diff --git a/crates/napi/src/next_api/project.rs b/crates/napi/src/next_api/project.rs index c411f71322aca..9fe3e9c34e54b 100644 --- a/crates/napi/src/next_api/project.rs +++ b/crates/napi/src/next_api/project.rs @@ -543,8 +543,8 @@ async fn project_on_exit_internal(project: &ProjectInstance) { pub async fn project_shutdown( #[napi(ts_arg_type = "{ __napiType: \"Project\" }")] project: External, ) { - project_on_exit_internal(&project).await; project.turbo_tasks.stop_and_wait().await; + project_on_exit_internal(&project).await; } #[napi(object)] diff --git a/packages/next/src/shared/lib/turbopack/manifest-loader.ts b/packages/next/src/shared/lib/turbopack/manifest-loader.ts index 3a9cae0c5866a..5faea439b6a28 100644 --- a/packages/next/src/shared/lib/turbopack/manifest-loader.ts +++ b/packages/next/src/shared/lib/turbopack/manifest-loader.ts @@ -200,6 +200,16 @@ export class TurbopackManifestLoader { mergeActionIds(manifest.node, m.node) mergeActionIds(manifest.edge, m.edge) } + for (const key in manifest.node) { + const entry = manifest.node[key] + entry.workers = sortObjectByKey(entry.workers) + entry.layer = sortObjectByKey(entry.layer) + } + for (const key in manifest.edge) { + const entry = manifest.edge[key] + entry.workers = sortObjectByKey(entry.workers) + entry.layer = sortObjectByKey(entry.layer) + } return manifest } @@ -247,6 +257,7 @@ export class TurbopackManifestLoader { for (const m of manifests) { Object.assign(manifest.pages, m.pages) } + manifest.pages = sortObjectByKey(manifest.pages) return manifest } @@ -398,6 +409,7 @@ export class TurbopackManifestLoader { // polyfillFiles should always be the same, so we can overwrite instead of actually merging if (m.polyfillFiles.length) manifest.polyfillFiles = m.polyfillFiles } + manifest.pages = sortObjectByKey(manifest.pages) as BuildManifest['pages'] return manifest } @@ -550,6 +562,8 @@ export class TurbopackManifestLoader { manifest.pagesUsingSizeAdjust = manifest.pagesUsingSizeAdjust || m.pagesUsingSizeAdjust } + manifest.app = sortObjectByKey(manifest.app) + manifest.pages = sortObjectByKey(manifest.pages) return manifest } @@ -620,6 +634,8 @@ export class TurbopackManifestLoader { instrumentation = m.instrumentation } } + manifest.functions = sortObjectByKey(manifest.functions) + manifest.middleware = sortObjectByKey(manifest.middleware) const updateFunctionDefinition = ( fun: EdgeFunctionDefinition ): EdgeFunctionDefinition => { @@ -696,7 +712,7 @@ export class TurbopackManifestLoader { for (const m of manifests) { Object.assign(manifest, m) } - return manifest + return sortObjectByKey(manifest) } private async writePagesManifest(): Promise { @@ -733,3 +749,15 @@ export class TurbopackManifestLoader { } } } + +function sortObjectByKey(obj: Record) { + return Object.keys(obj) + .sort() + .reduce( + (acc, key) => { + acc[key] = obj[key] + return acc + }, + {} as Record + ) +} diff --git a/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs b/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs index 7b5d9e47675b6..ac651fded253a 100644 --- a/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs +++ b/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs @@ -447,6 +447,7 @@ impl TurboTasksBackendInner { this: &TurboTasksBackendInner, task: &impl TaskGuard, reader: Option, + ctx: &impl ExecuteContext<'_>, ) -> Option, anyhow::Error>> { match get!(task, InProgress) { @@ -457,10 +458,18 @@ impl TurboTasksBackendInner { marked_as_completed, done_event, .. - })) if !*marked_as_completed => { - Some(Ok(Err(listen_to_done_event(this, reader, done_event)))) + })) => { + if !*marked_as_completed { + Some(Ok(Err(listen_to_done_event(this, reader, done_event)))) + } else { + None + } } - _ => None, + Some(InProgressState::Canceled) => Some(Err(anyhow::anyhow!( + "{} was canceled", + ctx.get_task_description(task.id()) + ))), + None => None, } } @@ -545,7 +554,7 @@ impl TurboTasksBackendInner { } } - if let Some(value) = check_in_progress(self, &task, reader) { + if let Some(value) = check_in_progress(self, &task, reader, &ctx) { return value; } @@ -755,6 +764,9 @@ impl TurboTasksBackendInner { InProgressState::Scheduled { .. } => { // Already scheduled } + InProgressState::Canceled => { + bail!("{} was canceled", ctx.get_task_description(task_id)); + } } } else if task.add(CachedDataItem::new_scheduled( self.get_task_desc_fn(task_id), @@ -1077,6 +1089,27 @@ impl TurboTasksBackendInner { .map(|task_type| task_type.fn_type) } + fn task_execution_canceled( + &self, + task_id: TaskId, + turbo_tasks: &dyn TurboTasksBackendApi>, + ) { + let mut ctx = self.execute_context(turbo_tasks); + let mut task = ctx.task(task_id, TaskDataCategory::Data); + if let Some(in_progress) = remove!(task, InProgress) { + match in_progress { + InProgressState::Scheduled { done_event } => done_event.notify(usize::MAX), + InProgressState::InProgress(box InProgressStateInner { done_event, .. }) => { + done_event.notify(usize::MAX) + } + InProgressState::Canceled => {} + } + } + task.add_new(CachedDataItem::InProgress { + value: InProgressState::Canceled, + }); + } + fn try_start_task_execution( &self, task_id: TaskId, @@ -2036,6 +2069,10 @@ impl Backend for TurboTasksBackend { type TaskState = (); fn new_task_state(&self, _task: TaskId) -> Self::TaskState {} + fn task_execution_canceled(&self, task: TaskId, turbo_tasks: &dyn TurboTasksBackendApi) { + self.0.task_execution_canceled(task, turbo_tasks) + } + fn try_start_task_execution( &self, task_id: TaskId, diff --git a/turbopack/crates/turbo-tasks-backend/src/data.rs b/turbopack/crates/turbo-tasks-backend/src/data.rs index dd6c85e21c35f..d0c6e8c66da69 100644 --- a/turbopack/crates/turbo-tasks-backend/src/data.rs +++ b/turbopack/crates/turbo-tasks-backend/src/data.rs @@ -320,6 +320,7 @@ pub struct InProgressStateInner { pub enum InProgressState { Scheduled { done_event: Event }, InProgress(Box), + Canceled, } transient_traits!(InProgressState); diff --git a/turbopack/crates/turbo-tasks-memory/src/memory_backend.rs b/turbopack/crates/turbo-tasks-memory/src/memory_backend.rs index 7618e4499e6c3..31e5b9c780dcd 100644 --- a/turbopack/crates/turbo-tasks-memory/src/memory_backend.rs +++ b/turbopack/crates/turbo-tasks-memory/src/memory_backend.rs @@ -395,6 +395,14 @@ impl Backend for MemoryBackend { } } + fn task_execution_canceled( + &self, + _task: TaskId, + _turbo_tasks: &dyn TurboTasksBackendApi, + ) { + todo!() + } + fn try_start_task_execution<'a>( &'a self, task: TaskId, diff --git a/turbopack/crates/turbo-tasks/src/backend.rs b/turbopack/crates/turbo-tasks/src/backend.rs index 6a2ee9dce1116..fec266da3b41e 100644 --- a/turbopack/crates/turbo-tasks/src/backend.rs +++ b/turbopack/crates/turbo-tasks/src/backend.rs @@ -453,6 +453,8 @@ pub trait Backend: Sync + Send { turbo_tasks: &dyn TurboTasksBackendApi, ) -> Option>; + fn task_execution_canceled(&self, task: TaskId, turbo_tasks: &dyn TurboTasksBackendApi); + fn task_execution_result( &self, task: TaskId, diff --git a/turbopack/crates/turbo-tasks/src/manager.rs b/turbopack/crates/turbo-tasks/src/manager.rs index de9700c00415f..b6213ce5a09b4 100644 --- a/turbopack/crates/turbo-tasks/src/manager.rs +++ b/turbopack/crates/turbo-tasks/src/manager.rs @@ -647,6 +647,7 @@ impl TurboTasks { ))); let single_execution_future = async { if this.stopped.load(Ordering::Acquire) { + this.backend.task_execution_canceled(task_id, &*this); return false; }