diff --git a/.changesets/11731.md b/.changesets/11731.md new file mode 100644 index 000000000000..cd7678425bcb --- /dev/null +++ b/.changesets/11731.md @@ -0,0 +1 @@ +- fix(api-server): prevent race condition in server restart process (#11731) by @o0charlie0o diff --git a/packages/api-server/src/serverManager.ts b/packages/api-server/src/serverManager.ts index 4027255bcee1..3885631d0fa6 100644 --- a/packages/api-server/src/serverManager.ts +++ b/packages/api-server/src/serverManager.ts @@ -94,24 +94,33 @@ export class ServerManager { // Try to gracefully close the server // If it doesn't close within 2 seconds, forcefully close it - await Promise.race([ - new Promise((resolve) => { - console.log(chalk.yellow('Shutting down API server.')) - this.httpServerProcess!.on('exit', () => resolve()) - this.httpServerProcess!.kill() - }), - new Promise((resolve) => - setTimeout(() => { - console.log( - chalk.yellow( - 'API server did not exit within 2 seconds, forcefully closing it.', - ), - ) - this.httpServerProcess!.kill('SIGKILL') - resolve() - }, 2000), - ), - ]) + await new Promise((resolve) => { + console.log(chalk.yellow('Shutting down API server.')) + + const cleanup = () => { + this.httpServerProcess?.removeAllListeners('exit') + clearTimeout(forceKillTimeout) + } + + this.httpServerProcess?.on('exit', () => { + console.log(chalk.yellow('API server exited.')) + cleanup() + resolve() + }) + + const forceKillTimeout = setTimeout(() => { + console.log( + chalk.yellow( + 'API server did not exit within 2 seconds, forcefully closing it.', + ), + ) + cleanup() + this.httpServerProcess?.kill('SIGKILL') + resolve() + }, 2000) + + this.httpServerProcess?.kill() + }) } }