From a5b1472132e357d3e94f84f2d48cfe7b99b40723 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Sat, 17 Aug 2024 09:23:29 +0200 Subject: [PATCH] shutdown gracefully after build --- crates/napi/src/next_api/project.rs | 7 +++++++ packages/next/src/build/index.ts | 14 +++++++++++++- packages/next/src/build/swc/index.ts | 6 ++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/crates/napi/src/next_api/project.rs b/crates/napi/src/next_api/project.rs index acda8aa99d4be..05304cfee1665 100644 --- a/crates/napi/src/next_api/project.rs +++ b/crates/napi/src/next_api/project.rs @@ -432,6 +432,13 @@ pub async fn project_update( Ok(()) } +#[napi(ts_return_type = "{ __napiType: \"Project\" }")] +pub async fn project_shutdown( + #[napi(ts_arg_type = "{ __napiType: \"Project\" }")] project: External, +) { + project.turbo_tasks.stop_and_wait().await; +} + #[napi(object)] #[derive(Default)] struct AppPageNapiRoute { diff --git a/packages/next/src/build/index.ts b/packages/next/src/build/index.ts index c1e7a0f8b2586..0d7923f8fd81d 100644 --- a/packages/next/src/build/index.ts +++ b/packages/next/src/build/index.ts @@ -1249,6 +1249,7 @@ export default async function build( async function turbopackBuild(): Promise<{ duration: number buildTraceContext: undefined + shutdownPromise: Promise }> { if (!IS_TURBOPACK_BUILD) { throw new Error("next build doesn't support turbopack yet") @@ -1464,6 +1465,8 @@ export default async function build( } } + const shutdownPromise = project.shutdown() + if (warnings.length > 0) { Log.warn( `Turbopack build collected ${warnings.length} warnings:\n${warnings @@ -1487,6 +1490,7 @@ export default async function build( return { duration: process.hrtime(startTime)[0], buildTraceContext: undefined, + shutdownPromise, } } @@ -1531,9 +1535,15 @@ export default async function build( }, }) + let shutdownPromise = Promise.resolve() if (!isGenerateMode) { if (turboNextBuild) { - const { duration: compilerDuration, ...rest } = await turbopackBuild() + const { + duration: compilerDuration, + shutdownPromise: p, + ...rest + } = await turbopackBuild() + shutdownPromise = p traceMemoryUsage('Finished build', nextBuildSpan) buildTraceContext = rest.buildTraceContext @@ -3566,6 +3576,8 @@ export default async function build( await nextBuildSpan .traceChild('telemetry-flush') .traceAsyncFn(() => telemetry.flush()) + + await shutdownPromise }) } finally { // Ensure we wait for lockfile patching if present diff --git a/packages/next/src/build/swc/index.ts b/packages/next/src/build/swc/index.ts index 3856aacc10e54..69ab052e95b8b 100644 --- a/packages/next/src/build/swc/index.ts +++ b/packages/next/src/build/swc/index.ts @@ -679,6 +679,8 @@ export interface Project { aggregationMs: number ): AsyncIterableIterator> + shutdown(): Promise + onExit(): Promise } @@ -1100,6 +1102,10 @@ function bindingToApi( return subscription } + shutdown(): Promise { + return binding.projectShutdown(this._nativeProject) + } + onExit(): Promise { return binding.projectOnExit(this._nativeProject) }