diff --git a/packages/next/src/build/turbopack-build/impl.ts b/packages/next/src/build/turbopack-build/impl.ts index 84ca19db10ddd..185a7f8417607 100644 --- a/packages/next/src/build/turbopack-build/impl.ts +++ b/packages/next/src/build/turbopack-build/impl.ts @@ -304,6 +304,7 @@ export async function turbopackBuild(): Promise<{ } } +let shutdownPromise: Promise | undefined export async function workerMain(workerData: { buildContext: typeof NextBuildContext }): Promise>> { @@ -330,5 +331,12 @@ export async function workerMain(workerData: { setGlobal('telemetry', telemetry) const result = await turbopackBuild() + shutdownPromise = result.shutdownPromise return result } + +export async function waitForShutdown(): Promise { + if (shutdownPromise) { + await shutdownPromise + } +} diff --git a/packages/next/src/build/turbopack-build/index.ts b/packages/next/src/build/turbopack-build/index.ts index 7ecb71626392d..aa74677430a58 100644 --- a/packages/next/src/build/turbopack-build/index.ts +++ b/packages/next/src/build/turbopack-build/index.ts @@ -11,7 +11,7 @@ async function turbopackBuildWithWorker() { try { const worker = new Worker(path.join(__dirname, 'impl.js'), { - exposedMethods: ['workerMain'], + exposedMethods: ['workerMain', 'waitForShutdown'], numWorkers: 1, maxRetries: 0, forkOptions: { @@ -27,8 +27,11 @@ async function turbopackBuildWithWorker() { buildContext: prunedBuildContext, }) - // destroy worker so it's not sticking around using memory - await worker.end() + // destroy worker when Turbopack has shutdown so it's not sticking around using memory + // We need to wait for shutdown to make sure persistent cache is flushed + result.shutdownPromise = worker.waitForShutdown().then(() => { + worker.end() + }) return result } catch (err: any) {