@barqel/barq 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +3 -3
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +4304 -10
  5. package/dist/index.js.map +24 -1
  6. package/dist/internal/node-compat.d.ts +2 -0
  7. package/dist/internal/node-compat.d.ts.map +1 -0
  8. package/dist/node-patch.d.ts +3 -0
  9. package/dist/node-patch.d.ts.map +1 -0
  10. package/dist/node-patch.js +4304 -0
  11. package/dist/node-patch.js.map +24 -0
  12. package/package.json +12 -3
  13. package/dist/app.js +0 -1370
  14. package/dist/app.js.map +0 -1
  15. package/dist/context.js +0 -261
  16. package/dist/context.js.map +0 -1
  17. package/dist/cookies.js +0 -234
  18. package/dist/cookies.js.map +0 -1
  19. package/dist/cors.js +0 -82
  20. package/dist/cors.js.map +0 -1
  21. package/dist/errors.js +0 -81
  22. package/dist/errors.js.map +0 -1
  23. package/dist/http.js +0 -127
  24. package/dist/http.js.map +0 -1
  25. package/dist/internal/ip.js +0 -151
  26. package/dist/internal/ip.js.map +0 -1
  27. package/dist/internal/pathname.js +0 -158
  28. package/dist/internal/pathname.js.map +0 -1
  29. package/dist/internal/query.js +0 -126
  30. package/dist/internal/query.js.map +0 -1
  31. package/dist/internal/scan.js +0 -1069
  32. package/dist/internal/scan.js.map +0 -1
  33. package/dist/internal/shutdown.js +0 -30
  34. package/dist/internal/shutdown.js.map +0 -1
  35. package/dist/internal/trie.js +0 -560
  36. package/dist/internal/trie.js.map +0 -1
  37. package/dist/middleware.js +0 -269
  38. package/dist/middleware.js.map +0 -1
  39. package/dist/types.js +0 -2
  40. package/dist/types.js.map +0 -1
  41. package/dist/validation.js +0 -32
  42. package/dist/validation.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1,24 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAExC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EACL,2BAA2B,EAC3B,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,WAAW,GACZ,MAAM,cAAc,CAAC;AAqBtB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/internal/node-compat.ts", "../src/app.ts", "../src/cookies.ts", "../src/http.ts", "../src/internal/ip.ts", "../src/internal/pathname.ts", "../src/internal/query.ts", "../src/context.ts", "../src/errors.ts", "../src/internal/scan.ts", "../src/internal/shutdown.ts", "../src/internal/trie.ts", "../src/middleware.ts", "../src/cors.ts", "../src/validation.ts"],
4
+ "sourcesContent": [
5
+ "import crypto from \"node:crypto\";\nimport http from \"node:http\";\nimport { Readable } from \"node:stream\";\nimport type { ReadableStream as NodeReadableStream } from \"node:stream/web\";\nimport type { Server } from \"bun\";\nimport { App } from \"../app\";\n\nconst isNode = typeof Bun === \"undefined\";\n\nif (isNode) {\n if (typeof (globalThis as Record<string, unknown>).Bun === \"undefined\") {\n Object.defineProperty(globalThis, \"Bun\", {\n configurable: true,\n value: {\n env: process.env,\n CryptoHasher: class {\n private hmac: crypto.Hmac;\n constructor(_algo: string, secret: string) {\n this.hmac = crypto.createHmac(\"sha256\", secret);\n }\n update(data: string) {\n this.hmac.update(data);\n return this;\n }\n digest(encoding: crypto.BinaryToTextEncoding) {\n return this.hmac.digest(encoding);\n }\n },\n },\n });\n }\n\n App.prototype.listen = function (port?: number) {\n // biome-ignore lint/complexity/useLiteralKeys: Access private members outside the class.\n const rawPort = port ?? this[\"_options\"]?.port ?? 3000;\n // biome-ignore lint/complexity/useLiteralKeys: Access private members outside the class.\n const hostname = this[\"_options\"]?.hostname ?? \"0.0.0.0\";\n\n const listenPort =\n rawPort === 0 ? Math.floor(Math.random() * 20000) + 30000 : rawPort;\n\n const server = http.createServer(\n async (req: http.IncomingMessage, res: http.ServerResponse) => {\n try {\n const protocol = (req.socket as { encrypted?: boolean })?.encrypted\n ? \"https\"\n : \"http\";\n const host = req.headers.host || \"localhost\";\n const url = `${protocol}://${host}${req.url || \"/\"}`;\n const method = req.method || \"GET\";\n\n let reqBody: ReadableStream<Uint8Array> | undefined;\n if (method !== \"GET\" && method !== \"HEAD\") {\n reqBody = Readable.toWeb(\n req,\n ) as unknown as ReadableStream<Uint8Array>;\n }\n\n const webReq = new Request(url, {\n method,\n headers: req.headers as HeadersInit,\n body: reqBody,\n // @ts-expect-error - duplex is required for streaming in Node.js\n duplex: \"half\",\n });\n\n const remoteIp = req.socket.remoteAddress || \"\";\n\n // biome-ignore lint/complexity/useLiteralKeys: Access private members outside the class.\n const webRes = await this[\"handle\"](webReq, {\n requestIP: () => (remoteIp ? { address: remoteIp } : null),\n } as unknown as Server<unknown>);\n\n res.statusCode = webRes.status;\n res.statusMessage = webRes.statusText;\n\n webRes.headers.forEach((val, key) => {\n res.setHeader(key, val);\n });\n\n if (!webRes.body) {\n res.end();\n return;\n }\n\n const nodeStream = Readable.fromWeb(\n webRes.body as unknown as NodeReadableStream<Uint8Array>,\n );\n nodeStream.pipe(res);\n } catch (err) {\n console.error(\"Barq Node Adapter Error:\", err);\n if (!res.headersSent) {\n res.statusCode = 500;\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end('{\"error\":\"Internal Server Error\"}');\n }\n }\n },\n );\n\n server.listen(listenPort, hostname);\n\n return {\n port: listenPort,\n hostname,\n stop: () =>\n new Promise<void>((resolve) => {\n server.close(() => resolve());\n if (typeof server.closeAllConnections === \"function\") {\n server.closeAllConnections();\n }\n }),\n } as unknown as Server<unknown>;\n };\n}\n",
6
+ "import { cpus } from \"node:os\";\nimport type { ServeOptions, Server, ServerWebSocket } from \"bun\";\nimport { Context, type ContextApplication } from \"./context\";\nimport { applyPendingCookies } from \"./cookies\";\nimport { errorToResponse, HttpError } from \"./errors\";\nimport { compileTrustProxy, isIpRange } from \"./internal/ip\";\nimport { scanPathname } from \"./internal/pathname\";\nimport { findQueryParam, findQueryParamAll } from \"./internal/query\";\nimport {\n analyzeHandler,\n type HandlerAnalysis,\n type HandlerFunction,\n} from \"./internal/scan\";\nimport type { ShutdownResult } from \"./internal/shutdown\";\nimport { stopServer } from \"./internal/shutdown\";\nimport type { RouteParams as TrieParams } from \"./internal/trie\";\nimport { MATCH_HANDLER, MATCH_NOT_ALLOWED, SegmentTrie } from \"./internal/trie\";\nimport {\n composeMiddlewareDispatcher,\n composeMiddlewares,\n isThenable,\n type MiddlewareDispatcher,\n unwindAfter,\n} from \"./middleware\";\nimport type {\n ErrorHandler,\n ErrorResolver,\n Handler,\n HandlerResult,\n HttpMethod,\n JoinPath,\n Middleware,\n NotFoundHandler,\n Params,\n ResponseHandler,\n RouteParams,\n WebSocketHandlers,\n} from \"./types\";\n\nexport type { ShutdownResult };\n\nconst METHODS: readonly HttpMethod[] = [\n \"GET\",\n \"POST\",\n \"PUT\",\n \"DELETE\",\n \"PATCH\",\n \"HEAD\",\n \"OPTIONS\",\n];\nconst MAX_ROUTE_SEGMENTS = 256;\nconst EMPTY_PARAMS: Params = Object.freeze(Object.create(null) as Params);\n// Prebuilt `Headers` instances rather than plain objects: the `Response`\n// constructor has to parse/validate header names and values on every call, and\n// handing it an already-built `Headers` skips that work. Measured ~285ns per\n// response versus a frozen plain object on Bun 1.4.\n//\n// Safe to share: `new Response(body, { headers })` copies the entries into a\n// fresh `Headers` on the response, so mutating `response.headers` later (cookie\n// application, `stripBody`) never touches these. Never mutate them here.\nconst FAST_JSON_HEADERS: Headers = new Headers({\n \"content-type\": \"application/json; charset=utf-8\",\n});\nconst FAST_TEXT_HEADERS: Headers = new Headers({\n \"content-type\": \"text/plain; charset=utf-8\",\n});\nconst _FAST_JSON_INIT: ResponseInit = Object.freeze({\n headers: FAST_JSON_HEADERS,\n});\nconst _FAST_TEXT_INIT: ResponseInit = Object.freeze({\n headers: FAST_TEXT_HEADERS,\n});\n\nclass ReadonlySetView<T> {\n constructor(private readonly source: Set<T>) {}\n get size(): number {\n return this.source.size;\n }\n has(value: T): boolean {\n return this.source.has(value);\n }\n forEach(\n callback: (value: T, value2: T, set: ReadonlySet<T>) => void,\n thisArg?: unknown,\n ): void {\n this.source.forEach((value) => {\n callback.call(thisArg, value, value, this as unknown as ReadonlySet<T>);\n });\n }\n entries(): IterableIterator<[T, T]> {\n return this.source.entries();\n }\n keys(): IterableIterator<T> {\n return this.source.keys();\n }\n values(): IterableIterator<T> {\n return this.source.values();\n }\n [Symbol.iterator](): IterableIterator<T> {\n return this.source[Symbol.iterator]();\n }\n get [Symbol.toStringTag](): string {\n return \"Set\";\n }\n}\n\nfunction createReadonlySet<T>(source: Set<T>): ReadonlySet<T> {\n return new ReadonlySetView(source) as unknown as ReadonlySet<T>;\n}\n\nconst EMPTY_REDIRECT_HOSTS: ReadonlySet<string> = createReadonlySet(\n new Set<string>(),\n);\n\ninterface HandlerNeeds {\n isContextFree: boolean;\n isLightweight: boolean;\n isParamsOnly: boolean;\n isJsonBodyOnly: boolean;\n}\n\nfunction expandOptionalPatterns(pattern: string): string[] {\n if (!pattern.includes(\"?\")) return [pattern];\n const segments = pattern.split(\"/\").filter(Boolean);\n const optIndices: number[] = [];\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i]!;\n if (seg.startsWith(\":\") && seg.endsWith(\"?\")) {\n optIndices.push(i);\n }\n }\n if (optIndices.length === 0) return [pattern];\n\n const variants: string[] = [];\n const count = 1 << optIndices.length;\n for (let mask = 0; mask < count; mask++) {\n const parts: string[] = [];\n for (let i = 0; i < segments.length; i++) {\n const optPos = optIndices.indexOf(i);\n if (optPos >= 0) {\n if (mask & (1 << optPos)) {\n parts.push(segments[i]!.slice(0, -1));\n }\n } else {\n parts.push(segments[i]!);\n }\n }\n variants.push(parts.length === 0 ? \"/\" : `/${parts.join(\"/\")}`);\n }\n return variants;\n}\n\nconst LIGHT_SUPPORTED_PROPS = new Set([\n \"req\",\n \"params\",\n \"pathname\",\n \"queryParam\",\n \"queryParamAll\",\n \"state\",\n \"stream\",\n \"bodyStream\",\n]);\n\nfunction classifyProps(props: Set<string>): HandlerNeeds {\n for (const p of props) {\n if (!LIGHT_SUPPORTED_PROPS.has(p)) {\n return {\n isContextFree: false,\n isLightweight: false,\n isParamsOnly: false,\n isJsonBodyOnly: false,\n };\n }\n }\n\n const hasParams = props.has(\"params\") || props.size === 0;\n const hasQuery = props.has(\"queryParam\") || props.has(\"queryParamAll\");\n\n if (hasParams && props.size === 1) {\n return {\n isContextFree: false,\n isLightweight: true,\n isParamsOnly: true,\n isJsonBodyOnly: false,\n };\n }\n\n if (hasParams || hasQuery || props.size > 0) {\n return {\n isContextFree: false,\n isLightweight: true,\n isParamsOnly: false,\n isJsonBodyOnly: false,\n };\n }\n\n return {\n isContextFree: false,\n isLightweight: false,\n isParamsOnly: false,\n isJsonBodyOnly: false,\n };\n}\n\nfunction classify(analysis: HandlerAnalysis): HandlerNeeds {\n if (analysis.isNoArg) {\n return {\n isContextFree: true,\n isLightweight: false,\n isParamsOnly: false,\n isJsonBodyOnly: false,\n };\n }\n if (\n analysis.arglessJsonCall &&\n !analysis.isDestructured &&\n analysis.contextProps.size === 1 &&\n analysis.contextProps.has(\"json\")\n ) {\n return {\n isContextFree: false,\n isLightweight: false,\n isParamsOnly: false,\n isJsonBodyOnly: true,\n };\n }\n if (analysis.isDestructured) {\n return classifyProps(analysis.destructuredProps);\n }\n if (analysis.hasDynamicAccess) {\n return {\n isContextFree: false,\n isLightweight: false,\n isParamsOnly: false,\n isJsonBodyOnly: false,\n };\n }\n return classifyProps(analysis.contextProps);\n}\n\nfunction detectHandlerNeeds(fn: HandlerFunction): HandlerNeeds {\n try {\n return classify(analyzeHandler(fn));\n } catch {\n return {\n isContextFree: false,\n isLightweight: false,\n isParamsOnly: false,\n isJsonBodyOnly: false,\n };\n }\n}\n\nclass FastLightContext {\n _pathname?: string;\n _state?: Record<string, unknown>;\n _hasPendingCookies = false;\n private _url?: string;\n private _qPos = -2;\n\n constructor(\n public req: Request,\n public params: Record<string, string>,\n ) {}\n\n init(req: Request, params: Record<string, string>): this {\n this.req = req;\n this.params = params;\n this._pathname = undefined;\n this._state = undefined;\n this._hasPendingCookies = false;\n this._url = undefined;\n this._qPos = -2;\n return this;\n }\n\n get url(): string {\n // biome-ignore lint/suspicious/noAssignInExpressions: Preserve the lazy-cache fast path.\n return this._url ?? (this._url = this.req.url);\n }\n get pathname(): string {\n if (this._pathname !== undefined) return this._pathname;\n // biome-ignore lint/suspicious/noAssignInExpressions: Preserve the lazy-cache fast path.\n return (this._pathname = scanPathname(this.url));\n }\n queryParam(name: string): string | null {\n let u = this._url;\n if (u === undefined) {\n u = this.req.url;\n this._url = u;\n }\n let q = this._qPos;\n if (q === -2) this._qPos = q = u.indexOf(\"?\");\n return findQueryParam(u, name, q);\n }\n queryParamAll(name: string): string[] {\n return findQueryParamAll(this.url, name);\n }\n get cookies(): never {\n throw new Error(\"LightweightContext does not support cookies.\");\n }\n get state(): Record<string, unknown> {\n let state = this._state;\n if (state === undefined) {\n state = Object.create(null) as Record<string, unknown>;\n this._state = state;\n }\n return state;\n }\n stream(): ReadableStream<Uint8Array> | null {\n return this.req.body;\n }\n get bodyStream(): ReadableStream<Uint8Array> | null {\n return this.req.body;\n }\n}\n\nexport type RouteHandlerArg = Middleware | readonly Middleware[];\n\ntype MiddlewareOutput<TMiddleware> = TMiddleware extends {\n before?: (...args: never[]) => infer TResult;\n}\n ? Exclude<\n Awaited<TResult>,\n Response | void | undefined\n > extends infer TOutput extends object\n ? TOutput\n : never\n : never;\n\ntype UnionToIntersection<T> = (\n T extends unknown\n ? (value: T) => void\n : never\n) extends (value: infer TIntersection) => void\n ? TIntersection\n : never;\n\ntype MiddlewareOutputs<TMiddlewares extends readonly unknown[]> =\n UnionToIntersection<MiddlewareOutput<TMiddlewares[number]>>;\n\nexport interface WebSocketOptions {\n maxPayloadLength?: number;\n backpressureLimit?: number;\n closeOnBackpressureLimit?: boolean;\n idleTimeout?: number;\n open?: (ws: ServerWebSocket<unknown>) => void | Promise<void>;\n message?: (\n ws: ServerWebSocket<unknown>,\n message: string | Buffer,\n ) => void | Promise<void>;\n close?: (\n ws: ServerWebSocket<unknown>,\n code: number,\n reason: string,\n ) => void | Promise<void>;\n drain?: (ws: ServerWebSocket<unknown>) => void | Promise<void>;\n error?: (\n ws: ServerWebSocket<unknown>,\n error: unknown,\n ) => void | Promise<void>;\n}\n\ntype WebSocketCallback = (...args: never[]) => unknown;\n\nfunction reportWebSocketError(\n handler: WebSocketHandlers[\"error\"] | undefined,\n ws: ServerWebSocket<unknown>,\n error: unknown,\n): void {\n if (!handler) {\n console.error(\"Unhandled WebSocket callback error:\", error);\n return;\n }\n try {\n const result = handler(ws, error);\n if (isThenable(result)) {\n Promise.resolve(result).catch((handlerError) =>\n console.error(\"WebSocket error handler failed:\", handlerError),\n );\n }\n } catch (handlerError) {\n console.error(\"WebSocket error handler failed:\", handlerError);\n }\n}\n\nfunction dispatchWebSocketCallback(\n callback: WebSocketCallback | undefined,\n args: unknown[],\n onError: (error: unknown) => void,\n): void {\n if (!callback) return;\n try {\n const len = args.length;\n let result: unknown;\n if (len === 1) {\n result = (callback as (a: unknown) => unknown)(args[0]);\n } else if (len === 2) {\n result = (callback as (a: unknown, b: unknown) => unknown)(\n args[0],\n args[1],\n );\n } else if (len === 3) {\n result = (callback as (a: unknown, b: unknown, c: unknown) => unknown)(\n args[0],\n args[1],\n args[2],\n );\n } else {\n result = Reflect.apply(callback, undefined, args);\n }\n\n if (isThenable(result)) {\n Promise.resolve(result).catch(onError);\n }\n } catch (error) {\n onError(error);\n }\n}\n\nfunction getInternalWebSocketHandlers(\n ws: ServerWebSocket<unknown>,\n): WebSocketHandlers | undefined {\n const data = ws.data as\n | { handlers?: WebSocketHandlers; _barqInternal?: boolean }\n | undefined;\n return data?._barqInternal === true ? data.handlers : undefined;\n}\n\nexport interface AppOptions {\n port?: number;\n hostname?: string;\n development?: boolean;\n maxRequestBodySize?: number;\n idleTimeout?: number;\n tls?: ServeOptions[\"tls\"];\n allowedRedirectHosts?: string[];\n trustProxy?: boolean | string | readonly string[] | ((ip: string) => boolean);\n websocket?: WebSocketOptions;\n cookieSecret?: string;\n}\n\nfunction parseRouteArgs(args: unknown[]): {\n middlewares: Middleware[];\n handler: Handler<object>;\n} {\n if (args.length === 0) {\n throw new Error(\"Route requires a handler function\");\n }\n const last = args[args.length - 1];\n if (typeof last !== \"function\") {\n throw new Error(\n \"The final argument in route definition must be a Handler function\",\n );\n }\n const handler = last as Handler<object>;\n if (args.length === 1) {\n return { middlewares: [], handler };\n }\n const middlewares: Middleware[] = [];\n for (let i = 0; i < args.length - 1; i++) {\n const item = args[i];\n if (Array.isArray(item)) {\n for (let j = 0; j < item.length; j++) {\n middlewares.push(item[j] as Middleware);\n }\n } else if (item && typeof item === \"object\") {\n middlewares.push(item as Middleware);\n } else {\n throw new TypeError(\n \"Route middleware must be a Middleware object or array of Middleware\",\n );\n }\n }\n return { middlewares, handler };\n}\n\nfunction normalizePrefix(prefix: string): string {\n let p = prefix.trim();\n if (p.length === 0 || p === \"/\") return \"\";\n if (p.charCodeAt(0) !== 47) p = `/${p}`;\n if (p.charCodeAt(p.length - 1) === 47) p = p.slice(0, -1);\n return p;\n}\n\nfunction joinPrefix(prefix: string, pattern: string): string {\n if (!prefix) return pattern;\n let p = pattern.trim();\n if (p.length === 0 || p === \"/\") return prefix;\n if (p.charCodeAt(0) !== 47) p = `/${p}`;\n return prefix + p;\n}\n\nfunction canonicalizeRoutePattern(pattern: string): string {\n let p = pattern.trim();\n if (p.length === 0) p = \"/\";\n if (p.charCodeAt(0) !== 47) p = `/${p}`;\n if (p.length > 1 && p.charCodeAt(p.length - 1) === 47) {\n p = p.slice(0, -1);\n }\n return p;\n}\n\nfunction validateRoutePattern(pattern: string): void {\n if (pattern.length === 0 || pattern.charCodeAt(0) !== 47) {\n throw new Error(`Invalid route pattern \"${pattern}\": must start with '/'`);\n }\n if (pattern === \"/\") return;\n if (pattern.indexOf(\"#\") !== -1) {\n throw new Error(`Invalid route pattern \"${pattern}\": must not contain '#'`);\n }\n const segments = pattern.split(\"/\");\n if (segments.length - 1 > MAX_ROUTE_SEGMENTS) {\n throw new RangeError(\n `Route pattern exceeds the limit of ${MAX_ROUTE_SEGMENTS} segments`,\n );\n }\n for (let i = 1; i < segments.length; i++) {\n const seg = segments[i]!;\n if (seg.length === 0) {\n throw new Error(\n `Invalid route pattern \"${pattern}\": empty segment ('//')`,\n );\n }\n const decoded = decodeSegment(seg);\n if (decoded === \".\" || decoded === \"..\") {\n throw new Error(\n `Invalid route pattern \"${pattern}\": dot segments '.', '..' not allowed in route patterns`,\n );\n }\n }\n}\n\nfunction decodeSegment(seg: string): string {\n if (seg.indexOf(\"%\") === -1) return seg;\n try {\n return decodeURIComponent(seg);\n } catch {\n return seg;\n }\n}\n\nfunction toResponse(\n value: HandlerResult | PromiseLike<HandlerResult>,\n): Response | Promise<Response> {\n if (value instanceof Response) return value;\n if (isThenable(value)) {\n return Promise.resolve(value).then((resolved) =>\n toResponse(resolved as HandlerResult),\n );\n }\n return finalizeValue(value as HandlerResult);\n}\n\nfunction finalizeValue(value: HandlerResult): Response {\n if (typeof value === \"object\" && value !== null)\n return new Response(JSON.stringify(value), { headers: FAST_JSON_HEADERS });\n if (typeof value === \"string\")\n return new Response(value, { headers: FAST_TEXT_HEADERS });\n return new Response(String(value), { headers: FAST_TEXT_HEADERS });\n}\n\nasync function stopClusterProcesses(\n processes: readonly ReturnType<typeof Bun.spawn>[],\n hardTimeoutMs: number,\n): Promise<boolean> {\n const running = processes.filter((process) => !process.killed);\n if (running.length === 0) return false;\n for (const process of running) process.kill(\"SIGTERM\");\n\n const exited = Promise.all(running.map((process) => process.exited));\n let timer: ReturnType<typeof setTimeout> | undefined;\n const forced = await Promise.race([\n exited.then(() => false),\n new Promise<boolean>((resolve) => {\n timer = setTimeout(() => resolve(true), hardTimeoutMs);\n timer.unref?.();\n }),\n ]);\n if (timer !== undefined) clearTimeout(timer);\n if (forced) {\n for (const process of running) {\n if (!process.killed) process.kill(\"SIGKILL\");\n }\n await exited;\n }\n return forced;\n}\n\nexport class RouteGroup<\n Prefix extends string = string,\n TState extends object = Record<string, unknown>,\n> {\n constructor(\n private readonly app: App<TState>,\n readonly prefix: string,\n private readonly middlewares: Middleware[] = [],\n ) {}\n\n use<const TMiddlewares extends readonly Middleware<TState, object>[]>(\n ...middlewares: TMiddlewares\n ): RouteGroup<Prefix, TState & MiddlewareOutputs<TMiddlewares>> {\n for (let i = 0; i < middlewares.length; i++) {\n this.middlewares.push(middlewares[i]! as Middleware);\n }\n return this as unknown as RouteGroup<\n Prefix,\n TState & MiddlewareOutputs<TMiddlewares>\n >;\n }\n\n plugin<TOptions>(\n pluginFn: (group: this, options?: TOptions) => void,\n options?: TOptions,\n ): this {\n pluginFn(this, options);\n return this;\n }\n\n private _register(\n method: HttpMethod,\n pattern: string,\n args: unknown[],\n ): this {\n return this._registerMethods([method], pattern, args);\n }\n\n private _registerMethods(\n methods: readonly HttpMethod[],\n pattern: string,\n args: unknown[],\n ): this {\n const fullPattern = joinPrefix(this.prefix, pattern);\n const { middlewares, handler } = parseRouteArgs(args);\n const allMiddlewares =\n this.middlewares.length === 0\n ? middlewares\n : [...this.middlewares, ...middlewares];\n this.app._registerMethods(\n methods,\n fullPattern,\n allMiddlewares.length === 0 ? [handler] : [...allMiddlewares, handler],\n );\n return this;\n }\n\n add<P extends string>(\n method: HttpMethod,\n pattern: P,\n handler: Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n ): this;\n add<P extends string>(\n method: HttpMethod,\n pattern: P,\n ...handlers: [\n ...RouteHandlerArg[],\n Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n ]\n ): this;\n add(method: HttpMethod, pattern: string, ...args: unknown[]): this {\n return this._register(method, pattern, args);\n }\n\n get<P extends string>(\n pattern: P,\n handler: Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n ): this;\n get<P extends string>(\n pattern: P,\n ...handlers: [\n ...RouteHandlerArg[],\n Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n ]\n ): this;\n get(pattern: string, ...args: unknown[]): this {\n return this._register(\"GET\", pattern, args);\n }\n\n post<P extends string>(\n pattern: P,\n handler: Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n ): this;\n post<P extends string>(\n pattern: P,\n ...handlers: [\n ...RouteHandlerArg[],\n Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n ]\n ): this;\n post(pattern: string, ...args: unknown[]): this {\n return this._register(\"POST\", pattern, args);\n }\n\n put<P extends string>(\n pattern: P,\n handler: Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n ): this;\n put<P extends string>(\n pattern: P,\n ...handlers: [\n ...RouteHandlerArg[],\n Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n ]\n ): this;\n put(pattern: string, ...args: unknown[]): this {\n return this._register(\"PUT\", pattern, args);\n }\n\n delete<P extends string>(\n pattern: P,\n handler: Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n ): this;\n delete<P extends string>(\n pattern: P,\n ...handlers: [\n ...RouteHandlerArg[],\n Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n ]\n ): this;\n delete(pattern: string, ...args: unknown[]): this {\n return this._register(\"DELETE\", pattern, args);\n }\n\n patch<P extends string>(\n pattern: P,\n handler: Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n ): this;\n patch<P extends string>(\n pattern: P,\n ...handlers: [\n ...RouteHandlerArg[],\n Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n ]\n ): this;\n patch(pattern: string, ...args: unknown[]): this {\n return this._register(\"PATCH\", pattern, args);\n }\n\n head<P extends string>(\n pattern: P,\n handler: Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n ): this;\n head<P extends string>(\n pattern: P,\n ...handlers: [\n ...RouteHandlerArg[],\n Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n ]\n ): this;\n head(pattern: string, ...args: unknown[]): this {\n return this._register(\"HEAD\", pattern, args);\n }\n\n options<P extends string>(\n pattern: P,\n handler: Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n ): this;\n options<P extends string>(\n pattern: P,\n ...handlers: [\n ...RouteHandlerArg[],\n Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n ]\n ): this;\n options(pattern: string, ...args: unknown[]): this {\n return this._register(\"OPTIONS\", pattern, args);\n }\n\n all<P extends string>(\n pattern: P,\n handler: Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n ): this;\n all<P extends string>(\n pattern: P,\n ...handlers: [\n ...RouteHandlerArg[],\n Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n ]\n ): this;\n all(pattern: string, ...args: unknown[]): this {\n return this._registerMethods(METHODS, pattern, args);\n }\n\n ws<P extends string, TData = unknown>(\n pattern: P,\n handlers: WebSocketHandlers<TData>,\n beforeUpgrade?: (\n ctx: Context<RouteParams<JoinPath<Prefix, P>>, TState>,\n ) => boolean | { data?: TData } | Promise<boolean | { data?: TData }>,\n ): this {\n this.app.ws(\n joinPrefix(this.prefix, pattern),\n handlers,\n beforeUpgrade\n ? (ctx) =>\n beforeUpgrade(\n ctx as unknown as Context<\n RouteParams<JoinPath<Prefix, P>>,\n TState\n >,\n )\n : undefined,\n );\n return this;\n }\n\n group<Sub extends string>(\n prefix: Sub,\n callback: (group: RouteGroup<JoinPath<Prefix, Sub>, TState>) => void,\n ): this;\n group<Sub extends string>(\n prefix: Sub,\n ...args: [\n ...RouteHandlerArg[],\n (group: RouteGroup<JoinPath<Prefix, Sub>, TState>) => void,\n ]\n ): this;\n group(prefix: string, ...args: unknown[]): this {\n const nestedPrefix = joinPrefix(this.prefix, prefix);\n const last = args[args.length - 1];\n if (typeof last !== \"function\") {\n throw new Error(\"Route group callback must be a function\");\n }\n const callback = last as (group: RouteGroup<string, TState>) => void;\n const groupMws: Middleware[] = [...this.middlewares];\n for (let i = 0; i < args.length - 1; i++) {\n const item = args[i];\n if (Array.isArray(item)) {\n for (let j = 0; j < item.length; j++)\n groupMws.push(item[j] as Middleware);\n } else if (item && typeof item === \"object\") {\n groupMws.push(item as Middleware);\n }\n }\n const nestedGroup = new RouteGroup(this.app, nestedPrefix, groupMws);\n callback(nestedGroup);\n return this;\n }\n}\n\nexport class App<TState extends object = Record<string, unknown>> {\n private readonly fetchHandler = (req: Request, srv?: Server<unknown>) =>\n this.handle(req, srv);\n private readonly trie = new SegmentTrie();\n private readonly middlewares: Middleware[] = [];\n private readonly nativeRoutes: Array<{\n method: HttpMethod;\n pattern: string;\n handler: ResponseHandler;\n rawHandler?: HandlerFunction;\n isDynamic: boolean;\n isContextFree: boolean;\n isLightweight: boolean;\n isParamsOnly: boolean;\n isJsonBodyOnly: boolean;\n hasRouteMiddlewares: boolean;\n }> = [];\n private server: Server<unknown> | null = null;\n private clusterProcesses: ReturnType<typeof Bun.spawn>[] | null = null;\n private readonly _options: AppOptions;\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: Accessed through ContextApplication.\n private readonly redirectHosts: ReadonlySet<string>;\n readonly trustProxy:\n | boolean\n | string\n | readonly string[]\n | ((ip: string) => boolean);\n readonly trustedProxyChecker: (ip: string) => boolean;\n private stopPromise: Promise<ShutdownResult> | null = null;\n private notFoundHandler: NotFoundHandler | null = null;\n private errorHandler: ErrorHandler | null = null;\n private errorResolver: ErrorResolver | undefined = undefined;\n private globalPipeline: MiddlewareDispatcher = composeMiddlewareDispatcher(\n [],\n );\n private hasMiddlewares = false;\n private hasWebSockets = false;\n readonly development: boolean;\n readonly cookieSecret?: string;\n\n constructor(options: AppOptions = {}) {\n if (\n options.port !== undefined &&\n (!Number.isInteger(options.port) ||\n options.port < 0 ||\n options.port > 65535)\n ) {\n throw new RangeError(\"port must be an integer between 0 and 65535\");\n }\n if (\n options.maxRequestBodySize !== undefined &&\n (!Number.isSafeInteger(options.maxRequestBodySize) ||\n options.maxRequestBodySize < 0)\n ) {\n throw new RangeError(\n \"maxRequestBodySize must be a non-negative safe integer\",\n );\n }\n if (\n options.idleTimeout !== undefined &&\n (!Number.isFinite(options.idleTimeout) ||\n options.idleTimeout < 0 ||\n options.idleTimeout > 255)\n ) {\n throw new RangeError(\"idleTimeout must be between 0 and 255 seconds\");\n }\n for (const [name, value] of [\n [\"websocket.maxPayloadLength\", options.websocket?.maxPayloadLength],\n [\"websocket.backpressureLimit\", options.websocket?.backpressureLimit],\n ] as const) {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 1)) {\n throw new RangeError(`${name} must be a positive safe integer`);\n }\n }\n if (\n options.websocket?.idleTimeout !== undefined &&\n (!Number.isFinite(options.websocket.idleTimeout) ||\n options.websocket.idleTimeout < 0 ||\n options.websocket.idleTimeout > 255)\n ) {\n throw new RangeError(\n \"websocket.idleTimeout must be between 0 and 255 seconds\",\n );\n }\n const trustedProxyRanges = Array.isArray(options.trustProxy)\n ? options.trustProxy\n : typeof options.trustProxy === \"string\"\n ? [options.trustProxy]\n : [];\n for (const range of trustedProxyRanges) {\n if (!isIpRange(range)) {\n throw new TypeError(`Invalid trustProxy IP range: ${range}`);\n }\n }\n if (options.cookieSecret !== undefined && !options.cookieSecret.trim()) {\n throw new TypeError(\"cookieSecret must be non-empty when provided\");\n }\n this._options = options;\n this.development =\n options.development ?? process.env.NODE_ENV === \"development\";\n this.trustProxy = Array.isArray(options.trustProxy)\n ? Object.freeze([...options.trustProxy])\n : (options.trustProxy ?? false);\n this.trustedProxyChecker = compileTrustProxy(options.trustProxy);\n this.cookieSecret = options.cookieSecret;\n this.redirectHosts = options.allowedRedirectHosts\n ? createReadonlySet(\n new Set(options.allowedRedirectHosts.map((h) => h.toLowerCase())),\n )\n : EMPTY_REDIRECT_HOSTS;\n }\n\n plugin<TOptions>(\n pluginFn: (app: this, options?: TOptions) => void,\n options?: TOptions,\n ): this {\n pluginFn(this, options);\n return this;\n }\n\n notFound(handler: NotFoundHandler): this {\n this.notFoundHandler = handler;\n return this;\n }\n\n onError(handler: ErrorHandler): this {\n this.errorHandler = handler;\n this.errorResolver = (err, ctx) => handler(err, ctx);\n if (this.server !== null) {\n this.globalPipeline = composeMiddlewareDispatcher(\n this.middlewares,\n this.errorResolver,\n );\n }\n return this;\n }\n\n /** @internal */\n _register(method: HttpMethod, pattern: string, args: unknown[]): this {\n return this._registerMethods([method], pattern, args);\n }\n\n /** @internal */\n _registerMethods(\n methods: readonly HttpMethod[],\n pattern: string,\n args: unknown[],\n ): this {\n const { middlewares, handler } = parseRouteArgs(args);\n const responseHandler: (ctx: Context) => Response | Promise<Response> = (\n ctx,\n ) => toResponse(handler(ctx));\n const finalHandler: (ctx: Context) => Response | Promise<Response> =\n middlewares.length === 0\n ? responseHandler\n : composeMiddlewares(middlewares, responseHandler);\n\n const canonicalPattern = canonicalizeRoutePattern(pattern);\n validateRoutePattern(canonicalPattern);\n const routes = methods.map((method) => ({\n method,\n pattern: canonicalPattern,\n handler: finalHandler,\n }));\n this.trie.addBatch(routes);\n\n const needs = detectHandlerNeeds(handler);\n const hasRouteMws = middlewares.length > 0;\n\n for (const r of routes) {\n const variants = expandOptionalPatterns(r.pattern);\n for (const variant of variants) {\n this.nativeRoutes.push({\n method: r.method,\n pattern: variant,\n handler: r.handler,\n rawHandler: handler,\n isDynamic: variant.includes(\":\") || variant.includes(\"*\"),\n isContextFree: needs.isContextFree && !hasRouteMws,\n isLightweight: needs.isLightweight && !hasRouteMws,\n isParamsOnly: needs.isParamsOnly && !hasRouteMws,\n isJsonBodyOnly: needs.isJsonBodyOnly && !hasRouteMws,\n hasRouteMiddlewares: hasRouteMws,\n });\n }\n }\n\n return this;\n }\n\n add<P extends string>(\n method: HttpMethod,\n pattern: P,\n handler: Handler<RouteParams<P>, TState>,\n ): this;\n add<P extends string>(\n method: HttpMethod,\n pattern: P,\n ...handlers: [...RouteHandlerArg[], Handler<RouteParams<P>, TState>]\n ): this;\n add(method: HttpMethod, pattern: string, ...args: unknown[]): this {\n return this._register(method, pattern, args);\n }\n\n get<P extends string>(\n pattern: P,\n handler: Handler<RouteParams<P>, TState>,\n ): this;\n get<P extends string>(\n pattern: P,\n ...handlers: [...RouteHandlerArg[], Handler<RouteParams<P>, TState>]\n ): this;\n get(pattern: string, ...args: unknown[]): this {\n return this._register(\"GET\", pattern, args);\n }\n\n post<P extends string>(\n pattern: P,\n handler: Handler<RouteParams<P>, TState>,\n ): this;\n post<P extends string>(\n pattern: P,\n ...handlers: [...RouteHandlerArg[], Handler<RouteParams<P>, TState>]\n ): this;\n post(pattern: string, ...args: unknown[]): this {\n return this._register(\"POST\", pattern, args);\n }\n\n put<P extends string>(\n pattern: P,\n handler: Handler<RouteParams<P>, TState>,\n ): this;\n put<P extends string>(\n pattern: P,\n ...handlers: [...RouteHandlerArg[], Handler<RouteParams<P>, TState>]\n ): this;\n put(pattern: string, ...args: unknown[]): this {\n return this._register(\"PUT\", pattern, args);\n }\n\n delete<P extends string>(\n pattern: P,\n handler: Handler<RouteParams<P>, TState>,\n ): this;\n delete<P extends string>(\n pattern: P,\n ...handlers: [...RouteHandlerArg[], Handler<RouteParams<P>, TState>]\n ): this;\n delete(pattern: string, ...args: unknown[]): this {\n return this._register(\"DELETE\", pattern, args);\n }\n\n patch<P extends string>(\n pattern: P,\n handler: Handler<RouteParams<P>, TState>,\n ): this;\n patch<P extends string>(\n pattern: P,\n ...handlers: [...RouteHandlerArg[], Handler<RouteParams<P>, TState>]\n ): this;\n patch(pattern: string, ...args: unknown[]): this {\n return this._register(\"PATCH\", pattern, args);\n }\n\n head<P extends string>(\n pattern: P,\n handler: Handler<RouteParams<P>, TState>,\n ): this;\n head<P extends string>(\n pattern: P,\n ...handlers: [...RouteHandlerArg[], Handler<RouteParams<P>, TState>]\n ): this;\n head(pattern: string, ...args: unknown[]): this {\n return this._register(\"HEAD\", pattern, args);\n }\n\n options<P extends string>(\n pattern: P,\n handler: Handler<RouteParams<P>, TState>,\n ): this;\n options<P extends string>(\n pattern: P,\n ...handlers: [...RouteHandlerArg[], Handler<RouteParams<P>, TState>]\n ): this;\n options(pattern: string, ...args: unknown[]): this {\n return this._register(\"OPTIONS\", pattern, args);\n }\n\n all<P extends string>(\n pattern: P,\n handler: Handler<RouteParams<P>, TState>,\n ): this;\n all<P extends string>(\n pattern: P,\n ...handlers: [...RouteHandlerArg[], Handler<RouteParams<P>, TState>]\n ): this;\n all(pattern: string, ...args: unknown[]): this {\n return this._registerMethods(METHODS, pattern, args);\n }\n\n ws<P extends string, TData = unknown>(\n pattern: P,\n handlers: WebSocketHandlers<TData>,\n beforeUpgrade?: (\n ctx: Context<RouteParams<P>, TState>,\n ) => boolean | { data?: TData } | Promise<boolean | { data?: TData }>,\n ): this {\n this.hasWebSockets = true;\n return this._registerMethods([\"GET\"], pattern, [\n async (ctx: Context<RouteParams<typeof pattern>, TState>) => {\n if (ctx.req.headers.get(\"upgrade\")?.toLowerCase() !== \"websocket\") {\n return new Response(\"Upgrade Required\", { status: 426 });\n }\n let customData: unknown;\n if (beforeUpgrade) {\n const check = await beforeUpgrade(ctx);\n if (!check) return new Response(\"Unauthorized\", { status: 401 });\n if (typeof check === \"object\" && check !== null && \"data\" in check) {\n customData = (check as { data?: unknown }).data;\n }\n }\n const upgradeData =\n customData !== undefined &&\n typeof customData === \"object\" &&\n customData !== null\n ? { ...customData, handlers, _barqInternal: true }\n : { handlers, _barqInternal: true, data: customData };\n const upgraded = ctx.upgrade(upgradeData);\n return upgraded\n ? new Response(null)\n : new Response(\"WebSocket upgrade failed\", { status: 400 });\n },\n ]);\n }\n\n group<Prefix extends string>(\n prefix: Prefix,\n callback: (group: RouteGroup<Prefix, TState>) => void,\n ): this;\n group<Prefix extends string>(\n prefix: Prefix,\n ...args: [...RouteHandlerArg[], (group: RouteGroup<Prefix, TState>) => void]\n ): this;\n group(prefix: string, ...args: unknown[]): this {\n const last = args[args.length - 1];\n if (typeof last !== \"function\") {\n throw new Error(\"Route group callback must be a function\");\n }\n const callback = last as (group: RouteGroup<string, TState>) => void;\n const groupMws: Middleware[] = [];\n for (let i = 0; i < args.length - 1; i++) {\n const item = args[i];\n if (Array.isArray(item)) {\n for (let j = 0; j < item.length; j++)\n groupMws.push(item[j] as Middleware);\n } else if (item && typeof item === \"object\") {\n groupMws.push(item as Middleware);\n }\n }\n const normalizedPrefix = normalizePrefix(prefix);\n const group = new RouteGroup(this, normalizedPrefix, groupMws);\n callback(group);\n return this;\n }\n\n use<const TMiddlewares extends readonly Middleware<TState, object>[]>(\n ...middlewares: TMiddlewares\n ): App<TState & MiddlewareOutputs<TMiddlewares>> {\n for (let i = 0; i < middlewares.length; i++) {\n this.middlewares.push(middlewares[i]! as Middleware);\n }\n this.hasMiddlewares = this.middlewares.length > 0;\n if (this.server !== null) {\n this.globalPipeline = composeMiddlewareDispatcher(\n this.middlewares,\n this.errorResolver,\n );\n }\n return this as unknown as App<TState & MiddlewareOutputs<TMiddlewares>>;\n }\n\n listen(port?: number): Server<unknown> {\n const listenPort = port ?? this._options.port ?? 0;\n if (!Number.isInteger(listenPort) || listenPort < 0 || listenPort > 65535) {\n throw new RangeError(\"port must be an integer between 0 and 65535\");\n }\n if (this.stopPromise !== null) {\n throw new Error(\"App cannot listen while shutdown is in progress\");\n }\n if (this.server !== null) {\n throw new Error(\"App is already listening\");\n }\n const userWs = this._options.websocket;\n this.globalPipeline = composeMiddlewareDispatcher(\n this.middlewares,\n this.errorResolver,\n );\n const contextApplication = this as unknown as ContextApplication;\n const opts: Record<string, unknown> = {\n fetch: this.fetchHandler,\n development: this.development,\n };\n if (this._options.idleTimeout !== undefined) {\n opts.idleTimeout = this._options.idleTimeout;\n }\n if (this._options.maxRequestBodySize !== undefined) {\n opts.maxRequestBodySize = this._options.maxRequestBodySize;\n }\n opts.error = (err: unknown) => errorToResponse(err, this.development);\n if (Bun.env.BARQ_IS_WORKER === \"true\") opts.reusePort = true;\n\n if (this.hasWebSockets || userWs !== undefined) {\n opts.websocket = {\n ...userWs,\n message: (ws: ServerWebSocket<unknown>, message: string | Buffer) => {\n const internal = getInternalWebSocketHandlers(ws);\n dispatchWebSocketCallback(internal?.message, [ws, message], (err) =>\n reportWebSocketError(internal?.error, ws, err),\n );\n dispatchWebSocketCallback(userWs?.message, [ws, message], (err) =>\n reportWebSocketError(userWs?.error, ws, err),\n );\n },\n open: (ws: ServerWebSocket<unknown>) => {\n const internal = getInternalWebSocketHandlers(ws);\n dispatchWebSocketCallback(internal?.open, [ws], (err) =>\n reportWebSocketError(internal?.error, ws, err),\n );\n dispatchWebSocketCallback(userWs?.open, [ws], (err) =>\n reportWebSocketError(userWs?.error, ws, err),\n );\n },\n close: (ws: ServerWebSocket<unknown>, code: number, reason: string) => {\n const internal = getInternalWebSocketHandlers(ws);\n dispatchWebSocketCallback(\n internal?.close,\n [ws, code, reason],\n (err) => reportWebSocketError(internal?.error, ws, err),\n );\n dispatchWebSocketCallback(userWs?.close, [ws, code, reason], (err) =>\n reportWebSocketError(userWs?.error, ws, err),\n );\n },\n drain: (ws: ServerWebSocket<unknown>) => {\n const internal = getInternalWebSocketHandlers(ws);\n dispatchWebSocketCallback(internal?.drain, [ws], (err) =>\n reportWebSocketError(internal?.error, ws, err),\n );\n dispatchWebSocketCallback(userWs?.drain, [ws], (err) =>\n reportWebSocketError(userWs?.error, ws, err),\n );\n },\n error: (ws: ServerWebSocket<unknown>, err: unknown) => {\n const internal = getInternalWebSocketHandlers(ws);\n if (internal?.error === undefined && userWs?.error === undefined) {\n console.error(\"Unhandled WebSocket error:\", err);\n return;\n }\n if (internal?.error) reportWebSocketError(internal.error, ws, err);\n if (userWs?.error) reportWebSocketError(userWs.error, ws, err);\n },\n };\n }\n\n if (this.nativeRoutes.length > 0) {\n const systemRoutes: Record<string, unknown> = Object.create(null);\n const hasGlobalPipeline =\n this.hasMiddlewares || this.errorResolver !== undefined;\n const routesByPattern = new Map<string, typeof this.nativeRoutes>();\n\n for (const nr of this.nativeRoutes) {\n let list = routesByPattern.get(nr.pattern);\n if (!list) {\n list = [];\n routesByPattern.set(nr.pattern, list);\n }\n list.push(nr);\n }\n\n for (const [pattern, list] of routesByPattern) {\n const isDynamic = pattern.includes(\":\") || pattern.includes(\"*\");\n const methodMap: Record<\n string,\n Response | ((req: Request) => Response | Promise<Response>)\n > = Object.create(null);\n\n for (const nr of list) {\n const h = nr.handler;\n const isDyn = nr.isDynamic;\n const raw = nr.rawHandler;\n\n if (hasGlobalPipeline || nr.hasRouteMiddlewares) {\n methodMap[nr.method] = (req: Request) => {\n try {\n const params = isDyn\n ? ((req as unknown as { params?: Record<string, string> })\n .params ?? EMPTY_PARAMS)\n : EMPTY_PARAMS;\n const ctx = new Context(\n req,\n this.server,\n params,\n contextApplication,\n );\n const result = this.globalPipeline(ctx, h);\n return finalizeResponse(ctx, result, req.method === \"HEAD\");\n } catch (err) {\n return errorToResponse(err, this.development);\n }\n };\n } else if (nr.isContextFree && raw) {\n const analysis = analyzeHandler(raw);\n const literal = analysis.literal;\n if (literal !== null) {\n if (literal.kind === \"string\") {\n methodMap[nr.method] = new Response(literal.value);\n if (nr.method === \"GET\" && !isDyn)\n methodMap.HEAD = new Response(null);\n } else {\n methodMap[nr.method] = new Response(literal.value, {\n headers: FAST_JSON_HEADERS,\n });\n if (nr.method === \"GET\" && !isDyn)\n methodMap.HEAD = new Response(null, {\n headers: FAST_JSON_HEADERS,\n });\n }\n } else {\n methodMap[nr.method] = () => {\n const res = raw();\n if (res instanceof Response) return res;\n if (isThenable(res)) {\n return Promise.resolve(res).then((r) => {\n if (r instanceof Response) return r;\n if (typeof r === \"object\" && r !== null)\n return Response.json(r);\n if (typeof r === \"string\")\n return new Response(r, { headers: FAST_TEXT_HEADERS });\n return finalizeValue(r as HandlerResult);\n });\n }\n if (typeof res === \"object\" && res !== null)\n return Response.json(res);\n if (typeof res === \"string\")\n return new Response(res, { headers: FAST_TEXT_HEADERS });\n return Response.json(res);\n };\n if (nr.method === \"GET\" && !isDyn) {\n methodMap.HEAD = () => {\n const res = raw();\n const r =\n res instanceof Response\n ? res\n : finalizeValue(res as HandlerResult);\n return stripBody(r);\n };\n }\n }\n } else if (nr.isJsonBodyOnly && raw) {\n methodMap[nr.method] = (req: Request) =>\n new Response(req.body, { headers: FAST_JSON_HEADERS });\n if (nr.method === \"GET\" && !isDyn) {\n methodMap.HEAD = (req: Request) =>\n req.json().then(\n () => new Response(null, { headers: FAST_JSON_HEADERS }),\n (err: unknown) => errorToResponse(err, this.development),\n );\n }\n } else if (nr.isParamsOnly && raw) {\n const analysis = analyzeHandler(raw);\n if (\n analysis.paramSerializer &&\n raw.constructor.name !== \"AsyncFunction\"\n ) {\n const serializer = analysis.paramSerializer;\n const responseInit = { headers: FAST_JSON_HEADERS };\n methodMap[nr.method] = (req: Request) => {\n const params =\n (\n req as unknown as {\n params?: Record<string, string>;\n }\n ).params ?? EMPTY_PARAMS;\n return new Response(serializer(params), responseInit);\n };\n } else {\n methodMap[nr.method] = (req: Request) => {\n const p = (\n req as unknown as { params?: Record<string, string> }\n ).params;\n const res = raw(\n (p ? req : { params: EMPTY_PARAMS, req }) as never,\n );\n if (typeof res === \"object\" && res !== null) {\n if (res instanceof Response) return res;\n return Response.json(res);\n }\n if (typeof res === \"string\")\n return new Response(res, { headers: FAST_TEXT_HEADERS });\n if (isThenable(res)) {\n return Promise.resolve(res).then((r) => {\n if (r instanceof Response) return r;\n if (typeof r === \"object\" && r !== null)\n return new Response(JSON.stringify(r), {\n headers: FAST_JSON_HEADERS,\n });\n if (typeof r === \"string\")\n return new Response(r, { headers: FAST_TEXT_HEADERS });\n return finalizeValue(r as HandlerResult);\n });\n }\n return new Response(JSON.stringify(res), {\n headers: FAST_JSON_HEADERS,\n });\n };\n if (nr.method === \"GET\" && !isDyn)\n methodMap.HEAD = () =>\n new Response(null, { headers: FAST_JSON_HEADERS });\n }\n } else if (nr.isLightweight && raw) {\n const isAsync = raw.constructor.name === \"AsyncFunction\";\n const reusedLightCtx = new FastLightContext(\n null as unknown as Request,\n EMPTY_PARAMS,\n );\n let lightCtxInUse = false;\n methodMap[nr.method] = (req: Request) => {\n const params = isDyn\n ? ((req as unknown as { params?: Record<string, string> })\n .params ?? EMPTY_PARAMS)\n : EMPTY_PARAMS;\n const useFresh = isAsync || lightCtxInUse;\n const ctx = useFresh\n ? new FastLightContext(req, params)\n : reusedLightCtx.init(req, params);\n if (!useFresh) lightCtxInUse = true;\n let res: unknown;\n try {\n res = raw(ctx as never);\n } catch (err) {\n if (!useFresh) lightCtxInUse = false;\n return errorToResponse(err, this.development);\n }\n if (typeof res === \"object\" && res !== null) {\n if (res instanceof Response) {\n if (!useFresh) lightCtxInUse = false;\n return res;\n }\n if (!isThenable(res)) {\n if (!useFresh) lightCtxInUse = false;\n return Response.json(res);\n }\n } else if (typeof res === \"string\") {\n if (!useFresh) lightCtxInUse = false;\n return new Response(res, { headers: FAST_TEXT_HEADERS });\n } else if (!isThenable(res)) {\n if (!useFresh) lightCtxInUse = false;\n return new Response(JSON.stringify(res), {\n headers: FAST_JSON_HEADERS,\n });\n }\n return Promise.resolve(res)\n .then((r) => {\n if (!useFresh) lightCtxInUse = false;\n if (r instanceof Response) return r;\n if (typeof r === \"object\" && r !== null)\n return new Response(JSON.stringify(r), {\n headers: FAST_JSON_HEADERS,\n });\n if (typeof r === \"string\")\n return new Response(r, { headers: FAST_TEXT_HEADERS });\n return finalizeValue(r as HandlerResult);\n })\n .catch((err) => {\n if (!useFresh) lightCtxInUse = false;\n return errorToResponse(err, this.development);\n });\n };\n if (nr.method === \"GET\" && !isDyn)\n methodMap.HEAD = () =>\n new Response(null, { headers: FAST_JSON_HEADERS });\n } else {\n methodMap[nr.method] = (req: Request) => {\n const isHead = nr.method === \"GET\" && req.method === \"HEAD\";\n try {\n const params = isDyn\n ? ((req as unknown as { params?: Record<string, string> })\n .params ?? EMPTY_PARAMS)\n : EMPTY_PARAMS;\n const ctx = new Context(\n req,\n this.server,\n params,\n contextApplication,\n );\n const res = raw ? raw(ctx as never) : h(ctx);\n if (res instanceof Response) {\n if (!isHead && !ctx._hasPendingCookies) return res;\n return finalizeResponse(ctx, res, isHead);\n }\n if (!isThenable(res))\n return finalizeResponse(\n ctx,\n toResponse(res as HandlerResult),\n isHead,\n );\n return Promise.resolve(res)\n .then((value) =>\n finalizeResponse(\n ctx,\n toResponse(value as HandlerResult),\n isHead,\n ),\n )\n .catch((err: unknown) =>\n finalizeResponse(\n ctx,\n errorToResponse(err, this.development),\n isHead,\n ),\n );\n } catch (err) {\n return errorToResponse(err, this.development);\n }\n };\n }\n }\n\n const allowMethods = Object.keys(methodMap);\n const allowHeader =\n allowMethods.includes(\"GET\") && !allowMethods.includes(\"HEAD\")\n ? [...allowMethods, \"HEAD\"].join(\", \")\n : allowMethods.join(\", \");\n\n if (isDynamic) {\n const getFn = methodMap.GET;\n if (\n allowMethods.length === 1 &&\n typeof getFn === \"function\" &&\n allowMethods[0] === \"GET\"\n ) {\n systemRoutes[pattern] = methodMap;\n } else {\n systemRoutes[pattern] = (req: Request) => {\n const matched = methodMap[req.method];\n if (typeof matched === \"function\") return matched(req);\n if (matched instanceof Response)\n return req.method === \"HEAD\" ? stripBody(matched) : matched;\n if (req.method === \"HEAD\") {\n const gh = methodMap.GET;\n if (typeof gh === \"function\") {\n const res = gh(req);\n return isThenable(res)\n ? (res as Promise<Response>).then(stripBody)\n : stripBody(res as Response);\n }\n }\n return new Response(`{\"error\":\"Method Not Allowed\"}`, {\n status: 405,\n headers: {\n \"content-type\": \"application/json; charset=utf-8\",\n Allow: allowHeader,\n },\n });\n };\n }\n } else {\n systemRoutes[pattern] = methodMap;\n }\n }\n\n opts.routes = systemRoutes;\n }\n\n opts.port = listenPort;\n if (this._options.hostname !== undefined)\n opts.hostname = this._options.hostname;\n if (this._options.tls !== undefined) opts.tls = this._options.tls;\n this.server = Bun.serve(opts as unknown as ServeOptions);\n return this.server;\n }\n\n private handle(\n req: Request,\n srv?: Server<unknown>,\n ): Response | Promise<Response> {\n const isHead = req.method === \"HEAD\";\n const serverInstance = srv ?? this.server;\n const contextApplication = this as unknown as ContextApplication;\n let currentCtx: Context | null = null;\n let pathname: string | undefined;\n\n try {\n pathname = scanPathname(req.url);\n\n const matched = this.trie.match(req.method, pathname);\n\n if (matched === null) {\n if (\n this.notFoundHandler === null &&\n !this.hasMiddlewares &&\n this.errorResolver === undefined\n ) {\n return new Response('{\"error\":\"Not Found\"}', {\n status: 404,\n headers: { \"content-type\": \"application/json; charset=utf-8\" },\n });\n }\n currentCtx = new Context(\n req,\n serverInstance,\n EMPTY_PARAMS,\n contextApplication,\n pathname,\n );\n const notFoundHandler =\n this.notFoundHandler !== null\n ? this.notFoundHandler\n : () =>\n new Response('{\"error\":\"Not Found\"}', {\n status: 404,\n headers: {\n \"content-type\": \"application/json; charset=utf-8\",\n },\n });\n const result = this.globalPipeline(currentCtx, notFoundHandler);\n return finalizeResponse(currentCtx, result, isHead);\n }\n\n if (!this.hasMiddlewares && this.errorResolver === undefined) {\n if (typeof matched === \"function\") {\n if (matched.length === 0) {\n const res = (\n matched as unknown as () => Response | Promise<Response>\n )();\n if (!isHead && !isThenable(res)) return res;\n if (isThenable(res)) {\n return (res as Promise<Response>).then(\n (r) => (isHead ? stripBody(r) : r),\n (err) => errorToResponse(err, this.development),\n );\n }\n return isHead ? stripBody(res) : res;\n }\n currentCtx = new Context(\n req,\n serverInstance,\n EMPTY_PARAMS,\n contextApplication,\n pathname,\n );\n const res = (matched as ResponseHandler)(currentCtx);\n if (!isHead && !isThenable(res)) {\n if (\n typeof res === \"object\" &&\n res !== null &&\n !(res instanceof Response)\n ) {\n return new Response(JSON.stringify(res), {\n headers: FAST_JSON_HEADERS,\n });\n }\n if (!currentCtx._hasPendingCookies) return res;\n }\n return finalizeResponse(\n currentCtx,\n guardRejections(res, this.development),\n isHead,\n );\n }\n\n const handler =\n typeof matched === \"object\" && MATCH_HANDLER in matched\n ? matched[MATCH_HANDLER]\n : undefined;\n if (handler !== undefined) {\n const params = matched as TrieParams;\n currentCtx = new Context(\n req,\n serverInstance,\n params,\n contextApplication,\n pathname,\n );\n const res = handler(currentCtx);\n if (!isHead && !isThenable(res)) {\n if (!currentCtx._hasPendingCookies) return res;\n }\n return finalizeResponse(\n currentCtx,\n guardRejections(res, this.development),\n isHead,\n );\n }\n }\n\n if (typeof matched === \"function\") {\n currentCtx = new Context(\n req,\n serverInstance,\n EMPTY_PARAMS,\n contextApplication,\n pathname,\n );\n const result = this.globalPipeline(currentCtx, matched);\n return finalizeResponse(currentCtx, result, isHead);\n }\n\n if (MATCH_NOT_ALLOWED in matched) {\n const allow = (matched as { [MATCH_NOT_ALLOWED]: string })[\n MATCH_NOT_ALLOWED\n ];\n if (\n this.errorHandler === null &&\n !this.hasMiddlewares &&\n this.errorResolver === undefined\n ) {\n return new Response('{\"error\":\"Method Not Allowed\"}', {\n status: 405,\n headers: {\n \"content-type\": \"application/json; charset=utf-8\",\n Allow: allow,\n },\n });\n }\n currentCtx = new Context(\n req,\n serverInstance,\n EMPTY_PARAMS,\n contextApplication,\n pathname,\n );\n const notAllowedHandler = () =>\n errorToResponse(\n new HttpError(\n 405,\n { error: \"Method Not Allowed\" },\n { Allow: allow },\n ),\n this.development,\n );\n const result = this.globalPipeline(currentCtx, notAllowedHandler);\n return finalizeResponse(currentCtx, result, isHead);\n }\n\n const params = matched as TrieParams;\n const handler = params[MATCH_HANDLER] as ResponseHandler;\n currentCtx = new Context(\n req,\n serverInstance,\n params,\n contextApplication,\n pathname,\n );\n const result = this.globalPipeline(currentCtx, handler);\n return finalizeResponse(currentCtx, result, isHead);\n } catch (err) {\n const activeCtx =\n currentCtx ??\n new Context(\n req,\n serverInstance,\n EMPTY_PARAMS,\n contextApplication,\n pathname,\n );\n if (this.errorHandler !== null) {\n try {\n const custom = this.errorHandler(err, activeCtx);\n const result = isThenable(custom)\n ? (custom as Promise<Response>).then((r) =>\n unwindAfter(\n this.middlewares,\n activeCtx,\n r,\n 0,\n this.errorResolver,\n ),\n )\n : unwindAfter(\n this.middlewares,\n activeCtx,\n custom as Response,\n 0,\n this.errorResolver,\n );\n return finalizeResponse(activeCtx, result, isHead);\n } catch (e2) {\n const fallback = errorToResponse(e2, this.development);\n const result = unwindAfter(\n this.middlewares,\n activeCtx,\n fallback,\n 0,\n this.errorResolver,\n );\n return finalizeResponse(activeCtx, result, isHead);\n }\n }\n const routingErr = errorToResponse(err, this.development);\n const result = unwindAfter(\n this.middlewares,\n activeCtx,\n routingErr,\n 0,\n this.errorResolver,\n );\n return finalizeResponse(activeCtx, result, isHead);\n }\n }\n\n cluster(port?: number): Server<unknown> | void {\n const listenPort = port ?? this._options.port ?? 3000;\n const isWorker = Bun.env.BARQ_IS_WORKER === \"true\";\n\n if (!Number.isInteger(listenPort) || listenPort < 0 || listenPort > 65535) {\n throw new RangeError(\"port must be an integer between 0 and 65535\");\n }\n\n if (isWorker || process.platform !== \"linux\") {\n return this.listen(listenPort);\n }\n if (listenPort === 0) {\n throw new RangeError(\"cluster requires a fixed, non-zero port\");\n }\n if (this.clusterProcesses !== null || this.server !== null) {\n throw new Error(\"App is already listening or clustering\");\n }\n const entry = process.argv[1];\n if (!entry) {\n throw new Error(\"Cannot start cluster without an application entry file\");\n }\n\n const processes: ReturnType<typeof Bun.spawn>[] = [];\n const spawnWorker = () => {\n const proc = Bun.spawn([process.execPath, \"run\", entry], {\n env: {\n ...process.env,\n BARQ_IS_WORKER: \"true\",\n PORT: String(listenPort),\n },\n stdio: [\"inherit\", \"inherit\", \"inherit\"],\n });\n proc.exited.then((_code) => {\n if (this.stopPromise === null && this.clusterProcesses !== null) {\n const idx = processes.indexOf(proc);\n if (idx !== -1) {\n processes.splice(idx, 1);\n }\n processes.push(spawnWorker());\n }\n });\n return proc;\n };\n\n try {\n for (let i = 0; i < cpus().length; i++) {\n processes.push(spawnWorker());\n }\n } catch (error) {\n for (const process of processes) process.kill(\"SIGTERM\");\n throw error;\n }\n this.clusterProcesses = processes;\n return;\n }\n\n async stop(hardTimeoutMs = 5000): Promise<ShutdownResult> {\n if (!Number.isFinite(hardTimeoutMs) || hardTimeoutMs < 0) {\n throw new RangeError(\n \"hardTimeoutMs must be a finite non-negative number\",\n );\n }\n if (this.stopPromise !== null) {\n return this.stopPromise;\n }\n const server = this.server;\n const clusterProcesses = this.clusterProcesses;\n this.server = null;\n this.clusterProcesses = null;\n if (server === null && clusterProcesses === null) {\n return { forced: false, pending: 0 };\n }\n this.stopPromise = (async () => {\n let serverResult: ShutdownResult = { forced: false, pending: 0 };\n let workersForced = false;\n try {\n if (server !== null) {\n serverResult = await stopServer(server, hardTimeoutMs);\n }\n } finally {\n if (clusterProcesses !== null) {\n workersForced = await stopClusterProcesses(\n clusterProcesses,\n hardTimeoutMs,\n );\n }\n }\n return {\n forced: serverResult.forced || workersForced,\n pending: serverResult.pending,\n };\n })();\n try {\n return await this.stopPromise;\n } finally {\n this.stopPromise = null;\n }\n }\n}\n\nfunction guardRejections(\n res: Response | Promise<Response>,\n development: boolean,\n): Response | Promise<Response> {\n return isThenable(res)\n ? (res as Promise<Response>).catch((err: unknown) =>\n errorToResponse(err, development),\n )\n : (res as Response);\n}\n\nfunction applyCookies(ctx: Context, res: Response): Response {\n if (!ctx._hasPendingCookies) return res;\n const cookies = ctx._cookieJarIfCreated();\n if (cookies === null) return res;\n const headers = new Headers(res.headers);\n applyPendingCookies(cookies, headers);\n ctx._hasPendingCookies = false;\n return new Response(res.body, {\n status: res.status,\n statusText: res.statusText,\n headers,\n });\n}\n\nfunction finalizeResponse(\n ctx: Context,\n res: Response | Promise<Response>,\n isHead: boolean,\n): Response | Promise<Response> {\n if (res instanceof Response) {\n if (!isHead && !ctx._hasPendingCookies) return res;\n const withCookies = applyCookies(ctx, res);\n return isHead ? stripBody(withCookies) : withCookies;\n }\n if (isThenable(res)) {\n return res.then((response) => {\n const withCookies = applyCookies(ctx, response);\n return isHead ? stripBody(withCookies) : withCookies;\n });\n }\n if (!isHead) {\n if (!ctx._hasPendingCookies) return res as Response;\n return applyCookies(ctx, res as Response);\n }\n return stripBody(applyCookies(ctx, res as Response));\n}\n\nfunction stripBody(res: Response): Response {\n if (res.body === null) return res;\n try {\n res.body.cancel?.().catch?.(() => {});\n } catch {}\n return new Response(null, {\n status: res.status,\n statusText: res.statusText,\n headers: res.headers,\n });\n}\n",
7
+ "import { timingSafeEqual } from \"node:crypto\";\nimport type { CookieJar, SetCookieOptions } from \"./types\";\n\ninterface PendingCookie {\n name: string;\n headerString: string;\n}\n\ninterface CookieState {\n cookies: Map<string, string> | null;\n requestHeaders: Headers | undefined;\n pending: PendingCookie[] | null;\n}\n\nclass CookieJarImpl implements CookieJar {\n private readonly state: CookieState;\n\n constructor(\n private readonly secret: string,\n requestHeaders?: Headers,\n private readonly onMutation?: () => void,\n ) {\n this.state = { cookies: null, requestHeaders, pending: null };\n }\n\n get(name: string): string | undefined {\n return getCookies(this.state).get(name);\n }\n\n getSigned(name: string, customSecret?: string): string | null {\n const signed = getCookies(this.state).get(name);\n if (!signed) return null;\n const signingSecret = customSecret ?? this.secret;\n if (!signingSecret) return null;\n return unsign(signed, signingSecret);\n }\n\n set(name: string, value: string, options?: SetCookieOptions): void {\n const cookieOptions = snapshotOptions(options);\n validateCookie(name, cookieOptions);\n getCookies(this.state).set(name, value);\n getPending(this.state).push({\n name,\n headerString: buildCookieString(name, value, cookieOptions),\n });\n this.onMutation?.();\n }\n\n setSigned(\n name: string,\n value: string,\n options?: SetCookieOptions,\n customSecret?: string,\n ): void {\n const signingSecret = customSecret ?? this.secret;\n if (!signingSecret) {\n throw new Error(\"A non-empty secret is required to set a signed cookie\");\n }\n const cookieOptions = snapshotOptions(options);\n validateCookie(name, cookieOptions);\n const signed = sign(value, signingSecret);\n getCookies(this.state).set(name, signed);\n getPending(this.state).push({\n name,\n headerString: buildCookieString(name, signed, cookieOptions),\n });\n this.onMutation?.();\n }\n\n delete(name: string, options?: SetCookieOptions): void {\n const cookieOptions = snapshotOptions(options);\n validateCookie(name, cookieOptions);\n getCookies(this.state).delete(name);\n getPending(this.state).push({\n name,\n headerString: buildCookieString(name, \"\", {\n ...cookieOptions,\n maxAge: 0,\n expires: new Date(0),\n }),\n });\n this.onMutation?.();\n }\n\n hasPending(): boolean {\n return (this.state.pending?.length ?? 0) > 0;\n }\n\n apply(headers: Headers): void {\n const pending = this.state.pending;\n if (pending === null) return;\n for (const cookie of pending) {\n headers.append(\"set-cookie\", cookie.headerString);\n }\n pending.length = 0;\n }\n}\n\nfunction normalizeSameSite(value: string | undefined): string {\n if (!value) return \"Lax\";\n const lower = value.toLowerCase();\n if (lower === \"strict\") return \"Strict\";\n if (lower === \"lax\") return \"Lax\";\n if (lower === \"none\") return \"None\";\n return value;\n}\n\nfunction buildCookieString(\n name: string,\n value: string,\n options: SetCookieOptions,\n): string {\n validateCookie(name, options);\n let cookie = `${name}=${encodeURIComponent(value)}`;\n\n if (options.path) cookie += `; Path=${options.path}`;\n if (options.domain) cookie += `; Domain=${options.domain}`;\n if (options.maxAge !== undefined) cookie += `; Max-Age=${options.maxAge}`;\n if (options.expires) cookie += `; Expires=${options.expires.toUTCString()}`;\n if (options.httpOnly !== false) cookie += \"; HttpOnly\";\n if (options.secure) cookie += \"; Secure\";\n const sameSite = normalizeSameSite(options.sameSite);\n if (sameSite) cookie += `; SameSite=${sameSite}`;\n\n return cookie;\n}\n\nfunction sign(value: string, secret: string): string {\n const hasher = new Bun.CryptoHasher(\"sha256\", secret);\n hasher.update(value);\n const sig = hasher.digest(\"base64url\");\n return `${value}.${sig}`;\n}\n\nfunction unsign(signedValue: string, secret: string): string | null {\n const lastDot = signedValue.lastIndexOf(\".\");\n if (lastDot <= 0 || lastDot === signedValue.length - 1) return null;\n const value = signedValue.slice(0, lastDot);\n const sig = signedValue.slice(lastDot + 1);\n const hasher = new Bun.CryptoHasher(\"sha256\", secret);\n hasher.update(value);\n const expected = hasher.digest(\"base64url\");\n const actualBytes = Buffer.from(sig);\n const expectedBytes = Buffer.from(expected);\n if (actualBytes.length !== expectedBytes.length) return null;\n if (!timingSafeEqual(actualBytes, expectedBytes)) return null;\n return value;\n}\n\nfunction decodeCookieValue(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n // A malformed percent escape is an invalid cookie value, not a request error.\n return value;\n }\n}\n\nfunction validateCookie(name: string, options: SetCookieOptions): void {\n if (!/^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/.test(name)) {\n throw new TypeError(\"Cookie name must be a valid HTTP token\");\n }\n if (\n options.path !== undefined &&\n (!options.path.startsWith(\"/\") || /[;\\r\\n\\0]/.test(options.path))\n ) {\n throw new TypeError(\n \"Cookie path must start with '/' and contain no controls\",\n );\n }\n if (\n options.domain !== undefined &&\n (!/^(?:\\.?[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?)(?:\\.[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?)*$/.test(\n options.domain,\n ) ||\n options.domain.includes(\"..\"))\n ) {\n throw new TypeError(\"Cookie domain is invalid\");\n }\n if (\n options.maxAge !== undefined &&\n (!Number.isSafeInteger(options.maxAge) || options.maxAge < 0)\n ) {\n throw new TypeError(\"Cookie maxAge must be a non-negative safe integer\");\n }\n if (\n options.expires !== undefined &&\n !Number.isFinite(options.expires.getTime())\n ) {\n throw new TypeError(\"Cookie expires must be a valid Date\");\n }\n if (\n options.sameSite !== undefined &&\n ![\"strict\", \"lax\", \"none\"].includes(options.sameSite.toLowerCase())\n ) {\n throw new TypeError(\"Cookie sameSite must be Strict, Lax, or None\");\n }\n if (options.sameSite?.toLowerCase() === \"none\" && !options.secure) {\n throw new TypeError(\"SameSite=None cookies must also be Secure\");\n }\n if (name.startsWith(\"__Secure-\") && !options.secure) {\n throw new TypeError(\"__Secure- cookies must also be Secure\");\n }\n if (\n name.startsWith(\"__Host-\") &&\n (!options.secure || options.path !== \"/\" || options.domain !== undefined)\n ) {\n throw new TypeError(\n \"__Host- cookies must be Secure, use Path=/, and omit Domain\",\n );\n }\n}\n\nfunction snapshotOptions(options?: SetCookieOptions): SetCookieOptions {\n if (!options) return {};\n return {\n ...options,\n ...(options.expires === undefined\n ? {}\n : { expires: new Date(options.expires.getTime()) }),\n };\n}\n\nfunction parseCookieHeader(header: string): Map<string, string> {\n const cookies = new Map<string, string>();\n let pos = 0;\n const len = header.length;\n while (pos < len) {\n while (pos < len && header.charCodeAt(pos) === 32) pos++;\n if (pos >= len) break;\n const eq = header.indexOf(\"=\", pos);\n if (eq === -1) break;\n const name = header.slice(pos, eq).trim();\n pos = eq + 1;\n let end = header.indexOf(\";\", pos);\n if (end === -1) end = len;\n const value = header.slice(pos, end);\n if (name) cookies.set(name, decodeCookieValue(value));\n pos = end + 1;\n }\n return cookies;\n}\n\nfunction getCookies(state: CookieState): Map<string, string> {\n if (state.cookies !== null) return state.cookies;\n const header = state.requestHeaders?.get(\"cookie\") ?? \"\";\n state.requestHeaders = undefined;\n state.cookies = header.length === 0 ? new Map() : parseCookieHeader(header);\n return state.cookies;\n}\n\nfunction getPending(state: CookieState): PendingCookie[] {\n if (state.pending === null) state.pending = [];\n return state.pending;\n}\n\nexport function createCookieJar(\n secret?: string,\n requestHeaders?: Headers,\n onMutation?: () => void,\n): CookieJar {\n return new CookieJarImpl(secret ?? \"\", requestHeaders, onMutation);\n}\n\nexport function hasPendingCookies(cookieJar: CookieJar): boolean {\n return cookieJar instanceof CookieJarImpl && cookieJar.hasPending();\n}\n\nexport function applyPendingCookies(\n cookieJar: CookieJar,\n headers: Headers,\n): void {\n if (!(cookieJar instanceof CookieJarImpl)) {\n throw new TypeError(\"CookieJar was not created by Barq\");\n }\n cookieJar.apply(headers);\n}\n",
8
+ "const NULL_BODY_STATUSES: ReadonlySet<number> = new Set([204, 205, 304]);\nconst DEFAULT_JSON_HEADERS = Object.freeze({\n \"content-type\": \"application/json; charset=utf-8\",\n});\nconst DEFAULT_JSON_INIT: ResponseInit = Object.freeze({\n status: 200,\n headers: DEFAULT_JSON_HEADERS,\n});\nconst DEFAULT_TEXT_HEADERS = Object.freeze({\n \"content-type\": \"text/plain; charset=utf-8\",\n});\nexport type HeadersInit = NonNullable<ResponseInit[\"headers\"]>;\n\nexport function isNullBodyStatus(status: number): boolean {\n return (status >= 100 && status < 200) || NULL_BODY_STATUSES.has(status);\n}\n\nfunction createJsonResponse(data: unknown, init: ResponseInit): Response {\n // Preserve JSON.stringify's empty-body behavior for values that do not\n // produce a JSON value, while using Bun's native serializer otherwise.\n if (\n data === undefined ||\n typeof data === \"function\" ||\n typeof data === \"symbol\"\n ) {\n return new Response(JSON.stringify(data), init);\n }\n return Response.json(data, init);\n}\n\nexport function json(data: unknown, init?: number | ResponseInit): Response {\n if (init === undefined) {\n if (typeof data === \"object\" && data !== null) {\n return new Response(JSON.stringify(data), DEFAULT_JSON_INIT);\n }\n return createJsonResponse(data, DEFAULT_JSON_INIT);\n }\n\n if (typeof init === \"number\") {\n if (isNullBodyStatus(init)) {\n return new Response(null, { status: init });\n }\n return createJsonResponse(data, {\n status: init,\n headers: DEFAULT_JSON_HEADERS,\n });\n }\n\n const status = init.status ?? 200;\n if (isNullBodyStatus(status)) {\n return new Response(null, { ...init, status });\n }\n\n if (init.headers === undefined) {\n return createJsonResponse(data, {\n ...init,\n status,\n headers: DEFAULT_JSON_HEADERS,\n });\n }\n\n const headers = new Headers(init.headers);\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json; charset=utf-8\");\n }\n return createJsonResponse(data, { ...init, status, headers });\n}\n\nexport function text(body: string, init?: number | ResponseInit): Response {\n if (init === undefined) {\n return new Response(body);\n }\n\n if (typeof init === \"number\") {\n if (isNullBodyStatus(init)) {\n return new Response(null, { status: init });\n }\n return new Response(body, {\n status: init,\n headers: DEFAULT_TEXT_HEADERS,\n });\n }\n\n const status = init.status ?? 200;\n if (isNullBodyStatus(status)) {\n return new Response(null, { ...init, status });\n }\n\n if (init.headers === undefined) {\n return new Response(body, {\n ...init,\n status,\n headers: DEFAULT_TEXT_HEADERS,\n });\n }\n\n const headers = new Headers(init.headers);\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"text/plain; charset=utf-8\");\n }\n return new Response(body, { ...init, status, headers });\n}\n\nexport function empty(status = 204, headers?: HeadersInit): Response {\n const init: ResponseInit =\n headers !== undefined ? { status, headers } : { status };\n return new Response(null, init);\n}\n\n// biome-ignore lint/suspicious/noControlCharactersInRegex: This regex detects control characters in redirect targets.\nconst CONTROL_CHARS = /[\\u0000-\\u001f\\u007f]/;\n\nconst ALLOWED_REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\n\nexport function redirect(\n url: string,\n status = 302,\n allowlist?: ReadonlySet<string>,\n): Response {\n if (!ALLOWED_REDIRECT_STATUSES.has(status)) {\n throw new TypeError(\n `redirect status must be one of: ${Array.from(ALLOWED_REDIRECT_STATUSES).join(\", \")}`,\n );\n }\n if (CONTROL_CHARS.test(url) || url.includes(\"\\\\\")) {\n throw new TypeError(\n \"redirect target contains control or backslash characters\",\n );\n }\n if (url.charCodeAt(0) === 47) {\n if (url.charCodeAt(1) === 47) {\n throw new TypeError(\"redirect target must not be protocol-relative\");\n }\n } else {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new TypeError(\n \"redirect target must be a root-relative path or an absolute URL\",\n );\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new TypeError(\n `redirect target protocol is not allowed: ${parsed.protocol}`,\n );\n }\n const host = parsed.host.toLowerCase();\n if (allowlist !== undefined && !allowlist.has(host)) {\n throw new TypeError(`redirect target host is not allowlisted: ${host}`);\n }\n }\n const res = new Response(null, { status });\n res.headers.set(\"location\", url);\n return res;\n}\n",
9
+ "import { isIP } from \"node:net\";\n\nexport type IpMatcher = (ip: string) => boolean;\n\nfunction ipv4ToNumber(bytes: Uint8Array): number {\n return (\n ((bytes[0]! << 24) | (bytes[1]! << 16) | (bytes[2]! << 8) | bytes[3]!) >>> 0\n );\n}\n\nexport function compileTrustProxy(\n trust:\n | boolean\n | string\n | readonly string[]\n | ((ip: string) => boolean)\n | undefined,\n): IpMatcher {\n if (!trust) return () => false;\n if (trust === true) return () => true;\n if (typeof trust === \"function\") return trust;\n\n const ranges = typeof trust === \"string\" ? [trust] : trust;\n if (ranges.length === 0) return () => false;\n\n const matchers: IpMatcher[] = [];\n\n for (const range of ranges) {\n if (range === \"loopback\") {\n matchers.push((ip) => {\n const addr = parseIpAddress(ip);\n if (addr === null) return false;\n if (addr.length === 4) return addr[0] === 127;\n return addr.slice(0, 15).every((b) => b === 0) && addr[15] === 1;\n });\n continue;\n }\n\n const slash = range.indexOf(\"/\");\n const netText = slash === -1 ? range : range.slice(0, slash);\n const netBytes = parseIpAddress(netText);\n if (!netBytes) continue;\n\n const bits =\n slash === -1 ? netBytes.length * 8 : Number(range.slice(slash + 1));\n if (netBytes.length === 4) {\n const netNum = ipv4ToNumber(netBytes);\n const mask = bits === 0 ? 0 : (~0 << (32 - bits)) >>> 0;\n const expected = (netNum & mask) >>> 0;\n matchers.push((ip) => {\n const addr = parseIpAddress(ip);\n if (addr?.length !== 4) return false;\n return (ipv4ToNumber(addr) & mask) >>> 0 === expected;\n });\n } else {\n matchers.push((ip) => ipMatchesRange(ip, range));\n }\n }\n\n return (ip: string) => matchers.some((m) => m(ip));\n}\n\nexport function isIpRange(value: string): boolean {\n if (value === \"loopback\") return true;\n const slash = value.indexOf(\"/\");\n if (slash !== value.lastIndexOf(\"/\")) return false;\n const address = slash === -1 ? value : value.slice(0, slash);\n const bytes = parseIpAddress(address);\n if (bytes === null) return false;\n if (slash === -1) return true;\n const bitsText = value.slice(slash + 1);\n if (!/^\\d+$/.test(bitsText)) return false;\n const bits = Number(bitsText);\n return Number.isInteger(bits) && bits >= 0 && bits <= bytes.length * 8;\n}\n\nexport function ipMatchesRange(ip: string, range: string): boolean {\n const address = parseIpAddress(ip);\n if (address === null) return false;\n if (range === \"loopback\") {\n if (address.length === 4) return address[0] === 127;\n return (\n address.slice(0, 15).every((byte) => byte === 0) && address[15] === 1\n );\n }\n\n const slash = range.indexOf(\"/\");\n const networkText = slash === -1 ? range : range.slice(0, slash);\n const network = parseIpAddress(networkText);\n if (network === null || address.length !== network.length) return false;\n const bits =\n slash === -1 ? network.length * 8 : Number(range.slice(slash + 1));\n if (!Number.isInteger(bits) || bits < 0 || bits > network.length * 8) {\n return false;\n }\n\n const fullBytes = Math.floor(bits / 8);\n for (let i = 0; i < fullBytes; i++) {\n if (address[i] !== network[i]) return false;\n }\n const remainingBits = bits % 8;\n if (remainingBits === 0) return true;\n const mask = (0xff << (8 - remainingBits)) & 0xff;\n return (address[fullBytes]! & mask) === (network[fullBytes]! & mask);\n}\n\nexport function isValidIpAddress(value: string): boolean {\n return parseIpAddress(value) !== null;\n}\n\nfunction parseIpAddress(value: string): Uint8Array | null {\n const version = isIP(value);\n if (version === 4) {\n const bytes = value.split(\".\").map(Number);\n if (bytes.length !== 4) return null;\n return Uint8Array.from(bytes);\n }\n if (version !== 6) return null;\n\n let address = value.toLowerCase();\n if (address.includes(\".\")) {\n const separator = address.lastIndexOf(\":\");\n const ipv4 = address\n .slice(separator + 1)\n .split(\".\")\n .map(Number);\n if (separator === -1 || ipv4.length !== 4) return null;\n const high = ((ipv4[0]! << 8) | ipv4[1]!).toString(16);\n const low = ((ipv4[2]! << 8) | ipv4[3]!).toString(16);\n address = `${address.slice(0, separator + 1)}${high}:${low}`;\n }\n\n const halves = address.split(\"::\");\n if (halves.length > 2) return null;\n const left = halves[0] ? halves[0].split(\":\") : [];\n const right = halves.length === 2 && halves[1] ? halves[1].split(\":\") : [];\n const missing = 8 - left.length - right.length;\n if (\n (halves.length === 1 && missing !== 0) ||\n (halves.length === 2 && missing < 1)\n ) {\n return null;\n }\n const groups = [\n ...left,\n ...new Array(halves.length === 2 ? missing : 0).fill(\"0\"),\n ...right,\n ];\n if (\n groups.length !== 8 ||\n groups.some((group) => !/^[0-9a-f]{1,4}$/.test(group))\n ) {\n return null;\n }\n\n const bytes = new Uint8Array(16);\n for (let i = 0; i < groups.length; i++) {\n const group = Number.parseInt(groups[i]!, 16);\n bytes[i * 2] = group >>> 8;\n bytes[i * 2 + 1] = group & 0xff;\n }\n return bytes;\n}\n",
10
+ "export interface ParsedTarget {\n pathname: string;\n query: string | undefined;\n}\n\nfunction decodeSegment(seg: string): string {\n if (seg.indexOf(\"%\") === -1) return seg;\n try {\n return decodeURIComponent(seg);\n } catch {\n return seg;\n }\n}\n\nfunction decodePercentSegment(seg: string): string {\n try {\n return decodeURIComponent(seg);\n } catch {\n return seg;\n }\n}\n\nfunction isDotSegment(seg: string): boolean {\n return seg === \".\" || seg === \"..\";\n}\n\nfunction hasDotSegment(path: string): boolean {\n let i = 0;\n const len = path.length;\n while (i < len) {\n while (i < len && path.charCodeAt(i) === 47) i++;\n if (i >= len) break;\n const endIdx = path.indexOf(\"/\", i);\n const segEnd = endIdx === -1 ? len : endIdx;\n const segmentLength = segEnd - i;\n if (\n (segmentLength === 1 && path.charCodeAt(i) === 46) ||\n (segmentLength === 2 &&\n path.charCodeAt(i) === 46 &&\n path.charCodeAt(i + 1) === 46)\n ) {\n return true;\n }\n\n const percent = path.indexOf(\"%\", i);\n if (percent !== -1 && percent < segEnd) {\n const decoded = decodePercentSegment(path.slice(i, segEnd));\n if (isDotSegment(decoded)) return true;\n }\n if (endIdx === -1) break;\n i = endIdx + 1;\n }\n return false;\n}\n\nexport function hasEncodedSlash(path: string): boolean {\n return path.includes(\"%2f\") || path.includes(\"%2F\");\n}\n\nfunction targetStart(url: string): number {\n if (url.charCodeAt(0) === 47) return 0;\n if (\n url.charCodeAt(4) === 58 &&\n url.charCodeAt(5) === 47 &&\n url.charCodeAt(6) === 47\n )\n return 7;\n if (\n url.charCodeAt(5) === 58 &&\n url.charCodeAt(6) === 47 &&\n url.charCodeAt(7) === 47\n )\n return 8;\n const scheme = url.indexOf(\"://\");\n return scheme === -1 ? 0 : scheme + 3;\n}\n\nexport function normalizeDotSegments(path: string): string {\n const len = path.length;\n const segments: string[] = [];\n let start = 0;\n\n while (start < len) {\n while (start < len && path.charCodeAt(start) === 47) start++;\n if (start >= len) break;\n const end = path.indexOf(\"/\", start);\n const segEnd = end === -1 ? len : end;\n const rawSeg = path.slice(start, segEnd);\n const decodedSeg = decodeSegment(rawSeg);\n\n if (decodedSeg === \".\") {\n } else if (decodedSeg === \"..\") {\n segments.pop();\n } else {\n segments.push(rawSeg);\n }\n if (end === -1) break;\n start = end + 1;\n }\n\n const res = `/${segments.join(\"/\")}`;\n const endsWithSlash =\n path.endsWith(\"/\") || path.endsWith(\"/.\") || path.endsWith(\"/..\");\n return path.length > 1 && endsWithSlash && res !== \"/\" ? `${res}/` : res;\n}\n\nexport function scanPathname(url: string): string {\n const s = targetStart(url);\n const slash = url.indexOf(\"/\", s);\n if (slash === -1) return \"/\";\n let end = url.indexOf(\"?\", slash);\n if (end === -1) {\n end = url.indexOf(\"#\", slash);\n if (end === -1) end = url.length;\n } else {\n const hash = url.indexOf(\"#\", slash);\n if (hash !== -1 && hash < end) end = hash;\n }\n const raw = url.slice(slash, end);\n if (raw.indexOf(\".\") === -1 && raw.indexOf(\"%\") === -1) return raw;\n\n if (hasEncodedSlash(raw)) {\n return raw;\n }\n\n return hasDotSegment(raw) ? normalizeDotSegments(raw) : raw;\n}\n\nexport function parseRequestTarget(url: string): ParsedTarget {\n const s = targetStart(url);\n const slash = url.indexOf(\"/\", s);\n\n let pathname: string;\n let query: string | undefined;\n\n if (slash === -1) {\n pathname = \"/\";\n const q = url.indexOf(\"?\", s);\n const h = url.indexOf(\"#\", s);\n if (q !== -1 && (h === -1 || q < h)) {\n query = h === -1 ? url.slice(q + 1) : url.slice(q + 1, h);\n }\n } else {\n let end = url.indexOf(\"?\", slash);\n const hash = url.indexOf(\"#\", slash);\n\n if (hash !== -1 && (end === -1 || hash < end)) end = hash;\n\n if (end === -1) {\n end = url.length;\n } else if (url.charCodeAt(end) === 63) {\n query =\n hash !== -1 && hash > end\n ? url.slice(end + 1, hash)\n : url.slice(end + 1);\n }\n\n const raw = url.slice(slash, end);\n\n if (hasEncodedSlash(raw)) {\n pathname = raw;\n } else {\n pathname = hasDotSegment(raw) ? normalizeDotSegments(raw) : raw;\n }\n }\n\n return { pathname, query };\n}\n",
11
+ "function decodeQueryComponent(value: string): string {\n const hasPlus = value.indexOf(\"+\") !== -1;\n const hasPercent = value.indexOf(\"%\") !== -1;\n if (!hasPlus && !hasPercent) return value;\n const formValue = hasPlus ? value.replace(/\\+/g, \" \") : value;\n if (!hasPercent) return formValue;\n try {\n return decodeURIComponent(formValue);\n } catch {\n return new URLSearchParams(`v=${value}`).get(\"v\") ?? \"\";\n }\n}\n\nexport function findQueryParam(\n url: string,\n name: string,\n startPos?: number,\n): string | null {\n const queryStart =\n startPos !== undefined && startPos >= 0 ? startPos : url.indexOf(\"?\");\n if (queryStart === -1) return null;\n\n let s = queryStart + 1;\n const len = url.length;\n const nameLen = name.length;\n\n while (s < len) {\n if (url.startsWith(name, s)) {\n const eqPos = s + nameLen;\n const nextChar = url.charCodeAt(eqPos);\n if (nextChar === 61) {\n // '='\n const valStart = eqPos + 1;\n let amp = url.indexOf(\"&\", valStart);\n if (amp === -1) amp = len;\n const val = url.slice(valStart, amp);\n if (val.indexOf(\"+\") === -1 && val.indexOf(\"%\") === -1) {\n return val;\n }\n return decodeQueryComponent(val);\n }\n if (nextChar === 38 || eqPos === len) {\n return \"\";\n }\n }\n\n const amp = url.indexOf(\"&\", s);\n if (amp === -1) break;\n s = amp + 1;\n }\n return null;\n}\n\nexport function findQueryParamAll(url: string, name: string): string[] {\n const res: string[] = [];\n const queryStart = url.indexOf(\"?\");\n if (queryStart === -1) return res;\n const len = url.length;\n let s = queryStart + 1;\n const nLen = name.length;\n while (s < len) {\n let amp = url.indexOf(\"&\", s);\n if (amp === -1) amp = len;\n let eq = url.indexOf(\"=\", s);\n if (eq === -1 || eq > amp) eq = amp;\n if (eq - s === nLen && url.startsWith(name, s)) {\n const val = eq < amp ? url.slice(eq + 1, amp) : \"\";\n if (val.indexOf(\"%\") === -1 && val.indexOf(\"+\") === -1) {\n res.push(val);\n } else {\n try {\n res.push(decodeURIComponent(val.replace(/\\+/g, \" \")));\n } catch {\n res.push(val);\n }\n }\n }\n s = amp + 1;\n }\n return res;\n}\n\nexport function parseAllQueryParams(url: string): Record<string, string> {\n const qIdx = url.indexOf(\"?\");\n if (qIdx === -1) return Object.create(null);\n const len = url.length;\n const res: Record<string, string> = Object.create(null);\n let s = qIdx + 1;\n while (s < len) {\n let amp = url.indexOf(\"&\", s);\n if (amp === -1) amp = len;\n let eq = url.indexOf(\"=\", s);\n if (eq === -1 || eq > amp) eq = amp;\n const k = decodeQueryComponent(url.slice(s, eq));\n const v = eq < amp ? decodeQueryComponent(url.slice(eq + 1, amp)) : \"\";\n if (res[k] === undefined) res[k] = v;\n s = amp + 1;\n }\n return res;\n}\n\nexport function parseFastQuery(\n url: string,\n startPos: number,\n): Record<string, string> {\n const out: Record<string, string> = Object.create(null);\n let s = startPos;\n const len = url.length;\n while (s < len) {\n let eq = url.indexOf(\"=\", s);\n if (eq === -1) eq = len;\n let amp = url.indexOf(\"&\", eq < len ? eq + 1 : s);\n if (amp === -1) amp = len;\n const k = url.slice(s, eq);\n const v = eq < amp ? url.slice(eq + 1, amp) : \"\";\n out[k] =\n v.indexOf(\"+\") === -1 && v.indexOf(\"%\") === -1\n ? v\n : decodeURIComponent(v.replace(/\\+/g, \" \"));\n s = amp + 1;\n }\n return out;\n}\n",
12
+ "import type { Server } from \"bun\";\nimport { createCookieJar } from \"./cookies\";\nimport { redirect } from \"./http\";\nimport { ipMatchesRange, isValidIpAddress } from \"./internal/ip\";\nimport { scanPathname } from \"./internal/pathname\";\nimport { parseAllQueryParams } from \"./internal/query\";\nimport type { CookieJar, Params } from \"./types\";\n\nexport interface ContextApplication {\n readonly development: boolean;\n readonly redirectHosts: ReadonlySet<string>;\n readonly trustProxy:\n | boolean\n | string\n | readonly string[]\n | ((ip: string) => boolean);\n readonly trustedProxyChecker?: (ip: string) => boolean;\n readonly cookieSecret?: string;\n}\n\ntype TrustProxy = ContextApplication[\"trustProxy\"];\nconst TEXT_DECODER = new TextDecoder();\n\ninterface LazyFields<TState> {\n cookies?: CookieJar | null;\n state?: TState | null;\n ip?: string | null;\n valid?: unknown;\n bodyBufferPromise?: Promise<ArrayBuffer> | null;\n textPromise?: Promise<string> | null;\n jsonPromise?: Promise<unknown> | null;\n blobPromise?: Promise<Blob> | null;\n formDataPromise?: ReturnType<Request[\"formData\"]> | null;\n}\n\nexport class Context<\n TParams extends object = Params,\n TState extends object = Record<string, unknown>,\n> {\n readonly req: Request;\n readonly params: TParams;\n /** @internal Set only when this request queues a cookie mutation. */\n _hasPendingCookies = false;\n\n private readonly server: Server<unknown> | null;\n private readonly application: ContextApplication;\n private _pathname: string | null;\n private _query: URLSearchParams | null = null;\n private _url: string | null = null;\n private _queryParams: Record<string, string> | null = null;\n private _lazy: LazyFields<TState> | null = null;\n\n constructor(\n req: Request,\n server: Server<unknown> | null,\n params: TParams,\n application: ContextApplication,\n pathname?: string,\n ) {\n this.req = req;\n this.server = server;\n this.params = params;\n this.application = application;\n this._pathname = pathname ?? null;\n this._query = null;\n }\n\n private _getLazy(): LazyFields<TState> {\n let lazy = this._lazy;\n if (lazy === null) {\n lazy = {};\n this._lazy = lazy;\n }\n return lazy;\n }\n\n get development(): boolean {\n return this.application.development;\n }\n\n get redirectHosts(): ReadonlySet<string> {\n return this.application.redirectHosts;\n }\n\n get trustProxy(): TrustProxy {\n return this.application.trustProxy;\n }\n\n get cookies(): CookieJar {\n const lazy = this._getLazy();\n if (!lazy.cookies) {\n lazy.cookies = createCookieJar(\n this.application.cookieSecret ?? \"\",\n this.req.headers,\n () => {\n this._hasPendingCookies = true;\n },\n );\n }\n return lazy.cookies as CookieJar;\n }\n\n /** @internal Returns the jar without creating one. */\n _cookieJarIfCreated(): CookieJar | null {\n return this._lazy?.cookies ?? null;\n }\n\n get state(): TState {\n const lazy = this._getLazy();\n if (!lazy.state) {\n lazy.state = Object.create(null) as TState;\n }\n return lazy.state;\n }\n\n get valid(): unknown {\n const lazy = this._lazy;\n if (lazy && lazy.valid !== undefined) return lazy.valid;\n return (lazy?.state as Record<string, unknown> | null | undefined)?.valid;\n }\n\n set valid(val: unknown) {\n this._getLazy().valid = val;\n (this.state as Record<string, unknown>).valid = val;\n }\n\n get pathname(): string {\n if (this._pathname !== null) return this._pathname;\n const p = scanPathname(this.req.url);\n this._pathname = p;\n return p;\n }\n\n get query(): URLSearchParams {\n if (this._query) return this._query;\n const url = this.req.url;\n const qIdx = url.indexOf(\"?\");\n if (qIdx === -1) {\n const sp = new URLSearchParams(\"\");\n this._query = sp;\n return sp;\n }\n const hashIdx = url.indexOf(\"#\", qIdx);\n const qStr =\n hashIdx === -1 ? url.slice(qIdx + 1) : url.slice(qIdx + 1, hashIdx);\n const sp = new URLSearchParams(qStr);\n this._query = sp;\n return sp;\n }\n\n queryParam(name: string): string | null {\n if (this._query) return this._query.get(name);\n if (this._queryParams === null) {\n if (this._url === null) this._url = this.req.url;\n this._queryParams = parseAllQueryParams(this._url);\n }\n return this._queryParams[name] ?? null;\n }\n\n queryParamAll(name: string): string[] {\n return this.query.getAll(name);\n }\n\n get ip(): string {\n const lazy = this._lazy;\n if (lazy && typeof lazy.ip === \"string\") return lazy.ip;\n const directIp = this.getDirectIp();\n if (!this.isTrustedProxy(directIp)) {\n this._getLazy().ip = directIp;\n return directIp;\n }\n\n const forwarded = this.req.headers.get(\"x-forwarded-for\");\n if (forwarded) {\n const hops = forwarded.split(\",\").map((hop) => hop.trim());\n if (hops.every(isValidIpAddress)) {\n let clientIp = directIp;\n for (let i = hops.length - 1; i >= 0; i--) {\n if (clientIp && !this.isTrustedProxy(clientIp)) break;\n clientIp = hops[i]!;\n }\n this._getLazy().ip = clientIp;\n return clientIp;\n }\n this._getLazy().ip = directIp;\n return directIp;\n }\n\n for (const name of [\"cf-connecting-ip\", \"x-real-ip\"]) {\n const candidate = this.req.headers.get(name)?.trim();\n if (candidate && isValidIpAddress(candidate)) {\n this._getLazy().ip = candidate;\n return candidate;\n }\n }\n\n this._getLazy().ip = directIp;\n return directIp;\n }\n\n private isTrustedProxy(ip: string): boolean {\n const trust = this.trustProxy;\n if (trust === true) return true;\n if (trust === false || !ip) return false;\n if (this.application.trustedProxyChecker) {\n return this.application.trustedProxyChecker(ip);\n }\n if (typeof trust === \"function\") return trust(ip);\n if (typeof trust !== \"string\") {\n return trust.some((range) => ipMatchesRange(ip, range));\n }\n return ipMatchesRange(ip, trust);\n }\n\n private getDirectIp(): string {\n const info = this.server?.requestIP(this.req);\n return info?.address ?? \"\";\n }\n\n get bodyStream(): ReadableStream<Uint8Array> | null {\n return this.req.body;\n }\n\n stream(): ReadableStream<Uint8Array> | null {\n return this.req.body;\n }\n\n private _getBodyBuffer(): Promise<ArrayBuffer> {\n const lazy = this._getLazy();\n if (!lazy.bodyBufferPromise) {\n lazy.bodyBufferPromise = this.req.arrayBuffer().catch((err: unknown) => {\n lazy.bodyBufferPromise = null;\n throw err;\n });\n }\n return lazy.bodyBufferPromise;\n }\n\n arrayBuffer(): Promise<ArrayBuffer> {\n return this._getBodyBuffer();\n }\n\n text(): Promise<string> {\n const lazy = this._getLazy();\n if (!lazy.textPromise) {\n lazy.textPromise = this._getBodyBuffer()\n .then((buf) => TEXT_DECODER.decode(buf))\n .catch((err: unknown) => {\n lazy.textPromise = null;\n throw err;\n });\n }\n return lazy.textPromise;\n }\n\n json<T = unknown>(): Promise<T> {\n const lazy = this._getLazy();\n if (!lazy.jsonPromise) {\n lazy.jsonPromise = this._getBodyBuffer()\n .then((buf) => JSON.parse(TEXT_DECODER.decode(buf)))\n .catch((err: unknown) => {\n lazy.jsonPromise = null;\n throw err;\n });\n }\n return lazy.jsonPromise as Promise<T>;\n }\n\n blob(): Promise<Blob> {\n const lazy = this._getLazy();\n if (!lazy.blobPromise) {\n const ct =\n this.req.headers.get(\"content-type\") ?? \"application/octet-stream\";\n lazy.blobPromise = this._getBodyBuffer()\n .then((buf) => new Blob([buf], { type: ct }))\n .catch((err: unknown) => {\n lazy.blobPromise = null;\n throw err;\n });\n }\n return lazy.blobPromise;\n }\n\n formData(): ReturnType<Request[\"formData\"]> {\n const lazy = this._getLazy();\n if (!lazy.formDataPromise) {\n lazy.formDataPromise = this._getBodyBuffer()\n .then((buf) => {\n const ct = this.req.headers.get(\"content-type\") ?? \"\";\n const tempRes = new Response(buf, {\n headers: { \"content-type\": ct },\n });\n return tempRes.formData();\n })\n .catch((err: unknown) => {\n lazy.formDataPromise = null;\n throw err;\n }) as ReturnType<Request[\"formData\"]>;\n }\n return lazy.formDataPromise;\n }\n\n redirect(url: string, status = 302): Response {\n return redirect(url, status, this.redirectHosts);\n }\n\n upgrade<TData = unknown>(data?: TData): boolean {\n if (!this.server) {\n throw new Error(\n \"Cannot upgrade WebSocket: server instance is not available\",\n );\n }\n return this.server.upgrade(this.req, { data });\n }\n\n timeout(seconds: number): this {\n if (this.server) {\n this.server.timeout(this.req, seconds);\n }\n return this;\n }\n\n disableTimeout(): this {\n if (this.server) {\n this.server.timeout(this.req, 0);\n }\n return this;\n }\n}\n",
13
+ "import { json } from \"./http\";\n\nexport type HeadersInit = NonNullable<ResponseInit[\"headers\"]>;\n\nexport class HttpError extends Error {\n readonly status: number;\n readonly body: unknown;\n readonly headers?: HeadersInit;\n\n constructor(status: number, body?: unknown, headers?: HeadersInit) {\n if (!Number.isInteger(status) || status < 100 || status > 599) {\n throw new Error(\n `Invalid HTTP status code: ${status}. Must be an integer between 100 and 599.`,\n );\n }\n super(typeof body === \"string\" ? body : `HTTP ${status}`);\n this.name = \"HttpError\";\n this.status = status;\n this.body = body ?? { error: defaultStatusText(status) };\n if (headers !== undefined) this.headers = headers;\n }\n}\n\nfunction defaultStatusText(status: number): string {\n switch (status) {\n case 400:\n return \"Bad Request\";\n case 401:\n return \"Unauthorized\";\n case 403:\n return \"Forbidden\";\n case 404:\n return \"Not Found\";\n case 405:\n return \"Method Not Allowed\";\n case 408:\n return \"Request Timeout\";\n case 409:\n return \"Conflict\";\n case 413:\n return \"Payload Too Large\";\n case 418:\n return \"I'm a teapot\";\n case 422:\n return \"Unprocessable Entity\";\n case 429:\n return \"Too Many Requests\";\n case 500:\n return \"Internal Server Error\";\n case 502:\n return \"Bad Gateway\";\n case 503:\n return \"Service Unavailable\";\n case 504:\n return \"Gateway Timeout\";\n default:\n return status >= 500 ? \"Internal Server Error\" : \"Error\";\n }\n}\n\nfunction safeJson(\n status: number,\n body: unknown,\n headers?: HeadersInit,\n): Response {\n try {\n const init: ResponseInit =\n headers !== undefined ? { status, headers } : { status };\n return json(body, init);\n } catch {\n return new Response(\"Internal Server Error\", {\n status: 500,\n headers: { \"content-type\": \"text/plain; charset=utf-8\" },\n });\n }\n}\n\nexport function errorToResponse(err: unknown, development: boolean): Response {\n if (err instanceof Response) {\n return err;\n }\n if (err instanceof HttpError) {\n return safeJson(err.status, err.body, err.headers);\n }\n if (development) {\n const message = err instanceof Error ? err.message : String(err);\n const stack = err instanceof Error ? err.stack : undefined;\n return safeJson(500, { error: \"Internal Server Error\", message, stack });\n }\n return safeJson(500, { error: \"Internal Server Error\" });\n}\n\nexport const createErrorResponse = errorToResponse;\n",
14
+ "/**\n * Token-based lexical scanner + semantic analyzer for handler functions.\n * Runs ONCE per route at registration time. Zero dependencies.\n */\n\nexport interface LiteralInfo {\n kind: \"string\" | \"json\";\n value: string;\n}\n\nexport type HandlerFunction = (...args: never[]) => unknown;\nexport type ParamSerializer = (\n params: Record<string, string> | string,\n) => string;\n\nexport interface ParamEntry {\n key: string;\n isParam: boolean;\n paramKey?: string;\n literalValue?: string;\n}\n\nexport interface HandlerAnalysis {\n isNoArg: boolean;\n contextProps: Set<string>;\n hasDynamicAccess: boolean;\n isDestructured: boolean;\n destructuredProps: Set<string>;\n literal: LiteralInfo | null;\n arglessJsonCall: boolean;\n isParamJson?: boolean;\n paramJsonKey?: string;\n paramSerializer?: ParamSerializer | null;\n paramParts?: ParamEntry[] | null;\n}\n\ninterface Token {\n type: \"ident\" | \"str\" | \"num\" | \"regex\" | \"punct\" | \"eof\";\n value: string;\n start: number;\n end: number;\n}\n\n// biome-ignore lint/suspicious/noControlCharactersInRegex: JSON control chars must be escaped\nexport const ESCAPE_JSON_CHARS_RE = /[\\u0000-\\u001f\"\\\\]/;\n\nexport function escapeJsonString(value: string): string {\n if (!ESCAPE_JSON_CHARS_RE.test(value)) return value;\n return JSON.stringify(value).slice(1, -1);\n}\n\nfunction isIdentStart(c: number): boolean {\n return (\n (c >= 97 && c <= 122) ||\n (c >= 65 && c <= 90) ||\n c === 95 ||\n c === 36 ||\n c > 127\n );\n}\nfunction isIdentPart(c: number): boolean {\n return isIdentStart(c) || (c >= 48 && c <= 57);\n}\nfunction isSpace(c: number): boolean {\n return c === 32 || c === 9 || c === 10 || c === 13 || c === 12 || c === 11;\n}\n\nconst KEYWORDS_BEFORE_REGEX = new Set([\n \"return\",\n \"typeof\",\n \"instanceof\",\n \"in\",\n \"of\",\n \"new\",\n \"delete\",\n \"void\",\n \"throw\",\n \"case\",\n \"do\",\n \"else\",\n \"yield\",\n \"await\",\n]);\n\nconst PUNCT_BEFORE_REGEX = new Set([\n \"(\",\n \"[\",\n \"{\",\n \",\",\n \";\",\n \":\",\n \"?\",\n \"!\",\n \"=\",\n \"==\",\n \"===\",\n \"!=\",\n \"!==\",\n \"&&\",\n \"||\",\n \"??\",\n \"+\",\n \"-\",\n \"*\",\n \"/\",\n \"%\",\n \"&\",\n \"|\",\n \"^\",\n \"~\",\n \"<\",\n \">\",\n \"<=\",\n \">=\",\n \"=>\",\n \"+=\",\n \"-=\",\n \"*=\",\n \"/=\",\n \"%=\",\n \"&=\",\n \"|=\",\n \"^=\",\n \"&&=\",\n \"||=\",\n \"??=\",\n \"<<\",\n \">>\",\n \">>>\",\n \"<<=\",\n \">>=\",\n \">>>=\",\n]);\n\nfunction tokenize(src: string): Token[] {\n const tokens: Token[] = [];\n const len = src.length;\n let i = 0;\n let last = \"\";\n\n while (i < len) {\n const c = src.charCodeAt(i);\n if (isSpace(c)) {\n i++;\n continue;\n }\n\n if (c === 47 && src.charCodeAt(i + 1) === 47) {\n i += 2;\n while (i < len && src.charCodeAt(i) !== 10) i++;\n continue;\n }\n if (c === 47 && src.charCodeAt(i + 1) === 42) {\n i += 2;\n while (\n i < len &&\n !(src.charCodeAt(i) === 42 && src.charCodeAt(i + 1) === 47)\n )\n i++;\n i += 2;\n continue;\n }\n\n if (c === 34 || c === 39) {\n const q = c;\n const start = i;\n i++;\n while (i < len) {\n const cc = src.charCodeAt(i);\n if (cc === 92) {\n i += 2;\n continue;\n }\n if (cc === q) {\n i++;\n break;\n }\n if (cc === 10) break;\n i++;\n }\n tokens.push({\n type: \"str\",\n value: src.slice(start + 1, i - 1),\n start,\n end: i,\n });\n last = \"str\";\n continue;\n }\n\n if (c === 96) {\n i = tokenizeTemplate(src, i, tokens);\n last = \"template\";\n continue;\n }\n\n if (c === 47) {\n let isRegex: boolean;\n if (last === \"\" || last === \"regex\" || last === \"num\") isRegex = true;\n else if (last === \"str\" || last === \"template\") isRegex = false;\n else if (last === \"ident\") isRegex = KEYWORDS_BEFORE_REGEX.has(last);\n else isRegex = PUNCT_BEFORE_REGEX.has(last);\n\n if (isRegex) {\n const start = i;\n i++;\n let inClass = false;\n while (i < len) {\n const cc = src.charCodeAt(i);\n if (cc === 92) {\n i += 2;\n continue;\n }\n if (cc === 91) {\n inClass = true;\n i++;\n continue;\n }\n if (cc === 93) {\n inClass = false;\n i++;\n continue;\n }\n if (cc === 47 && !inClass) {\n i++;\n break;\n }\n if (cc === 10) break;\n i++;\n }\n while (i < len && isIdentPart(src.charCodeAt(i))) i++;\n tokens.push({ type: \"regex\", value: \"\", start, end: i });\n last = \"regex\";\n continue;\n }\n tokens.push({ type: \"punct\", value: \"/\", start: i, end: i + 1 });\n last = \"/\";\n i++;\n continue;\n }\n\n if (isIdentStart(c)) {\n const start = i;\n i++;\n while (i < len && isIdentPart(src.charCodeAt(i))) i++;\n const value = src.slice(start, i);\n tokens.push({ type: \"ident\", value, start, end: i });\n last = value;\n continue;\n }\n\n if (c >= 48 && c <= 57) {\n const start = i;\n i++;\n while (i < len) {\n const cc = src.charCodeAt(i);\n if (\n (cc >= 48 && cc <= 57) ||\n cc === 46 ||\n cc === 95 ||\n (cc >= 97 && cc <= 122) ||\n (cc >= 65 && cc <= 90)\n )\n i++;\n else if (\n (cc === 43 || cc === 45) &&\n (src.charCodeAt(i - 1) === 101 || src.charCodeAt(i - 1) === 69)\n )\n i++;\n else break;\n }\n tokens.push({ type: \"num\", value: src.slice(start, i), start, end: i });\n last = \"num\";\n continue;\n }\n\n const start = i;\n const cc2 = src.charCodeAt(i + 1);\n const cc3 = src.charCodeAt(i + 2);\n const cc4 = src.charCodeAt(i + 3);\n let op = src[i]!;\n\n if (c === 62 && cc2 === 62 && cc3 === 62 && cc4 === 61) op = \">>>=\";\n else if (c === 61 && cc2 === 61 && cc3 === 61) op = \"===\";\n else if (c === 33 && cc2 === 61 && cc3 === 61) op = \"!==\";\n else if (c === 42 && cc2 === 42 && cc3 === 61) op = \"**=\";\n else if (c === 60 && cc2 === 60 && cc3 === 61) op = \"<<=\";\n else if (c === 62 && cc2 === 62 && cc3 === 61) op = \">>=\";\n else if (c === 62 && cc2 === 62 && cc3 === 62) op = \">>>\";\n else if (c === 46 && cc2 === 46 && cc3 === 46) op = \"...\";\n else if (c === 63 && cc2 === 63 && cc3 === 61) op = \"??=\";\n else if (c === 38 && cc2 === 38 && cc3 === 61) op = \"&&=\";\n else if (c === 124 && cc2 === 124 && cc3 === 61) op = \"||=\";\n else if (c === 61 && cc2 === 62) op = \"=>\";\n else if (c === 61 && cc2 === 61) op = \"==\";\n else if (c === 33 && cc2 === 61) op = \"!=\";\n else if (c === 60 && cc2 === 61) op = \"<=\";\n else if (c === 62 && cc2 === 61) op = \">=\";\n else if (c === 38 && cc2 === 38) op = \"&&\";\n else if (c === 124 && cc2 === 124) op = \"||\";\n else if (c === 63 && cc2 === 46) op = \"?.\";\n else if (c === 63 && cc2 === 63) op = \"??\";\n else if (c === 43 && cc2 === 43) op = \"++\";\n else if (c === 45 && cc2 === 45) op = \"--\";\n else if (c === 42 && cc2 === 42) op = \"**\";\n else if (c === 60 && cc2 === 60) op = \"<<\";\n else if (c === 62 && cc2 === 62) op = \">>\";\n else if (c === 43 && cc2 === 61) op = \"+=\";\n else if (c === 45 && cc2 === 61) op = \"-=\";\n else if (c === 42 && cc2 === 61) op = \"*=\";\n else if (c === 47 && cc2 === 61) op = \"/=\";\n else if (c === 37 && cc2 === 61) op = \"%=\";\n else if (c === 38 && cc2 === 61) op = \"&=\";\n else if (c === 124 && cc2 === 61) op = \"|=\";\n else if (c === 94 && cc2 === 61) op = \"^=\";\n\n i += op.length;\n tokens.push({ type: \"punct\", value: op, start, end: i });\n last = op;\n }\n\n tokens.push({ type: \"eof\", value: \"\", start: len, end: len });\n return tokens;\n}\n\nfunction tokenizeTemplate(src: string, start: number, out: Token[]): number {\n let i = start + 1;\n const len = src.length;\n let strStart = i;\n\n while (i < len) {\n const c = src.charCodeAt(i);\n if (c === 92) {\n i += 2;\n continue;\n }\n if (c === 96) {\n if (i > strStart) {\n out.push({\n type: \"str\",\n value: src.slice(strStart, i),\n start: strStart,\n end: i,\n });\n }\n return i + 1;\n }\n if (c === 36 && src.charCodeAt(i + 1) === 123) {\n if (i > strStart) {\n out.push({\n type: \"str\",\n value: src.slice(strStart, i),\n start: strStart,\n end: i,\n });\n }\n out.push({ type: \"punct\", value: \"${\", start: i, end: i + 2 });\n i += 2;\n\n const exprStart = i;\n let depth = 1;\n while (i < len && depth > 0) {\n const cc = src.charCodeAt(i);\n if (cc === 92) {\n i += 2;\n continue;\n }\n if (cc === 34 || cc === 39) {\n const q = cc;\n i++;\n while (i < len) {\n const c2 = src.charCodeAt(i);\n if (c2 === 92) {\n i += 2;\n continue;\n }\n if (c2 === q) {\n i++;\n break;\n }\n i++;\n }\n continue;\n }\n if (cc === 96) {\n i = tokenizeTemplate(src, i, out);\n continue;\n }\n if (cc === 123) {\n depth++;\n i++;\n continue;\n }\n if (cc === 125) {\n depth--;\n if (depth === 0) break;\n i++;\n continue;\n }\n i++;\n }\n\n const inner = src.slice(exprStart, i);\n const innerTokens = tokenize(inner);\n for (const t of innerTokens) {\n if (t.type === \"eof\") continue;\n out.push({ ...t, start: t.start + exprStart, end: t.end + exprStart });\n }\n out.push({ type: \"punct\", value: \"}\", start: i, end: i + 1 });\n i++;\n strStart = i;\n continue;\n }\n i++;\n }\n\n if (i > strStart) {\n out.push({\n type: \"str\",\n value: src.slice(strStart, i),\n start: strStart,\n end: i,\n });\n }\n return i;\n}\n\nexport function analyzeHandler(fn: HandlerFunction): HandlerAnalysis {\n let src: string;\n try {\n src = fn.toString();\n } catch {\n return makeUnknown();\n }\n\n const tokens = tokenize(src);\n let i = 0;\n\n if (tokens[i]?.type === \"ident\" && tokens[i]!.value === \"async\") i++;\n if (tokens[i]?.type === \"ident\" && tokens[i]!.value === \"function\") {\n i++;\n if (tokens[i]?.type === \"ident\") i++;\n }\n\n if (tokens[i]?.type === \"punct\" && tokens[i]!.value === \"(\") {\n i++;\n const first = tokens[i];\n\n if (first?.type === \"punct\" && first.value === \")\") {\n i++;\n const body = walkBody(tokens, i, null);\n return {\n isNoArg: true,\n contextProps: new Set(),\n hasDynamicAccess: false,\n isDestructured: false,\n destructuredProps: new Set(),\n literal: body.literal,\n arglessJsonCall: false,\n paramSerializer: null,\n paramParts: null,\n };\n }\n\n if (first?.type === \"punct\" && first.value === \"{\") {\n const { names, next } = parseDestructure(tokens, i);\n const body = walkBody(tokens, next, null);\n return {\n isNoArg: false,\n contextProps: new Set(),\n hasDynamicAccess: false,\n isDestructured: true,\n destructuredProps: names,\n literal: body.literal,\n arglessJsonCall: false,\n paramSerializer: body.paramSerializer,\n paramParts: body.paramParts,\n };\n }\n\n if (first?.type === \"ident\") {\n const name = first.value;\n i++;\n const body = walkBody(tokens, i, name);\n return {\n isNoArg: false,\n contextProps: body.props,\n hasDynamicAccess: body.hasDynamic,\n isDestructured: false,\n destructuredProps: new Set(),\n literal: body.literal,\n arglessJsonCall: body.arglessJsonCall,\n paramSerializer: body.paramSerializer,\n paramParts: body.paramParts,\n };\n }\n\n return makeUnknown();\n }\n\n if (tokens[i]?.type === \"ident\") {\n const name = tokens[i]!.value;\n i++;\n const body = walkBody(tokens, i, name);\n return {\n isNoArg: false,\n contextProps: body.props,\n hasDynamicAccess: body.hasDynamic,\n isDestructured: false,\n destructuredProps: new Set(),\n literal: body.literal,\n arglessJsonCall: body.arglessJsonCall,\n paramSerializer: body.paramSerializer,\n paramParts: body.paramParts,\n };\n }\n\n return makeUnknown();\n}\n\nfunction parseDestructure(\n tokens: Token[],\n braceStart: number,\n): { names: Set<string>; next: number } {\n const names = new Set<string>();\n let i = braceStart + 1;\n let depth = 1;\n while (i < tokens.length) {\n const t = tokens[i]!;\n if (t.type === \"eof\") break;\n if (t.type === \"punct\") {\n if (t.value === \"{\") depth++;\n else if (t.value === \"}\") {\n depth--;\n i++;\n if (depth === 0) break;\n continue;\n } else if (t.value === \"[\") depth += 100;\n else if (t.value === \"]\") depth -= 100;\n }\n if (t.type === \"ident\" && depth === 1) {\n const prev = tokens[i - 1];\n const next = tokens[i + 1];\n if (prev?.type === \"punct\" && prev.value === \":\") {\n names.add(t.value);\n } else if (next?.type !== \"punct\" || next.value !== \":\") {\n names.add(t.value);\n }\n }\n i++;\n }\n while (i < tokens.length) {\n const t = tokens[i]!;\n if (t.type === \"eof\") break;\n if (t.type === \"punct\" && t.value === \")\") {\n i++;\n break;\n }\n i++;\n }\n return { names, next: i };\n}\n\ninterface BodyResult {\n props: Set<string>;\n hasDynamic: boolean;\n literal: LiteralInfo | null;\n arglessJsonCall: boolean;\n paramSerializer: ParamSerializer | null;\n paramParts: ParamEntry[] | null;\n}\n\nfunction walkBody(\n tokens: Token[],\n from: number,\n paramName: string | null,\n): BodyResult {\n const props = new Set<string>();\n let hasDynamic = false;\n let arglessJsonCall = false;\n\n let bodyStart = -1;\n let i = from;\n let parenDepth = 0;\n\n if (tokens[from]?.type === \"punct\" && tokens[from]!.value === \"{\") {\n bodyStart = from + 1;\n } else {\n while (i < tokens.length) {\n const t = tokens[i]!;\n if (t.type === \"eof\") break;\n if (t.type === \"punct\") {\n if (t.value === \"(\" || t.value === \"[\" || t.value === \"{\") {\n parenDepth++;\n } else if (t.value === \")\" || t.value === \"]\" || t.value === \"}\") {\n if (parenDepth > 0) parenDepth--;\n } else if (t.value === \"=>\" && parenDepth === 0) {\n const next = tokens[i + 1];\n if (next?.type === \"punct\" && next.value === \"{\") {\n bodyStart = i + 2;\n } else {\n bodyStart = i + 1;\n }\n break;\n }\n if (t.value === \")\" && parenDepth === 0 && i + 1 < tokens.length) {\n const next = tokens[i + 1];\n if (next?.type === \"punct\" && next.value === \"{\") {\n bodyStart = i + 2;\n break;\n }\n }\n }\n i++;\n }\n }\n\n if (bodyStart < 0) {\n return {\n props,\n hasDynamic,\n literal: null,\n arglessJsonCall: false,\n paramSerializer: null,\n paramParts: null,\n };\n }\n\n if (paramName !== null) {\n for (let j = bodyStart; j < tokens.length; j++) {\n const t = tokens[j]!;\n if (t.type === \"eof\") break;\n if (t.type !== \"ident\" || t.value !== paramName) continue;\n\n const n = tokens[j + 1];\n if (!n) continue;\n\n if (n.type === \"punct\" && (n.value === \".\" || n.value === \"?.\")) {\n const key = tokens[j + 2];\n if (key?.type === \"ident\") {\n props.add(key.value);\n\n if (key.value === \"json\") {\n const pOpen = tokens[j + 3];\n const pClose = tokens[j + 4];\n if (\n pOpen?.type === \"punct\" &&\n pOpen.value === \"(\" &&\n pClose?.type === \"punct\" &&\n pClose.value === \")\"\n ) {\n const prev1 = tokens[j - 1];\n const prev2 = tokens[j - 2];\n const isPrecededByReturn =\n (prev1?.type === \"punct\" && prev1.value === \"=>\") ||\n (prev1?.type === \"ident\" && prev1.value === \"return\") ||\n (prev1?.type === \"ident\" &&\n prev1.value === \"await\" &&\n ((prev2?.type === \"punct\" && prev2.value === \"=>\") ||\n (prev2?.type === \"ident\" && prev2.value === \"return\")));\n\n const next1 = tokens[j + 5];\n const next2 = tokens[j + 6];\n const isEndOfBody =\n isBodyEnd(next1) && (next1?.value !== \";\" || isBodyEnd(next2));\n\n if (isPrecededByReturn && isEndOfBody) {\n arglessJsonCall = true;\n }\n }\n }\n\n j += 2;\n continue;\n }\n hasDynamic = true;\n continue;\n }\n\n if (n.type === \"punct\" && n.value === \"[\") {\n const key = tokens[j + 2];\n const close = tokens[j + 3];\n if (\n key?.type === \"str\" &&\n close?.type === \"punct\" &&\n close.value === \"]\"\n ) {\n props.add(key.value);\n j += 3;\n continue;\n }\n hasDynamic = true;\n continue;\n }\n\n const prev = tokens[j - 1];\n if (prev?.type === \"punct\" && prev.value === \"...\") {\n hasDynamic = true;\n }\n }\n }\n\n const literal = tryExtractLiteral(tokens, bodyStart);\n const paramExtraction =\n literal === null\n ? tryExtractParamSerializer(tokens, bodyStart, paramName)\n : null;\n const paramSerializer = paramExtraction?.serializer ?? null;\n const paramParts = paramExtraction?.parts ?? null;\n\n return {\n props,\n hasDynamic,\n literal,\n arglessJsonCall,\n paramSerializer,\n paramParts,\n };\n}\n\nfunction isBodyEnd(t: Token | undefined): boolean {\n if (!t) return true;\n if (t.type === \"eof\") return true;\n if (t.type === \"punct\" && (t.value === \";\" || t.value === \"}\")) return true;\n return false;\n}\n\nfunction tryExtractLiteral(\n tokens: Token[],\n bodyStart: number,\n): LiteralInfo | null {\n const t = tokens[bodyStart];\n if (!t || t.type === \"eof\") return null;\n\n if (t.type === \"ident\" && t.value === \"return\") {\n return tryExtractLiteral(tokens, bodyStart + 1);\n }\n\n if (t.type === \"str\") {\n if (isBodyEnd(tokens[bodyStart + 1])) {\n return { kind: \"string\", value: t.value };\n }\n return null;\n }\n\n if (t.type === \"punct\" && t.value === \"(\") {\n const inner = tokens[bodyStart + 1];\n if (inner?.type === \"punct\" && inner.value === \"{\") {\n const obj = extractFlatObject(tokens, bodyStart + 1);\n if (!obj.ok) return null;\n const afterBrace = tokens[obj.end];\n if (afterBrace?.type !== \"punct\" || afterBrace.value !== \")\") return null;\n if (!isBodyEnd(tokens[obj.end + 1])) return null;\n return { kind: \"json\", value: JSON.stringify(obj.value) };\n }\n return null;\n }\n\n if (t.type === \"punct\" && t.value === \"{\") {\n const next = tokens[bodyStart + 1];\n if (\n next &&\n (next.type === \"ident\" || next.type === \"str\" || next.type === \"num\") &&\n tokens[bodyStart + 2]?.type === \"punct\" &&\n tokens[bodyStart + 2]!.value === \":\"\n ) {\n const obj = extractFlatObject(tokens, bodyStart);\n if (obj.ok) {\n if (isBodyEnd(tokens[obj.end])) {\n return { kind: \"json\", value: JSON.stringify(obj.value) };\n }\n return null;\n }\n return null;\n }\n let j = bodyStart + 1;\n while (j < tokens.length) {\n const tt = tokens[j]!;\n if (tt.type === \"eof\") return null;\n if (tt.type === \"punct\" && tt.value === \"}\") return null;\n if (tt.type === \"ident\" && tt.value === \"return\") {\n return tryExtractLiteral(tokens, j + 1);\n }\n if (tt.type === \"punct\" && tt.value === \";\") return null;\n if (tt.type === \"ident\" && tt.value !== \"return\") return null;\n j++;\n }\n return null;\n }\n\n return null;\n}\n\ninterface FlatObjectResult {\n ok: true;\n end: number;\n value: Record<string, unknown>;\n}\ninterface FlatObjectError {\n ok: false;\n}\n\nfunction extractFlatObject(\n tokens: Token[],\n braceStart: number,\n): FlatObjectResult | FlatObjectError {\n let i = braceStart + 1;\n const obj: Record<string, unknown> = {};\n let expectKey = true;\n let key: string | null = null;\n\n while (i < tokens.length) {\n const t = tokens[i]!;\n if (t.type === \"eof\") return { ok: false };\n\n if (t.type === \"punct\" && t.value === \"}\") {\n if (!expectKey) return { ok: false };\n return { ok: true, end: i + 1, value: obj };\n }\n\n if (expectKey) {\n if (t.type === \"ident\" || t.type === \"str\" || t.type === \"num\")\n key = t.value;\n else return { ok: false };\n i++;\n const colon = tokens[i];\n if (colon?.type !== \"punct\" || colon.value !== \":\") return { ok: false };\n i++;\n expectKey = false;\n continue;\n }\n\n if (t.type === \"str\") {\n obj[key!] = t.value;\n i++;\n } else if (t.type === \"num\") {\n obj[key!] = Number(t.value);\n i++;\n } else if (t.type === \"ident\") {\n if (t.value === \"true\") obj[key!] = true;\n else if (t.value === \"false\") obj[key!] = false;\n else if (t.value === \"null\") obj[key!] = null;\n else return { ok: false };\n i++;\n } else if (\n t.type === \"punct\" &&\n t.value === \"!\" &&\n tokens[i + 1]?.type === \"num\"\n ) {\n const n = tokens[i + 1]!.value;\n obj[key!] = n === \"1\";\n i += 2;\n } else if (\n t.type === \"punct\" &&\n t.value === \"-\" &&\n tokens[i + 1]?.type === \"num\"\n ) {\n obj[key!] = -Number(tokens[i + 1]!.value);\n i += 2;\n } else {\n return { ok: false };\n }\n\n const sep = tokens[i];\n if (sep?.type === \"punct\" && sep.value === \",\") {\n i++;\n expectKey = true;\n continue;\n }\n if (sep?.type === \"punct\" && sep.value === \"}\") {\n return { ok: true, end: i + 1, value: obj };\n }\n return { ok: false };\n }\n\n return { ok: false };\n}\n\ninterface ParamObjectResult {\n ok: true;\n end: number;\n parts: ParamEntry[];\n}\n\nfunction extractParamObject(\n tokens: Token[],\n braceStart: number,\n paramName: string | null,\n): ParamObjectResult | FlatObjectError {\n let i = braceStart + 1;\n const parts: ParamEntry[] = [];\n let expectKey = true;\n let key: string | null = null;\n let hasParam = false;\n\n while (i < tokens.length) {\n const t = tokens[i]!;\n if (t.type === \"eof\") return { ok: false };\n\n if (t.type === \"punct\" && t.value === \"}\") {\n if (!expectKey) return { ok: false };\n return hasParam ? { ok: true, end: i + 1, parts } : { ok: false };\n }\n\n if (expectKey) {\n if (t.type === \"ident\" || t.type === \"str\" || t.type === \"num\") {\n key = t.value;\n } else {\n return { ok: false };\n }\n i++;\n const colon = tokens[i];\n if (colon?.type !== \"punct\" || colon.value !== \":\") return { ok: false };\n i++;\n expectKey = false;\n continue;\n }\n\n if (paramName !== null && t.type === \"ident\" && t.value === paramName) {\n const dot1 = tokens[i + 1];\n const pIdent = tokens[i + 2];\n const dot2 = tokens[i + 3];\n const pKey = tokens[i + 4];\n if (\n dot1?.type === \"punct\" &&\n (dot1.value === \".\" || dot1.value === \"?.\") &&\n pIdent?.type === \"ident\" &&\n pIdent.value === \"params\" &&\n dot2?.type === \"punct\" &&\n (dot2.value === \".\" || dot2.value === \"?.\") &&\n pKey?.type === \"ident\"\n ) {\n hasParam = true;\n parts.push({ key: key!, isParam: true, paramKey: pKey.value });\n i += 5;\n const sep = tokens[i];\n if (sep?.type === \"punct\" && sep.value === \",\") {\n i++;\n expectKey = true;\n continue;\n }\n if (sep?.type === \"punct\" && sep.value === \"}\") {\n return { ok: true, end: i + 1, parts };\n }\n return { ok: false };\n }\n }\n\n if (t.type === \"ident\" && t.value === \"params\") {\n const dot = tokens[i + 1];\n const pKey = tokens[i + 2];\n if (\n dot?.type === \"punct\" &&\n (dot.value === \".\" || dot.value === \"?.\") &&\n pKey?.type === \"ident\"\n ) {\n hasParam = true;\n parts.push({ key: key!, isParam: true, paramKey: pKey.value });\n i += 3;\n const sep = tokens[i];\n if (sep?.type === \"punct\" && sep.value === \",\") {\n i++;\n expectKey = true;\n continue;\n }\n if (sep?.type === \"punct\" && sep.value === \"}\") {\n return { ok: true, end: i + 1, parts };\n }\n return { ok: false };\n }\n }\n\n if (t.type === \"str\") {\n parts.push({\n key: key!,\n isParam: false,\n literalValue: JSON.stringify(t.value),\n });\n i++;\n } else if (t.type === \"num\") {\n parts.push({\n key: key!,\n isParam: false,\n literalValue: t.value,\n });\n i++;\n } else if (t.type === \"ident\") {\n if (t.value === \"true\" || t.value === \"false\" || t.value === \"null\") {\n parts.push({\n key: key!,\n isParam: false,\n literalValue: t.value,\n });\n i++;\n } else {\n return { ok: false };\n }\n } else if (\n t.type === \"punct\" &&\n t.value === \"!\" &&\n tokens[i + 1]?.type === \"num\"\n ) {\n parts.push({\n key: key!,\n isParam: false,\n literalValue: tokens[i + 1]!.value === \"1\" ? \"true\" : \"false\",\n });\n i += 2;\n } else if (\n t.type === \"punct\" &&\n t.value === \"-\" &&\n tokens[i + 1]?.type === \"num\"\n ) {\n parts.push({\n key: key!,\n isParam: false,\n literalValue: `-${tokens[i + 1]!.value}`,\n });\n i += 2;\n } else {\n return { ok: false };\n }\n\n const sep = tokens[i];\n if (sep?.type === \"punct\" && sep.value === \",\") {\n i++;\n expectKey = true;\n continue;\n }\n if (sep?.type === \"punct\" && sep.value === \"}\") {\n return hasParam ? { ok: true, end: i + 1, parts } : { ok: false };\n }\n return { ok: false };\n }\n\n return { ok: false };\n}\n\nfunction buildParamSerializer(parts: ParamEntry[]): ParamSerializer {\n const chunks: string[] = [];\n const keys: string[] = [];\n let current = \"{\";\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]!;\n if (i > 0) current += \",\";\n current += `${JSON.stringify(part.key)}:`;\n\n if (part.isParam) {\n current += '\"';\n chunks.push(current);\n keys.push(part.paramKey!);\n current = '\"';\n } else {\n current += part.literalValue!;\n }\n }\n current += \"}\";\n chunks.push(current);\n\n if (keys.length === 1) {\n const c0 = chunks[0]!;\n const c1 = chunks[1]!;\n const k0 = keys[0]!;\n return (p: Record<string, string> | string) =>\n c0 + escapeJsonString(typeof p === \"string\" ? p : (p[k0] ?? \"\")) + c1;\n }\n\n if (keys.length === 2) {\n const c0 = chunks[0]!;\n const c1 = chunks[1]!;\n const c2 = chunks[2]!;\n const k0 = keys[0]!;\n const k1 = keys[1]!;\n return (p: Record<string, string> | string) =>\n `${c0}${escapeJsonString(typeof p === \"string\" ? p : (p[k0] ?? \"\"))}${c1}${typeof p === \"string\" ? \"\" : escapeJsonString(p[k1] ?? \"\")}${c2}`;\n }\n\n return (p: Record<string, string> | string) => {\n let out = chunks[0]!;\n for (let j = 0; j < keys.length; j++) {\n out +=\n escapeJsonString(\n typeof p === \"string\" ? (j === 0 ? p : \"\") : (p[keys[j]!] ?? \"\"),\n ) + chunks[j + 1]!;\n }\n return out;\n };\n}\n\ninterface ParamSerializerResult {\n serializer: ParamSerializer;\n parts: ParamEntry[];\n}\n\nfunction tryExtractParamSerializer(\n tokens: Token[],\n bodyStart: number,\n paramName: string | null,\n): ParamSerializerResult | null {\n const t = tokens[bodyStart];\n if (!t || t.type === \"eof\") return null;\n\n if (t.type === \"punct\" && t.value === \"(\") {\n const inner = tokens[bodyStart + 1];\n if (inner?.type === \"punct\" && inner.value === \"{\") {\n const res = extractParamObject(tokens, bodyStart + 1, paramName);\n if (!res.ok) return null;\n const afterBrace = tokens[res.end];\n if (afterBrace?.type !== \"punct\" || afterBrace.value !== \")\") return null;\n if (!isBodyEnd(tokens[res.end + 1])) return null;\n return { serializer: buildParamSerializer(res.parts), parts: res.parts };\n }\n return null;\n }\n\n if (t.type === \"punct\" && t.value === \"{\") {\n const next = tokens[bodyStart + 1];\n if (\n next &&\n (next.type === \"ident\" || next.type === \"str\" || next.type === \"num\") &&\n tokens[bodyStart + 2]?.type === \"punct\" &&\n tokens[bodyStart + 2]!.value === \":\"\n ) {\n const res = extractParamObject(tokens, bodyStart, paramName);\n if (res.ok && isBodyEnd(tokens[res.end])) {\n return {\n serializer: buildParamSerializer(res.parts),\n parts: res.parts,\n };\n }\n return null;\n }\n let j = bodyStart + 1;\n while (j < tokens.length) {\n const tt = tokens[j]!;\n if (tt.type === \"eof\") return null;\n if (tt.type === \"punct\" && tt.value === \"}\") return null;\n if (tt.type === \"ident\" && tt.value === \"return\") {\n return tryExtractParamSerializer(tokens, j + 1, paramName);\n }\n if (tt.type === \"punct\" && tt.value === \";\") return null;\n if (tt.type === \"ident\" && tt.value !== \"return\") return null;\n j++;\n }\n return null;\n }\n\n return null;\n}\n\nfunction makeUnknown(): HandlerAnalysis {\n return {\n isNoArg: false,\n contextProps: new Set(),\n hasDynamicAccess: true,\n isDestructured: false,\n destructuredProps: new Set(),\n literal: null,\n arglessJsonCall: false,\n paramSerializer: null,\n paramParts: null,\n };\n}\n",
15
+ "import type { Server } from \"bun\";\n\nexport interface ShutdownResult {\n forced: boolean;\n pending: number;\n}\n\nexport async function stopServer(\n server: Server<unknown>,\n hardTimeoutMs: number,\n): Promise<ShutdownResult> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n let forced = false;\n let stopPromise: Promise<void> | null = null;\n\n try {\n stopPromise = server.stop().then(() => {});\n await Promise.race([\n stopPromise,\n new Promise<void>((resolve) => {\n timer = setTimeout(() => {\n forced = true;\n stopPromise = server.stop(true).then(() => {});\n resolve();\n }, hardTimeoutMs);\n timer?.unref?.();\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n\n await stopPromise;\n\n return {\n forced,\n pending: 0,\n };\n}\n",
16
+ "import { HttpError } from \"../errors\";\nimport type { HttpMethod, ResponseHandler } from \"../types\";\n\nexport const MATCH_HANDLER: unique symbol = Symbol(\"barq.match.handler\");\n\nexport const MATCH_NOT_ALLOWED: unique symbol = Symbol(\n \"barq.match.not-allowed\",\n);\n\nexport type RouteParams = Record<string, string> & {\n [MATCH_HANDLER]?: ResponseHandler;\n};\n\nexport interface NotAllowed {\n readonly [MATCH_NOT_ALLOWED]: string;\n}\n\nexport type RouteResult = ResponseHandler | RouteParams | NotAllowed | null;\n\nconst METHOD_BITS: Record<HttpMethod, number> = {\n GET: 1 << 0,\n POST: 1 << 1,\n PUT: 1 << 2,\n DELETE: 1 << 3,\n PATCH: 1 << 4,\n HEAD: 1 << 5,\n OPTIONS: 1 << 6,\n};\n\nconst _ALL_METHODS_BITMASK = (1 << 7) - 1;\n// Linear key checks beat substring creation only at very small fanout.\nconst STATIC_CHILD_SCAN_THRESHOLD = 4;\n\nfunction methodBit(method: HttpMethod): number {\n return METHOD_BITS[method] ?? 0;\n}\n\nfunction _hasMethod(bits: number, method: HttpMethod): boolean {\n return (bits & methodBit(method)) !== 0;\n}\n\nfunction _methodsToString(bits: number): string {\n const methods: string[] = [];\n if (bits & METHOD_BITS.GET) methods.push(\"GET\");\n if (bits & METHOD_BITS.POST) methods.push(\"POST\");\n if (bits & METHOD_BITS.PUT) methods.push(\"PUT\");\n if (bits & METHOD_BITS.DELETE) methods.push(\"DELETE\");\n if (bits & METHOD_BITS.PATCH) methods.push(\"PATCH\");\n if (bits & METHOD_BITS.HEAD) methods.push(\"HEAD\");\n if (bits & METHOD_BITS.OPTIONS) methods.push(\"OPTIONS\");\n return methods.join(\", \");\n}\n\ninterface TrieNode {\n staticChildren: Map<string, TrieNode> | null;\n staticChildKeys: string[];\n staticChildNodes: TrieNode[];\n paramChildren: Map<string, TrieNode> | null;\n paramChild: TrieNode | null;\n paramName: string | null;\n wildcardChild: TrieNode | null;\n wildcardName: string | null;\n handlers: Record<string, ResponseHandler> | null;\n allow: string | null;\n notAllowed: NotAllowed | null;\n}\n\nfunction createNode(): TrieNode {\n return {\n staticChildren: null,\n staticChildKeys: [],\n staticChildNodes: [],\n paramChildren: null,\n paramChild: null,\n paramName: null,\n wildcardChild: null,\n wildcardName: null,\n handlers: null,\n allow: null,\n notAllowed: null,\n };\n}\n\nfunction cloneNode(node: TrieNode): TrieNode {\n const staticChildren = node.staticChildren\n ? new Map(\n Array.from(node.staticChildren, ([key, child]) => [\n key,\n cloneNode(child),\n ]),\n )\n : null;\n const staticChildKeys = node.staticChildKeys.slice();\n const staticChildNodes = staticChildren\n ? staticChildKeys.map((key) => staticChildren.get(key)!)\n : [];\n const paramChildren = node.paramChildren\n ? new Map(\n Array.from(node.paramChildren, ([name, child]) => [\n name,\n cloneNode(child),\n ]),\n )\n : null;\n let handlers: Record<string, ResponseHandler> | null = null;\n if (node.handlers !== null) {\n handlers = Object.assign(Object.create(null), node.handlers) as Record<\n string,\n ResponseHandler\n >;\n }\n return {\n staticChildren,\n staticChildKeys,\n staticChildNodes,\n paramChildren,\n paramChild: node.paramChild ? cloneNode(node.paramChild) : null,\n paramName: node.paramName,\n wildcardChild: node.wildcardChild ? cloneNode(node.wildcardChild) : null,\n wildcardName: node.wildcardName,\n handlers,\n allow: node.allow,\n notAllowed: node.notAllowed,\n };\n}\n\ntype PatternSegment =\n | { readonly kind: \"static\"; readonly value: string }\n | {\n readonly kind: \"param\";\n readonly name: string;\n readonly optional?: boolean;\n }\n | { readonly kind: \"wildcard\"; readonly name: string | null };\n\nconst MAX_OPTIONAL_PARAMS = 8;\n\nexport function parsePattern(pattern: string): PatternSegment[] {\n if (pattern.length === 0 || pattern.charCodeAt(0) !== 47) {\n throw new Error(`Invalid route pattern \"${pattern}\": must start with '/'`);\n }\n if (pattern.indexOf(\"#\") !== -1) {\n throw new Error(`Invalid route pattern \"${pattern}\": must not contain '#'`);\n }\n let p = pattern;\n if (p.length > 1 && p.charCodeAt(p.length - 1) === 47) {\n p = p.slice(0, -1);\n }\n\n const segments: PatternSegment[] = [];\n const names = new Set<string>();\n let i = 1;\n while (i < p.length) {\n const slash = p.indexOf(\"/\", i);\n const end = slash === -1 ? p.length : slash;\n const seg = p.slice(i, end);\n if (seg.length === 0) {\n throw new Error(\n `Invalid route pattern \"${pattern}\": empty segment ('//')`,\n );\n }\n const c0 = seg.charCodeAt(0);\n if (\n seg.includes(\"?\") &&\n !(c0 === 58 && seg.endsWith(\"?\") && seg.indexOf(\"?\") === seg.length - 1)\n ) {\n throw new Error(\n `Invalid route pattern \"${pattern}\": malformed optional parameter`,\n );\n }\n if (c0 === 58) {\n const optional = seg.endsWith(\"?\");\n const name = optional ? seg.slice(1, -1) : seg.slice(1);\n if (name.length === 0) {\n throw new Error(\n `Invalid route pattern \"${pattern}\": empty parameter name in segment \":${name}\"`,\n );\n }\n if (names.has(name)) {\n throw new Error(\n `Invalid route pattern \"${pattern}\": duplicate parameter name \"${name}\"`,\n );\n }\n names.add(name);\n if (name.includes(\"?\")) {\n throw new Error(\n `Invalid route pattern \"${pattern}\": malformed optional parameter`,\n );\n }\n segments.push(\n optional\n ? { kind: \"param\", name, optional: true }\n : { kind: \"param\", name },\n );\n } else if (c0 === 42) {\n if (end !== p.length) {\n throw new Error(\n `Invalid route pattern \"${pattern}\": wildcard '*' must be the final segment`,\n );\n }\n const name = seg.length > 1 ? seg.slice(1) : null;\n if (name !== null) {\n if (names.has(name)) {\n throw new Error(\n `Invalid route pattern \"${pattern}\": duplicate parameter name \"${name}\"`,\n );\n }\n names.add(name);\n }\n segments.push({ kind: \"wildcard\", name });\n } else {\n segments.push({ kind: \"static\", value: seg });\n }\n i = end + 1;\n }\n const optionalCount = segments.reduce(\n (count, segment) =>\n count + (segment.kind === \"param\" && segment.optional ? 1 : 0),\n 0,\n );\n if (optionalCount > MAX_OPTIONAL_PARAMS) {\n throw new RangeError(\n `Route pattern exceeds the limit of ${MAX_OPTIONAL_PARAMS} optional parameters`,\n );\n }\n return segments;\n}\n\nfunction _segmentEquals(\n path: string,\n start: number,\n end: number,\n key: string,\n): boolean {\n const n = end - start;\n if (key.length !== n) return false;\n for (let i = 0; i < n; i++) {\n if (path.charCodeAt(start + i) !== key.charCodeAt(i)) return false;\n }\n return true;\n}\n\nfunction decodeParam(raw: string): string {\n if (raw.indexOf(\"%\") === -1) return raw;\n try {\n return decodeURIComponent(raw);\n } catch {\n throw new HttpError(400, { error: \"Bad Request\" });\n }\n}\n\nfunction matchNode(\n rootNode: TrieNode,\n pathname: string,\n startI: number,\n method: string,\n paramNames: string[],\n paramValues: string[],\n startDepth: number,\n): RouteResult {\n let node = rootNode;\n let i = startI;\n const depth = startDepth;\n while (true) {\n const len = pathname.length;\n if (i >= len) {\n const handlers = node.handlers;\n if (handlers === null) return null;\n\n let handler = handlers[method];\n if (handler === undefined && method === \"HEAD\") {\n handler = handlers.GET;\n }\n if (handler === undefined) {\n return node.notAllowed;\n }\n if (depth === 0) return handler;\n\n const p = Object.create(null) as RouteParams;\n p[MATCH_HANDLER] = handler;\n for (let k = 0; k < depth; k++) {\n p[paramNames[k]!] = paramValues[k]!;\n }\n return p;\n }\n\n const slash = pathname.indexOf(\"/\", i);\n const segEnd = slash === -1 ? len : slash;\n\n if (segEnd === i) {\n // A single trailing slash is accepted; empty interior segments are not.\n if (slash === len - 1) {\n return matchNode(\n node,\n pathname,\n len,\n method,\n paramNames,\n paramValues,\n depth,\n );\n }\n return null;\n }\n\n const nextI = slash === -1 ? len : slash + 1;\n let notAllowedCandidate: NotAllowed | null = null;\n\n const staticChildren = node.staticChildren;\n if (staticChildren !== null) {\n let child: TrieNode | undefined;\n if (staticChildren.size <= STATIC_CHILD_SCAN_THRESHOLD) {\n const keys = node.staticChildKeys;\n const nodes = node.staticChildNodes;\n for (let childIndex = 0; childIndex < keys.length; childIndex++) {\n if (_segmentEquals(pathname, i, segEnd, keys[childIndex]!)) {\n child = nodes[childIndex];\n break;\n }\n }\n } else {\n child = staticChildren.get(pathname.slice(i, segEnd));\n }\n if (child !== undefined) {\n const hasParamChildren =\n node.paramChildren !== null && node.paramChildren.size > 0;\n if (!hasParamChildren && node.wildcardChild === null) {\n node = child;\n i = nextI;\n continue;\n }\n const res = matchNode(\n child,\n pathname,\n nextI,\n method,\n paramNames,\n paramValues,\n depth,\n );\n if (res !== null) {\n if (MATCH_NOT_ALLOWED in res) {\n notAllowedCandidate = res as NotAllowed;\n } else {\n return res;\n }\n }\n }\n }\n\n const paramChildren =\n node.paramChildren ??\n (node.paramChild !== null && node.paramName !== null\n ? new Map([[node.paramName, node.paramChild]])\n : null);\n if (paramChildren !== null && paramChildren.size > 0) {\n for (const [paramName, child] of paramChildren) {\n if (nextI >= len && child.handlers !== null) {\n let leafH = child.handlers[method];\n if (leafH === undefined && method === \"HEAD\")\n leafH = child.handlers.GET;\n if (leafH !== undefined) {\n const paramVal =\n pathname.indexOf(\"%\", i) !== -1\n ? decodeParam(pathname.slice(i, segEnd))\n : pathname.slice(i, segEnd);\n const p: RouteParams = {\n [paramName]: paramVal,\n [MATCH_HANDLER]: leafH,\n };\n if (depth === 0) return p;\n for (let k = 0; k < depth; k++) {\n p[paramNames[k]!] = paramValues[k]!;\n }\n return p;\n }\n }\n\n paramNames[depth] = paramName;\n paramValues[depth] = decodeParam(pathname.slice(i, segEnd));\n\n const res = matchNode(\n child,\n pathname,\n nextI,\n method,\n paramNames,\n paramValues,\n depth + 1,\n );\n if (res !== null) {\n if (MATCH_NOT_ALLOWED in res) {\n notAllowedCandidate ??= res as NotAllowed;\n } else {\n return res;\n }\n }\n }\n }\n\n if (node.wildcardChild !== null) {\n let wildcardDepth = depth;\n if (node.wildcardName !== null) {\n let rest = pathname.slice(i);\n if (rest.length > 1 && rest.charCodeAt(rest.length - 1) === 47) {\n rest = rest.slice(0, -1);\n }\n paramNames[wildcardDepth] = node.wildcardName;\n paramValues[wildcardDepth] = decodeParam(rest);\n wildcardDepth++;\n }\n const handlers = node.wildcardChild.handlers;\n if (handlers !== null) {\n let handler = handlers[method];\n if (handler === undefined && method === \"HEAD\") {\n handler = handlers.GET;\n }\n if (handler === undefined) {\n return node.wildcardChild.notAllowed;\n }\n if (wildcardDepth === 0) return handler;\n\n const p = Object.create(null) as RouteParams;\n for (let k = 0; k < wildcardDepth; k++) {\n p[paramNames[k]!] = paramValues[k]!;\n }\n p[MATCH_HANDLER] = handler;\n return p;\n }\n }\n\n return notAllowedCandidate;\n }\n}\n\nexport class SegmentTrie {\n private root: TrieNode = createNode();\n private staticRoutes = new Map<string, Record<string, ResponseHandler>>();\n private staticNotAllowed = new Map<string, NotAllowed>();\n private maxStaticLength = 0;\n private readonly paramNameBuffer: string[] = [];\n private readonly paramValueBuffer: string[] = [];\n\n addBatch(\n routes: readonly {\n method: HttpMethod;\n pattern: string;\n handler: ResponseHandler;\n }[],\n ): void {\n if (routes.length === 0) return;\n if (routes.length === 1) {\n const route = routes[0]!;\n this.add(route.method, route.pattern, route.handler);\n return;\n }\n\n const staged = this.clone();\n const parsedPatterns = new Map<string, readonly PatternSegment[]>();\n for (const route of routes) {\n let segments = parsedPatterns.get(route.pattern);\n if (segments === undefined) {\n segments = parsePattern(route.pattern);\n parsedPatterns.set(route.pattern, segments);\n }\n staged.addWithSegments(\n route.method,\n route.pattern,\n segments,\n route.handler,\n );\n }\n this.root = staged.root;\n this.staticRoutes = staged.staticRoutes;\n this.staticNotAllowed = staged.staticNotAllowed;\n this.maxStaticLength = staged.maxStaticLength;\n }\n\n private clone(): SegmentTrie {\n const copy = new SegmentTrie();\n copy.root = cloneNode(this.root);\n copy.staticRoutes = new Map(\n Array.from(this.staticRoutes, ([path, handlers]) => [\n path,\n Object.assign(Object.create(null), handlers) as Record<\n string,\n ResponseHandler\n >,\n ]),\n );\n copy.staticNotAllowed = new Map(this.staticNotAllowed);\n copy.maxStaticLength = this.maxStaticLength;\n return copy;\n }\n\n add(method: HttpMethod, pattern: string, handler: ResponseHandler): void {\n const segments = parsePattern(pattern);\n let optionalCount = 0;\n for (const segment of segments) {\n if (segment.kind === \"param\" && segment.optional) optionalCount++;\n }\n if (optionalCount === 0) {\n this.addParsed(method, pattern, segments, handler, false);\n return;\n }\n\n const staged = this.clone();\n staged.addWithSegments(method, pattern, segments, handler);\n this.root = staged.root;\n this.staticRoutes = staged.staticRoutes;\n this.staticNotAllowed = staged.staticNotAllowed;\n }\n\n private addWithSegments(\n method: HttpMethod,\n pattern: string,\n segments: readonly PatternSegment[],\n handler: ResponseHandler,\n ): void {\n let optionalCount = 0;\n for (const segment of segments) {\n if (segment.kind === \"param\" && segment.optional) optionalCount++;\n }\n if (optionalCount === 0) {\n this.addParsed(method, pattern, segments, handler, false);\n return;\n }\n\n const selected: PatternSegment[] = [];\n const addVariants = (index: number): void => {\n if (index === segments.length) {\n const variant =\n selected.length === 0\n ? \"/\"\n : `/${selected.map((segment) => (segment.kind === \"static\" ? segment.value : segment.kind === \"param\" ? `:${segment.name}` : `*${segment.name ?? \"\"}`)).join(\"/\")}`;\n this.addParsed(method, variant, selected, handler, true);\n return;\n }\n const segment = segments[index]!;\n if (segment.kind === \"param\" && segment.optional) {\n selected.push({ kind: \"param\", name: segment.name });\n addVariants(index + 1);\n selected.pop();\n addVariants(index + 1);\n return;\n }\n selected.push(segment);\n addVariants(index + 1);\n selected.pop();\n };\n addVariants(0);\n }\n\n private addParsed(\n method: HttpMethod,\n pattern: string,\n segments: readonly PatternSegment[],\n handler: ResponseHandler,\n _allowConflictingParamNames: boolean,\n ): void {\n const bit = methodBit(method);\n if (bit === 0) {\n throw new Error(\n `Unsupported HTTP method \"${method}\" for route \"${pattern}\"`,\n );\n }\n\n const isPureStatic = segments.every((s) => s.kind === \"static\");\n let cleanPattern: string;\n if (isPureStatic) {\n cleanPattern =\n pattern.length > 1 && pattern.charCodeAt(pattern.length - 1) === 47\n ? pattern.slice(0, -1)\n : pattern;\n if (cleanPattern.length > this.maxStaticLength) {\n this.maxStaticLength = cleanPattern.length;\n }\n }\n\n for (const seg of segments) {\n if (seg.kind === \"static\") {\n } else if (seg.kind === \"param\") {\n if (isPureStatic) {\n throw new Error(`Internal error: param segment in pure static route`);\n }\n } else {\n if (isPureStatic) {\n throw new Error(\n `Internal error: wildcard segment in pure static route`,\n );\n }\n }\n }\n\n let node = this.root;\n for (const seg of segments) {\n if (seg.kind === \"static\") {\n if (node.staticChildren === null) {\n node.staticChildren = new Map();\n }\n let child = node.staticChildren.get(seg.value);\n if (child === undefined) {\n child = createNode();\n node.staticChildren.set(seg.value, child);\n node.staticChildKeys.push(seg.value);\n node.staticChildNodes.push(child);\n }\n node = child;\n } else if (seg.kind === \"param\") {\n if (node.wildcardChild !== null) {\n throw new Error(\n `Ambiguous routes: wildcard \"${node.wildcardName ?? \"*\"}\" and param \":${seg.name}\" compete at the same position in \"${pattern}\"`,\n );\n }\n if (node.paramChildren === null) {\n node.paramChildren = new Map();\n }\n let child = node.paramChildren.get(seg.name);\n if (child === undefined) {\n child = createNode();\n node.paramChildren.set(seg.name, child);\n if (node.paramChild === null && node.paramChildren.size === 1) {\n node.paramChild = child;\n node.paramName = seg.name;\n } else {\n node.paramChild = null;\n node.paramName = null;\n }\n }\n node = child;\n } else {\n if (node.wildcardChild !== null) {\n if (node.wildcardName !== seg.name) {\n throw new Error(\n `Conflicting wildcards at the same position: \"*${node.wildcardName ?? \"\"}\" vs \"*${seg.name ?? \"\"}\" (route \"${pattern}\")`,\n );\n }\n } else {\n if (node.paramChildren !== null && node.paramChildren.size > 0) {\n const existingParam = node.paramChildren.keys().next().value;\n if (existingParam !== undefined) {\n throw new Error(\n `Ambiguous routes: param \":${existingParam}\" and wildcard \"*${seg.name ?? \"\"}\" compete at the same position in \"${pattern}\"`,\n );\n }\n }\n node.wildcardChild = createNode();\n node.wildcardName = seg.name;\n }\n node = node.wildcardChild;\n }\n }\n\n if (node.handlers?.[method] !== undefined) {\n throw new Error(\n `Duplicate route: ${method} ${pattern} is already registered`,\n );\n }\n if (node.handlers === null) node.handlers = Object.create(null);\n node.handlers![method] = handler;\n node.allow = SegmentTrie.computeAllow(node.handlers!);\n node.notAllowed = Object.freeze({\n [MATCH_NOT_ALLOWED]: node.allow,\n }) as NotAllowed;\n\n if (isPureStatic) {\n let sHandlers = this.staticRoutes.get(cleanPattern!);\n if (sHandlers === undefined) {\n sHandlers = Object.create(null) as Record<string, ResponseHandler>;\n this.staticRoutes.set(cleanPattern!, sHandlers);\n }\n sHandlers[method] = handler;\n const sAllow = SegmentTrie.computeAllow(sHandlers);\n this.staticNotAllowed.set(\n cleanPattern!,\n Object.freeze({ [MATCH_NOT_ALLOWED]: sAllow }) as NotAllowed,\n );\n }\n }\n\n static computeAllow(handlers: Record<string, ResponseHandler>): string {\n const methods = Object.keys(handlers);\n if (methods.includes(\"GET\") && !methods.includes(\"HEAD\")) {\n return [...methods, \"HEAD\"].join(\", \");\n }\n return methods.join(\", \");\n }\n\n match(method: string, pathname: string): RouteResult {\n const len = pathname.length;\n const cleanPath =\n len > 1 && pathname.charCodeAt(len - 1) === 47\n ? pathname.slice(0, -1)\n : pathname;\n\n if (cleanPath.length <= this.maxStaticLength) {\n const sHandlers = this.staticRoutes.get(cleanPath);\n if (sHandlers !== undefined) {\n let handler = sHandlers[method];\n if (handler === undefined && method === \"HEAD\") {\n handler = sHandlers.GET;\n }\n if (handler !== undefined) {\n return handler;\n }\n const dynamicMatch = matchNode(\n this.root,\n pathname,\n 1,\n method,\n this.paramNameBuffer,\n this.paramValueBuffer,\n 0,\n );\n if (this.paramNameBuffer.length > 0) {\n this.paramNameBuffer.length = 0;\n this.paramValueBuffer.length = 0;\n }\n if (dynamicMatch !== null && !(MATCH_NOT_ALLOWED in dynamicMatch)) {\n return dynamicMatch;\n }\n return this.staticNotAllowed.get(cleanPath)!;\n }\n }\n\n const res = matchNode(\n this.root,\n pathname,\n 1,\n method,\n this.paramNameBuffer,\n this.paramValueBuffer,\n 0,\n );\n if (this.paramNameBuffer.length > 0) {\n this.paramNameBuffer.length = 0;\n this.paramValueBuffer.length = 0;\n }\n return res;\n }\n}\n",
17
+ "import type { Context } from \"./context\";\nimport { errorToResponse } from \"./errors\";\nimport type { ErrorResolver, Middleware } from \"./types\";\n\ntype PipelineHandler = (ctx: Context) => Response | Promise<Response>;\n\nexport type MiddlewareDispatcher = (\n ctx: Context,\n handler: PipelineHandler,\n) => Response | Promise<Response>;\n\nexport function isThenable(value: unknown): value is PromiseLike<unknown> {\n return (\n (typeof value === \"object\" || typeof value === \"function\") &&\n value !== null &&\n typeof (value as { then?: unknown }).then === \"function\"\n );\n}\n\nfunction mergeState(ctx: Context, value: unknown): void {\n if (typeof value === \"object\" && value !== null) {\n Object.assign(ctx.state as Record<string, unknown>, value as object);\n }\n}\n\n/** Compile a middleware chain once for reuse by native and fallback routes. */\nexport function composeMiddlewareDispatcher(\n mws: readonly Middleware[],\n errorResolver?: ErrorResolver,\n): MiddlewareDispatcher {\n // Keep pathological chains on the iterative implementation to avoid deep\n // call stacks. The usual short chains are compiled into direct closures.\n if (\n mws.length > 64 ||\n mws.some((middleware) => middleware.after !== undefined)\n ) {\n return (ctx, handler) => runPipeline(mws, ctx, handler, errorResolver);\n }\n\n let next: MiddlewareDispatcher = (ctx, handler) => {\n let result: Response | Promise<Response>;\n try {\n result = handler(ctx);\n } catch (error) {\n return handlePipelineError(mws, ctx, error, mws.length, errorResolver);\n }\n if (isThenable(result)) {\n return Promise.resolve(result).catch((error: unknown) =>\n handlePipelineError(mws, ctx, error, mws.length, errorResolver),\n );\n }\n return result;\n };\n\n for (let i = mws.length - 1; i >= 0; i--) {\n const middleware = mws[i]!;\n const hook = middleware.before;\n const following = next;\n next = (ctx, handler) => {\n if (!hook) return following(ctx, handler);\n let result: unknown;\n try {\n result = hook(ctx);\n } catch (error) {\n return handlePipelineError(mws, ctx, error, i, errorResolver);\n }\n if (result === undefined) return following(ctx, handler);\n if (isThenable(result)) {\n return Promise.resolve(result).then(\n (value: unknown) => {\n if (value instanceof Response) return value;\n mergeState(ctx, value);\n return following(ctx, handler);\n },\n (error: unknown) =>\n handlePipelineError(mws, ctx, error, i, errorResolver),\n );\n }\n if (result instanceof Response) return result;\n mergeState(ctx, result);\n return following(ctx, handler);\n };\n }\n\n return next;\n}\n\n/** Compile a route-specific chain around its handler. */\nexport function composeMiddlewares(\n mws: readonly Middleware[],\n handler: PipelineHandler,\n errorResolver?: ErrorResolver,\n): PipelineHandler {\n const dispatch = composeMiddlewareDispatcher(mws, errorResolver);\n return (ctx) => dispatch(ctx, handler);\n}\n\nexport function runPipeline(\n mws: readonly Middleware[],\n ctx: Context,\n handler: (ctx: Context) => Response | Promise<Response>,\n errorResolver?: ErrorResolver,\n): Response | Promise<Response> {\n let i = 0;\n const len = mws.length;\n\n while (i < len) {\n const hook = mws[i]!.before;\n if (hook) {\n let r: unknown;\n try {\n r = hook(ctx);\n } catch (err) {\n return handlePipelineError(mws, ctx, err, i, errorResolver);\n }\n if (r !== undefined) {\n if (r instanceof Response) {\n return unwindAfter(mws, ctx, r, i + 1, errorResolver);\n }\n if (isThenable(r)) {\n return resumeBefore(mws, ctx, handler, r, i, errorResolver);\n }\n mergeState(ctx, r);\n }\n }\n i++;\n }\n\n return invokeHandler(mws, ctx, handler, len, errorResolver);\n}\n\nfunction continueBefore(\n mws: readonly Middleware[],\n ctx: Context,\n handler: (ctx: Context) => Response | Promise<Response>,\n startIndex: number,\n errorResolver?: ErrorResolver,\n): Response | Promise<Response> {\n let i = startIndex;\n const len = mws.length;\n while (i < len) {\n const hook = mws[i]!.before;\n if (hook) {\n let r: unknown;\n try {\n r = hook(ctx);\n } catch (err) {\n return handlePipelineError(mws, ctx, err, i, errorResolver);\n }\n if (r !== undefined) {\n if (r instanceof Response) {\n return unwindAfter(mws, ctx, r, i + 1, errorResolver);\n }\n if (isThenable(r)) {\n return resumeBefore(mws, ctx, handler, r, i, errorResolver);\n }\n mergeState(ctx, r);\n }\n }\n i++;\n }\n return invokeHandler(mws, ctx, handler, len, errorResolver);\n}\n\nfunction invokeHandler(\n mws: readonly Middleware[],\n ctx: Context,\n handler: (ctx: Context) => Response | Promise<Response>,\n entered: number,\n errorResolver?: ErrorResolver,\n): Response | Promise<Response> {\n let res: Response | Promise<Response>;\n try {\n res = handler(ctx);\n } catch (err) {\n return handlePipelineError(mws, ctx, err, entered, errorResolver);\n }\n if (isThenable(res)) {\n return resumeHandler(mws, ctx, res, entered, errorResolver);\n }\n return unwindAfter(mws, ctx, res, entered, errorResolver);\n}\n\nfunction resumeBefore(\n mws: readonly Middleware[],\n ctx: Context,\n handler: (ctx: Context) => Response | Promise<Response>,\n promise: PromiseLike<unknown>,\n index: number,\n errorResolver?: ErrorResolver,\n): Promise<Response> {\n return Promise.resolve(promise).then(\n (r) => {\n if (r instanceof Response) {\n return unwindAfter(mws, ctx, r, index + 1, errorResolver);\n }\n mergeState(ctx, r);\n return continueBefore(mws, ctx, handler, index + 1, errorResolver);\n },\n (err: unknown) => handlePipelineError(mws, ctx, err, index, errorResolver),\n );\n}\n\nfunction resumeHandler(\n mws: readonly Middleware[],\n ctx: Context,\n promise: PromiseLike<unknown>,\n entered: number,\n errorResolver?: ErrorResolver,\n): Promise<Response> {\n return Promise.resolve(promise).then(\n (res) => unwindAfter(mws, ctx, res as Response, entered, errorResolver),\n (err: unknown) =>\n handlePipelineError(mws, ctx, err, entered, errorResolver),\n );\n}\n\nfunction handlePipelineError(\n mws: readonly Middleware[],\n ctx: Context,\n err: unknown,\n entered: number,\n errorResolver?: ErrorResolver,\n): Response | Promise<Response> {\n if (errorResolver !== undefined) {\n let res: Response | Promise<Response>;\n try {\n res = errorResolver(err, ctx);\n } catch (resolverErr) {\n const fallback = errorToResponse(resolverErr, ctx.development);\n return unwindAfter(mws, ctx, fallback, entered, errorResolver);\n }\n if (isThenable(res)) {\n return (res as Promise<Response>).then(\n (resolved) => unwindAfter(mws, ctx, resolved, entered, errorResolver),\n (resolverErr) => {\n const fallback = errorToResponse(resolverErr, ctx.development);\n return unwindAfter(mws, ctx, fallback, entered, errorResolver);\n },\n );\n }\n return unwindAfter(mws, ctx, res as Response, entered, errorResolver);\n }\n const res = errorToResponse(err, ctx.development);\n return unwindAfter(mws, ctx, res, entered, errorResolver);\n}\n\nexport function unwindAfter(\n mws: readonly Middleware[],\n ctx: Context,\n res: Response,\n enteredCount: number,\n errorResolver?: ErrorResolver,\n): Response | Promise<Response> {\n let currentRes = res;\n\n for (let j = enteredCount - 1; j >= 0; j--) {\n const hook = mws[j]!.after;\n if (hook) {\n let r: unknown;\n try {\n r = hook(ctx, currentRes);\n } catch (err) {\n if (errorResolver !== undefined) {\n try {\n const resolved = errorResolver(err, ctx);\n if (isThenable(resolved)) {\n return (resolved as Promise<Response>).then(\n (resolvedRes) =>\n continueUnwind(mws, ctx, j - 1, resolvedRes, errorResolver),\n (resolverErr) =>\n continueUnwind(\n mws,\n ctx,\n j - 1,\n errorToResponse(resolverErr, ctx.development),\n errorResolver,\n ),\n );\n }\n currentRes = resolved;\n continue;\n } catch (resolverErr) {\n currentRes = errorToResponse(resolverErr, ctx.development);\n continue;\n }\n }\n currentRes = errorToResponse(err, ctx.development);\n continue;\n }\n if (r !== undefined) {\n if (isThenable(r)) {\n return resumeUnwind(mws, ctx, r, j - 1, currentRes, errorResolver);\n }\n if (r instanceof Response) {\n currentRes = r;\n }\n }\n }\n }\n\n return currentRes;\n}\n\nfunction resumeUnwind(\n mws: readonly Middleware[],\n ctx: Context,\n promise: PromiseLike<unknown>,\n nextIndex: number,\n currentRes: Response,\n errorResolver?: ErrorResolver,\n): Promise<Response> {\n return Promise.resolve(promise).then(\n (r) => {\n const next = r instanceof Response ? r : currentRes;\n return continueUnwind(mws, ctx, nextIndex, next, errorResolver);\n },\n (err: unknown) => {\n if (errorResolver !== undefined) {\n try {\n const resolved = errorResolver(err, ctx);\n if (isThenable(resolved)) {\n return (resolved as Promise<Response>).then(\n (resolvedRes) =>\n continueUnwind(mws, ctx, nextIndex, resolvedRes, errorResolver),\n (resolverErr) =>\n continueUnwind(\n mws,\n ctx,\n nextIndex,\n errorToResponse(resolverErr, ctx.development),\n errorResolver,\n ),\n );\n }\n return continueUnwind(mws, ctx, nextIndex, resolved, errorResolver);\n } catch (resolverErr) {\n return continueUnwind(\n mws,\n ctx,\n nextIndex,\n errorToResponse(resolverErr, ctx.development),\n errorResolver,\n );\n }\n }\n const next = errorToResponse(err, ctx.development);\n return continueUnwind(mws, ctx, nextIndex, next, errorResolver);\n },\n );\n}\n\nfunction continueUnwind(\n mws: readonly Middleware[],\n ctx: Context,\n startIndex: number,\n currentRes: Response,\n errorResolver?: ErrorResolver,\n): Response | Promise<Response> {\n let cur = currentRes;\n for (let j = startIndex; j >= 0; j--) {\n const hook = mws[j]!.after;\n if (hook) {\n let r: unknown;\n try {\n r = hook(ctx, cur);\n } catch (err) {\n if (errorResolver !== undefined) {\n try {\n const resolved = errorResolver(err, ctx);\n if (isThenable(resolved)) {\n return (resolved as Promise<Response>).then(\n (resolvedRes) =>\n continueUnwind(mws, ctx, j - 1, resolvedRes, errorResolver),\n (resolverErr) =>\n continueUnwind(\n mws,\n ctx,\n j - 1,\n errorToResponse(resolverErr, ctx.development),\n errorResolver,\n ),\n );\n }\n cur = resolved;\n continue;\n } catch (resolverErr) {\n cur = errorToResponse(resolverErr, ctx.development);\n continue;\n }\n }\n cur = errorToResponse(err, ctx.development);\n continue;\n }\n if (r !== undefined) {\n if (isThenable(r)) {\n return resumeUnwind(mws, ctx, r, j - 1, cur, errorResolver);\n }\n if (r instanceof Response) {\n cur = r;\n }\n }\n }\n }\n return cur;\n}\n",
18
+ "import type { Context } from \"./context\";\nimport type { Middleware } from \"./types\";\n\nexport interface CorsOptions {\n origin?: string | string[] | ((origin: string) => boolean | string);\n methods?: string[];\n allowedHeaders?: string[];\n exposedHeaders?: string[];\n credentials?: boolean;\n maxAge?: number;\n}\n\nexport function cors(options: CorsOptions = {}): Middleware {\n const methods = (\n options.methods ?? [\"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\", \"PATCH\"]\n ).join(\", \");\n const allowedHeaders = options.allowedHeaders?.join(\", \");\n const exposedHeaders = options.exposedHeaders?.join(\", \");\n const maxAge = options.maxAge !== undefined ? String(options.maxAge) : null;\n const credentials = options.credentials === true;\n\n function resolveOrigin(reqOrigin: string | null): string | null {\n if (!options.origin || options.origin === \"*\") {\n return credentials ? (reqOrigin ?? \"*\") : \"*\";\n }\n if (!reqOrigin) return null;\n if (typeof options.origin === \"string\") {\n return options.origin === reqOrigin ? reqOrigin : null;\n }\n if (Array.isArray(options.origin)) {\n return options.origin.includes(reqOrigin) ? reqOrigin : null;\n }\n if (typeof options.origin === \"function\") {\n const result = options.origin(reqOrigin);\n if (typeof result === \"string\") return result;\n return result ? reqOrigin : null;\n }\n return null;\n }\n\n function setCorsHeaders(\n headers: Headers,\n matchedOrigin: string | null,\n ): void {\n if (matchedOrigin) {\n headers.set(\"access-control-allow-origin\", matchedOrigin);\n if (matchedOrigin !== \"*\") {\n headers.append(\"vary\", \"Origin\");\n }\n }\n if (credentials) {\n headers.set(\"access-control-allow-credentials\", \"true\");\n }\n if (exposedHeaders) {\n headers.set(\"access-control-expose-headers\", exposedHeaders);\n }\n }\n\n return {\n before(ctx: Context) {\n const reqOrigin = ctx.req.headers.get(\"origin\");\n const matchedOrigin = resolveOrigin(reqOrigin);\n\n if (ctx.req.method === \"OPTIONS\") {\n const headers = new Headers();\n setCorsHeaders(headers, matchedOrigin);\n headers.set(\"access-control-allow-methods\", methods);\n if (allowedHeaders) {\n headers.set(\"access-control-allow-headers\", allowedHeaders);\n } else {\n const reqHeaders = ctx.req.headers.get(\n \"access-control-request-headers\",\n );\n if (reqHeaders) {\n headers.set(\"access-control-allow-headers\", reqHeaders);\n }\n }\n if (maxAge) {\n headers.set(\"access-control-max-age\", maxAge);\n }\n headers.set(\"content-length\", \"0\");\n return new Response(null, { status: 204, headers });\n }\n\n (ctx.state as Record<string, unknown>)._corsOrigin = matchedOrigin;\n },\n after(ctx: Context, res: Response) {\n const matchedOrigin = (ctx.state as Record<string, unknown>)\n ._corsOrigin as string | null | undefined;\n if (matchedOrigin !== undefined) {\n const headers = new Headers(res.headers);\n setCorsHeaders(headers, matchedOrigin);\n return new Response(res.body, {\n status: res.status,\n statusText: res.statusText,\n headers,\n });\n }\n return res;\n },\n };\n}\n",
19
+ "import type { Context } from \"./context\";\nimport { HttpError } from \"./errors\";\nimport type { Params, ResponseHandler } from \"./types\";\n\nexport interface StandardSchemaV1Issue {\n readonly message: string;\n readonly path?: ReadonlyArray<PropertyKey | { readonly key: PropertyKey }>;\n}\n\nexport type StandardSchemaV1Result<TOutput> =\n | { readonly value: TOutput; readonly issues?: undefined }\n | { readonly issues: ReadonlyArray<StandardSchemaV1Issue> };\n\nexport interface StandardSchemaV1<_TInput = unknown, TOutput = unknown> {\n readonly \"~standard\": {\n readonly version: 1;\n readonly vendor: string;\n readonly validate: (\n value: unknown,\n ) =>\n | StandardSchemaV1Result<TOutput>\n | Promise<StandardSchemaV1Result<TOutput>>;\n };\n}\n\nexport interface LegacyValidator<TOutput> {\n parse(data: unknown): TOutput;\n}\n\nexport type Validator<TOutput> =\n | LegacyValidator<TOutput>\n | StandardSchemaV1<unknown, TOutput>\n | ((data: unknown) => TOutput | Promise<TOutput>);\n\nexport function validateJson<\n TOutput,\n TParams extends object = Params,\n TState extends object = Record<string, unknown>,\n>(\n validator: Validator<TOutput>,\n handler: (\n ctx: Context<TParams, TState>,\n body: TOutput,\n ) => Response | Promise<Response>,\n): ResponseHandler<TParams, TState> {\n return async (ctx) => {\n const raw = await ctx.json<unknown>();\n let body: TOutput;\n\n if (\n typeof validator === \"object\" &&\n validator !== null &&\n \"~standard\" in validator\n ) {\n const res = await validator[\"~standard\"].validate(raw);\n if (res.issues) {\n throw new HttpError(422, {\n error: \"Validation Failed\",\n issues: res.issues,\n });\n }\n body = res.value;\n } else if (typeof validator === \"function\") {\n body = await validator(raw);\n } else if (\n typeof validator === \"object\" &&\n validator !== null &&\n \"parse\" in validator\n ) {\n body = (validator as LegacyValidator<TOutput>).parse(raw);\n } else {\n throw new TypeError(\"Invalid validator provided to validateJson\");\n }\n\n return handler(ctx, body);\n };\n}\n"
20
+ ],
21
+ "mappings": "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",
22
+ "debugId": "488AD569EC96D0E864756E2164756E21",
23
+ "names": []
24
+ }