fix(platform): preserve fiber context in HttpLayerRouter.addHttpApi so API-level middleware is applied#6147
Open
syhstanley wants to merge 2 commits intoEffect-TS:mainfrom
Conversation
When `HttpLayerRouter.addHttpApi` wrapped route handlers using `Effect.provide(route.handler, context)`, it replaced the entire fiber context (via `fiberRefLocally`). This silently discarded any services injected at runtime — most notably `Session` provided by API-level `HttpApiMiddleware` via `provideServiceEffect`. The bug manifested as: - Endpoints returning 200 instead of 401 when rejecting middleware was configured (middleware was skipped entirely for the second API in `Layer.mergeAll`) - Endpoints returning 500 "Service not found: Session" when accepting middleware was configured (Session injected by middleware was overwritten before the handler ran) Fix: replace `Effect.provide` with `Effect.mapInputContext` so the build-time platform services context is *merged* into the runtime fiber context rather than replacing it. This preserves all request-time services (including Session from API-level middleware). Adds regression tests for GitHub issue Effect-TS#6121. Fixes Effect-TS#6121 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
🦋 Changeset detectedLatest commit: 5fd07e0 The changes in this PR will be included in the next version bump. This PR includes changesets to release 31 packages
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 |
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixes #6121 —
@effect/platform HttpApi: middleware is skippedwhen usingHttpLayerRouter.addHttpApiwith multiple APIs combined viaLayer.mergeAll.Root Cause
In
HttpLayerRouter.addHttpApi, each route handler was wrapped with:Effect.providecallsfiberRefLocally(currentContext, context)which replaces the entire fiber context with the captured build-time context. This silently discards any services injected at request time — most notably theSessionservice provided by API-levelHttpApiMiddlewareviaEffect.provideServiceEffect.Fix
Replace
Effect.providewithEffect.mapInputContextto merge the build-time platform services into the runtime fiber context instead of replacing it:This preserves all request-time services (including
Sessionfrom API-level middleware) while still ensuring the required platform services (Etag, FileSystem, HttpPlatform, Path, HttpRouter) are available. This is the same pattern already used byHttpApiBuilder.groupinternally.Symptoms Fixed
Layer.mergeAll)Tests
Adds
packages/platform-node/test/HttpApiLayerRouterMiddleware.test.tswith 5 regression tests covering:Test plan
HttpApi.test.tstests continue to pass🤖 Generated with Claude Code