Skip to content

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

…equests

Add undici Agent with allowH2 and pipelining to all fetch calls in
world-vercel, enabling HTTP/2 multiplexing and connection reuse for
both the storage API (makeRequest) and streaming API paths.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
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: 9b895c7

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.032s (+26.5% 🔺) 1.005s (~) 0.973s 10 1.00x
💻 Local Nitro 0.032s (-3.3%) 1.005s (~) 0.973s 10 1.01x
💻 Local Next.js (Turbopack) 0.038s (-7.1% 🟢) 1.005s (~) 0.967s 10 1.19x
🌐 Redis Next.js (Turbopack) 0.045s (-2.4%) 1.005s (~) 0.959s 10 1.42x
🌐 MongoDB Next.js (Turbopack) 0.091s (-5.7% 🟢) 1.007s (~) 0.917s 10 2.83x
🐘 Postgres Express 0.128s (+30.4% 🔺) 1.010s (~) 0.882s 10 4.01x
🐘 Postgres Nitro 0.336s (+155.8% 🔺) 1.009s (~) 0.673s 10 10.50x
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -
workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 1.104s (+2.7%) 2.005s (~) 0.901s 10 1.00x
💻 Local Next.js (Turbopack) 1.105s (~) 2.006s (~) 0.901s 10 1.00x
💻 Local Nitro 1.107s (~) 2.006s (~) 0.899s 10 1.00x
🌐 Redis Next.js (Turbopack) 1.110s (+0.7%) 2.006s (~) 0.896s 10 1.01x
🌐 MongoDB Next.js (Turbopack) 1.281s (-3.0%) 2.009s (~) 0.728s 10 1.16x
🐘 Postgres Nitro 1.911s (-21.8% 🟢) 2.011s (-33.3% 🟢) 0.100s 10 1.73x
🐘 Postgres Express 2.443s (-1.2%) 3.015s (~) 0.571s 10 2.21x
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -
workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 10.722s (~) 11.022s (~) 0.300s 3 1.00x
💻 Local Next.js (Turbopack) 10.743s (~) 11.023s (~) 0.279s 3 1.00x
💻 Local Express 10.820s (+2.4%) 11.023s (~) 0.203s 3 1.01x
💻 Local Nitro 10.824s (-0.6%) 11.022s (~) 0.198s 3 1.01x
🌐 MongoDB Next.js (Turbopack) 12.205s (-0.6%) 13.017s (~) 0.812s 3 1.14x
🐘 Postgres Nitro 15.290s (-24.9% 🟢) 16.044s (-23.8% 🟢) 0.754s 2 1.43x
🐘 Postgres Express 20.361s (~) 21.058s (~) 0.697s 2 1.90x
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -
workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 26.948s (~) 27.052s (~) 0.104s 3 1.00x
💻 Local Next.js (Turbopack) 27.296s (~) 28.053s (~) 0.757s 3 1.01x
💻 Local Express 27.474s (+2.5%) 28.053s (+3.7%) 0.579s 3 1.02x
💻 Local Nitro 27.521s (~) 28.050s (~) 0.530s 3 1.02x
🌐 MongoDB Next.js (Turbopack) 30.468s (~) 31.035s (~) 0.566s 2 1.13x
🐘 Postgres Nitro 37.601s (-25.1% 🟢) 38.088s (-25.5% 🟢) 0.487s 2 1.40x
🐘 Postgres Express 50.370s (~) 51.129s (+1.0%) 0.759s 2 1.87x
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -
workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 54.444s (~) 55.101s (~) 0.657s 2 1.00x
💻 Local Next.js (Turbopack) 56.979s (~) 57.607s (+0.9%) 0.628s 2 1.05x
💻 Local Express 57.284s (+2.8%) 58.100s (+3.6%) 0.816s 2 1.05x
💻 Local Nitro 57.459s (~) 58.103s (~) 0.644s 2 1.06x
🌐 MongoDB Next.js (Turbopack) 60.812s (~) 61.074s (~) 0.262s 2 1.12x
🐘 Postgres Nitro 74.506s (-25.8% 🟢) 75.161s (-25.8% 🟢) 0.655s 2 1.37x
🐘 Postgres Express 100.259s (~) 101.237s (~) 0.978s 1 1.84x
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -
Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 1.251s (-1.3%) 2.006s (~) 0.755s 15 1.00x
💻 Local Nitro 1.406s (-1.8%) 2.006s (~) 0.599s 15 1.12x
💻 Local Express 1.416s (+4.5%) 2.005s (~) 0.589s 15 1.13x
💻 Local Next.js (Turbopack) 1.423s (+1.0%) 2.006s (~) 0.583s 15 1.14x
🌐 MongoDB Next.js (Turbopack) 2.143s (-0.8%) 3.008s (~) 0.865s 10 1.71x
🐘 Postgres Nitro 2.202s (+2.2%) 2.678s (+6.6% 🔺) 0.476s 12 1.76x
🐘 Postgres Express 2.293s (-0.6%) 3.014s (~) 0.721s 10 1.83x
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -
Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 2.525s (+1.2%) 3.008s (~) 0.482s 10 1.00x
💻 Local Express 2.599s (+13.4% 🔺) 3.008s (~) 0.409s 10 1.03x
💻 Local Nitro 2.615s (+1.8%) 3.008s (~) 0.393s 10 1.04x
💻 Local Next.js (Turbopack) 2.670s (+11.0% 🔺) 3.008s (~) 0.338s 10 1.06x
🌐 MongoDB Next.js (Turbopack) 4.683s (-1.7%) 5.177s (~) 0.494s 6 1.85x
🐘 Postgres Express 9.469s (+10.8% 🔺) 10.034s (+11.1% 🔺) 0.565s 3 3.75x
🐘 Postgres Nitro 10.931s (+19.1% 🔺) 11.033s (+15.8% 🔺) 0.102s 3 4.33x
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -
Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 4.104s (+1.2%) 4.867s (+3.0%) 0.763s 7 1.00x
💻 Local Express 7.383s (+17.1% 🔺) 8.020s (+14.4% 🔺) 0.636s 4 1.80x
💻 Local Nitro 7.534s (+2.0%) 8.021s (~) 0.487s 4 1.84x
💻 Local Next.js (Turbopack) 7.720s (+17.8% 🔺) 8.267s (+10.0% 🔺) 0.547s 4 1.88x
🌐 MongoDB Next.js (Turbopack) 9.967s (~) 10.353s (-3.2%) 0.386s 3 2.43x
🐘 Postgres Express 46.305s (-2.7%) 47.124s (-2.1%) 0.819s 1 11.28x
🐘 Postgres Nitro 51.785s (+4.8%) 52.146s (+4.0%) 0.361s 1 12.62x
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -
Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 1.243s (-2.7%) 2.006s (~) 0.763s 15 1.00x
💻 Local Nitro 1.429s (+1.2%) 2.005s (~) 0.576s 15 1.15x
💻 Local Express 1.430s (+5.4% 🔺) 2.005s (~) 0.574s 15 1.15x
💻 Local Next.js (Turbopack) 1.459s (+3.7%) 2.005s (~) 0.546s 15 1.17x
🐘 Postgres Express 2.089s (+2.4%) 2.474s (-9.8% 🟢) 0.386s 13 1.68x
🐘 Postgres Nitro 2.104s (+5.4% 🔺) 2.597s (~) 0.493s 12 1.69x
🌐 MongoDB Next.js (Turbopack) 2.132s (-1.6%) 3.008s (~) 0.876s 10 1.72x
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -
Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 2.553s (~) 3.008s (~) 0.455s 10 1.00x
💻 Local Nitro 2.717s (+2.8%) 3.008s (~) 0.291s 10 1.06x
💻 Local Express 2.727s (+13.9% 🔺) 3.007s (~) 0.281s 10 1.07x
💻 Local Next.js (Turbopack) 2.804s (+14.3% 🔺) 3.108s (+3.3%) 0.303s 10 1.10x
🌐 MongoDB Next.js (Turbopack) 4.689s (-2.4%) 5.177s (-3.1%) 0.489s 6 1.84x
🐘 Postgres Express 10.893s (-9.9% 🟢) 11.364s (-8.1% 🟢) 0.471s 3 4.27x
🐘 Postgres Nitro 12.246s (+10.4% 🔺) 12.701s (+5.5% 🔺) 0.455s 3 4.80x
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -
Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 4.108s (~) 4.868s (+6.3% 🔺) 0.760s 7 1.00x
💻 Local Express 8.059s (+11.3% 🔺) 8.768s (+9.4% 🔺) 0.709s 4 1.96x
💻 Local Next.js (Turbopack) 8.170s (+14.6% 🔺) 8.769s (+16.6% 🔺) 0.599s 4 1.99x
💻 Local Nitro 8.256s (+6.4% 🔺) 9.024s (+12.5% 🔺) 0.767s 4 2.01x
🌐 MongoDB Next.js (Turbopack) 10.042s (-1.6%) 10.347s (-3.2%) 0.306s 3 2.44x
🐘 Postgres Express 47.243s (-8.5% 🟢) 48.110s (-7.7% 🟢) 0.867s 1 11.50x
🐘 Postgres Nitro 51.378s (-4.1%) 52.128s (-3.7%) 0.750s 1 12.51x
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -
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.146s (-0.8%) 1.001s (~) 0.011s (+8.8% 🔺) 1.017s (~) 0.871s 10 1.00x
🌐 Redis Next.js (Turbopack) 0.152s (-0.8%) 0.999s (~) 0.001s (-7.7% 🟢) 1.007s (~) 0.855s 10 1.04x
💻 Local Nitro 0.176s (-4.7%) 1.002s (~) 0.011s (+6.6% 🔺) 1.017s (~) 0.841s 10 1.21x
💻 Local Express 0.177s (+60.7% 🔺) 1.003s (~) 0.011s (+12.5% 🔺) 1.016s (~) 0.839s 10 1.22x
🌐 MongoDB Next.js (Turbopack) 0.504s (~) 0.939s (-1.1%) 0.001s (+18.2% 🔺) 1.009s (~) 0.505s 10 3.46x
🐘 Postgres Nitro 0.982s (-58.6% 🟢) 0.758s (-70.0% 🟢) 0.001s (~) 1.111s (-61.9% 🟢) 0.129s 10 6.74x
🐘 Postgres Express 2.367s (-3.1%) 2.675s (+3.0%) 0.001s (+9.1% 🔺) 3.015s (~) 0.648s 10 16.25x
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - - -

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Express 5/12
🐘 Postgres Express 6/12
Fastest World by Framework

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 💻 Local 12/12
Next.js (Turbopack) 🌐 Redis 9/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 432 58 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 102 42 9 153
✅ 📋 Other 123 0 21 144
Total 1956 100 257 2313

❌ Failed Tests

▲ Vercel Production (58 failed)

astro (2 failed):

  • promiseAllWorkflow
  • promiseRaceWorkflow

example (2 failed):

  • promiseAllWorkflow
  • hookWorkflow

express (1 failed):

  • promiseRaceWorkflow

fastify (5 failed):

  • promiseAllWorkflow
  • readableStreamWorkflow
  • promiseRaceStressTestWorkflow
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • Calculator.calculate - static workflow method using static step methods from another class

nextjs-webpack (1 failed):

  • promiseAnyWorkflow

nuxt (3 failed):

  • promiseRaceWorkflow
  • promiseRaceStressTestWorkflow
  • error handling error propagation workflow errors nested function calls preserve message and stack trace

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 (5 failed):

  • promiseAnyWorkflow
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • ChainableService.processWithThis - static step methods using this to reference the class
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument
🌍 Community Worlds (42 failed)

mongodb (1 failed):

  • webhookWorkflow

turso (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
  • 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 42 2 4
❌ express 43 1 4
❌ fastify 39 5 4
✅ hono 44 0 4
✅ nextjs-turbopack 47 0 1
❌ nextjs-webpack 46 1 1
✅ nitro 44 0 4
❌ nuxt 41 3 4
❌ sveltekit 5 39 4
❌ vite 39 5 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 44 1 3
✅ redis-dev 3 0 0
✅ redis 45 0 3
✅ turso-dev 3 0 0
❌ turso 4 41 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 requested a review from a team February 12, 2026 08:48
The undici h2 Agent conflicts with duplex: 'half' streaming requests in
Vercel Functions, causing connections to hang. Keep h2 for standard
request/response calls in makeRequest() only.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
The change from fetch(new Request(...)) to fetch(url, {...}) altered
request body/header normalization, causing HTTP 400s. Restore the
original new Request() pattern and pass dispatcher as the second arg
to fetch(request, { dispatcher }).

Co-Authored-By: Claude Opus 4.6 <[email protected]>
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