diff --git a/packages/start/src/server/fetchEvent.ts b/packages/start/src/server/fetchEvent.ts index b61101b59..ffbae0080 100644 --- a/packages/start/src/server/fetchEvent.ts +++ b/packages/start/src/server/fetchEvent.ts @@ -1,4 +1,5 @@ -import { getRequestIP, type H3Event } from "h3"; +import { type EventHandler, getRequestIP, type H3Event, type Middleware } from "h3"; +import { provideRequestEvent } from "solid-js/web/storage"; import type { FetchEvent } from "./types.ts"; const FETCH_EVENT_CONTEXT = "solidFetchEvent"; @@ -27,3 +28,9 @@ export function mergeResponseHeaders(h3Event: H3Event, headers: Headers) { h3Event.res.headers.append(key, value); } } + +export const decorateHandler = (fn: T) => + (event => provideRequestEvent(getFetchEvent(event), () => fn(event))) as T; + +export const decorateMiddleware = (fn: T) => + ((event, next) => provideRequestEvent(getFetchEvent(event), () => fn(event, next))) as T; diff --git a/packages/start/src/server/handler.ts b/packages/start/src/server/handler.ts index 69744ab61..090c5484a 100644 --- a/packages/start/src/server/handler.ts +++ b/packages/start/src/server/handler.ts @@ -4,10 +4,9 @@ import { join } from "pathe"; import type { JSX } from "solid-js"; import { sharedConfig } from "solid-js"; import { getRequestEvent, renderToStream, renderToString } from "solid-js/web"; -import { provideRequestEvent } from "solid-js/web/storage"; import { createRoutes } from "../router.tsx"; -import { getFetchEvent } from "./fetchEvent.ts"; +import { decorateHandler, decorateMiddleware } from "./fetchEvent.ts"; import { getSsrManifest } from "./manifest/ssr-manifest.ts"; import { matchAPIRoute } from "./routes.ts"; import { handleServerFunction } from "./server-functions-handler.ts"; @@ -29,8 +28,8 @@ export function createBaseHandler( | ((context: PageEvent) => HandlerOptions | Promise) = {}, ) { const handler = defineHandler({ - middleware, - handler: async (e: H3Event) => { + middleware: middleware.length ? middleware.map(decorateMiddleware): undefined, + handler: decorateHandler(async (e: H3Event) => { const event = getRequestEvent()!; const url = new URL(event.request.url); const pathname = url.pathname; @@ -126,16 +125,12 @@ export function createBaseHandler( const { writable, readable } = new TransformStream(); stream.pipeTo(writable); return readable - }, + }), }); const app = new H3(); - app.use( - defineHandler((e) => - provideRequestEvent(getFetchEvent(e), () => handler(e)), - ), - ); + app.use(handler); return app; }