Skip to content

[e2e] Remove /api/hook and /api/test-health-check endpoints, call APIs directly#974

Merged
TooTallNate merged 1 commit intomainfrom
02-07-e2e_cleanup_remove_more_endpoints
Feb 7, 2026
Merged

[e2e] Remove /api/hook and /api/test-health-check endpoints, call APIs directly#974
TooTallNate merged 1 commit intomainfrom
02-07-e2e_cleanup_remove_more_endpoints

Conversation

@TooTallNate
Copy link
Copy Markdown
Member

@TooTallNate TooTallNate commented Feb 7, 2026

Follow-up to #958 that removes even more workbench app duplication / indirection:

  • Remove leftover debug logging from bench.bench.ts
  • Remove awaitReturnValue() wrapper, use run.returnValue directly in benchmarks
  • Add changeset for Nitro builder manifest fix that was forgotten
  • Refactor hookWorkflow tests to call getHookByToken()/resumeHook() directly
  • Refactor queue-based health check test to call healthCheck() directly
  • Remove /api/hook and /api/test-health-check endpoints from all workbench apps
    (nextjs-turbopack, nextjs-webpack, vite, hono, express, fastify, sveltekit,
    astro, nuxt, nitro-v2, nitro-v3, nest, example)

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Feb 7, 2026

🦋 Changeset detected

Latest commit: e0276c4

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 14 packages
Name Type
@workflow/nitro Patch
@workflow/nuxt Patch
workflow Patch
@workflow/world-testing Patch
@workflow/core Patch
@workflow/builders Patch
@workflow/cli Patch
@workflow/next Patch
@workflow/web-shared Patch
@workflow/astro Patch
@workflow/nest Patch
@workflow/rollup Patch
@workflow/sveltekit Patch
@workflow/vite Patch

Not sure what this means? Click here to learn what changesets are.

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Feb 7, 2026

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 479 0 38 517
✅ 💻 Local Development 408 0 62 470
✅ 📦 Local Production 408 0 62 470
✅ 🐘 Local Postgres 408 0 62 470
✅ 🪟 Windows 44 0 3 47
❌ 🌍 Community Worlds 29 159 12 200
✅ 📋 Other 120 0 21 141
Total 1896 159 260 2315

❌ Failed Tests

🌍 Community Worlds (159 failed)

mongodb (39 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • instanceMethodStepWorkflow - instance methods with "use step" directive
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

redis (39 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • instanceMethodStepWorkflow - instance methods with "use step" directive
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

starter (41 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • instanceMethodStepWorkflow - instance methods with "use step" directive
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

turso (40 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • instanceMethodStepWorkflow - instance methods with "use step" directive
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 43 0 4
✅ example 43 0 4
✅ express 43 0 4
✅ fastify 43 0 4
✅ hono 43 0 4
✅ nextjs-turbopack 46 0 1
✅ nextjs-webpack 46 0 1
✅ nitro 43 0 4
✅ nuxt 43 0 4
✅ sveltekit 43 0 4
✅ vite 43 0 4
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 40 0 7
✅ express-stable 40 0 7
✅ fastify-stable 40 0 7
✅ hono-stable 40 0 7
✅ nextjs-turbopack-stable 44 0 3
✅ nextjs-webpack-stable 44 0 3
✅ nitro-stable 40 0 7
✅ nuxt-stable 40 0 7
✅ sveltekit-stable 40 0 7
✅ vite-stable 40 0 7
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 40 0 7
✅ express-stable 40 0 7
✅ fastify-stable 40 0 7
✅ hono-stable 40 0 7
✅ nextjs-turbopack-stable 44 0 3
✅ nextjs-webpack-stable 44 0 3
✅ nitro-stable 40 0 7
✅ nuxt-stable 40 0 7
✅ sveltekit-stable 40 0 7
✅ vite-stable 40 0 7
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 40 0 7
✅ express-stable 40 0 7
✅ fastify-stable 40 0 7
✅ hono-stable 40 0 7
✅ nextjs-turbopack-stable 44 0 3
✅ nextjs-webpack-stable 44 0 3
✅ nitro-stable 40 0 7
✅ nuxt-stable 40 0 7
✅ sveltekit-stable 40 0 7
✅ vite-stable 40 0 7
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 44 0 3
❌ 🌍 Community Worlds
App Passed Failed Skipped
✅ mongodb-dev 3 0 0
❌ mongodb 5 39 3
✅ redis-dev 3 0 0
❌ redis 5 39 3
✅ starter-dev 3 0 0
❌ starter 3 41 3
✅ turso-dev 3 0 0
❌ turso 4 40 3
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 40 0 7
✅ e2e-local-postgres-nest-stable 40 0 7
✅ e2e-local-prod-nest-stable 40 0 7

📋 View full workflow run

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Feb 7, 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 🥇 Express 0.032s (-0.9%) 1.005s (~) 0.973s 10 1.00x
💻 Local Nitro 0.032s (-3.9%) 1.005s (~) 0.973s 10 1.01x
💻 Local Next.js (Turbopack) 0.044s 1.005s 0.961s 10 1.41x
🐘 Postgres Express 0.309s (+73.1% 🔺) 1.045s (+3.4%) 0.736s 10 9.80x
🐘 Postgres Next.js (Turbopack) 0.351s 1.009s 0.658s 10 11.16x
🐘 Postgres Nitro 0.381s (-16.0% 🟢) 1.023s (+0.9%) 0.642s 10 12.08x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 0.733s (-39.0% 🟢) 1.917s (-29.4% 🟢) 1.184s 10 1.00x
▲ Vercel Next.js (Turbopack) 0.751s (-9.1% 🟢) 2.184s (~) 1.433s 10 1.02x
▲ Vercel Express 0.765s (-9.0% 🟢) 1.946s (-9.0% 🟢) 1.181s 10 1.04x

🔍 Observability: Nitro | Next.js (Turbopack) | Express

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 1.098s 2.005s 0.908s 10 1.00x
💻 Local Express 1.103s (~) 2.005s (~) 0.901s 10 1.01x
💻 Local Nitro 1.106s (~) 2.005s (~) 0.900s 10 1.01x
🐘 Postgres Express 1.755s (-23.6% 🟢) 2.213s (-26.6% 🟢) 0.458s 10 1.60x
🐘 Postgres Next.js (Turbopack) 1.892s 2.011s 0.119s 10 1.72x
🐘 Postgres Nitro 2.393s (+0.9%) 3.014s (~) 0.620s 10 2.18x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.502s (-8.5% 🟢) 3.127s (-16.0% 🟢) 0.625s 10 1.00x
▲ Vercel Express 2.609s (-4.6%) 3.490s (-12.6% 🟢) 0.881s 10 1.04x
▲ Vercel Next.js (Turbopack) 2.660s (-3.1%) 3.472s (-3.3%) 0.812s 10 1.06x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 10.701s 11.021s 0.320s 3 1.00x
💻 Local Nitro 10.823s (~) 11.021s (~) 0.198s 3 1.01x
💻 Local Express 10.830s (~) 11.022s (~) 0.192s 3 1.01x
🐘 Postgres Next.js (Turbopack) 15.272s 16.043s 0.771s 2 1.43x
🐘 Postgres Express 15.287s (-25.1% 🟢) 16.046s (-23.8% 🟢) 0.759s 2 1.43x
🐘 Postgres Nitro 20.274s (~) 21.055s (~) 0.781s 2 1.89x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 18.791s (-5.2% 🟢) 20.039s (-7.2% 🟢) 1.247s 2 1.00x
▲ Vercel Express 18.957s (-4.9%) 20.006s (-4.1%) 1.049s 2 1.01x
▲ Vercel Next.js (Turbopack) 19.534s (-3.5%) 20.877s (-3.7%) 1.343s 2 1.04x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 27.133s 28.053s 0.920s 3 1.00x
💻 Local Nitro 27.448s (~) 28.048s (~) 0.600s 3 1.01x
💻 Local Express 27.483s (~) 28.050s (~) 0.567s 3 1.01x
🐘 Postgres Next.js (Turbopack) 36.852s 37.588s 0.737s 2 1.36x
🐘 Postgres Express 37.855s (-24.6% 🟢) 38.097s (-25.5% 🟢) 0.242s 2 1.40x
🐘 Postgres Nitro 50.339s (~) 51.117s (~) 0.778s 2 1.86x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 49.090s (~) 50.380s (~) 1.290s 2 1.00x
▲ Vercel Express 49.127s (-1.2%) 49.978s (-1.6%) 0.851s 2 1.00x
▲ Vercel Next.js (Turbopack) 50.740s (-0.7%) 52.293s (~) 1.553s 2 1.03x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 56.519s 57.098s 0.580s 2 1.00x
💻 Local Nitro 57.077s (~) 57.101s (~) 0.025s 2 1.01x
💻 Local Express 57.273s (~) 58.103s (~) 0.829s 2 1.01x
🐘 Postgres Next.js (Turbopack) 72.109s 72.674s 0.565s 2 1.28x
🐘 Postgres Express 75.242s (-25.1% 🟢) 75.676s (-25.2% 🟢) 0.434s 2 1.33x
🐘 Postgres Nitro 100.337s (~) 101.242s (~) 0.905s 1 1.78x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 101.757s (-3.5%) 102.416s (-4.0%) 0.659s 1 1.00x
▲ Vercel Express 102.701s (-1.9%) 103.341s (-2.6%) 0.640s 1 1.01x
▲ Vercel Next.js (Turbopack) 103.493s (-5.5% 🟢) 104.894s (-5.6% 🟢) 1.401s 1 1.02x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 1.387s 2.004s 0.618s 15 1.00x
💻 Local Nitro 1.413s (+1.0%) 2.006s (~) 0.593s 15 1.02x
💻 Local Express 1.418s (~) 2.005s (~) 0.587s 15 1.02x
🐘 Postgres Express 2.154s (-11.7% 🟢) 3.017s (~) 0.862s 10 1.55x
🐘 Postgres Nitro 2.367s (-1.6%) 3.014s (~) 0.646s 10 1.71x
🐘 Postgres Next.js (Turbopack) 2.387s 2.923s 0.536s 11 1.72x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.197s (+11.8% 🔺) 4.198s (+11.9% 🔺) 1.001s 8 1.00x
▲ Vercel Next.js (Turbopack) 3.246s (+8.1% 🔺) 4.374s (+9.5% 🔺) 1.129s 7 1.02x
▲ Vercel Nitro 3.833s (+48.0% 🔺) 4.653s (+32.8% 🔺) 0.820s 7 1.20x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 2.478s 3.008s 0.530s 10 1.00x
💻 Local Nitro 2.530s (-1.1%) 3.007s (~) 0.477s 10 1.02x
💻 Local Express 2.582s (-2.3%) 3.007s (~) 0.426s 10 1.04x
🐘 Postgres Nitro 9.520s (+10.7% 🔺) 10.028s (+11.1% 🔺) 0.508s 4 3.84x
🐘 Postgres Express 11.212s (+42.3% 🔺) 11.702s (+41.3% 🔺) 0.490s 3 4.53x
🐘 Postgres Next.js (Turbopack) 12.677s 13.371s 0.694s 3 5.12x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.099s (-1.8%) 4.493s (+3.4%) 1.393s 7 1.00x
▲ Vercel Nitro 3.209s (-1.6%) 4.366s (~) 1.157s 8 1.04x
▲ Vercel Next.js (Turbopack) 4.344s (+37.3% 🔺) 5.506s (+33.4% 🔺) 1.162s 6 1.40x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 6.881s 7.413s 0.532s 5 1.00x
💻 Local Nitro 7.051s (-1.6%) 7.418s (-7.5% 🟢) 0.367s 5 1.02x
💻 Local Express 7.416s (-2.7%) 8.022s (~) 0.606s 4 1.08x
🐘 Postgres Express 51.384s (+4.8%) 52.110s (+6.1% 🔺) 0.726s 1 7.47x
🐘 Postgres Nitro 52.366s (+6.5% 🔺) 53.122s (+6.0% 🔺) 0.756s 1 7.61x
🐘 Postgres Next.js (Turbopack) 55.371s 56.127s 0.756s 1 8.05x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.555s (+8.1% 🔺) 4.698s (+0.9%) 1.143s 7 1.00x
▲ Vercel Nitro 3.648s (-2.7%) 4.857s (-8.0% 🟢) 1.209s 7 1.03x
▲ Vercel Next.js (Turbopack) 4.395s (+16.2% 🔺) 5.776s (+14.0% 🔺) 1.381s 6 1.24x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 1.415s 2.005s 0.589s 15 1.00x
💻 Local Nitro 1.417s (-0.6%) 2.004s (~) 0.587s 15 1.00x
💻 Local Express 1.430s (+1.0%) 2.005s (~) 0.575s 15 1.01x
🐘 Postgres Nitro 2.071s (+1.3%) 3.014s (+10.0% 🔺) 0.943s 10 1.46x
🐘 Postgres Express 2.263s (+19.9% 🔺) 3.014s (+16.1% 🔺) 0.751s 11 1.60x
🐘 Postgres Next.js (Turbopack) 2.469s 2.830s 0.361s 11 1.74x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.553s (-6.4% 🟢) 3.165s (-12.4% 🟢) 0.612s 10 1.00x
▲ Vercel Next.js (Turbopack) 2.652s (-8.0% 🟢) 3.545s (-10.5% 🟢) 0.894s 9 1.04x
▲ Vercel Nitro 2.689s (+1.9%) 3.627s (-1.3%) 0.938s 9 1.05x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 2.559s 3.008s 0.448s 10 1.00x
💻 Local Nitro 2.669s (+0.6%) 3.006s (~) 0.337s 10 1.04x
💻 Local Express 2.712s (~) 3.008s (~) 0.296s 10 1.06x
🐘 Postgres Express 12.311s (+17.7% 🔺) 12.707s (+15.2% 🔺) 0.396s 3 4.81x
🐘 Postgres Nitro 12.735s (+8.4% 🔺) 13.365s (+11.1% 🔺) 0.629s 3 4.98x
🐘 Postgres Next.js (Turbopack) 13.879s 14.370s 0.492s 3 5.42x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.941s (-4.2%) 4.139s (-20.8% 🟢) 1.199s 8 1.00x
▲ Vercel Next.js (Turbopack) 3.078s (-5.3% 🟢) 4.647s (+7.4% 🔺) 1.569s 7 1.05x
▲ Vercel Express 3.363s (+4.6%) 4.499s (-12.8% 🟢) 1.136s 7 1.14x

🔍 Observability: Nitro | Next.js (Turbopack) | Express

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 7.752s 8.266s 0.515s 4 1.00x
💻 Local Nitro 7.841s (-2.3%) 8.273s (-2.9%) 0.432s 4 1.01x
💻 Local Express 8.241s (+5.1% 🔺) 9.026s (+12.5% 🔺) 0.785s 4 1.06x
🐘 Postgres Nitro 51.295s (-5.9% 🟢) 52.114s (-5.4% 🟢) 0.819s 1 6.62x
🐘 Postgres Express 51.323s (-0.7%) 52.143s (~) 0.820s 1 6.62x
🐘 Postgres Next.js (Turbopack) 58.383s 59.121s 0.738s 1 7.53x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 3.630s (-2.9%) 4.994s (-3.7%) 1.364s 7 1.00x
▲ Vercel Nitro 4.077s (+14.5% 🔺) 5.118s (~) 1.041s 6 1.12x
▲ Vercel Express 4.529s (+31.7% 🔺) 5.544s (+17.7% 🔺) 1.015s 6 1.25x

🔍 Observability: Next.js (Turbopack) | 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 🥇 Next.js (Turbopack) 0.141s 1.001s 0.010s 1.015s 0.874s 10 1.00x
💻 Local Nitro 0.172s (~) 1.002s (~) 0.010s (-1.9%) 1.015s (~) 0.843s 10 1.21x
💻 Local Express 0.176s (+3.3%) 1.002s (~) 0.011s (+5.0%) 1.015s (~) 0.839s 10 1.24x
🐘 Postgres Express 1.076s (-55.2% 🟢) 1.951s (-26.1% 🟢) 0.001s (+16.7% 🔺) 2.013s (-33.2% 🟢) 0.937s 10 7.60x
🐘 Postgres Next.js (Turbopack) 1.088s 1.146s 0.003s 1.313s 0.225s 10 7.69x
🐘 Postgres Nitro 2.450s (~) 2.591s (~) 0.001s (~) 3.013s (~) 0.564s 10 17.31x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.339s (-8.9% 🟢) 2.710s (-3.4%) 0.152s (-32.9% 🟢) 3.424s (-8.3% 🟢) 1.085s 10 1.00x
▲ Vercel Nitro 2.437s (-4.8%) 2.841s (-4.9%) 0.257s (+4.6%) 3.676s (-6.9% 🟢) 1.240s 10 1.04x
▲ Vercel Next.js (Turbopack) 2.636s (-2.7%) 3.384s (+12.4% 🔺) 0.194s (-29.8% 🟢) 4.190s (+6.1% 🔺) 1.554s 10 1.13x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Next.js (Turbopack) 11/12
🐘 Postgres Express 6/12
▲ Vercel Nitro 6/12
Fastest World by Framework

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 💻 Local 10/12
Next.js (Turbopack) 💻 Local 10/12
Nitro 💻 Local 10/12
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
  • 🌐 Starter: Community world (local development)
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run

@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented Feb 7, 2026

Copy link
Copy Markdown
Member Author

This stack of pull requests is managed by Graphite. Learn more about stacking.

@TooTallNate TooTallNate changed the title refactor: remove /api/hook and /api/test-health-check endpoints, call APIs directly [e2e] remove /api/hook and /api/test-health-check endpoints, call APIs directly Feb 7, 2026
@TooTallNate TooTallNate changed the title [e2e] remove /api/hook and /api/test-health-check endpoints, call APIs directly [e2e] Remove /api/hook and /api/test-health-check endpoints, call APIs directly Feb 7, 2026
@TooTallNate TooTallNate marked this pull request as ready for review February 7, 2026 07:45
@TooTallNate TooTallNate requested review from a team and Copilot February 7, 2026 07:45
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 continues the E2E refactor from #958 by removing the remaining workbench HTTP indirection for hooks and queue-based health checks, updating E2E tests/benchmarks to call the runtime APIs directly, and adding the missing changeset for a Nitro prod manifest/handler fix.

Changes:

  • Removed /api/hook and /api/test-health-check endpoints across workbench apps.
  • Refactored E2E hook + queue-health-check tests to use getHookByToken() / resumeHook() / healthCheck() directly.
  • Simplified benchmark runner by removing debug logging and using run.returnValue directly.

Reviewed changes

Copilot reviewed 25 out of 25 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
workbench/vite/routes/api/test-health-check.post.ts Removed queue-health-check test endpoint.
workbench/vite/routes/api/hook.post.ts Removed hook resume endpoint.
workbench/sveltekit/src/routes/api/test-health-check/+server.ts Removed queue-health-check test endpoint.
workbench/sveltekit/src/routes/api/hook/+server.ts Removed hook resume endpoint.
workbench/nuxt/server/api/test-health-check.post.ts Removed queue-health-check test endpoint.
workbench/nuxt/server/api/hook.post.ts Removed hook resume endpoint.
workbench/nitro-v3/routes/api/test-health-check.post.ts Removed queue-health-check test endpoint.
workbench/nitro-v3/routes/api/hook.post.ts Removed hook resume endpoint.
workbench/nitro-v2/server/api/test-health-check.post.ts Removed queue-health-check test endpoint.
workbench/nitro-v2/server/api/hook.post.ts Removed hook resume endpoint.
workbench/nextjs-webpack/app/api/test-health-check/route.ts Removed queue-health-check test endpoint.
workbench/nextjs-webpack/app/api/hook/route.ts Removed hook resume endpoint.
workbench/nextjs-turbopack/app/api/test-health-check/route.ts Removed queue-health-check test endpoint.
workbench/nextjs-turbopack/app/api/hook/route.ts Removed hook resume endpoint route reference.
workbench/nest/src/app.controller.ts Removed hook + queue-health-check endpoints from Nest controller.
workbench/hono/src/index.ts Removed hook + queue-health-check routes from Hono app.
workbench/fastify/src/index.ts Removed hook + queue-health-check routes from Fastify app.
workbench/express/src/index.ts Removed hook + queue-health-check routes from Express app.
workbench/example/api/test-health-check.ts Removed queue-health-check test endpoint.
workbench/example/api/hook.ts Removed hook resume endpoint.
workbench/astro/src/pages/api/test-health-check.ts Removed queue-health-check test endpoint.
workbench/astro/src/pages/api/hook.ts Removed hook resume endpoint.
packages/core/e2e/e2e.test.ts Updated hook + queue-health-check E2E tests to call runtime APIs directly.
packages/core/e2e/bench.bench.ts Removed debug logging and awaitReturnValue() wrapper; use run.returnValue directly.
.changeset/expose-public-manifest.md Adds patch changeset for Nitro prod manifest/handler fix.

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

Comment thread packages/core/e2e/e2e.test.ts
Comment thread packages/core/e2e/e2e.test.ts Outdated
Comment thread packages/core/e2e/e2e.test.ts
Comment thread packages/core/e2e/e2e.test.ts Outdated
Comment thread packages/core/e2e/e2e.test.ts Outdated
Comment thread packages/core/e2e/bench.bench.ts
… APIs directly

- Remove debug logging from bench.bench.ts
- Remove awaitReturnValue() wrapper, use run.returnValue directly in benchmarks
- Add changeset for Nitro builder manifest fix
- Refactor hookWorkflow tests to call getHookByToken()/resumeHook() directly
  (pass hook object to resumeHook to avoid duplicate lookups)
- Refactor queue-based health check test to call healthCheck() directly
- Assert specific error message for invalid hook token test
- Remove /api/hook and /api/test-health-check endpoints from all workbench apps
  (nextjs-turbopack, nextjs-webpack, vite, hono, express, fastify, sveltekit,
  astro, nuxt, nitro-v2, nitro-v3, nest, example)
@TooTallNate TooTallNate merged commit 5b5b36a into main Feb 7, 2026
124 of 128 checks passed
@TooTallNate TooTallNate deleted the 02-07-e2e_cleanup_remove_more_endpoints branch February 7, 2026 17:00
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.

3 participants