Skip to content

fix: settle aborted parallel steps before completing abortParallelWorkflow#2244

Open
pranaygp wants to merge 2 commits into
mainfrom
pranaygp/fix-abort-parallel-timeout
Open

fix: settle aborted parallel steps before completing abortParallelWorkflow#2244
pranaygp wants to merge 2 commits into
mainfrom
pranaygp/fix-abort-parallel-timeout

Conversation

@pranaygp
Copy link
Copy Markdown
Contributor

@pranaygp pranaygp commented Jun 4, 2026

Summary

  • keep the parallel longStep() promises alive as a named promise so the workflow can await them after aborting
  • return the settled parallel step results after timeout so the test can prove all three steps actually observed the abort
  • assert AbortController > abortParallelWorkflow: abort cancels all parallel steps returns ["aborted", "aborted", "aborted"]

Validation

  • git diff --check
  • WORKFLOW_PUBLIC_MANIFEST=1 pnpm dev in workbench/nextjs-turbopack
  • DEPLOYMENT_URL="http://localhost:3000" APP_NAME="nextjs-turbopack" pnpm vitest run packages/core/e2e/e2e.test.ts -t "abortParallelWorkflow: abort cancels all parallel steps"

Notes

  • The focused local E2E still does not reach the assertion because local Next dev fails earlier with Workflow "workflow//./workflows/99_e2e//abortParallelWorkflow" is not registered in the current deployment.
  • Dev logs continue to show the concurrent local bundling warning Module not found: Can't resolve <dynamic> from packages/core/dist/runtime/world.js.
  • That local registration/bundling issue appears unrelated to this workflow/test change, so CI remains the real verification path for the timeout fix.

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Jun 4, 2026

⚠️ No Changeset found

Latest commit: a1fcc91

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented Jun 4, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
example-nextjs-workflow-turbopack Ready Ready Preview, Comment Jun 5, 2026 10:21pm
example-nextjs-workflow-webpack Ready Ready Preview, Comment Jun 5, 2026 10:21pm
example-workflow Ready Ready Preview, Comment Jun 5, 2026 10:21pm
workbench-astro-workflow Ready Ready Preview, Comment Jun 5, 2026 10:21pm
workbench-express-workflow Ready Ready Preview, Comment Jun 5, 2026 10:21pm
workbench-fastify-workflow Ready Ready Preview, Comment Jun 5, 2026 10:21pm
workbench-hono-workflow Ready Ready Preview, Comment Jun 5, 2026 10:21pm
workbench-nitro-workflow Ready Ready Preview, Comment Jun 5, 2026 10:21pm
workbench-nuxt-workflow Ready Ready Preview, Comment Jun 5, 2026 10:21pm
workbench-sveltekit-workflow Ready Ready Preview, Comment Jun 5, 2026 10:21pm
workbench-tanstack-start-workflow Ready Ready Preview, Comment Jun 5, 2026 10:21pm
workbench-vite-workflow Ready Ready Preview, Comment Jun 5, 2026 10:21pm
workflow-docs Ready Ready Preview, Comment, Open in v0 Jun 5, 2026 10:21pm
workflow-swc-playground Ready Ready Preview, Comment Jun 5, 2026 10:21pm
workflow-tarballs Ready Ready Preview, Comment Jun 5, 2026 10:21pm
workflow-web Ready Ready Preview, Comment Jun 5, 2026 10:21pm

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 4, 2026

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 0.042s (-2.1%) 1.006s (~) 0.964s 10 1.00x
💻 Local Express 0.043s (~) 1.006s (~) 0.963s 10 1.03x
🐘 Postgres Express 0.060s (-10.0% 🟢) 1.012s (~) 0.953s 10 1.42x
💻 Local Next.js (Turbopack) 0.062s (+13.3% 🔺) 1.007s (~) 0.944s 10 1.49x
🐘 Postgres Nitro 0.063s (-1.1%) 1.012s (~) 0.949s 10 1.49x
🐘 Postgres Next.js (Turbopack) 0.067s (-4.4%) 1.012s (~) 0.945s 10 1.60x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 0.252s (-3.6%) 2.403s (-1.3%) 2.151s 10 1.00x
▲ Vercel Express 0.297s (+9.1% 🔺) 2.135s (-21.3% 🟢) 1.838s 10 1.18x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro | Express

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 1.099s (~) 2.007s (~) 0.908s 10 1.00x
💻 Local Nitro 1.103s (+0.6%) 2.007s (~) 0.904s 10 1.00x
🐘 Postgres Express 1.105s (+1.2%) 2.011s (~) 0.905s 10 1.01x
🐘 Postgres Nitro 1.112s (~) 2.010s (~) 0.899s 10 1.01x
💻 Local Next.js (Turbopack) 1.134s (+2.3%) 2.006s (~) 0.872s 10 1.03x
🐘 Postgres Next.js (Turbopack) 1.140s (~) 2.009s (~) 0.869s 10 1.04x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.586s (+1.3%) 3.917s (+11.0% 🔺) 2.331s 10 1.00x
▲ Vercel Express 1.666s (+5.2% 🔺) 3.986s (+11.6% 🔺) 2.319s 10 1.05x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro | Express

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 10.520s (-1.8%) 11.015s (-2.9%) 0.495s 3 1.00x
💻 Local Nitro 10.537s (~) 11.022s (~) 0.485s 3 1.00x
🐘 Postgres Nitro 10.546s (~) 11.020s (~) 0.473s 3 1.00x
💻 Local Express 10.555s (~) 11.022s (~) 0.467s 3 1.00x
💻 Local Next.js (Turbopack) 10.797s (+1.8%) 11.022s (~) 0.225s 3 1.03x
🐘 Postgres Next.js (Turbopack) 10.814s (~) 11.018s (~) 0.204s 3 1.03x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 13.412s (+1.9%) 15.953s (+3.3%) 2.541s 2 1.00x
▲ Vercel Nitro 13.614s (+2.2%) 15.903s (+2.0%) 2.289s 2 1.02x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Express | Nitro

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 13.754s (-1.1%) 14.026s (-1.4%) 0.272s 5 1.00x
🐘 Postgres Express 13.860s (~) 14.023s (-1.5%) 0.163s 5 1.01x
🐘 Postgres Nitro 13.873s (~) 14.020s (~) 0.147s 5 1.01x
💻 Local Nitro 13.883s (+1.2%) 14.227s (+1.4%) 0.345s 5 1.01x
💻 Local Next.js (Turbopack) 14.367s (+2.4%) 15.031s (+2.8%) 0.664s 4 1.04x
🐘 Postgres Next.js (Turbopack) 14.437s (-1.1%) 15.014s (~) 0.576s 4 1.05x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 20.293s (-20.3% 🟢) 22.390s (-17.8% 🟢) 2.097s 3 1.00x
▲ Vercel Nitro 20.916s (-18.0% 🟢) 22.998s (-16.7% 🟢) 2.081s 3 1.03x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Express | Nitro

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 12.434s (-1.3%) 13.024s (~) 0.590s 7 1.00x
💻 Local Nitro 12.449s (~) 13.025s (~) 0.576s 7 1.00x
🐘 Postgres Express 12.478s (-2.0%) 13.018s (-2.2%) 0.541s 7 1.00x
🐘 Postgres Nitro 12.795s (~) 13.163s (+1.1%) 0.368s 7 1.03x
🐘 Postgres Next.js (Turbopack) 13.720s (~) 14.019s (~) 0.298s 7 1.10x
💻 Local Next.js (Turbopack) 13.793s (+6.5% 🔺) 14.171s (+6.5% 🔺) 0.378s 7 1.11x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 28.281s (-11.8% 🟢) 31.006s (-9.4% 🟢) 2.725s 3 1.00x
▲ Vercel Nitro 29.486s (+1.5%) 31.364s (~) 1.878s 3 1.04x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Express | Nitro

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.200s (~) 2.009s (~) 0.809s 15 1.00x
🐘 Postgres Express 1.214s (+1.2%) 2.008s (-0.7%) 0.794s 15 1.01x
💻 Local Nitro 1.217s (~) 2.006s (~) 0.789s 15 1.01x
💻 Local Express 1.219s (-3.5%) 2.006s (~) 0.786s 15 1.02x
🐘 Postgres Next.js (Turbopack) 1.245s (~) 2.007s (~) 0.762s 15 1.04x
💻 Local Next.js (Turbopack) 1.306s (+6.8% 🔺) 2.006s (~) 0.699s 15 1.09x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.457s (-11.2% 🟢) 4.020s (-14.8% 🟢) 1.563s 8 1.00x
▲ Vercel Nitro 2.555s (-7.8% 🟢) 4.046s (-6.8% 🟢) 1.492s 8 1.04x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Express | Nitro

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.259s (~) 2.008s (~) 0.750s 15 1.00x
🐘 Postgres Express 1.268s (-4.4%) 2.008s (~) 0.740s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.388s (-1.5%) 2.073s (+3.2%) 0.685s 15 1.10x
💻 Local Next.js (Turbopack) 1.773s (+2.7%) 2.073s (+3.3%) 0.300s 15 1.41x
💻 Local Nitro 1.784s (+4.7%) 2.074s (~) 0.290s 15 1.42x
💻 Local Express 1.838s (-2.4%) 2.150s (-3.2%) 0.312s 14 1.46x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.409s (-16.5% 🟢) 5.261s (-14.7% 🟢) 1.852s 6 1.00x
▲ Vercel Nitro 4.236s (+4.1%) 6.058s (-2.4%) 1.822s 6 1.24x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Express | Nitro

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.402s (+0.6%) 2.008s (~) 0.606s 15 1.00x
🐘 Postgres Nitro 1.414s (+0.5%) 2.007s (~) 0.594s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.688s (-4.1%) 2.151s (-6.3% 🟢) 0.462s 14 1.20x
💻 Local Next.js (Turbopack) 4.642s (+5.6% 🔺) 5.179s (+3.3%) 0.537s 6 3.31x
💻 Local Express 5.369s (+1.3%) 6.014s (~) 0.645s 5 3.83x
💻 Local Nitro 5.580s (+18.3% 🔺) 6.014s (+20.1% 🔺) 0.435s 5 3.98x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.190s (-23.0% 🟢) 7.400s (-15.0% 🟢) 2.210s 5 1.00x
▲ Vercel Express 7.015s (+18.8% 🔺) 9.135s (+15.7% 🔺) 2.120s 4 1.35x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro | Express

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.178s (-2.1%) 2.009s (~) 0.831s 15 1.00x
🐘 Postgres Nitro 1.193s (-0.6%) 2.009s (~) 0.816s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.240s (-2.1%) 2.008s (~) 0.768s 15 1.05x
💻 Local Next.js (Turbopack) 1.376s (+5.4% 🔺) 2.006s (~) 0.630s 15 1.17x
💻 Local Nitro 1.578s (+2.2%) 2.006s (~) 0.428s 15 1.34x
💻 Local Express 1.596s (-3.7%) 2.007s (-3.2%) 0.411s 15 1.35x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.364s (-7.9% 🟢) 3.989s (-5.0%) 1.626s 8 1.00x
▲ Vercel Nitro 2.585s (-3.3%) 4.181s (-3.5%) 1.596s 8 1.09x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Express | Nitro

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.256s (+1.0%) 2.009s (~) 0.753s 15 1.00x
🐘 Postgres Nitro 1.270s (~) 2.010s (~) 0.740s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.372s (-1.8%) 2.009s (~) 0.637s 15 1.09x
💻 Local Nitro 2.087s (+18.8% 🔺) 2.675s (+29.1% 🔺) 0.589s 12 1.66x
💻 Local Next.js (Turbopack) 2.105s (+4.2%) 2.676s (+6.8% 🔺) 0.571s 12 1.68x
💻 Local Express 2.117s (~) 2.591s (~) 0.474s 12 1.69x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.687s (~) 5.540s (-1.3%) 1.854s 6 1.00x
▲ Vercel Nitro 3.726s (-9.0% 🟢) 5.647s (-5.9% 🟢) 1.921s 6 1.01x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Express | Nitro

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.405s (-6.3% 🟢) 2.007s (-16.3% 🟢) 0.602s 15 1.00x
🐘 Postgres Nitro 1.410s (-3.5%) 2.008s (~) 0.597s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.640s (-1.0%) 2.150s (+3.7%) 0.510s 14 1.17x
💻 Local Next.js (Turbopack) 5.592s (+8.4% 🔺) 6.017s (~) 0.425s 5 3.98x
💻 Local Express 6.060s (+3.4%) 6.416s (+3.3%) 0.355s 5 4.31x
💻 Local Nitro 6.308s (+33.0% 🔺) 6.615s (+23.8% 🔺) 0.307s 5 4.49x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.328s (+5.0% 🔺) 7.109s (+7.3% 🔺) 1.781s 5 1.00x
▲ Vercel Nitro 156.356s (+3071.8% 🔺) 158.702s (+2255.8% 🔺) 2.347s 2 29.35x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Express | Nitro

workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.559s (-16.1% 🟢) 1.007s (-3.9%) 0.447s 60 1.00x
💻 Local Nitro 0.599s (-25.6% 🟢) 1.005s (-16.6% 🟢) 0.406s 60 1.07x
💻 Local Express 0.613s (-6.5% 🟢) 1.005s (-3.3%) 0.392s 60 1.10x
🐘 Postgres Nitro 0.644s (+5.8% 🔺) 1.059s (+5.2% 🔺) 0.415s 57 1.15x
🐘 Postgres Next.js (Turbopack) 0.788s (-2.9%) 1.006s (~) 0.218s 60 1.41x
💻 Local Next.js (Turbopack) 0.870s (+25.0% 🔺) 1.021s (+1.7%) 0.151s 59 1.56x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.234s (-4.9%) 7.188s (+1.1%) 1.954s 9 1.00x
▲ Vercel Nitro 5.234s (-29.9% 🟢) 7.068s (-25.8% 🟢) 1.834s 9 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Express | Nitro

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.423s (-7.4% 🟢) 2.053s (-4.6%) 0.630s 44 1.00x
🐘 Postgres Nitro 1.430s (+1.0%) 2.054s (+2.3%) 0.624s 44 1.01x
💻 Local Nitro 1.508s (+3.0%) 2.007s (~) 0.499s 45 1.06x
💻 Local Express 1.536s (-3.5%) 2.007s (-1.1%) 0.470s 45 1.08x
🐘 Postgres Next.js (Turbopack) 1.883s (-3.1%) 2.030s (-6.6% 🟢) 0.147s 45 1.32x
💻 Local Next.js (Turbopack) 2.073s (+19.9% 🔺) 2.976s (+46.7% 🔺) 0.903s 31 1.46x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 12.374s (-24.5% 🟢) 14.609s (-20.2% 🟢) 2.235s 7 1.00x
▲ Vercel Nitro 12.892s (-2.5%) 15.013s (-3.0%) 2.121s 7 1.04x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Express | Nitro

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 2.798s (-4.0%) 3.138s (-4.3%) 0.341s 39 1.00x
🐘 Postgres Express 2.852s (-2.0%) 3.220s (-9.0% 🟢) 0.367s 38 1.02x
💻 Local Express 3.273s (-4.3%) 4.010s (~) 0.736s 30 1.17x
💻 Local Nitro 3.325s (+3.7%) 4.043s (+0.8%) 0.718s 30 1.19x
🐘 Postgres Next.js (Turbopack) 3.741s (-3.1%) 4.042s (-0.8%) 0.301s 30 1.34x
💻 Local Next.js (Turbopack) 4.397s (+18.0% 🔺) 5.012s (+22.0% 🔺) 0.614s 24 1.57x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 24.989s (-16.1% 🟢) 27.368s (-14.4% 🟢) 2.379s 5 1.00x
▲ Vercel Express 27.286s (-5.4% 🟢) 30.110s (-2.6%) 2.824s 5 1.09x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro | Express

workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.218s (-7.5% 🟢) 1.007s (~) 0.789s 60 1.00x
🐘 Postgres Express 0.223s (-11.7% 🟢) 1.006s (~) 0.784s 60 1.02x
🐘 Postgres Next.js (Turbopack) 0.274s (-2.9%) 1.006s (~) 0.732s 60 1.26x
💻 Local Express 0.463s (~) 1.005s (~) 0.542s 60 2.13x
💻 Local Nitro 0.464s (+9.4% 🔺) 1.004s (~) 0.540s 60 2.13x
💻 Local Next.js (Turbopack) 0.661s (+8.2% 🔺) 1.058s (+1.9%) 0.397s 57 3.04x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.257s (-3.8%) 3.916s (-9.6% 🟢) 1.659s 16 1.00x
▲ Vercel Express 2.816s (+27.3% 🔺) 4.679s (+14.2% 🔺) 1.863s 13 1.25x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro | Express

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.347s (+2.4%) 1.006s (~) 0.659s 90 1.00x
🐘 Postgres Nitro 0.379s (+2.1%) 1.007s (~) 0.628s 90 1.09x
🐘 Postgres Next.js (Turbopack) 0.472s (-2.2%) 1.006s (~) 0.534s 90 1.36x
💻 Local Nitro 2.177s (+5.5% 🔺) 2.766s (+4.9%) 0.588s 33 6.27x
💻 Local Express 2.190s (~) 2.713s (-3.9%) 0.524s 34 6.31x
💻 Local Next.js (Turbopack) 2.558s (+4.4%) 3.261s (+4.9%) 0.704s 28 7.37x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 4.560s (-89.6% 🟢) 6.563s (-85.7% 🟢) 2.004s 14 1.00x
▲ Vercel Express 5.307s (-87.7% 🟢) 7.209s (-84.1% 🟢) 1.901s 13 1.16x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro | Express

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.663s (+6.0% 🔺) 1.006s (-4.6%) 0.343s 120 1.00x
🐘 Postgres Nitro 0.694s (-1.8%) 1.006s (~) 0.312s 120 1.05x
🐘 Postgres Next.js (Turbopack) 0.927s (-5.4% 🟢) 1.231s (-23.4% 🟢) 0.305s 98 1.40x
💻 Local Express 9.974s (-3.3%) 10.530s (-3.1%) 0.556s 12 15.04x
💻 Local Nitro 10.018s (+15.0% 🔺) 10.526s (+12.8% 🔺) 0.507s 12 15.11x
💻 Local Next.js (Turbopack) 10.257s (-0.6%) 11.209s (-0.8%) 0.952s 11 15.47x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 13.262s (-95.7% 🟢) 15.600s (-95.0% 🟢) 2.338s 8 1.00x
▲ Vercel Express 13.685s (-10.3% 🟢) 15.695s (-10.3% 🟢) 2.009s 8 1.03x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro | Express

Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 1.162s (-0.6%) 2.005s (~) 0.012s (-3.1%) 2.019s (~) 0.858s 10 1.00x
🐘 Postgres Express 1.165s (-2.5%) 2.000s (~) 0.001s (-96.8% 🟢) 2.011s (-1.6%) 0.846s 10 1.00x
💻 Local Nitro 1.165s (+1.2%) 2.005s (~) 0.012s (+23.0% 🔺) 2.019s (~) 0.854s 10 1.00x
🐘 Postgres Nitro 1.189s (+0.6%) 2.004s (~) 0.003s (+128.6% 🔺) 2.019s (~) 0.830s 10 1.02x
💻 Local Next.js (Turbopack) 1.206s (+3.2%) 2.003s (~) 0.010s (+1.0%) 2.018s (~) 0.811s 10 1.04x
🐘 Postgres Next.js (Turbopack) 1.232s (~) 2.001s (~) 0.001s (-26.7% 🟢) 2.010s (~) 0.778s 10 1.06x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.175s (~) 3.553s (+4.0%) 1.893s (+266.9% 🔺) 5.938s (+32.9% 🔺) 3.763s 10 1.00x
▲ Vercel Express 2.463s (+14.8% 🔺) 3.433s (+0.7%) 2.296s (+336.7% 🔺) 6.318s (+42.1% 🔺) 3.855s 10 1.13x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -

🔍 Observability: Nitro | Express

stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.587s (-8.6% 🟢) 2.004s (-6.5% 🟢) 0.004s (+24.6% 🔺) 2.025s (-6.2% 🟢) 0.438s 30 1.00x
💻 Local Express 1.607s (-1.8%) 2.010s (~) 0.010s (-5.1% 🟢) 2.022s (~) 0.415s 30 1.01x
🐘 Postgres Nitro 1.653s (-0.6%) 2.039s (+1.6%) 0.004s (+0.9%) 2.060s (+1.6%) 0.407s 30 1.04x
🐘 Postgres Next.js (Turbopack) 1.726s (-2.1%) 2.009s (~) 0.004s (-7.4% 🟢) 2.024s (~) 0.298s 30 1.09x
💻 Local Next.js (Turbopack) 1.751s (+6.8% 🔺) 2.010s (~) 0.010s (-3.6%) 2.023s (~) 0.271s 30 1.10x
💻 Local Nitro 1.767s (+1.4%) 2.010s (~) 0.009s (+3.1%) 2.201s (~) 0.433s 28 1.11x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.707s (-0.7%) 7.166s (-5.7% 🟢) 0.300s (-11.2% 🟢) 7.923s (-6.6% 🟢) 2.216s 8 1.00x
▲ Vercel Express 5.795s (+0.6%) 7.189s (-3.3%) 0.260s (-26.5% 🟢) 7.931s (-5.6% 🟢) 2.136s 8 1.02x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -

🔍 Observability: Nitro | Express

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.700s (-28.4% 🟢) 1.050s (-26.4% 🟢) 0.000s (-50.9% 🟢) 1.061s (-26.8% 🟢) 0.361s 57 1.00x
🐘 Postgres Nitro 0.717s (-0.8%) 1.051s (+2.0%) 0.000s (-83.0% 🟢) 1.061s (+1.2%) 0.343s 57 1.02x
🐘 Postgres Next.js (Turbopack) 0.802s (-3.7%) 1.072s (~) 0.000s (~) 1.079s (~) 0.277s 56 1.15x
💻 Local Express 1.412s (-4.8%) 2.014s (~) 0.000s (-53.3% 🟢) 2.016s (~) 0.604s 30 2.02x
💻 Local Nitro 1.581s (+16.9% 🔺) 2.013s (~) 0.000s (-28.6% 🟢) 2.194s (+8.9% 🔺) 0.613s 28 2.26x
💻 Local Next.js (Turbopack) 1.585s (+9.5% 🔺) 2.015s (~) 0.001s (+100.0% 🔺) 2.019s (~) 0.434s 30 2.27x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.288s (-19.0% 🟢) 4.748s (-11.1% 🟢) 0.000s (-85.3% 🟢) 5.247s (-14.9% 🟢) 1.959s 12 1.00x
▲ Vercel Nitro 3.570s (-0.8%) 5.029s (-0.9%) 0.000s (+Infinity% 🔺) 5.483s (-2.6%) 1.913s 11 1.09x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -

🔍 Observability: Express | Nitro

fan-out fan-in 10 streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.390s (-13.9% 🟢) 2.068s (-8.2% 🟢) 0.000s (+Infinity% 🔺) 2.082s (-8.7% 🟢) 0.692s 29 1.00x
🐘 Postgres Nitro 1.470s (+4.2%) 2.175s (+9.0% 🔺) 0.000s (+Infinity% 🔺) 2.192s (+8.9% 🔺) 0.722s 28 1.06x
🐘 Postgres Next.js (Turbopack) 1.604s (-7.2% 🟢) 2.181s (-3.6%) 0.000s (+Infinity% 🔺) 2.188s (-3.6%) 0.584s 28 1.15x
💻 Local Nitro 3.174s (+1.9%) 4.027s (+3.4%) 0.001s (+246.7% 🔺) 4.030s (+3.3%) 0.856s 15 2.28x
💻 Local Express 3.184s (-4.5%) 3.901s (+1.6%) 0.000s (~) 3.903s (+1.5%) 0.719s 16 2.29x
💻 Local Next.js (Turbopack) 3.483s (+8.4% 🔺) 3.840s (-1.5%) 0.001s (+140.0% 🔺) 3.848s (-1.3%) 0.365s 16 2.51x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.176s (-26.5% 🟢) 6.833s (-20.3% 🟢) 0.000s (NaN%) 7.304s (-19.6% 🟢) 2.127s 9 1.00x
▲ Vercel Express 5.209s (-17.6% 🟢) 6.695s (-12.2% 🟢) 0.002s (+463.0% 🔺) 7.182s (-12.2% 🟢) 1.973s 9 1.01x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -

🔍 Observability: Nitro | Express

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Express 9/21
🐘 Postgres Express 17/21
▲ Vercel Express 11/21
Fastest World by Framework

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 🐘 Postgres 16/21
Next.js (Turbopack) 🐘 Postgres 16/21
Nitro 🐘 Postgres 15/21
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Redis + BullMQ: Community world (local development)
  • 🌐 Cloudflare: Community world (local development)
  • 🌐 MySQL: Community world (local development)
  • 🌐 Azure: Community world (local development)
  • 🌐 NATS JetStream: Community world (local development)
  • 🌐 Upstash: Community world (local development)

📋 View full workflow run


Some benchmark jobs failed:

  • Local: success
  • Postgres: success
  • Vercel: failure

Check the workflow run for details.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 4, 2026

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
❌ ▲ Vercel Production 1261 5 219 1485
✅ 💻 Local Development 1671 0 219 1890
✅ 📦 Local Production 1671 0 219 1890
✅ 🐘 Local Postgres 1671 0 219 1890
✅ 🪟 Windows 135 0 0 135
✅ 📋 Other 769 0 176 945
Total 7178 5 1052 8235

❌ Failed Tests

▲ Vercel Production (5 failed)

astro (1 failed):

  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream

nextjs-turbopack (1 failed):

  • outputStreamWorkflow no startIndex (reads all chunks)

nitro (1 failed):

  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream

vite (2 failed):

Details by Category

❌ ▲ Vercel Production
App Passed Failed Skipped
❌ astro 108 1 26
✅ example 109 0 26
✅ express 109 0 26
✅ fastify 109 0 26
✅ hono 109 0 26
❌ nextjs-turbopack 132 1 2
✅ nextjs-webpack 133 0 2
❌ nitro 108 1 26
✅ nuxt 109 0 26
✅ sveltekit 128 0 7
❌ vite 107 2 26
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 110 0 25
✅ express-stable 110 0 25
✅ fastify-stable 110 0 25
✅ hono-stable 110 0 25
✅ nextjs-turbopack-canary 116 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 135 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 135 0 0
✅ nextjs-webpack-canary 116 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 135 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 135 0 0
✅ nitro-stable 110 0 25
✅ nuxt-stable 110 0 25
✅ sveltekit-stable 129 0 6
✅ vite-stable 110 0 25
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 110 0 25
✅ express-stable 110 0 25
✅ fastify-stable 110 0 25
✅ hono-stable 110 0 25
✅ nextjs-turbopack-canary 116 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 135 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 135 0 0
✅ nextjs-webpack-canary 116 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 135 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 135 0 0
✅ nitro-stable 110 0 25
✅ nuxt-stable 110 0 25
✅ sveltekit-stable 129 0 6
✅ vite-stable 110 0 25
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 110 0 25
✅ express-stable 110 0 25
✅ fastify-stable 110 0 25
✅ hono-stable 110 0 25
✅ nextjs-turbopack-canary 116 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 135 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 135 0 0
✅ nextjs-webpack-canary 116 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 135 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 135 0 0
✅ nitro-stable 110 0 25
✅ nuxt-stable 110 0 25
✅ sveltekit-stable 129 0 6
✅ vite-stable 110 0 25
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 135 0 0
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 110 0 25
✅ e2e-local-dev-tanstack-start- 110 0 25
✅ e2e-local-postgres-nest-stable 110 0 25
✅ e2e-local-postgres-tanstack-start- 110 0 25
✅ e2e-local-prod-nest-stable 110 0 25
✅ e2e-local-prod-tanstack-start- 110 0 25
✅ e2e-vercel-prod-tanstack-start 109 0 26

📋 View full workflow run


Some E2E test jobs failed:

  • Vercel Prod: failure
  • Local Dev: success
  • Local Prod: success
  • Local Postgres: success
  • Windows: success

Check the workflow run for details.

@pranaygp pranaygp marked this pull request as ready for review June 5, 2026 22:17
@pranaygp pranaygp requested a review from a team as a code owner June 5, 2026 22:17
Copilot AI review requested due to automatic review settings June 5, 2026 22:17
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the abort-parallel E2E workflow to ensure that once the workflow times out and triggers an abort, it waits for the in-flight parallel steps to observe the abort and settle before returning. This prevents “dangling” parallel work from keeping the run open until the long steps reach their natural completion, and it strengthens the E2E assertion to prove all branches actually took the abort path.

Changes:

  • Keep the three parallel longStep() executions alive via a named parallelSteps promise so it can be awaited after timeout/abort.
  • On timeout, abort the controller and then await parallelSteps before returning, including the settled results in the return value.
  • Update the E2E test to assert that the workflow returns results: ["aborted", "aborted", "aborted"] for the timeout path.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

File Description
workbench/example/workflows/99_e2e.ts Persists the parallel steps promise and awaits it after abort on timeout, returning the settled step results.
packages/core/e2e/e2e.test.ts Strengthens the assertion to verify all parallel steps actually observed the abort and returned "aborted".

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants