Skip to content

perf(world-vercel): use HTTP/2 with connection multiplexing#1019

Draft
pranaygp wants to merge 4 commits intomainfrom
pranaygp/workflow-h2-client
Draft

perf(world-vercel): use HTTP/2 with connection multiplexing#1019
pranaygp wants to merge 4 commits intomainfrom
pranaygp/workflow-h2-client

Conversation

@pranaygp
Copy link
Collaborator

Summary

  • Add undici Agent with allowH2: true and pipelining: 10 to all fetch calls in @workflow/world-vercel
  • Covers both the centralized makeRequest() path (22 API calls) and the direct streaming fetch calls (5 calls)
  • Mirrors the approach from vercel/vqs#120 — no server-side changes needed since Vercel's edge already handles h2 termination

Test plan

  • All 24 existing unit tests pass
  • Full workspace build succeeds (26/26 packages)
  • Verify h2 negotiation works against vercel-workflow.com in a deployed preview

🤖 Generated with Claude Code

Copilot AI review requested due to automatic review settings February 12, 2026 08:38
@vercel
Copy link
Contributor

vercel bot commented Feb 12, 2026

@changeset-bot
Copy link

changeset-bot bot commented Feb 12, 2026

🦋 Changeset detected

Latest commit: 2552392

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

This PR includes changesets to release 15 packages
Name Type
@workflow/world-vercel Patch
@workflow/cli Patch
@workflow/core Patch
workflow Patch
@workflow/world-testing Patch
@workflow/builders Patch
@workflow/next Patch
@workflow/nitro Patch
@workflow/web-shared Patch
@workflow/astro Patch
@workflow/nest Patch
@workflow/rollup Patch
@workflow/sveltekit Patch
@workflow/vite Patch
@workflow/nuxt 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
Contributor

github-actions bot commented Feb 12, 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.026s (+2.3%) 1.005s (~) 0.979s 10 1.00x
💻 Local Nitro 0.032s (-0.6%) 1.005s (~) 0.973s 10 1.24x
💻 Local Next.js (Turbopack) 0.045s (+10.8% 🔺) 1.005s (~) 0.960s 10 1.73x
🌐 Redis Next.js (Turbopack) 0.049s (+5.8% 🔺) 1.005s (~) 0.955s 10 1.87x
🌐 MongoDB Next.js (Turbopack) 0.106s (+6.8% 🔺) 1.007s (~) 0.901s 10 4.05x
🐘 Postgres Express 0.300s (-22.7% 🟢) 1.010s (-1.1%) 0.710s 10 11.45x
🐘 Postgres Next.js (Turbopack) 0.378s 1.010s 0.632s 10 14.42x
🐘 Postgres Nitro 0.384s (+3.4%) 1.029s (+1.9%) 0.645s 10 14.64x
workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 1.073s (~) 2.006s (~) 0.933s 10 1.00x
💻 Local Next.js (Turbopack) 1.097s (~) 2.006s (~) 0.908s 10 1.02x
🌐 Redis Next.js (Turbopack) 1.101s (-0.6%) 2.006s (~) 0.905s 10 1.03x
💻 Local Nitro 1.107s (~) 2.005s (~) 0.898s 10 1.03x
🌐 MongoDB Next.js (Turbopack) 1.292s (-0.6%) 2.008s (~) 0.716s 10 1.20x
🐘 Postgres Next.js (Turbopack) 1.780s 2.012s 0.232s 10 1.66x
🐘 Postgres Express 1.924s (-17.0% 🟢) 2.013s (-30.9% 🟢) 0.089s 10 1.79x
🐘 Postgres Nitro 2.262s (-6.4% 🟢) 3.015s (~) 0.752s 10 2.11x
workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 10.563s (~) 11.023s (~) 0.460s 3 1.00x
💻 Local Next.js (Turbopack) 10.721s (~) 11.022s (~) 0.300s 3 1.02x
🌐 Redis Next.js (Turbopack) 10.731s (~) 11.023s (~) 0.292s 3 1.02x
💻 Local Nitro 10.834s (~) 11.022s (~) 0.188s 3 1.03x
🌐 MongoDB Next.js (Turbopack) 12.208s (~) 13.016s (~) 0.808s 3 1.16x
🐘 Postgres Next.js (Turbopack) 15.131s 16.045s 0.914s 2 1.43x
🐘 Postgres Express 15.302s (-1.2%) 16.046s (~) 0.744s 2 1.45x
🐘 Postgres Nitro 20.116s (-0.9%) 21.058s (~) 0.943s 2 1.90x
workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 26.819s (~) 27.050s (~) 0.231s 3 1.00x
🌐 Redis Next.js (Turbopack) 26.974s (~) 27.054s (~) 0.080s 3 1.01x
💻 Local Next.js (Turbopack) 27.229s (~) 28.052s (~) 0.823s 3 1.02x
💻 Local Nitro 27.515s (~) 28.052s (~) 0.537s 3 1.03x
🌐 MongoDB Next.js (Turbopack) 30.404s (~) 31.039s (~) 0.635s 2 1.13x
🐘 Postgres Next.js (Turbopack) 37.215s 37.587s 0.371s 2 1.39x
🐘 Postgres Express 37.602s (-1.2%) 38.098s (-1.3%) 0.497s 2 1.40x
🐘 Postgres Nitro 50.402s (~) 51.134s (~) 0.732s 2 1.88x
workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 54.468s (~) 55.099s (~) 0.630s 2 1.00x
💻 Local Express 55.714s (~) 56.097s (~) 0.383s 2 1.02x
💻 Local Next.js (Turbopack) 56.722s (~) 57.099s (~) 0.377s 2 1.04x
💻 Local Nitro 57.382s (~) 58.103s (~) 0.721s 2 1.05x
🌐 MongoDB Next.js (Turbopack) 60.721s (~) 61.058s (~) 0.336s 2 1.11x
🐘 Postgres Next.js (Turbopack) 71.627s 72.155s 0.527s 2 1.32x
🐘 Postgres Express 74.010s (-18.0% 🟢) 74.671s (-18.1% 🟢) 0.661s 2 1.36x
🐘 Postgres Nitro 100.560s (~) 101.244s (~) 0.684s 1 1.85x
Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 1.235s (-2.2%) 2.006s (~) 0.772s 15 1.00x
💻 Local Express 1.345s (-0.8%) 2.006s (~) 0.661s 15 1.09x
💻 Local Next.js (Turbopack) 1.399s (-1.8%) 2.006s (~) 0.607s 15 1.13x
💻 Local Nitro 1.432s (+1.3%) 2.006s (~) 0.574s 15 1.16x
🐘 Postgres Next.js (Turbopack) 2.158s 2.831s 0.673s 11 1.75x
🌐 MongoDB Next.js (Turbopack) 2.159s (+0.6%) 3.008s (~) 0.849s 10 1.75x
🐘 Postgres Express 2.303s (-1.2%) 2.596s (-11.2% 🟢) 0.293s 12 1.87x
🐘 Postgres Nitro 2.473s (+7.0% 🔺) 3.016s (~) 0.543s 10 2.00x
Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 2.325s (+1.7%) 3.007s (~) 0.682s 10 1.00x
🌐 Redis Next.js (Turbopack) 2.517s (~) 3.008s (~) 0.491s 10 1.08x
💻 Local Next.js (Turbopack) 2.574s (-3.0%) 3.007s (~) 0.433s 10 1.11x
💻 Local Nitro 2.637s (+1.8%) 3.007s (~) 0.371s 10 1.13x
🌐 MongoDB Next.js (Turbopack) 4.617s (~) 5.176s (~) 0.559s 6 1.99x
🐘 Postgres Nitro 8.514s (~) 9.028s (+2.8%) 0.514s 4 3.66x
🐘 Postgres Express 9.362s (+1.2%) 10.042s (+5.4% 🔺) 0.680s 3 4.03x
🐘 Postgres Next.js (Turbopack) 13.243s 13.705s 0.462s 3 5.69x
Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 4.097s (~) 4.868s (+6.2% 🔺) 0.771s 7 1.00x
💻 Local Express 6.390s (+1.1%) 7.013s (~) 0.623s 5 1.56x
💻 Local Next.js (Turbopack) 7.186s (-12.9% 🟢) 7.764s (-8.8% 🟢) 0.579s 4 1.75x
💻 Local Nitro 7.776s (+1.2%) 8.017s (~) 0.241s 4 1.90x
🌐 MongoDB Next.js (Turbopack) 9.985s (+3.3%) 10.345s (~) 0.360s 3 2.44x
🐘 Postgres Nitro 48.237s (+6.4% 🔺) 49.120s (+6.5% 🔺) 0.883s 1 11.77x
🐘 Postgres Express 50.493s (+19.5% 🔺) 51.139s (+18.6% 🔺) 0.646s 1 12.33x
🐘 Postgres Next.js (Turbopack) 53.178s 54.121s 0.943s 1 12.98x
Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 1.258s (+1.9%) 2.006s (~) 0.749s 15 1.00x
💻 Local Express 1.373s (-0.7%) 2.005s (~) 0.632s 15 1.09x
💻 Local Nitro 1.430s (+0.8%) 2.004s (~) 0.574s 15 1.14x
💻 Local Next.js (Turbopack) 1.456s (-0.7%) 2.006s (~) 0.549s 15 1.16x
🐘 Postgres Next.js (Turbopack) 2.076s 2.513s 0.436s 12 1.65x
🐘 Postgres Express 2.091s (-1.8%) 2.598s (+3.3%) 0.507s 12 1.66x
🌐 MongoDB Next.js (Turbopack) 2.191s (+3.0%) 3.008s (~) 0.817s 10 1.74x
🐘 Postgres Nitro 2.216s (+1.4%) 2.740s (~) 0.524s 11 1.76x
Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 2.400s (+1.4%) 3.008s (~) 0.607s 10 1.00x
🌐 Redis Next.js (Turbopack) 2.490s (~) 3.008s (~) 0.518s 10 1.04x
💻 Local Next.js (Turbopack) 2.712s (-8.7% 🟢) 3.107s (-7.0% 🟢) 0.395s 10 1.13x
💻 Local Nitro 2.731s (~) 3.007s (~) 0.277s 10 1.14x
🌐 MongoDB Next.js (Turbopack) 4.815s (+3.0%) 5.176s (~) 0.361s 6 2.01x
🐘 Postgres Express 11.253s (-14.0% 🟢) 11.367s (-15.0% 🟢) 0.114s 3 4.69x
🐘 Postgres Nitro 12.185s (-7.1% 🟢) 12.704s (-5.0%) 0.520s 3 5.08x
🐘 Postgres Next.js (Turbopack) 12.382s 13.034s 0.652s 3 5.16x
Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 4.052s (-0.8%) 4.581s (-5.9% 🟢) 0.529s 7 1.00x
💻 Local Express 6.889s (+0.7%) 7.215s (~) 0.326s 5 1.70x
💻 Local Next.js (Turbopack) 7.569s (-14.9% 🟢) 8.268s (-13.1% 🟢) 0.699s 4 1.87x
💻 Local Nitro 8.045s (~) 8.773s (-2.8%) 0.728s 4 1.99x
🌐 MongoDB Next.js (Turbopack) 9.737s (-2.9%) 10.345s (~) 0.608s 3 2.40x
🐘 Postgres Nitro 52.929s (-1.2%) 53.125s (-1.8%) 0.196s 1 13.06x
🐘 Postgres Express 53.527s (-2.0%) 54.149s (-1.8%) 0.622s 1 13.21x
🐘 Postgres Next.js (Turbopack) 53.997s 54.123s 0.126s 1 13.33x
Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 0.110s (-3.0%) 1.002s (~) 0.010s (-1.0%) 1.015s (~) 0.905s 10 1.00x
💻 Local Next.js (Turbopack) 0.150s (-3.5%) 1.002s (~) 0.011s (+0.9%) 1.017s (~) 0.867s 10 1.36x
🌐 Redis Next.js (Turbopack) 0.150s (~) 1.000s (~) 0.001s (-15.4% 🟢) 1.007s (~) 0.857s 10 1.36x
💻 Local Nitro 0.175s (+0.6%) 1.002s (~) 0.011s (+2.7%) 1.017s (~) 0.842s 10 1.59x
🌐 MongoDB Next.js (Turbopack) 0.504s (-1.1%) 0.940s (+0.5%) 0.002s (+21.4% 🔺) 1.008s (~) 0.504s 10 4.57x
🐘 Postgres Next.js (Turbopack) 0.783s 0.783s 0.001s 1.011s 0.227s 10 7.10x
🐘 Postgres Express 1.338s (-3.5%) 1.701s (+2.8%) 0.001s (+9.1% 🔺) 2.014s (~) 0.676s 10 12.13x
🐘 Postgres Nitro 2.152s (-10.2% 🟢) 2.889s (+9.1% 🔺) 0.001s (~) 3.015s (~) 0.863s 10 19.51x

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Express 12/12
🐘 Postgres Next.js (Turbopack) 7/12
Fastest World by Framework

Winner determined by most benchmark wins

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

📋 View full workflow run

@github-actions
Copy link
Contributor

github-actions bot commented Feb 12, 2026

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
❌ ▲ Vercel Production 417 73 38 528
✅ 💻 Local Development 418 0 62 480
✅ 📦 Local Production 418 0 62 480
✅ 🐘 Local Postgres 418 0 62 480
✅ 🪟 Windows 45 0 3 48
❌ 🌍 Community Worlds 105 42 9 156
✅ 📋 Other 123 0 21 144
Total 1944 115 257 2316

❌ Failed Tests

▲ Vercel Production (73 failed)

astro (2 failed):

  • promiseRaceStressTestWorkflow
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step

example (1 failed):

  • promiseAnyWorkflow

express (2 failed):

  • promiseAnyWorkflow
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step

fastify (2 failed):

  • promiseRaceStressTestWorkflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion

hono (2 failed):

  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • AllInOneService.processNumber - static workflow method using sibling static step methods

nextjs-turbopack (4 failed):

  • promiseRaceWorkflow
  • promiseRaceStressTestWorkflow
  • error handling retry behavior regular Error retries until success
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step

nextjs-webpack (4 failed):

  • promiseAnyWorkflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pages router promiseAllWorkflow via pages router

nitro (5 failed):

  • promiseRaceStressTestWorkflow
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • thisSerializationWorkflow - step function invoked with .call() and .apply()

nuxt (5 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE

sveltekit (39 failed):

  • addTenWorkflow
  • addTenWorkflow
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • 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
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument

vite (7 failed):

  • promiseAllWorkflow
  • promiseRaceWorkflow
  • hookWorkflow
  • workflowAndStepMetadataWorkflow
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
🌍 Community Worlds (42 failed)

turso (42 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 retry behavior workflow completes despite transient 5xx on step_completed
  • 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
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument
  • 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 42 2 4
❌ example 43 1 4
❌ express 42 2 4
❌ fastify 42 2 4
❌ hono 42 2 4
❌ nextjs-turbopack 43 4 1
❌ nextjs-webpack 43 4 1
❌ nitro 39 5 4
❌ nuxt 39 5 4
❌ sveltekit 5 39 4
❌ vite 37 7 4
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 41 0 7
✅ express-stable 41 0 7
✅ fastify-stable 41 0 7
✅ hono-stable 41 0 7
✅ nextjs-turbopack-stable 45 0 3
✅ nextjs-webpack-stable 45 0 3
✅ nitro-stable 41 0 7
✅ nuxt-stable 41 0 7
✅ sveltekit-stable 41 0 7
✅ vite-stable 41 0 7
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 41 0 7
✅ express-stable 41 0 7
✅ fastify-stable 41 0 7
✅ hono-stable 41 0 7
✅ nextjs-turbopack-stable 45 0 3
✅ nextjs-webpack-stable 45 0 3
✅ nitro-stable 41 0 7
✅ nuxt-stable 41 0 7
✅ sveltekit-stable 41 0 7
✅ vite-stable 41 0 7
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 41 0 7
✅ express-stable 41 0 7
✅ fastify-stable 41 0 7
✅ hono-stable 41 0 7
✅ nextjs-turbopack-stable 45 0 3
✅ nextjs-webpack-stable 45 0 3
✅ nitro-stable 41 0 7
✅ nuxt-stable 41 0 7
✅ sveltekit-stable 41 0 7
✅ vite-stable 41 0 7
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 45 0 3
❌ 🌍 Community Worlds
App Passed Failed Skipped
✅ mongodb-dev 3 0 0
✅ mongodb 46 0 3
✅ redis-dev 3 0 0
✅ redis 46 0 3
✅ turso-dev 3 0 0
❌ turso 4 42 3
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 41 0 7
✅ e2e-local-postgres-nest-stable 41 0 7
✅ e2e-local-prod-nest-stable 41 0 7

📋 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.

Copy link
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 improves request performance in @workflow/world-vercel by introducing a shared undici Agent configured to negotiate HTTP/2 and reuse a single connection via multiplexing, then wiring that dispatcher into all relevant fetch paths.

Changes:

  • Add an undici Agent (allowH2: true, pipelining: 10) and pass it as dispatcher to the centralized makeRequest() fetch.
  • Pass the same dispatcher to all direct streaming fetch calls in streamer.ts.
  • Add undici dependency and a changeset for a patch release.

Reviewed changes

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

Show a summary per file
File Description
packages/world-vercel/src/utils.ts Creates a shared undici Agent and uses it for makeRequest() fetch calls.
packages/world-vercel/src/streamer.ts Threads the shared dispatcher into all streaming-related fetch calls.
packages/world-vercel/package.json Adds undici as a dependency for the Agent/dispatcher.
pnpm-lock.yaml Locks the new undici dependency resolution.
.changeset/h2-client.md Declares a patch release note for the performance change.
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

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

@pranaygp pranaygp force-pushed the pranaygp/workflow-h2-client branch from 9b895c7 to b875ea0 Compare February 13, 2026 02:06
The global fetch in Vercel Functions is patched by the runtime and
doesn't properly support the undici dispatcher option. Use undici's
fetch directly to ensure h2 dispatcher works correctly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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.

1 participant

Comments