@barqel/barq 1.0.1 → 1.0.2
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.
- package/README.md +7 -3
- package/dist/app.d.ts +0 -2
- package/dist/app.d.ts.map +1 -1
- package/dist/context.d.ts +0 -2
- package/dist/context.d.ts.map +1 -1
- package/dist/cookies.d.ts.map +1 -1
- package/dist/cors.d.ts.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/http.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +755 -189
- package/dist/index.js.map +18 -18
- package/dist/internal/ip.d.ts.map +1 -1
- package/dist/internal/pathname.d.ts.map +1 -1
- package/dist/internal/query.d.ts.map +1 -1
- package/dist/internal/scan.d.ts.map +1 -1
- package/dist/internal/shutdown.d.ts.map +1 -1
- package/dist/internal/trie.d.ts.map +1 -1
- package/dist/middleware.d.ts.map +1 -1
- package/dist/node-patch.js +755 -189
- package/dist/node-patch.js.map +18 -18
- package/dist/types.d.ts.map +1 -1
- package/dist/validation.d.ts.map +1 -1
- package/package.json +72 -67
package/dist/index.js.map
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/internal/node-compat.ts", "../src/app.ts", "../src/cookies.ts", "../src/http.ts", "../src/internal/ip.ts", "../src/
|
|
3
|
+
"sources": ["../src/internal/node-compat.ts", "../src/app.ts", "../src/cookies.ts", "../src/http.ts", "../src/internal/ip.ts", "../src/errors.ts", "../src/internal/pathname.ts", "../src/internal/query.ts", "../src/context.ts", "../src/internal/scan.ts", "../src/internal/shutdown.ts", "../src/internal/trie.ts", "../src/middleware.ts", "../src/cors.ts", "../src/validation.ts"],
|
|
4
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
|
|
8
|
-
"const NULL_BODY_STATUSES: ReadonlySet<number> = new Set([204, 205, 304]);\nconst DEFAULT_JSON_HEADERS = Object.freeze({\n
|
|
9
|
-
"import { isIP } from \"node:net\";\n\nexport type IpMatcher = (ip: string) => boolean;\n\nfunction ipv4ToNumber(bytes: Uint8Array): number {\n
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"import {
|
|
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
|
|
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
|
|
19
|
-
"import type { Context } from \"./context\";\nimport { HttpError } from \"./errors\";\nimport type { Params, ResponseHandler } from \"./types\";\n\nexport interface StandardSchemaV1Issue {\n
|
|
5
|
+
"import cluster from \"node:cluster\";\nimport crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport http from \"node:http\";\nimport https from \"node:https\";\nimport type { AddressInfo, Socket } from \"node:net\";\nimport { cpus } from \"node:os\";\nimport { type Duplex, Readable } from \"node:stream\";\nimport type { Server, ServerWebSocket } from \"bun\";\nimport { App, type WebSocketOptions } from \"../app\";\nimport type { WebSocketHandlers } from \"../types\";\nimport { scanPathname } from \"./pathname\";\nimport type { ShutdownResult } from \"./shutdown\";\n\nconst isNode = typeof Bun === \"undefined\";\nconst WS_GUID = \"258EAFA5-E914-47DA-95CA-C5AB0DC85B11\";\n\ninterface InternalWsSession {\n\thandlers?: WebSocketHandlers;\n\t_barqInternal?: boolean;\n\tdata?: unknown;\n}\n\nconst nodeTopics = new Map<string, Set<NodeServerWebSocket<unknown>>>();\n\nclass NodeServerWebSocket<TData = unknown> {\n\treadonly socket: Duplex;\n\tdata: TData;\n\treadyState = 1;\n\treadonly remoteAddress: string;\n\treadonly topics = new Set<string>();\n\tprivate buffer: Buffer = Buffer.alloc(0);\n\tprivate fragments: Buffer[] = [];\n\tprivate fragmentOpcode = 0;\n\tprivate readonly maxPayloadLength: number;\n\tprivate readonly handlers?: WebSocketHandlers;\n\tprivate readonly appHandlers?: WebSocketHandlers;\n\n\tconstructor(socket: Duplex, data: TData, wsOptions?: WebSocketOptions) {\n\t\tthis.socket = socket;\n\t\tthis.data = data;\n\t\tthis.remoteAddress =\n\t\t\t(\"remoteAddress\" in socket ? (socket as Socket).remoteAddress : \"\") || \"\";\n\t\tthis.maxPayloadLength = wsOptions?.maxPayloadLength ?? 16 * 1024 * 1024;\n\t\tthis.appHandlers = wsOptions;\n\n\t\tconst internal = (data as InternalWsSession)?._barqInternal\n\t\t\t? (data as InternalWsSession).handlers\n\t\t\t: undefined;\n\t\tthis.handlers = internal;\n\n\t\tsocket.on(\"data\", (chunk: Buffer) => this.onData(chunk));\n\t\tsocket.on(\"close\", () => this.onClose(1006, \"\"));\n\t\tsocket.on(\"error\", (err: Error) => this.onError(err));\n\t\tsocket.on(\"drain\", () => this.onDrain());\n\t}\n\n\tsend(data: string | Buffer | Uint8Array | ArrayBufferView | unknown): number {\n\t\tif (this.readyState !== 1) return -1;\n\t\tlet payload: Buffer;\n\t\tlet isText = true;\n\n\t\tif (typeof data === \"string\") {\n\t\t\tpayload = Buffer.from(data, \"utf8\");\n\t\t\tisText = true;\n\t\t} else if (Buffer.isBuffer(data)) {\n\t\t\tpayload = data;\n\t\t\tisText = false;\n\t\t} else if (ArrayBuffer.isView(data)) {\n\t\t\tpayload = Buffer.from(data.buffer, data.byteOffset, data.byteLength);\n\t\t\tisText = false;\n\t\t} else {\n\t\t\tpayload = Buffer.from(String(data), \"utf8\");\n\t\t\tisText = true;\n\t\t}\n\n\t\tthis.sendFrame(isText ? 0x01 : 0x02, payload);\n\t\treturn payload.length;\n\t}\n\n\tsubscribe(room: string): void {\n\t\tlet set = nodeTopics.get(room);\n\t\tif (!set) {\n\t\t\tset = new Set();\n\t\t\tnodeTopics.set(room, set);\n\t\t}\n\t\tset.add(this as unknown as NodeServerWebSocket<unknown>);\n\t\tthis.topics.add(room);\n\t}\n\n\tunsubscribe(room: string): void {\n\t\tconst set = nodeTopics.get(room);\n\t\tif (set) {\n\t\t\tset.delete(this as unknown as NodeServerWebSocket<unknown>);\n\t\t\tif (set.size === 0) nodeTopics.delete(room);\n\t\t}\n\t\tthis.topics.delete(room);\n\t}\n\n\tisSubscribed(room: string): boolean {\n\t\treturn this.topics.has(room);\n\t}\n\n\tpublish(\n\t\troom: string,\n\t\tmessage: string | Buffer | Uint8Array,\n\t\t_compress?: boolean,\n\t): number {\n\t\tconst set = nodeTopics.get(room);\n\t\tif (!set || set.size === 0) return 0;\n\t\tlet sent = 0;\n\t\tfor (const client of set) {\n\t\t\tif (client !== (this as unknown) && client.readyState === 1) {\n\t\t\t\tclient.send(message);\n\t\t\t\tsent++;\n\t\t\t}\n\t\t}\n\t\treturn sent;\n\t}\n\n\tping(data: string | Buffer = \"\"): void {\n\t\tif (this.readyState !== 1) return;\n\t\tconst buf = typeof data === \"string\" ? Buffer.from(data, \"utf8\") : data;\n\t\tthis.sendFrame(0x09, buf);\n\t}\n\n\tpong(data: string | Buffer = \"\"): void {\n\t\tif (this.readyState !== 1) return;\n\t\tconst buf = typeof data === \"string\" ? Buffer.from(data, \"utf8\") : data;\n\t\tthis.sendFrame(0x0a, buf);\n\t}\n\n\tcork<T>(callback: (ws: this) => T): T {\n\t\treturn callback(this);\n\t}\n\n\tclose(code = 1000, reason = \"\"): void {\n\t\tif (this.readyState >= 2) return;\n\t\tthis.readyState = 2;\n\t\tconst reasonBuf = Buffer.from(reason, \"utf8\");\n\t\tconst payload = Buffer.allocUnsafe(2 + reasonBuf.length);\n\t\tpayload.writeUInt16BE(code, 0);\n\t\treasonBuf.copy(payload, 2);\n\t\tthis.sendFrame(0x08, payload);\n\t\tthis.socket.end();\n\t}\n\n\tterminate(): void {\n\t\tthis.readyState = 3;\n\t\tthis.socket.destroy();\n\t}\n\n\tprivate sendFrame(opcode: number, payload: Buffer): void {\n\t\tif (this.socket.destroyed) return;\n\t\tconst len = payload.length;\n\t\tlet header: Buffer;\n\n\t\tif (len <= 125) {\n\t\t\theader = Buffer.allocUnsafe(2);\n\t\t\theader[0] = 0x80 | (opcode & 0x0f);\n\t\t\theader[1] = len;\n\t\t} else if (len <= 65535) {\n\t\t\theader = Buffer.allocUnsafe(4);\n\t\t\theader[0] = 0x80 | (opcode & 0x0f);\n\t\t\theader[1] = 126;\n\t\t\theader.writeUInt16BE(len, 2);\n\t\t} else {\n\t\t\theader = Buffer.allocUnsafe(10);\n\t\t\theader[0] = 0x80 | (opcode & 0x0f);\n\t\t\theader[1] = 127;\n\t\t\theader.writeBigUInt64BE(BigInt(len), 2);\n\t\t}\n\n\t\tthis.socket.write(Buffer.concat([header, payload]));\n\t}\n\n\tprivate onData(chunk: Buffer): void {\n\t\tthis.buffer =\n\t\t\tthis.buffer.length === 0 ? chunk : Buffer.concat([this.buffer, chunk]);\n\n\t\twhile (this.buffer.length >= 2) {\n\t\t\tconst byte0 = this.buffer[0]!;\n\t\t\tconst byte1 = this.buffer[1]!;\n\t\t\tconst fin = (byte0 & 0x80) !== 0;\n\t\t\tconst opcode = byte0 & 0x0f;\n\t\t\tconst masked = (byte1 & 0x80) !== 0;\n\n\t\t\tif (!masked) {\n\t\t\t\tthis.close(1002, \"Protocol error: unmasked client frame\");\n\t\t\t\tthis.onClose(1002, \"Protocol error: unmasked client frame\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet payloadLen = byte1 & 0x7f;\n\t\t\tlet offset = 2;\n\n\t\t\tif (payloadLen === 126) {\n\t\t\t\tif (this.buffer.length < 4) return;\n\t\t\t\tpayloadLen = this.buffer.readUInt16BE(2);\n\t\t\t\toffset = 4;\n\t\t\t} else if (payloadLen === 127) {\n\t\t\t\tif (this.buffer.length < 10) return;\n\t\t\t\tconst high = this.buffer.readUInt32BE(2);\n\t\t\t\tconst low = this.buffer.readUInt32BE(6);\n\t\t\t\tpayloadLen = high * 0x100000000 + low;\n\t\t\t\toffset = 10;\n\t\t\t}\n\n\t\t\tif (payloadLen > this.maxPayloadLength) {\n\t\t\t\tthis.close(1009, \"Message Too Big\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst maskLen = 4;\n\t\t\tconst totalLen = offset + maskLen + payloadLen;\n\t\t\tif (this.buffer.length < totalLen) return;\n\n\t\t\tconst maskKey = this.buffer.subarray(offset, offset + 4);\n\t\t\tconst rawPayload = this.buffer.subarray(offset + maskLen, totalLen);\n\t\t\tconst payload = Buffer.allocUnsafe(payloadLen);\n\n\t\t\tfor (let i = 0; i < payloadLen; i++) {\n\t\t\t\tpayload[i] = rawPayload[i]! ^ maskKey[i & 3]!;\n\t\t\t}\n\n\t\t\tthis.buffer = this.buffer.subarray(totalLen);\n\n\t\t\tif (opcode === 0x08) {\n\t\t\t\tlet code = 1000;\n\t\t\t\tlet reason = \"\";\n\t\t\t\tif (payload.length >= 2) {\n\t\t\t\t\tcode = payload.readUInt16BE(0);\n\t\t\t\t\tif (payload.length > 2) {\n\t\t\t\t\t\treason = payload.subarray(2).toString(\"utf8\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (this.readyState === 1) {\n\t\t\t\t\tthis.close(code, reason);\n\t\t\t\t}\n\t\t\t\tthis.onClose(code, reason);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (opcode === 0x09) {\n\t\t\t\tthis.sendFrame(0x0a, payload);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (opcode === 0x0a) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!fin) {\n\t\t\t\tif (opcode !== 0x00) {\n\t\t\t\t\tthis.fragmentOpcode = opcode;\n\t\t\t\t\tthis.fragments = [payload];\n\t\t\t\t} else {\n\t\t\t\t\tthis.fragments.push(payload);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet fullPayload = payload;\n\t\t\tlet effectiveOpcode = opcode;\n\t\t\tif (opcode === 0x00) {\n\t\t\t\tthis.fragments.push(payload);\n\t\t\t\tfullPayload = Buffer.concat(this.fragments);\n\t\t\t\teffectiveOpcode = this.fragmentOpcode;\n\t\t\t\tthis.fragments = [];\n\t\t\t\tthis.fragmentOpcode = 0;\n\t\t\t}\n\n\t\t\tconst message =\n\t\t\t\teffectiveOpcode === 0x01 ? fullPayload.toString(\"utf8\") : fullPayload;\n\n\t\t\tthis.onMessage(message);\n\t\t}\n\t}\n\n\tdispatchOpen(): void {\n\t\ttry {\n\t\t\tthis.handlers?.open?.(this as unknown as ServerWebSocket<TData>);\n\t\t\tthis.appHandlers?.open?.(this as unknown as ServerWebSocket<TData>);\n\t\t} catch (err) {\n\t\t\tthis.onError(err);\n\t\t}\n\t}\n\n\tprivate onMessage(msg: string | Buffer): void {\n\t\ttry {\n\t\t\tthis.handlers?.message?.(this as unknown as ServerWebSocket<TData>, msg);\n\t\t\tthis.appHandlers?.message?.(\n\t\t\t\tthis as unknown as ServerWebSocket<TData>,\n\t\t\t\tmsg,\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tthis.onError(err);\n\t\t}\n\t}\n\n\tprivate onClose(code: number, reason: string): void {\n\t\tif (this.readyState === 3) return;\n\t\tthis.readyState = 3;\n\n\t\tfor (const room of this.topics) {\n\t\t\tconst set = nodeTopics.get(room);\n\t\t\tif (set) {\n\t\t\t\tset.delete(this as unknown as NodeServerWebSocket<unknown>);\n\t\t\t\tif (set.size === 0) nodeTopics.delete(room);\n\t\t\t}\n\t\t}\n\t\tthis.topics.clear();\n\n\t\ttry {\n\t\t\tthis.handlers?.close?.(\n\t\t\t\tthis as unknown as ServerWebSocket<TData>,\n\t\t\t\tcode,\n\t\t\t\treason,\n\t\t\t);\n\t\t\tthis.appHandlers?.close?.(\n\t\t\t\tthis as unknown as ServerWebSocket<TData>,\n\t\t\t\tcode,\n\t\t\t\treason,\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tthis.onError(err);\n\t\t}\n\t}\n\n\tprivate onError(err: unknown): void {\n\t\ttry {\n\t\t\tif (this.handlers?.error) {\n\t\t\t\tthis.handlers.error(this as unknown as ServerWebSocket<TData>, err);\n\t\t\t} else if (this.appHandlers?.error) {\n\t\t\t\tthis.appHandlers.error(this as unknown as ServerWebSocket<TData>, err);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(\"Unhandled WebSocket error:\", e);\n\t\t}\n\t}\n\n\tprivate onDrain(): void {\n\t\ttry {\n\t\t\tthis.handlers?.drain?.(this as unknown as ServerWebSocket<TData>);\n\t\t\tthis.appHandlers?.drain?.(this as unknown as ServerWebSocket<TData>);\n\t\t} catch (err) {\n\t\t\tthis.onError(err);\n\t\t}\n\t}\n}\n\ninterface AppInternal {\n\t_options?: {\n\t\tport?: number;\n\t\thostname?: string;\n\t\twebsocket?: WebSocketOptions;\n\t\ttls?: {\n\t\t\tkey?: unknown;\n\t\t\tcert?: unknown;\n\t\t\tca?: unknown;\n\t\t\tpassphrase?: string;\n\t\t};\n\t};\n\tnativeRoutes?: Array<{\n\t\tmethod: string;\n\t\tpattern: string;\n\t\tisDynamic: boolean;\n\t\tisContextFree: boolean;\n\t\trawHandler?: () => unknown;\n\t}>;\n\thasMiddlewares?: boolean;\n\terrorResolver?: unknown;\n\thandle: (req: Request, srv: Server<unknown>) => Promise<Response>;\n}\n\nfunction resolveTlsData(input: unknown): Buffer | string | undefined {\n\tif (!input) return undefined;\n\tif (Buffer.isBuffer(input) || typeof input === \"string\") {\n\t\tif (\n\t\t\ttypeof input === \"string\" &&\n\t\t\t!input.includes(\"\\n\") &&\n\t\t\t(input.startsWith(\"./\") || input.startsWith(\"/\") || input.includes(\".\"))\n\t\t) {\n\t\t\ttry {\n\t\t\t\tif (fs.existsSync(input)) {\n\t\t\t\t\treturn fs.readFileSync(input);\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t}\n\t\treturn input;\n\t}\n\treturn undefined;\n}\n\nif (isNode) {\n\tif (typeof (globalThis as Record<string, unknown>).Bun === \"undefined\") {\n\t\tObject.defineProperty(globalThis, \"Bun\", {\n\t\t\tconfigurable: true,\n\t\t\tvalue: {\n\t\t\t\tenv: process.env,\n\t\t\t\tCryptoHasher: class {\n\t\t\t\t\tprivate hmac: crypto.Hmac;\n\t\t\t\t\tconstructor(_algo: string, secret: string) {\n\t\t\t\t\t\tthis.hmac = crypto.createHmac(\"sha256\", secret);\n\t\t\t\t\t}\n\t\t\t\t\tupdate(data: string) {\n\t\t\t\t\t\tthis.hmac.update(data);\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\t\t\t\t\tdigest(encoding: crypto.BinaryToTextEncoding) {\n\t\t\t\t\t\treturn this.hmac.digest(encoding);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\t}\n\n\tApp.prototype.listen = function (this: unknown, port?: number) {\n\t\tconst app = this as unknown as AppInternal;\n\t\tconst rawPort = port ?? app._options?.port ?? 3000;\n\t\tconst hostname = app._options?.hostname ?? \"0.0.0.0\";\n\n\t\tconst activeSockets = new Set<Socket | Duplex>();\n\t\tlet inFlightRequests = 0;\n\t\tlet isDraining = false;\n\t\tconst fastRoutes = new Map<string, () => unknown>();\n\n\t\tif (\n\t\t\tapp.nativeRoutes &&\n\t\t\t!app.hasMiddlewares &&\n\t\t\tapp.errorResolver === undefined\n\t\t) {\n\t\t\tfor (const nr of app.nativeRoutes) {\n\t\t\t\tif (!nr.isDynamic && nr.isContextFree && nr.rawHandler) {\n\t\t\t\t\tfastRoutes.set(`${nr.method}:${nr.pattern}`, nr.rawHandler);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst requestListener = async (\n\t\t\treq: http.IncomingMessage,\n\t\t\tres: http.ServerResponse,\n\t\t) => {\n\t\t\tinFlightRequests++;\n\t\t\tif (isDraining) {\n\t\t\t\tres.setHeader(\"Connection\", \"close\");\n\t\t\t}\n\n\t\t\tconst onFinished = () => {\n\t\t\t\tinFlightRequests--;\n\t\t\t\tres.removeListener(\"finish\", onFinished);\n\t\t\t\tres.removeListener(\"close\", onFinished);\n\t\t\t};\n\t\t\tres.on(\"finish\", onFinished);\n\t\t\tres.on(\"close\", onFinished);\n\n\t\t\tconst method = req.method || \"GET\";\n\t\t\tconst rawUrl = req.url || \"/\";\n\t\t\tconst pathname = scanPathname(rawUrl);\n\n\t\t\tconst fastHandler = fastRoutes.get(`${method}:${pathname}`);\n\t\t\tif (fastHandler) {\n\t\t\t\ttry {\n\t\t\t\t\tconst val = fastHandler();\n\t\t\t\t\tif (typeof val === \"string\") {\n\t\t\t\t\t\tres.writeHead(200, {\n\t\t\t\t\t\t\t\"content-type\": \"text/plain; charset=utf-8\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tres.end(val);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypeof val === \"object\" &&\n\t\t\t\t\t\tval !== null &&\n\t\t\t\t\t\t!(val instanceof Response)\n\t\t\t\t\t) {\n\t\t\t\t\t\tres.writeHead(200, {\n\t\t\t\t\t\t\t\"content-type\": \"application/json; charset=utf-8\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tres.end(JSON.stringify(val));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} catch {}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst protocol = (req.socket as { encrypted?: boolean })?.encrypted\n\t\t\t\t\t? \"https\"\n\t\t\t\t\t: \"http\";\n\t\t\t\tconst host = req.headers.host || \"localhost\";\n\t\t\t\tconst url = `${protocol}://${host}${rawUrl}`;\n\n\t\t\t\tlet reqBody: unknown;\n\t\t\t\tif (method !== \"GET\" && method !== \"HEAD\") {\n\t\t\t\t\treqBody = Readable.toWeb(req);\n\t\t\t\t}\n\n\t\t\t\tconst webReq = new Request(url, {\n\t\t\t\t\tmethod,\n\t\t\t\t\theaders: req.headers as never,\n\t\t\t\t\tbody: reqBody as never,\n\t\t\t\t\tduplex: \"half\",\n\t\t\t\t} as never);\n\n\t\t\t\tconst remoteIp = req.socket.remoteAddress || \"\";\n\t\t\t\tlet upgraded = false;\n\n\t\t\t\tconst serverShim = {\n\t\t\t\t\trequestIP: () => (remoteIp ? { address: remoteIp } : null),\n\t\t\t\t\tupgrade: (_request: Request, options?: { data?: unknown }) => {\n\t\t\t\t\t\tconst secKey = req.headers[\"sec-websocket-key\"];\n\t\t\t\t\t\tif (!secKey || typeof secKey !== \"string\") return false;\n\n\t\t\t\t\t\tconst acceptKey = crypto\n\t\t\t\t\t\t\t.createHash(\"sha1\")\n\t\t\t\t\t\t\t.update(secKey + WS_GUID)\n\t\t\t\t\t\t\t.digest(\"base64\");\n\n\t\t\t\t\t\treq.socket.write(\n\t\t\t\t\t\t\t\"HTTP/1.1 101 Switching Protocols\\r\\n\" +\n\t\t\t\t\t\t\t\t\"Upgrade: websocket\\r\\n\" +\n\t\t\t\t\t\t\t\t\"Connection: Upgrade\\r\\n\" +\n\t\t\t\t\t\t\t\t`Sec-WebSocket-Accept: ${acceptKey}\\r\\n\\r\\n`,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst ws = new NodeServerWebSocket(\n\t\t\t\t\t\t\treq.socket,\n\t\t\t\t\t\t\toptions?.data,\n\t\t\t\t\t\t\tapp._options?.websocket,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tupgraded = true;\n\t\t\t\t\t\tws.dispatchOpen();\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tconst webRes = await app.handle(\n\t\t\t\t\twebReq,\n\t\t\t\t\tserverShim as unknown as Server<unknown>,\n\t\t\t\t);\n\n\t\t\t\tif (upgraded) return;\n\n\t\t\t\tconst resHeaders: Record<string, string | string[]> = {};\n\t\t\t\twebRes.headers.forEach((val, key) => {\n\t\t\t\t\tresHeaders[key] = val;\n\t\t\t\t});\n\n\t\t\t\tconst getSetCookie = (\n\t\t\t\t\twebRes.headers as unknown as { getSetCookie?: () => string[] }\n\t\t\t\t).getSetCookie;\n\t\t\t\tif (typeof getSetCookie === \"function\") {\n\t\t\t\t\tconst cookies = getSetCookie.call(webRes.headers);\n\t\t\t\t\tif (cookies && cookies.length > 0) {\n\t\t\t\t\t\tresHeaders[\"set-cookie\"] = cookies;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tres.writeHead(\n\t\t\t\t\twebRes.status,\n\t\t\t\t\twebRes.statusText || undefined,\n\t\t\t\t\tresHeaders,\n\t\t\t\t);\n\n\t\t\t\tif (webRes.body) {\n\t\t\t\t\tconst nodeStream = Readable.fromWeb(webRes.body as never);\n\t\t\t\t\tnodeStream.pipe(res);\n\t\t\t\t} else {\n\t\t\t\t\tres.end();\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(\"Barq Node Adapter Error:\", err);\n\t\t\t\tif (!res.headersSent) {\n\t\t\t\t\tres.writeHead(500, {\n\t\t\t\t\t\t\"content-type\": \"application/json; charset=utf-8\",\n\t\t\t\t\t});\n\t\t\t\t\tres.end('{\"error\":\"Internal Server Error\"}');\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst tlsConfig = app._options?.tls;\n\t\tconst hasTls = Boolean(tlsConfig && (tlsConfig.key || tlsConfig.cert));\n\n\t\tconst server = hasTls\n\t\t\t? https.createServer(\n\t\t\t\t\t{\n\t\t\t\t\t\tkey: resolveTlsData(tlsConfig?.key),\n\t\t\t\t\t\tcert: resolveTlsData(tlsConfig?.cert),\n\t\t\t\t\t\tca: resolveTlsData(tlsConfig?.ca),\n\t\t\t\t\t\tpassphrase: tlsConfig?.passphrase,\n\t\t\t\t\t},\n\t\t\t\t\trequestListener,\n\t\t\t\t)\n\t\t\t: http.createServer(requestListener);\n\n\t\tserver.on(\"connection\", (socket: Socket) => {\n\t\t\tactiveSockets.add(socket);\n\t\t\tsocket.on(\"close\", () => activeSockets.delete(socket));\n\t\t});\n\n\t\tserver.on(\n\t\t\t\"upgrade\",\n\t\t\tasync (req: http.IncomingMessage, socket: Duplex, head: Buffer) => {\n\t\t\t\tactiveSockets.add(socket);\n\t\t\t\tsocket.on(\"close\", () => activeSockets.delete(socket));\n\n\t\t\t\tconst protocol = (socket as { encrypted?: boolean })?.encrypted\n\t\t\t\t\t? \"https\"\n\t\t\t\t\t: \"http\";\n\t\t\t\tconst host = req.headers.host || \"localhost\";\n\t\t\t\tconst fullUrl = `${protocol}://${host}${req.url || \"/\"}`;\n\n\t\t\t\tlet upgradedSocket: NodeServerWebSocket | null = null;\n\n\t\t\t\tconst serverShim = {\n\t\t\t\t\trequestIP: () => ({\n\t\t\t\t\t\taddress:\n\t\t\t\t\t\t\t(\"remoteAddress\" in socket\n\t\t\t\t\t\t\t\t? (socket as Socket).remoteAddress\n\t\t\t\t\t\t\t\t: \"\") || \"\",\n\t\t\t\t\t}),\n\t\t\t\t\tupgrade: (_request: Request, options?: { data?: unknown }) => {\n\t\t\t\t\t\tconst secKey = req.headers[\"sec-websocket-key\"];\n\t\t\t\t\t\tif (!secKey || typeof secKey !== \"string\") return false;\n\n\t\t\t\t\t\tconst acceptKey = crypto\n\t\t\t\t\t\t\t.createHash(\"sha1\")\n\t\t\t\t\t\t\t.update(secKey + WS_GUID)\n\t\t\t\t\t\t\t.digest(\"base64\");\n\n\t\t\t\t\t\tsocket.write(\n\t\t\t\t\t\t\t\"HTTP/1.1 101 Switching Protocols\\r\\n\" +\n\t\t\t\t\t\t\t\t\"Upgrade: websocket\\r\\n\" +\n\t\t\t\t\t\t\t\t\"Connection: Upgrade\\r\\n\" +\n\t\t\t\t\t\t\t\t`Sec-WebSocket-Accept: ${acceptKey}\\r\\n\\r\\n`,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst ws = new NodeServerWebSocket(\n\t\t\t\t\t\t\tsocket,\n\t\t\t\t\t\t\toptions?.data,\n\t\t\t\t\t\t\tapp._options?.websocket,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tupgradedSocket = ws;\n\n\t\t\t\t\t\tif (head && head.length > 0) {\n\t\t\t\t\t\t\tsocket.unshift(head);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tws.dispatchOpen();\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tconst webReq = new Request(fullUrl, {\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\theaders: req.headers as never,\n\t\t\t\t});\n\n\t\t\t\ttry {\n\t\t\t\t\tconst webRes = await app.handle(\n\t\t\t\t\t\twebReq,\n\t\t\t\t\t\tserverShim as unknown as Server<unknown>,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (!upgradedSocket) {\n\t\t\t\t\t\tconst status = webRes.status || 400;\n\t\t\t\t\t\tconst statusText = webRes.statusText || \"Bad Request\";\n\t\t\t\t\t\tsocket.write(\n\t\t\t\t\t\t\t`HTTP/1.1 ${status} ${statusText}\\r\\nConnection: close\\r\\n\\r\\n`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsocket.destroy();\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\tif (!upgradedSocket) {\n\t\t\t\t\t\tsocket.write(\n\t\t\t\t\t\t\t\"HTTP/1.1 500 Internal Server Error\\r\\nConnection: close\\r\\n\\r\\n\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsocket.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\n\t\tserver.listen(rawPort, hostname);\n\n\t\tconst serverHandle = {\n\t\t\tget port() {\n\t\t\t\tconst addr = server.address() as AddressInfo | null;\n\t\t\t\treturn addr && typeof addr === \"object\" ? addr.port : rawPort;\n\t\t\t},\n\t\t\thostname,\n\t\t\tstop: (hardTimeoutMs?: number | boolean): Promise<ShutdownResult> =>\n\t\t\t\tnew Promise<ShutdownResult>((resolve) => {\n\t\t\t\t\tif (hardTimeoutMs === true) {\n\t\t\t\t\t\tfor (const socket of activeSockets) {\n\t\t\t\t\t\t\tsocket.destroy();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tactiveSockets.clear();\n\t\t\t\t\t\tserver.close(() => resolve({ forced: true, pending: 0 }));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tisDraining = true;\n\t\t\t\t\tconst timeout =\n\t\t\t\t\t\ttypeof hardTimeoutMs === \"number\" ? hardTimeoutMs : 5000;\n\t\t\t\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\t\t\t\tlet resolved = false;\n\n\t\t\t\t\tconst done = (forced: boolean) => {\n\t\t\t\t\t\tif (resolved) return;\n\t\t\t\t\t\tresolved = true;\n\t\t\t\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\t\t\t\tconst pending = activeSockets.size;\n\t\t\t\t\t\tif (forced) {\n\t\t\t\t\t\t\tfor (const socket of activeSockets) {\n\t\t\t\t\t\t\t\tsocket.destroy();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tactiveSockets.clear();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tserver.close(() =>\n\t\t\t\t\t\t\tresolve({ forced, pending: forced ? pending : 0 }),\n\t\t\t\t\t\t);\n\t\t\t\t\t};\n\n\t\t\t\t\ttimer = setTimeout(() => done(true), timeout);\n\t\t\t\t\tif (typeof timer.unref === \"function\") timer.unref();\n\n\t\t\t\t\tserver.close(() => {\n\t\t\t\t\t\tif (!resolved) {\n\t\t\t\t\t\t\tresolved = true;\n\t\t\t\t\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\t\t\t\t\tresolve({ forced: false, pending: 0 });\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tif (inFlightRequests === 0) {\n\t\t\t\t\t\tdone(false);\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t};\n\n\t\treturn serverHandle as unknown as Server<unknown>;\n\t};\n\n\tApp.prototype.cluster = function (this: unknown, port?: number) {\n\t\tconst app = this as unknown as AppInternal;\n\t\tconst rawPort = port ?? app._options?.port ?? 3000;\n\t\tconst hostname = app._options?.hostname ?? \"0.0.0.0\";\n\t\tconst listenPort = rawPort === 0 ? 3000 : rawPort;\n\n\t\tif (cluster.isPrimary) {\n\t\t\tconst numCPUs = cpus().length;\n\t\t\tconst workers: ReturnType<typeof cluster.fork>[] = [];\n\t\t\tlet crashCount = 0;\n\t\t\tlet lastReset = Date.now();\n\n\t\t\tconst spawnWorker = () => {\n\t\t\t\tconst worker = cluster.fork({\n\t\t\t\t\t...process.env,\n\t\t\t\t\tPORT: String(listenPort),\n\t\t\t\t});\n\n\t\t\t\tworker.on(\"exit\", () => {\n\t\t\t\t\tconst now = Date.now();\n\t\t\t\t\tif (now - lastReset > 5000) {\n\t\t\t\t\t\tcrashCount = 0;\n\t\t\t\t\t\tlastReset = now;\n\t\t\t\t\t}\n\t\t\t\t\tcrashCount++;\n\n\t\t\t\t\tconst idx = workers.indexOf(worker);\n\t\t\t\t\tif (idx !== -1) workers.splice(idx, 1);\n\n\t\t\t\t\tif (crashCount > 15) {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\"[Barq Cluster] Node workers restarting too fast. Throttling respawn.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tworkers.push(spawnWorker());\n\t\t\t\t\t\t}, 2000);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tworkers.push(spawnWorker());\n\t\t\t\t});\n\n\t\t\t\treturn worker;\n\t\t\t};\n\n\t\t\tfor (let i = 0; i < numCPUs; i++) {\n\t\t\t\tworkers.push(spawnWorker());\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tport: listenPort,\n\t\t\t\thostname,\n\t\t\t\tstop: async () => {\n\t\t\t\t\tfor (const w of workers) {\n\t\t\t\t\t\tw.kill(\"SIGTERM\");\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t} as unknown as Server<unknown>;\n\t\t}\n\n\t\treturn (\n\t\t\tthis as unknown as { listen: (p?: number) => Server<unknown> }\n\t\t).listen(listenPort);\n\t};\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\tanalyzeHandler,\n\ttype HandlerAnalysis,\n\ttype 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\tcomposeMiddlewareDispatcher,\n\tcomposeMiddlewares,\n\tisThenable,\n\ttype MiddlewareDispatcher,\n\tunwindAfter,\n} from \"./middleware\";\nimport type {\n\tErrorHandler,\n\tErrorResolver,\n\tHandler,\n\tHandlerResult,\n\tHttpMethod,\n\tJoinPath,\n\tMiddleware,\n\tNotFoundHandler,\n\tParams,\n\tResponseHandler,\n\tRouteParams,\n\tWebSocketHandlers,\n} from \"./types\";\n\nexport type { ShutdownResult };\n\nconst METHODS: readonly HttpMethod[] = [\n\t\"GET\",\n\t\"POST\",\n\t\"PUT\",\n\t\"DELETE\",\n\t\"PATCH\",\n\t\"HEAD\",\n\t\"OPTIONS\",\n];\nconst MAX_ROUTE_SEGMENTS = 256;\nconst EMPTY_PARAMS: Params = Object.freeze(Object.create(null) as Params);\n\nconst FAST_JSON_HEADERS: Headers = new Headers({\n\t\"content-type\": \"application/json; charset=utf-8\",\n});\nconst FAST_TEXT_HEADERS: Headers = new Headers({\n\t\"content-type\": \"text/plain; charset=utf-8\",\n});\n\nclass ReadonlySetView<T> {\n\tconstructor(private readonly source: Set<T>) {}\n\tget size(): number {\n\t\treturn this.source.size;\n\t}\n\thas(value: T): boolean {\n\t\treturn this.source.has(value);\n\t}\n\tforEach(\n\t\tcallback: (value: T, value2: T, set: ReadonlySet<T>) => void,\n\t\tthisArg?: unknown,\n\t): void {\n\t\tthis.source.forEach((value) => {\n\t\t\tcallback.call(thisArg, value, value, this as unknown as ReadonlySet<T>);\n\t\t});\n\t}\n\tentries(): IterableIterator<[T, T]> {\n\t\treturn this.source.entries();\n\t}\n\tkeys(): IterableIterator<T> {\n\t\treturn this.source.keys();\n\t}\n\tvalues(): IterableIterator<T> {\n\t\treturn this.source.values();\n\t}\n\t[Symbol.iterator](): IterableIterator<T> {\n\t\treturn this.source[Symbol.iterator]();\n\t}\n\tget [Symbol.toStringTag](): string {\n\t\treturn \"Set\";\n\t}\n}\n\nfunction createReadonlySet<T>(source: Set<T>): ReadonlySet<T> {\n\treturn new ReadonlySetView(source) as unknown as ReadonlySet<T>;\n}\n\nconst EMPTY_REDIRECT_HOSTS: ReadonlySet<string> = createReadonlySet(\n\tnew Set<string>(),\n);\n\ninterface HandlerNeeds {\n\tisContextFree: boolean;\n\tisLightweight: boolean;\n\tisParamsOnly: boolean;\n\tisJsonBodyOnly: boolean;\n}\n\nfunction expandOptionalPatterns(pattern: string): string[] {\n\tif (!pattern.includes(\"?\")) return [pattern];\n\tconst segments = pattern.split(\"/\").filter(Boolean);\n\tconst optIndices: number[] = [];\n\tfor (let i = 0; i < segments.length; i++) {\n\t\tconst seg = segments[i]!;\n\t\tif (seg.startsWith(\":\") && seg.endsWith(\"?\")) {\n\t\t\toptIndices.push(i);\n\t\t}\n\t}\n\tif (optIndices.length === 0) return [pattern];\n\n\tconst variants: string[] = [];\n\tconst count = 1 << optIndices.length;\n\tfor (let mask = 0; mask < count; mask++) {\n\t\tconst parts: string[] = [];\n\t\tfor (let i = 0; i < segments.length; i++) {\n\t\t\tconst optPos = optIndices.indexOf(i);\n\t\t\tif (optPos >= 0) {\n\t\t\t\tif (mask & (1 << optPos)) {\n\t\t\t\t\tparts.push(segments[i]!.slice(0, -1));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparts.push(segments[i]!);\n\t\t\t}\n\t\t}\n\t\tvariants.push(parts.length === 0 ? \"/\" : `/${parts.join(\"/\")}`);\n\t}\n\treturn variants;\n}\n\nconst LIGHT_SUPPORTED_PROPS = new Set([\n\t\"req\",\n\t\"params\",\n\t\"pathname\",\n\t\"queryParam\",\n\t\"queryParamAll\",\n\t\"state\",\n\t\"stream\",\n\t\"bodyStream\",\n]);\n\nfunction classifyProps(props: Set<string>): HandlerNeeds {\n\tfor (const p of props) {\n\t\tif (!LIGHT_SUPPORTED_PROPS.has(p)) {\n\t\t\treturn {\n\t\t\t\tisContextFree: false,\n\t\t\t\tisLightweight: false,\n\t\t\t\tisParamsOnly: false,\n\t\t\t\tisJsonBodyOnly: false,\n\t\t\t};\n\t\t}\n\t}\n\n\tconst hasParams = props.has(\"params\") || props.size === 0;\n\tconst hasQuery = props.has(\"queryParam\") || props.has(\"queryParamAll\");\n\n\tif (hasParams && props.size === 1) {\n\t\treturn {\n\t\t\tisContextFree: false,\n\t\t\tisLightweight: true,\n\t\t\tisParamsOnly: true,\n\t\t\tisJsonBodyOnly: false,\n\t\t};\n\t}\n\n\tif (hasParams || hasQuery || props.size > 0) {\n\t\treturn {\n\t\t\tisContextFree: false,\n\t\t\tisLightweight: true,\n\t\t\tisParamsOnly: false,\n\t\t\tisJsonBodyOnly: false,\n\t\t};\n\t}\n\n\treturn {\n\t\tisContextFree: false,\n\t\tisLightweight: false,\n\t\tisParamsOnly: false,\n\t\tisJsonBodyOnly: false,\n\t};\n}\n\nfunction classify(analysis: HandlerAnalysis): HandlerNeeds {\n\tif (analysis.isNoArg) {\n\t\treturn {\n\t\t\tisContextFree: true,\n\t\t\tisLightweight: false,\n\t\t\tisParamsOnly: false,\n\t\t\tisJsonBodyOnly: false,\n\t\t};\n\t}\n\tif (\n\t\tanalysis.arglessJsonCall &&\n\t\t!analysis.isDestructured &&\n\t\tanalysis.contextProps.size === 1 &&\n\t\tanalysis.contextProps.has(\"json\")\n\t) {\n\t\treturn {\n\t\t\tisContextFree: false,\n\t\t\tisLightweight: false,\n\t\t\tisParamsOnly: false,\n\t\t\tisJsonBodyOnly: true,\n\t\t};\n\t}\n\tif (analysis.isDestructured) {\n\t\treturn classifyProps(analysis.destructuredProps);\n\t}\n\tif (analysis.hasDynamicAccess) {\n\t\treturn {\n\t\t\tisContextFree: false,\n\t\t\tisLightweight: false,\n\t\t\tisParamsOnly: false,\n\t\t\tisJsonBodyOnly: false,\n\t\t};\n\t}\n\treturn classifyProps(analysis.contextProps);\n}\n\nfunction detectHandlerNeeds(fn: HandlerFunction): HandlerNeeds {\n\ttry {\n\t\treturn classify(analyzeHandler(fn));\n\t} catch {\n\t\treturn {\n\t\t\tisContextFree: false,\n\t\t\tisLightweight: false,\n\t\t\tisParamsOnly: false,\n\t\t\tisJsonBodyOnly: false,\n\t\t};\n\t}\n}\n\nclass FastLightContext {\n\t_pathname?: string;\n\t_state?: Record<string, unknown>;\n\t_hasPendingCookies = false;\n\tprivate _url?: string;\n\tprivate _qPos = -2;\n\n\tconstructor(\n\t\tpublic req: Request,\n\t\tpublic params: Record<string, string>,\n\t) {}\n\n\tinit(req: Request, params: Record<string, string>): this {\n\t\tthis.req = req;\n\t\tthis.params = params;\n\t\tthis._pathname = undefined;\n\t\tthis._state = undefined;\n\t\tthis._hasPendingCookies = false;\n\t\tthis._url = undefined;\n\t\tthis._qPos = -2;\n\t\treturn this;\n\t}\n\n\tget url(): string {\n\t\tif (this._url === undefined) {\n\t\t\tthis._url = this.req.url;\n\t\t}\n\t\treturn this._url;\n\t}\n\tget pathname(): string {\n\t\tif (this._pathname === undefined) {\n\t\t\tthis._pathname = scanPathname(this.url);\n\t\t}\n\t\treturn this._pathname;\n\t}\n\tqueryParam(name: string): string | null {\n\t\tlet u = this._url;\n\t\tif (u === undefined) {\n\t\t\tu = this.req.url;\n\t\t\tthis._url = u;\n\t\t}\n\t\tlet q = this._qPos;\n\t\tif (q === -2) this._qPos = q = u.indexOf(\"?\");\n\t\treturn findQueryParam(u, name, q);\n\t}\n\tqueryParamAll(name: string): string[] {\n\t\treturn findQueryParamAll(this.url, name);\n\t}\n\tget cookies(): never {\n\t\tthrow new Error(\"LightweightContext does not support cookies.\");\n\t}\n\tget state(): Record<string, unknown> {\n\t\tlet state = this._state;\n\t\tif (state === undefined) {\n\t\t\tstate = Object.create(null) as Record<string, unknown>;\n\t\t\tthis._state = state;\n\t\t}\n\t\treturn state;\n\t}\n\tstream(): ReadableStream<Uint8Array> | null {\n\t\treturn this.req.body;\n\t}\n\tget bodyStream(): ReadableStream<Uint8Array> | null {\n\t\treturn this.req.body;\n\t}\n}\n\nconst lightContextPool: FastLightContext[] = [];\n\nfunction acquireLightContext(\n\treq: Request,\n\tparams: Record<string, string>,\n): FastLightContext {\n\tconst popped = lightContextPool.pop();\n\tif (popped !== undefined) {\n\t\treturn popped.init(req, params);\n\t}\n\treturn new FastLightContext(req, params);\n}\n\nfunction releaseLightContext(ctx: FastLightContext): void {\n\tif (lightContextPool.length < 128) {\n\t\tlightContextPool.push(ctx);\n\t}\n}\n\nexport type RouteHandlerArg = Middleware | readonly Middleware[];\n\ntype MiddlewareOutput<TMiddleware> = TMiddleware extends {\n\tbefore?: (...args: never[]) => infer TResult;\n}\n\t? Exclude<\n\t\t\tAwaited<TResult>,\n\t\t\tResponse | void | undefined\n\t\t> extends infer TOutput extends object\n\t\t? TOutput\n\t\t: never\n\t: never;\n\ntype UnionToIntersection<T> = (\n\tT extends unknown\n\t\t? (value: T) => void\n\t\t: never\n) extends (value: infer TIntersection) => void\n\t? TIntersection\n\t: never;\n\ntype MiddlewareOutputs<TMiddlewares extends readonly unknown[]> =\n\tUnionToIntersection<MiddlewareOutput<TMiddlewares[number]>>;\n\nexport interface WebSocketOptions {\n\tmaxPayloadLength?: number;\n\tbackpressureLimit?: number;\n\tcloseOnBackpressureLimit?: boolean;\n\tidleTimeout?: number;\n\topen?: (ws: ServerWebSocket<unknown>) => void | Promise<void>;\n\tmessage?: (\n\t\tws: ServerWebSocket<unknown>,\n\t\tmessage: string | Buffer,\n\t) => void | Promise<void>;\n\tclose?: (\n\t\tws: ServerWebSocket<unknown>,\n\t\tcode: number,\n\t\treason: string,\n\t) => void | Promise<void>;\n\tdrain?: (ws: ServerWebSocket<unknown>) => void | Promise<void>;\n\terror?: (\n\t\tws: ServerWebSocket<unknown>,\n\t\terror: unknown,\n\t) => void | Promise<void>;\n}\n\ntype WebSocketCallback = (...args: never[]) => unknown;\n\nfunction reportWebSocketError(\n\thandler: WebSocketHandlers[\"error\"] | undefined,\n\tws: ServerWebSocket<unknown>,\n\terror: unknown,\n): void {\n\tif (!handler) {\n\t\tconsole.error(\"Unhandled WebSocket callback error:\", error);\n\t\treturn;\n\t}\n\ttry {\n\t\tconst result = handler(ws, error);\n\t\tif (isThenable(result)) {\n\t\t\tPromise.resolve(result).catch((handlerError) =>\n\t\t\t\tconsole.error(\"WebSocket error handler failed:\", handlerError),\n\t\t\t);\n\t\t}\n\t} catch (handlerError) {\n\t\tconsole.error(\"WebSocket error handler failed:\", handlerError);\n\t}\n}\n\nfunction dispatchWebSocketCallback(\n\tcallback: WebSocketCallback | undefined,\n\targs: unknown[],\n\tonError: (error: unknown) => void,\n): void {\n\tif (!callback) return;\n\ttry {\n\t\tconst len = args.length;\n\t\tlet result: unknown;\n\t\tif (len === 1) {\n\t\t\tresult = (callback as (a: unknown) => unknown)(args[0]);\n\t\t} else if (len === 2) {\n\t\t\tresult = (callback as (a: unknown, b: unknown) => unknown)(\n\t\t\t\targs[0],\n\t\t\t\targs[1],\n\t\t\t);\n\t\t} else if (len === 3) {\n\t\t\tresult = (callback as (a: unknown, b: unknown, c: unknown) => unknown)(\n\t\t\t\targs[0],\n\t\t\t\targs[1],\n\t\t\t\targs[2],\n\t\t\t);\n\t\t} else {\n\t\t\tresult = Reflect.apply(callback, undefined, args);\n\t\t}\n\n\t\tif (isThenable(result)) {\n\t\t\tPromise.resolve(result).catch(onError);\n\t\t}\n\t} catch (error) {\n\t\tonError(error);\n\t}\n}\n\nfunction getInternalWebSocketHandlers(\n\tws: ServerWebSocket<unknown>,\n): WebSocketHandlers | undefined {\n\tconst data = ws.data as\n\t\t| { handlers?: WebSocketHandlers; _barqInternal?: boolean }\n\t\t| undefined;\n\treturn data?._barqInternal === true ? data.handlers : undefined;\n}\n\nexport interface AppOptions {\n\tport?: number;\n\thostname?: string;\n\tdevelopment?: boolean;\n\tmaxRequestBodySize?: number;\n\tidleTimeout?: number;\n\ttls?: ServeOptions[\"tls\"];\n\tallowedRedirectHosts?: string[];\n\ttrustProxy?: boolean | string | readonly string[] | ((ip: string) => boolean);\n\twebsocket?: WebSocketOptions;\n\tcookieSecret?: string;\n}\n\nfunction parseRouteArgs(args: unknown[]): {\n\tmiddlewares: Middleware[];\n\thandler: Handler<object>;\n} {\n\tif (args.length === 0) {\n\t\tthrow new Error(\"Route requires a handler function\");\n\t}\n\tconst last = args[args.length - 1];\n\tif (typeof last !== \"function\") {\n\t\tthrow new Error(\n\t\t\t\"The final argument in route definition must be a Handler function\",\n\t\t);\n\t}\n\tconst handler = last as Handler<object>;\n\tif (args.length === 1) {\n\t\treturn { middlewares: [], handler };\n\t}\n\tconst middlewares: Middleware[] = [];\n\tfor (let i = 0; i < args.length - 1; i++) {\n\t\tconst item = args[i];\n\t\tif (Array.isArray(item)) {\n\t\t\tfor (let j = 0; j < item.length; j++) {\n\t\t\t\tmiddlewares.push(item[j] as Middleware);\n\t\t\t}\n\t\t} else if (item && typeof item === \"object\") {\n\t\t\tmiddlewares.push(item as Middleware);\n\t\t} else {\n\t\t\tthrow new TypeError(\n\t\t\t\t\"Route middleware must be a Middleware object or array of Middleware\",\n\t\t\t);\n\t\t}\n\t}\n\treturn { middlewares, handler };\n}\n\nfunction normalizePrefix(prefix: string): string {\n\tlet p = prefix.trim();\n\tif (p.length === 0 || p === \"/\") return \"\";\n\tif (p.charCodeAt(0) !== 47) p = `/${p}`;\n\tif (p.charCodeAt(p.length - 1) === 47) p = p.slice(0, -1);\n\treturn p;\n}\n\nfunction joinPrefix(prefix: string, pattern: string): string {\n\tif (!prefix) return pattern;\n\tlet p = pattern.trim();\n\tif (p.length === 0 || p === \"/\") return prefix;\n\tif (p.charCodeAt(0) !== 47) p = `/${p}`;\n\treturn prefix + p;\n}\n\nfunction canonicalizeRoutePattern(pattern: string): string {\n\tlet p = pattern.trim();\n\tif (p.length === 0) p = \"/\";\n\tif (p.charCodeAt(0) !== 47) p = `/${p}`;\n\tif (p.length > 1 && p.charCodeAt(p.length - 1) === 47) {\n\t\tp = p.slice(0, -1);\n\t}\n\treturn p;\n}\n\nfunction validateRoutePattern(pattern: string): void {\n\tif (pattern.length === 0 || pattern.charCodeAt(0) !== 47) {\n\t\tthrow new Error(`Invalid route pattern \"${pattern}\": must start with /`);\n\t}\n\tif (pattern === \"/\") return;\n\tif (pattern.indexOf(\"#\") !== -1) {\n\t\tthrow new Error(`Invalid route pattern \"${pattern}\": must not contain #`);\n\t}\n\tconst segments = pattern.split(\"/\");\n\tif (segments.length - 1 > MAX_ROUTE_SEGMENTS) {\n\t\tthrow new RangeError(\n\t\t\t`Route pattern exceeds the limit of ${MAX_ROUTE_SEGMENTS} segments`,\n\t\t);\n\t}\n\tfor (let i = 1; i < segments.length; i++) {\n\t\tconst seg = segments[i]!;\n\t\tif (seg.length === 0) {\n\t\t\tthrow new Error(`Invalid route pattern \"${pattern}\": empty segment (//)`);\n\t\t}\n\t\tconst decoded = decodeSegment(seg);\n\t\tif (decoded === \".\" || decoded === \"..\") {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid route pattern \"${pattern}\": dot segments ., .. not allowed in route patterns`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction decodeSegment(seg: string): string {\n\tif (seg.indexOf(\"%\") === -1) return seg;\n\ttry {\n\t\treturn decodeURIComponent(seg);\n\t} catch {\n\t\treturn seg;\n\t}\n}\n\nfunction toResponse(\n\tvalue: HandlerResult | PromiseLike<HandlerResult>,\n): Response | Promise<Response> {\n\tif (value instanceof Response) return value;\n\tif (isThenable(value)) {\n\t\treturn Promise.resolve(value).then((resolved) =>\n\t\t\ttoResponse(resolved as HandlerResult),\n\t\t);\n\t}\n\treturn finalizeValue(value as HandlerResult);\n}\n\nfunction finalizeValue(value: HandlerResult): Response {\n\tif (typeof value === \"object\" && value !== null)\n\t\treturn new Response(JSON.stringify(value), { headers: FAST_JSON_HEADERS });\n\tif (typeof value === \"string\")\n\t\treturn new Response(value, { headers: FAST_TEXT_HEADERS });\n\treturn new Response(String(value), { headers: FAST_TEXT_HEADERS });\n}\n\nasync function stopClusterProcesses(\n\tprocesses: readonly ReturnType<typeof Bun.spawn>[],\n\thardTimeoutMs: number,\n): Promise<boolean> {\n\tconst running = processes.filter((process) => !process.killed);\n\tif (running.length === 0) return false;\n\tfor (const process of running) process.kill(\"SIGTERM\");\n\n\tconst exited = Promise.all(running.map((process) => process.exited));\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tconst forced = await Promise.race([\n\t\texited.then(() => false),\n\t\tnew Promise<boolean>((resolve) => {\n\t\t\ttimer = setTimeout(() => resolve(true), hardTimeoutMs);\n\t\t\ttimer.unref?.();\n\t\t}),\n\t]);\n\tif (timer !== undefined) clearTimeout(timer);\n\tif (forced) {\n\t\tfor (const process of running) {\n\t\t\tif (!process.killed) process.kill(\"SIGKILL\");\n\t\t}\n\t\tawait exited;\n\t}\n\treturn forced;\n}\n\nexport class RouteGroup<\n\tPrefix extends string = string,\n\tTState extends object = Record<string, unknown>,\n> {\n\tconstructor(\n\t\tprivate readonly app: App<TState>,\n\t\treadonly prefix: string,\n\t\tprivate readonly middlewares: Middleware[] = [],\n\t) {}\n\n\tuse<const TMiddlewares extends readonly Middleware<TState, object>[]>(\n\t\t...middlewares: TMiddlewares\n\t): RouteGroup<Prefix, TState & MiddlewareOutputs<TMiddlewares>> {\n\t\tfor (let i = 0; i < middlewares.length; i++) {\n\t\t\tthis.middlewares.push(middlewares[i]! as Middleware);\n\t\t}\n\t\treturn this as unknown as RouteGroup<\n\t\t\tPrefix,\n\t\t\tTState & MiddlewareOutputs<TMiddlewares>\n\t\t>;\n\t}\n\n\tplugin<TOptions>(\n\t\tpluginFn: (group: this, options?: TOptions) => void,\n\t\toptions?: TOptions,\n\t): this {\n\t\tpluginFn(this, options);\n\t\treturn this;\n\t}\n\n\tprivate _register(\n\t\tmethod: HttpMethod,\n\t\tpattern: string,\n\t\targs: unknown[],\n\t): this {\n\t\treturn this._registerMethods([method], pattern, args);\n\t}\n\n\tprivate _registerMethods(\n\t\tmethods: readonly HttpMethod[],\n\t\tpattern: string,\n\t\targs: unknown[],\n\t): this {\n\t\tconst fullPattern = joinPrefix(this.prefix, pattern);\n\t\tconst { middlewares, handler } = parseRouteArgs(args);\n\t\tconst allMiddlewares =\n\t\t\tthis.middlewares.length === 0\n\t\t\t\t? middlewares\n\t\t\t\t: [...this.middlewares, ...middlewares];\n\t\tthis.app._registerMethods(\n\t\t\tmethods,\n\t\t\tfullPattern,\n\t\t\tallMiddlewares.length === 0 ? [handler] : [...allMiddlewares, handler],\n\t\t);\n\t\treturn this;\n\t}\n\n\tadd<P extends string>(\n\t\tmethod: HttpMethod,\n\t\tpattern: P,\n\t\thandler: Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n\t): this;\n\tadd<P extends string>(\n\t\tmethod: HttpMethod,\n\t\tpattern: P,\n\t\t...handlers: [\n\t\t\t...RouteHandlerArg[],\n\t\t\tHandler<RouteParams<JoinPath<Prefix, P>>, TState>,\n\t\t]\n\t): this;\n\tadd(method: HttpMethod, pattern: string, ...args: unknown[]): this {\n\t\treturn this._register(method, pattern, args);\n\t}\n\n\tget<P extends string>(\n\t\tpattern: P,\n\t\thandler: Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n\t): this;\n\tget<P extends string>(\n\t\tpattern: P,\n\t\t...handlers: [\n\t\t\t...RouteHandlerArg[],\n\t\t\tHandler<RouteParams<JoinPath<Prefix, P>>, TState>,\n\t\t]\n\t): this;\n\tget(pattern: string, ...args: unknown[]): this {\n\t\treturn this._register(\"GET\", pattern, args);\n\t}\n\n\tpost<P extends string>(\n\t\tpattern: P,\n\t\thandler: Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n\t): this;\n\tpost<P extends string>(\n\t\tpattern: P,\n\t\t...handlers: [\n\t\t\t...RouteHandlerArg[],\n\t\t\tHandler<RouteParams<JoinPath<Prefix, P>>, TState>,\n\t\t]\n\t): this;\n\tpost(pattern: string, ...args: unknown[]): this {\n\t\treturn this._register(\"POST\", pattern, args);\n\t}\n\n\tput<P extends string>(\n\t\tpattern: P,\n\t\thandler: Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n\t): this;\n\tput<P extends string>(\n\t\tpattern: P,\n\t\t...handlers: [\n\t\t\t...RouteHandlerArg[],\n\t\t\tHandler<RouteParams<JoinPath<Prefix, P>>, TState>,\n\t\t]\n\t): this;\n\tput(pattern: string, ...args: unknown[]): this {\n\t\treturn this._register(\"PUT\", pattern, args);\n\t}\n\n\tdelete<P extends string>(\n\t\tpattern: P,\n\t\thandler: Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n\t): this;\n\tdelete<P extends string>(\n\t\tpattern: P,\n\t\t...handlers: [\n\t\t\t...RouteHandlerArg[],\n\t\t\tHandler<RouteParams<JoinPath<Prefix, P>>, TState>,\n\t\t]\n\t): this;\n\tdelete(pattern: string, ...args: unknown[]): this {\n\t\treturn this._register(\"DELETE\", pattern, args);\n\t}\n\n\tpatch<P extends string>(\n\t\tpattern: P,\n\t\thandler: Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n\t): this;\n\tpatch<P extends string>(\n\t\tpattern: P,\n\t\t...handlers: [\n\t\t\t...RouteHandlerArg[],\n\t\t\tHandler<RouteParams<JoinPath<Prefix, P>>, TState>,\n\t\t]\n\t): this;\n\tpatch(pattern: string, ...args: unknown[]): this {\n\t\treturn this._register(\"PATCH\", pattern, args);\n\t}\n\n\thead<P extends string>(\n\t\tpattern: P,\n\t\thandler: Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n\t): this;\n\thead<P extends string>(\n\t\tpattern: P,\n\t\t...handlers: [\n\t\t\t...RouteHandlerArg[],\n\t\t\tHandler<RouteParams<JoinPath<Prefix, P>>, TState>,\n\t\t]\n\t): this;\n\thead(pattern: string, ...args: unknown[]): this {\n\t\treturn this._register(\"HEAD\", pattern, args);\n\t}\n\n\toptions<P extends string>(\n\t\tpattern: P,\n\t\thandler: Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n\t): this;\n\toptions<P extends string>(\n\t\tpattern: P,\n\t\t...handlers: [\n\t\t\t...RouteHandlerArg[],\n\t\t\tHandler<RouteParams<JoinPath<Prefix, P>>, TState>,\n\t\t]\n\t): this;\n\toptions(pattern: string, ...args: unknown[]): this {\n\t\treturn this._register(\"OPTIONS\", pattern, args);\n\t}\n\n\tall<P extends string>(\n\t\tpattern: P,\n\t\thandler: Handler<RouteParams<JoinPath<Prefix, P>>, TState>,\n\t): this;\n\tall<P extends string>(\n\t\tpattern: P,\n\t\t...handlers: [\n\t\t\t...RouteHandlerArg[],\n\t\t\tHandler<RouteParams<JoinPath<Prefix, P>>, TState>,\n\t\t]\n\t): this;\n\tall(pattern: string, ...args: unknown[]): this {\n\t\treturn this._registerMethods(METHODS, pattern, args);\n\t}\n\n\tws<P extends string, TData = unknown>(\n\t\tpattern: P,\n\t\thandlers: WebSocketHandlers<TData>,\n\t\tbeforeUpgrade?: (\n\t\t\tctx: Context<RouteParams<JoinPath<Prefix, P>>, TState>,\n\t\t) => boolean | { data?: TData } | Promise<boolean | { data?: TData }>,\n\t): this {\n\t\tthis.app.ws(\n\t\t\tjoinPrefix(this.prefix, pattern),\n\t\t\thandlers,\n\t\t\tbeforeUpgrade\n\t\t\t\t? (ctx) =>\n\t\t\t\t\t\tbeforeUpgrade(\n\t\t\t\t\t\t\tctx as unknown as Context<\n\t\t\t\t\t\t\t\tRouteParams<JoinPath<Prefix, P>>,\n\t\t\t\t\t\t\t\tTState\n\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t)\n\t\t\t\t: undefined,\n\t\t);\n\t\treturn this;\n\t}\n\n\tgroup<Sub extends string>(\n\t\tprefix: Sub,\n\t\tcallback: (group: RouteGroup<JoinPath<Prefix, Sub>, TState>) => void,\n\t): this;\n\tgroup<Sub extends string>(\n\t\tprefix: Sub,\n\t\t...args: [\n\t\t\t...RouteHandlerArg[],\n\t\t\t(group: RouteGroup<JoinPath<Prefix, Sub>, TState>) => void,\n\t\t]\n\t): this;\n\tgroup(prefix: string, ...args: unknown[]): this {\n\t\tconst nestedPrefix = joinPrefix(this.prefix, prefix);\n\t\tconst last = args[args.length - 1];\n\t\tif (typeof last !== \"function\") {\n\t\t\tthrow new Error(\"Route group callback must be a function\");\n\t\t}\n\t\tconst callback = last as (group: RouteGroup<string, TState>) => void;\n\t\tconst groupMws: Middleware[] = [...this.middlewares];\n\t\tfor (let i = 0; i < args.length - 1; i++) {\n\t\t\tconst item = args[i];\n\t\t\tif (Array.isArray(item)) {\n\t\t\t\tfor (let j = 0; j < item.length; j++)\n\t\t\t\t\tgroupMws.push(item[j] as Middleware);\n\t\t\t} else if (item && typeof item === \"object\") {\n\t\t\t\tgroupMws.push(item as Middleware);\n\t\t\t}\n\t\t}\n\t\tconst nestedGroup = new RouteGroup(this.app, nestedPrefix, groupMws);\n\t\tcallback(nestedGroup);\n\t\treturn this;\n\t}\n}\n\nexport class App<TState extends object = Record<string, unknown>> {\n\tprivate readonly fetchHandler = (req: Request, srv?: Server<unknown>) =>\n\t\tthis.handle(req, srv);\n\tprivate readonly trie = new SegmentTrie();\n\tprivate readonly middlewares: Middleware[] = [];\n\tprivate readonly nativeRoutes: Array<{\n\t\tmethod: HttpMethod;\n\t\tpattern: string;\n\t\thandler: ResponseHandler;\n\t\trawHandler?: HandlerFunction;\n\t\tisDynamic: boolean;\n\t\tisContextFree: boolean;\n\t\tisLightweight: boolean;\n\t\tisParamsOnly: boolean;\n\t\tisJsonBodyOnly: boolean;\n\t\thasRouteMiddlewares: boolean;\n\t}> = [];\n\tprivate server: Server<unknown> | null = null;\n\tprivate clusterProcesses: ReturnType<typeof Bun.spawn>[] | null = null;\n\tprivate readonly _options: AppOptions;\n\t// biome-ignore lint/correctness/noUnusedPrivateClassMembers: Accessed through ContextApplication.\n\tprivate readonly redirectHosts: ReadonlySet<string>;\n\treadonly trustProxy:\n\t\t| boolean\n\t\t| string\n\t\t| readonly string[]\n\t\t| ((ip: string) => boolean);\n\treadonly trustedProxyChecker: (ip: string) => boolean;\n\tprivate stopPromise: Promise<ShutdownResult> | null = null;\n\tprivate notFoundHandler: NotFoundHandler | null = null;\n\tprivate errorHandler: ErrorHandler | null = null;\n\tprivate errorResolver: ErrorResolver | undefined = undefined;\n\tprivate globalPipeline: MiddlewareDispatcher = composeMiddlewareDispatcher(\n\t\t[],\n\t);\n\tprivate hasMiddlewares = false;\n\tprivate hasWebSockets = false;\n\treadonly development: boolean;\n\treadonly cookieSecret?: string;\n\n\tconstructor(options: AppOptions = {}) {\n\t\tif (\n\t\t\toptions.port !== undefined &&\n\t\t\t(!Number.isInteger(options.port) ||\n\t\t\t\toptions.port < 0 ||\n\t\t\t\toptions.port > 65535)\n\t\t) {\n\t\t\tthrow new RangeError(\"port must be an integer between 0 and 65535\");\n\t\t}\n\t\tif (\n\t\t\toptions.maxRequestBodySize !== undefined &&\n\t\t\t(!Number.isSafeInteger(options.maxRequestBodySize) ||\n\t\t\t\toptions.maxRequestBodySize < 0)\n\t\t) {\n\t\t\tthrow new RangeError(\n\t\t\t\t\"maxRequestBodySize must be a non-negative safe integer\",\n\t\t\t);\n\t\t}\n\t\tif (\n\t\t\toptions.idleTimeout !== undefined &&\n\t\t\t(!Number.isFinite(options.idleTimeout) ||\n\t\t\t\toptions.idleTimeout < 0 ||\n\t\t\t\toptions.idleTimeout > 255)\n\t\t) {\n\t\t\tthrow new RangeError(\"idleTimeout must be between 0 and 255 seconds\");\n\t\t}\n\t\tfor (const [name, value] of [\n\t\t\t[\"websocket.maxPayloadLength\", options.websocket?.maxPayloadLength],\n\t\t\t[\"websocket.backpressureLimit\", options.websocket?.backpressureLimit],\n\t\t] as const) {\n\t\t\tif (value !== undefined && (!Number.isSafeInteger(value) || value < 1)) {\n\t\t\t\tthrow new RangeError(`${name} must be a positive safe integer`);\n\t\t\t}\n\t\t}\n\t\tif (\n\t\t\toptions.websocket?.idleTimeout !== undefined &&\n\t\t\t(!Number.isFinite(options.websocket.idleTimeout) ||\n\t\t\t\toptions.websocket.idleTimeout < 0 ||\n\t\t\t\toptions.websocket.idleTimeout > 255)\n\t\t) {\n\t\t\tthrow new RangeError(\n\t\t\t\t\"websocket.idleTimeout must be between 0 and 255 seconds\",\n\t\t\t);\n\t\t}\n\t\tconst trustedProxyRanges = Array.isArray(options.trustProxy)\n\t\t\t? options.trustProxy\n\t\t\t: typeof options.trustProxy === \"string\"\n\t\t\t\t? [options.trustProxy]\n\t\t\t\t: [];\n\t\tfor (const range of trustedProxyRanges) {\n\t\t\tif (!isIpRange(range)) {\n\t\t\t\tthrow new TypeError(`Invalid trustProxy IP range: ${range}`);\n\t\t\t}\n\t\t}\n\t\tif (options.cookieSecret !== undefined && !options.cookieSecret.trim()) {\n\t\t\tthrow new TypeError(\"cookieSecret must be non-empty when provided\");\n\t\t}\n\t\tthis._options = options;\n\t\tthis.development =\n\t\t\toptions.development ?? process.env.NODE_ENV === \"development\";\n\t\tthis.trustProxy = Array.isArray(options.trustProxy)\n\t\t\t? Object.freeze([...options.trustProxy])\n\t\t\t: (options.trustProxy ?? false);\n\t\tthis.trustedProxyChecker = compileTrustProxy(options.trustProxy);\n\t\tthis.cookieSecret = options.cookieSecret;\n\t\tthis.redirectHosts = options.allowedRedirectHosts\n\t\t\t? createReadonlySet(\n\t\t\t\t\tnew Set(options.allowedRedirectHosts.map((h) => h.toLowerCase())),\n\t\t\t\t)\n\t\t\t: EMPTY_REDIRECT_HOSTS;\n\t}\n\n\tplugin<TOptions>(\n\t\tpluginFn: (app: this, options?: TOptions) => void,\n\t\toptions?: TOptions,\n\t): this {\n\t\tpluginFn(this, options);\n\t\treturn this;\n\t}\n\n\tnotFound(handler: NotFoundHandler): this {\n\t\tthis.notFoundHandler = handler;\n\t\treturn this;\n\t}\n\n\tonError(handler: ErrorHandler): this {\n\t\tthis.errorHandler = handler;\n\t\tthis.errorResolver = (err, ctx) => handler(err, ctx);\n\t\tif (this.server !== null) {\n\t\t\tthis.globalPipeline = composeMiddlewareDispatcher(\n\t\t\t\tthis.middlewares,\n\t\t\t\tthis.errorResolver,\n\t\t\t);\n\t\t}\n\t\treturn this;\n\t}\n\n\t_register(method: HttpMethod, pattern: string, args: unknown[]): this {\n\t\treturn this._registerMethods([method], pattern, args);\n\t}\n\n\t_registerMethods(\n\t\tmethods: readonly HttpMethod[],\n\t\tpattern: string,\n\t\targs: unknown[],\n\t): this {\n\t\tconst { middlewares, handler } = parseRouteArgs(args);\n\t\tconst responseHandler: (ctx: Context) => Response | Promise<Response> = (\n\t\t\tctx,\n\t\t) => toResponse(handler(ctx));\n\t\tconst finalHandler: (ctx: Context) => Response | Promise<Response> =\n\t\t\tmiddlewares.length === 0\n\t\t\t\t? responseHandler\n\t\t\t\t: composeMiddlewares(middlewares, responseHandler);\n\n\t\tconst canonicalPattern = canonicalizeRoutePattern(pattern);\n\t\tvalidateRoutePattern(canonicalPattern);\n\t\tconst routes = methods.map((method) => ({\n\t\t\tmethod,\n\t\t\tpattern: canonicalPattern,\n\t\t\thandler: finalHandler,\n\t\t}));\n\t\tthis.trie.addBatch(routes);\n\n\t\tconst needs = detectHandlerNeeds(handler);\n\t\tconst hasRouteMws = middlewares.length > 0;\n\n\t\tfor (const r of routes) {\n\t\t\tconst variants = expandOptionalPatterns(r.pattern);\n\t\t\tfor (const variant of variants) {\n\t\t\t\tthis.nativeRoutes.push({\n\t\t\t\t\tmethod: r.method,\n\t\t\t\t\tpattern: variant,\n\t\t\t\t\thandler: r.handler,\n\t\t\t\t\trawHandler: handler,\n\t\t\t\t\tisDynamic: variant.includes(\":\") || variant.includes(\"*\"),\n\t\t\t\t\tisContextFree: needs.isContextFree && !hasRouteMws,\n\t\t\t\t\tisLightweight: needs.isLightweight && !hasRouteMws,\n\t\t\t\t\tisParamsOnly: needs.isParamsOnly && !hasRouteMws,\n\t\t\t\t\tisJsonBodyOnly: needs.isJsonBodyOnly && !hasRouteMws,\n\t\t\t\t\thasRouteMiddlewares: hasRouteMws,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tadd<P extends string>(\n\t\tmethod: HttpMethod,\n\t\tpattern: P,\n\t\thandler: Handler<RouteParams<P>, TState>,\n\t): this;\n\tadd<P extends string>(\n\t\tmethod: HttpMethod,\n\t\tpattern: P,\n\t\t...handlers: [...RouteHandlerArg[], Handler<RouteParams<P>, TState>]\n\t): this;\n\tadd(method: HttpMethod, pattern: string, ...args: unknown[]): this {\n\t\treturn this._register(method, pattern, args);\n\t}\n\n\tget<P extends string>(\n\t\tpattern: P,\n\t\thandler: Handler<RouteParams<P>, TState>,\n\t): this;\n\tget<P extends string>(\n\t\tpattern: P,\n\t\t...handlers: [...RouteHandlerArg[], Handler<RouteParams<P>, TState>]\n\t): this;\n\tget(pattern: string, ...args: unknown[]): this {\n\t\treturn this._register(\"GET\", pattern, args);\n\t}\n\n\tpost<P extends string>(\n\t\tpattern: P,\n\t\thandler: Handler<RouteParams<P>, TState>,\n\t): this;\n\tpost<P extends string>(\n\t\tpattern: P,\n\t\t...handlers: [...RouteHandlerArg[], Handler<RouteParams<P>, TState>]\n\t): this;\n\tpost(pattern: string, ...args: unknown[]): this {\n\t\treturn this._register(\"POST\", pattern, args);\n\t}\n\n\tput<P extends string>(\n\t\tpattern: P,\n\t\thandler: Handler<RouteParams<P>, TState>,\n\t): this;\n\tput<P extends string>(\n\t\tpattern: P,\n\t\t...handlers: [...RouteHandlerArg[], Handler<RouteParams<P>, TState>]\n\t): this;\n\tput(pattern: string, ...args: unknown[]): this {\n\t\treturn this._register(\"PUT\", pattern, args);\n\t}\n\n\tdelete<P extends string>(\n\t\tpattern: P,\n\t\thandler: Handler<RouteParams<P>, TState>,\n\t): this;\n\tdelete<P extends string>(\n\t\tpattern: P,\n\t\t...handlers: [...RouteHandlerArg[], Handler<RouteParams<P>, TState>]\n\t): this;\n\tdelete(pattern: string, ...args: unknown[]): this {\n\t\treturn this._register(\"DELETE\", pattern, args);\n\t}\n\n\tpatch<P extends string>(\n\t\tpattern: P,\n\t\thandler: Handler<RouteParams<P>, TState>,\n\t): this;\n\tpatch<P extends string>(\n\t\tpattern: P,\n\t\t...handlers: [...RouteHandlerArg[], Handler<RouteParams<P>, TState>]\n\t): this;\n\tpatch(pattern: string, ...args: unknown[]): this {\n\t\treturn this._register(\"PATCH\", pattern, args);\n\t}\n\n\thead<P extends string>(\n\t\tpattern: P,\n\t\thandler: Handler<RouteParams<P>, TState>,\n\t): this;\n\thead<P extends string>(\n\t\tpattern: P,\n\t\t...handlers: [...RouteHandlerArg[], Handler<RouteParams<P>, TState>]\n\t): this;\n\thead(pattern: string, ...args: unknown[]): this {\n\t\treturn this._register(\"HEAD\", pattern, args);\n\t}\n\n\toptions<P extends string>(\n\t\tpattern: P,\n\t\thandler: Handler<RouteParams<P>, TState>,\n\t): this;\n\toptions<P extends string>(\n\t\tpattern: P,\n\t\t...handlers: [...RouteHandlerArg[], Handler<RouteParams<P>, TState>]\n\t): this;\n\toptions(pattern: string, ...args: unknown[]): this {\n\t\treturn this._register(\"OPTIONS\", pattern, args);\n\t}\n\n\tall<P extends string>(\n\t\tpattern: P,\n\t\thandler: Handler<RouteParams<P>, TState>,\n\t): this;\n\tall<P extends string>(\n\t\tpattern: P,\n\t\t...handlers: [...RouteHandlerArg[], Handler<RouteParams<P>, TState>]\n\t): this;\n\tall(pattern: string, ...args: unknown[]): this {\n\t\treturn this._registerMethods(METHODS, pattern, args);\n\t}\n\n\tws<P extends string, TData = unknown>(\n\t\tpattern: P,\n\t\thandlers: WebSocketHandlers<TData>,\n\t\tbeforeUpgrade?: (\n\t\t\tctx: Context<RouteParams<P>, TState>,\n\t\t) => boolean | { data?: TData } | Promise<boolean | { data?: TData }>,\n\t): this {\n\t\tthis.hasWebSockets = true;\n\t\treturn this._registerMethods([\"GET\"], pattern, [\n\t\t\tasync (ctx: Context<RouteParams<typeof pattern>, TState>) => {\n\t\t\t\tif (ctx.req.headers.get(\"upgrade\")?.toLowerCase() !== \"websocket\") {\n\t\t\t\t\treturn new Response(\"Upgrade Required\", { status: 426 });\n\t\t\t\t}\n\t\t\t\tlet customData: unknown;\n\t\t\t\tif (beforeUpgrade) {\n\t\t\t\t\tconst check = await beforeUpgrade(ctx);\n\t\t\t\t\tif (!check) return new Response(\"Unauthorized\", { status: 401 });\n\t\t\t\t\tif (typeof check === \"object\" && check !== null && \"data\" in check) {\n\t\t\t\t\t\tcustomData = (check as { data?: unknown }).data;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst upgradeData =\n\t\t\t\t\tcustomData !== undefined &&\n\t\t\t\t\ttypeof customData === \"object\" &&\n\t\t\t\t\tcustomData !== null\n\t\t\t\t\t\t? { ...customData, handlers, _barqInternal: true }\n\t\t\t\t\t\t: { handlers, _barqInternal: true, data: customData };\n\t\t\t\tconst upgraded = ctx.upgrade(upgradeData);\n\t\t\t\treturn upgraded\n\t\t\t\t\t? new Response(null)\n\t\t\t\t\t: new Response(\"WebSocket upgrade failed\", { status: 400 });\n\t\t\t},\n\t\t]);\n\t}\n\n\tgroup<Prefix extends string>(\n\t\tprefix: Prefix,\n\t\tcallback: (group: RouteGroup<Prefix, TState>) => void,\n\t): this;\n\tgroup<Prefix extends string>(\n\t\tprefix: Prefix,\n\t\t...args: [...RouteHandlerArg[], (group: RouteGroup<Prefix, TState>) => void]\n\t): this;\n\tgroup(prefix: string, ...args: unknown[]): this {\n\t\tconst last = args[args.length - 1];\n\t\tif (typeof last !== \"function\") {\n\t\t\tthrow new Error(\"Route group callback must be a function\");\n\t\t}\n\t\tconst callback = last as (group: RouteGroup<string, TState>) => void;\n\t\tconst groupMws: Middleware[] = [];\n\t\tfor (let i = 0; i < args.length - 1; i++) {\n\t\t\tconst item = args[i];\n\t\t\tif (Array.isArray(item)) {\n\t\t\t\tfor (let j = 0; j < item.length; j++)\n\t\t\t\t\tgroupMws.push(item[j] as Middleware);\n\t\t\t} else if (item && typeof item === \"object\") {\n\t\t\t\tgroupMws.push(item as Middleware);\n\t\t\t}\n\t\t}\n\t\tconst normalizedPrefix = normalizePrefix(prefix);\n\t\tconst group = new RouteGroup(this, normalizedPrefix, groupMws);\n\t\tcallback(group);\n\t\treturn this;\n\t}\n\n\tuse<const TMiddlewares extends readonly Middleware<TState, object>[]>(\n\t\t...middlewares: TMiddlewares\n\t): App<TState & MiddlewareOutputs<TMiddlewares>> {\n\t\tfor (let i = 0; i < middlewares.length; i++) {\n\t\t\tthis.middlewares.push(middlewares[i]! as Middleware);\n\t\t}\n\t\tthis.hasMiddlewares = this.middlewares.length > 0;\n\t\tif (this.server !== null) {\n\t\t\tthis.globalPipeline = composeMiddlewareDispatcher(\n\t\t\t\tthis.middlewares,\n\t\t\t\tthis.errorResolver,\n\t\t\t);\n\t\t}\n\t\treturn this as unknown as App<TState & MiddlewareOutputs<TMiddlewares>>;\n\t}\n\n\tlisten(port?: number): Server<unknown> {\n\t\tconst listenPort = port ?? this._options.port ?? 0;\n\t\tif (!Number.isInteger(listenPort) || listenPort < 0 || listenPort > 65535) {\n\t\t\tthrow new RangeError(\"port must be an integer between 0 and 65535\");\n\t\t}\n\t\tif (this.stopPromise !== null) {\n\t\t\tthrow new Error(\"App cannot listen while shutdown is in progress\");\n\t\t}\n\t\tif (this.server !== null) {\n\t\t\tthrow new Error(\"App is already listening\");\n\t\t}\n\t\tconst userWs = this._options.websocket;\n\t\tthis.globalPipeline = composeMiddlewareDispatcher(\n\t\t\tthis.middlewares,\n\t\t\tthis.errorResolver,\n\t\t);\n\t\tconst contextApplication = this as unknown as ContextApplication;\n\t\tconst opts: Record<string, unknown> = {\n\t\t\tfetch: this.fetchHandler,\n\t\t\tdevelopment: this.development,\n\t\t};\n\t\tif (this._options.idleTimeout !== undefined) {\n\t\t\topts.idleTimeout = this._options.idleTimeout;\n\t\t}\n\t\tif (this._options.maxRequestBodySize !== undefined) {\n\t\t\topts.maxRequestBodySize = this._options.maxRequestBodySize;\n\t\t}\n\t\topts.error = (err: unknown) => errorToResponse(err, this.development);\n\t\tif (Bun.env.BARQ_IS_WORKER === \"true\") opts.reusePort = true;\n\n\t\tif (this.hasWebSockets || userWs !== undefined) {\n\t\t\topts.websocket = {\n\t\t\t\t...userWs,\n\t\t\t\tmessage: (ws: ServerWebSocket<unknown>, message: string | Buffer) => {\n\t\t\t\t\tconst internal = getInternalWebSocketHandlers(ws);\n\t\t\t\t\tdispatchWebSocketCallback(internal?.message, [ws, message], (err) =>\n\t\t\t\t\t\treportWebSocketError(internal?.error, ws, err),\n\t\t\t\t\t);\n\t\t\t\t\tdispatchWebSocketCallback(userWs?.message, [ws, message], (err) =>\n\t\t\t\t\t\treportWebSocketError(userWs?.error, ws, err),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\topen: (ws: ServerWebSocket<unknown>) => {\n\t\t\t\t\tconst internal = getInternalWebSocketHandlers(ws);\n\t\t\t\t\tdispatchWebSocketCallback(internal?.open, [ws], (err) =>\n\t\t\t\t\t\treportWebSocketError(internal?.error, ws, err),\n\t\t\t\t\t);\n\t\t\t\t\tdispatchWebSocketCallback(userWs?.open, [ws], (err) =>\n\t\t\t\t\t\treportWebSocketError(userWs?.error, ws, err),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tclose: (ws: ServerWebSocket<unknown>, code: number, reason: string) => {\n\t\t\t\t\tconst internal = getInternalWebSocketHandlers(ws);\n\t\t\t\t\tdispatchWebSocketCallback(\n\t\t\t\t\t\tinternal?.close,\n\t\t\t\t\t\t[ws, code, reason],\n\t\t\t\t\t\t(err) => reportWebSocketError(internal?.error, ws, err),\n\t\t\t\t\t);\n\t\t\t\t\tdispatchWebSocketCallback(userWs?.close, [ws, code, reason], (err) =>\n\t\t\t\t\t\treportWebSocketError(userWs?.error, ws, err),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tdrain: (ws: ServerWebSocket<unknown>) => {\n\t\t\t\t\tconst internal = getInternalWebSocketHandlers(ws);\n\t\t\t\t\tdispatchWebSocketCallback(internal?.drain, [ws], (err) =>\n\t\t\t\t\t\treportWebSocketError(internal?.error, ws, err),\n\t\t\t\t\t);\n\t\t\t\t\tdispatchWebSocketCallback(userWs?.drain, [ws], (err) =>\n\t\t\t\t\t\treportWebSocketError(userWs?.error, ws, err),\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\terror: (ws: ServerWebSocket<unknown>, err: unknown) => {\n\t\t\t\t\tconst internal = getInternalWebSocketHandlers(ws);\n\t\t\t\t\tif (internal?.error === undefined && userWs?.error === undefined) {\n\t\t\t\t\t\tconsole.error(\"Unhandled WebSocket error:\", err);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (internal?.error) reportWebSocketError(internal.error, ws, err);\n\t\t\t\t\tif (userWs?.error) reportWebSocketError(userWs.error, ws, err);\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tif (this.nativeRoutes.length > 0) {\n\t\t\tconst systemRoutes: Record<string, unknown> = Object.create(null);\n\t\t\tconst hasGlobalPipeline =\n\t\t\t\tthis.hasMiddlewares || this.errorResolver !== undefined;\n\t\t\tconst routesByPattern = new Map<string, typeof this.nativeRoutes>();\n\n\t\t\tfor (const nr of this.nativeRoutes) {\n\t\t\t\tlet list = routesByPattern.get(nr.pattern);\n\t\t\t\tif (!list) {\n\t\t\t\t\tlist = [];\n\t\t\t\t\troutesByPattern.set(nr.pattern, list);\n\t\t\t\t}\n\t\t\t\tlist.push(nr);\n\t\t\t}\n\n\t\t\tfor (const [pattern, list] of routesByPattern) {\n\t\t\t\tconst isDynamic = pattern.includes(\":\") || pattern.includes(\"*\");\n\t\t\t\tconst methodMap: Record<\n\t\t\t\t\tstring,\n\t\t\t\t\tResponse | ((req: Request) => Response | Promise<Response>)\n\t\t\t\t> = Object.create(null);\n\n\t\t\t\tfor (const nr of list) {\n\t\t\t\t\tconst h = nr.handler;\n\t\t\t\t\tconst isDyn = nr.isDynamic;\n\t\t\t\t\tconst raw = nr.rawHandler;\n\n\t\t\t\t\tif (hasGlobalPipeline || nr.hasRouteMiddlewares) {\n\t\t\t\t\t\tmethodMap[nr.method] = (req: Request) => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst params = isDyn\n\t\t\t\t\t\t\t\t\t? ((req as unknown as { params?: Record<string, string> })\n\t\t\t\t\t\t\t\t\t\t\t.params ?? EMPTY_PARAMS)\n\t\t\t\t\t\t\t\t\t: EMPTY_PARAMS;\n\t\t\t\t\t\t\t\tconst ctx = new Context(\n\t\t\t\t\t\t\t\t\treq,\n\t\t\t\t\t\t\t\t\tthis.server,\n\t\t\t\t\t\t\t\t\tparams,\n\t\t\t\t\t\t\t\t\tcontextApplication,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tconst result = this.globalPipeline(ctx, h);\n\t\t\t\t\t\t\t\treturn finalizeResponse(ctx, result, req.method === \"HEAD\");\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\treturn errorToResponse(err, this.development);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t} else if (nr.isContextFree && raw) {\n\t\t\t\t\t\tconst analysis = analyzeHandler(raw);\n\t\t\t\t\t\tconst literal = analysis.literal;\n\t\t\t\t\t\tif (literal !== null) {\n\t\t\t\t\t\t\tif (literal.kind === \"string\") {\n\t\t\t\t\t\t\t\tmethodMap[nr.method] = new Response(literal.value);\n\t\t\t\t\t\t\t\tif (nr.method === \"GET\" && !isDyn)\n\t\t\t\t\t\t\t\t\tmethodMap.HEAD = new Response(null);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tmethodMap[nr.method] = new Response(literal.value, {\n\t\t\t\t\t\t\t\t\theaders: FAST_JSON_HEADERS,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (nr.method === \"GET\" && !isDyn)\n\t\t\t\t\t\t\t\t\tmethodMap.HEAD = new Response(null, {\n\t\t\t\t\t\t\t\t\t\theaders: FAST_JSON_HEADERS,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmethodMap[nr.method] = () => {\n\t\t\t\t\t\t\t\tconst res = raw();\n\t\t\t\t\t\t\t\tif (res instanceof Response) return res;\n\t\t\t\t\t\t\t\tif (isThenable(res)) {\n\t\t\t\t\t\t\t\t\treturn Promise.resolve(res).then((r) => {\n\t\t\t\t\t\t\t\t\t\tif (r instanceof Response) return r;\n\t\t\t\t\t\t\t\t\t\tif (typeof r === \"object\" && r !== null)\n\t\t\t\t\t\t\t\t\t\t\treturn Response.json(r);\n\t\t\t\t\t\t\t\t\t\tif (typeof r === \"string\")\n\t\t\t\t\t\t\t\t\t\t\treturn new Response(r, { headers: FAST_TEXT_HEADERS });\n\t\t\t\t\t\t\t\t\t\treturn finalizeValue(r as HandlerResult);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (typeof res === \"object\" && res !== null)\n\t\t\t\t\t\t\t\t\treturn Response.json(res);\n\t\t\t\t\t\t\t\tif (typeof res === \"string\")\n\t\t\t\t\t\t\t\t\treturn new Response(res, { headers: FAST_TEXT_HEADERS });\n\t\t\t\t\t\t\t\treturn Response.json(res);\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tif (nr.method === \"GET\" && !isDyn) {\n\t\t\t\t\t\t\t\tmethodMap.HEAD = () => {\n\t\t\t\t\t\t\t\t\tconst res = raw();\n\t\t\t\t\t\t\t\t\tconst r =\n\t\t\t\t\t\t\t\t\t\tres instanceof Response\n\t\t\t\t\t\t\t\t\t\t\t? res\n\t\t\t\t\t\t\t\t\t\t\t: finalizeValue(res as HandlerResult);\n\t\t\t\t\t\t\t\t\treturn stripBody(r);\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (nr.isJsonBodyOnly && raw) {\n\t\t\t\t\t\tmethodMap[nr.method] = (req: Request) =>\n\t\t\t\t\t\t\tnew Response(req.body, { headers: FAST_JSON_HEADERS });\n\t\t\t\t\t\tif (nr.method === \"GET\" && !isDyn) {\n\t\t\t\t\t\t\tmethodMap.HEAD = (req: Request) =>\n\t\t\t\t\t\t\t\treq.json().then(\n\t\t\t\t\t\t\t\t\t() => new Response(null, { headers: FAST_JSON_HEADERS }),\n\t\t\t\t\t\t\t\t\t(err: unknown) => errorToResponse(err, this.development),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (nr.isParamsOnly && raw) {\n\t\t\t\t\t\tconst analysis = analyzeHandler(raw);\n\t\t\t\t\t\tif (analysis.paramSerializer) {\n\t\t\t\t\t\t\tconst serializer = analysis.paramSerializer;\n\t\t\t\t\t\t\tconst responseInit = { headers: FAST_JSON_HEADERS };\n\t\t\t\t\t\t\tmethodMap[nr.method] = (req: Request) => {\n\t\t\t\t\t\t\t\tconst params =\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\t\treq as unknown as {\n\t\t\t\t\t\t\t\t\t\t\tparams?: Record<string, string>;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t).params ?? EMPTY_PARAMS;\n\t\t\t\t\t\t\t\tconst syncRes = raw({ params } as never);\n\t\t\t\t\t\t\t\tif (isThenable(syncRes)) {\n\t\t\t\t\t\t\t\t\treturn Promise.resolve(syncRes).then((val) =>\n\t\t\t\t\t\t\t\t\t\tval instanceof Response\n\t\t\t\t\t\t\t\t\t\t\t? val\n\t\t\t\t\t\t\t\t\t\t\t: typeof val === \"object\" && val !== null\n\t\t\t\t\t\t\t\t\t\t\t\t? Response.json(val)\n\t\t\t\t\t\t\t\t\t\t\t\t: new Response(String(val)),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn new Response(serializer(params), responseInit);\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmethodMap[nr.method] = (req: Request) => {\n\t\t\t\t\t\t\t\tconst p = (\n\t\t\t\t\t\t\t\t\treq as unknown as { params?: Record<string, string> }\n\t\t\t\t\t\t\t\t).params;\n\t\t\t\t\t\t\t\tconst res = raw(\n\t\t\t\t\t\t\t\t\t(p ? req : { params: EMPTY_PARAMS, req }) as never,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (typeof res === \"object\" && res !== null) {\n\t\t\t\t\t\t\t\t\tif (res instanceof Response) return res;\n\t\t\t\t\t\t\t\t\treturn Response.json(res);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (typeof res === \"string\")\n\t\t\t\t\t\t\t\t\treturn new Response(res, { headers: FAST_TEXT_HEADERS });\n\t\t\t\t\t\t\t\tif (isThenable(res)) {\n\t\t\t\t\t\t\t\t\treturn Promise.resolve(res).then((r) => {\n\t\t\t\t\t\t\t\t\t\tif (r instanceof Response) return r;\n\t\t\t\t\t\t\t\t\t\tif (typeof r === \"object\" && r !== null)\n\t\t\t\t\t\t\t\t\t\t\treturn new Response(JSON.stringify(r), {\n\t\t\t\t\t\t\t\t\t\t\t\theaders: FAST_JSON_HEADERS,\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\tif (typeof r === \"string\")\n\t\t\t\t\t\t\t\t\t\t\treturn new Response(r, { headers: FAST_TEXT_HEADERS });\n\t\t\t\t\t\t\t\t\t\treturn finalizeValue(r as HandlerResult);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn new Response(JSON.stringify(res), {\n\t\t\t\t\t\t\t\t\theaders: FAST_JSON_HEADERS,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tif (nr.method === \"GET\" && !isDyn)\n\t\t\t\t\t\t\t\tmethodMap.HEAD = () =>\n\t\t\t\t\t\t\t\t\tnew Response(null, { headers: FAST_JSON_HEADERS });\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (nr.isLightweight && raw) {\n\t\t\t\t\t\tmethodMap[nr.method] = (req: Request) => {\n\t\t\t\t\t\t\tconst params = isDyn\n\t\t\t\t\t\t\t\t? ((req as unknown as { params?: Record<string, string> })\n\t\t\t\t\t\t\t\t\t\t.params ?? EMPTY_PARAMS)\n\t\t\t\t\t\t\t\t: EMPTY_PARAMS;\n\t\t\t\t\t\t\tconst ctx = acquireLightContext(req, params);\n\t\t\t\t\t\t\tlet res: unknown;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tres = raw(ctx as never);\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\treleaseLightContext(ctx);\n\t\t\t\t\t\t\t\treturn errorToResponse(err, this.development);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (typeof res === \"object\" && res !== null) {\n\t\t\t\t\t\t\t\tif (res instanceof Response) {\n\t\t\t\t\t\t\t\t\treleaseLightContext(ctx);\n\t\t\t\t\t\t\t\t\treturn res;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (!isThenable(res)) {\n\t\t\t\t\t\t\t\t\treleaseLightContext(ctx);\n\t\t\t\t\t\t\t\t\treturn Response.json(res);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (typeof res === \"string\") {\n\t\t\t\t\t\t\t\treleaseLightContext(ctx);\n\t\t\t\t\t\t\t\treturn new Response(res, { headers: FAST_TEXT_HEADERS });\n\t\t\t\t\t\t\t} else if (!isThenable(res)) {\n\t\t\t\t\t\t\t\treleaseLightContext(ctx);\n\t\t\t\t\t\t\t\treturn new Response(JSON.stringify(res), {\n\t\t\t\t\t\t\t\t\theaders: FAST_JSON_HEADERS,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn Promise.resolve(res)\n\t\t\t\t\t\t\t\t.then((r) => {\n\t\t\t\t\t\t\t\t\treleaseLightContext(ctx);\n\t\t\t\t\t\t\t\t\tif (r instanceof Response) return r;\n\t\t\t\t\t\t\t\t\tif (typeof r === \"object\" && r !== null)\n\t\t\t\t\t\t\t\t\t\treturn new Response(JSON.stringify(r), {\n\t\t\t\t\t\t\t\t\t\t\theaders: FAST_JSON_HEADERS,\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tif (typeof r === \"string\")\n\t\t\t\t\t\t\t\t\t\treturn new Response(r, { headers: FAST_TEXT_HEADERS });\n\t\t\t\t\t\t\t\t\treturn finalizeValue(r as HandlerResult);\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch((err) => {\n\t\t\t\t\t\t\t\t\treleaseLightContext(ctx);\n\t\t\t\t\t\t\t\t\treturn errorToResponse(err, this.development);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif (nr.method === \"GET\" && !isDyn)\n\t\t\t\t\t\t\tmethodMap.HEAD = () =>\n\t\t\t\t\t\t\t\tnew Response(null, { headers: FAST_JSON_HEADERS });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmethodMap[nr.method] = (req: Request) => {\n\t\t\t\t\t\t\tconst isHead = nr.method === \"GET\" && req.method === \"HEAD\";\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst params = isDyn\n\t\t\t\t\t\t\t\t\t? ((req as unknown as { params?: Record<string, string> })\n\t\t\t\t\t\t\t\t\t\t\t.params ?? EMPTY_PARAMS)\n\t\t\t\t\t\t\t\t\t: EMPTY_PARAMS;\n\t\t\t\t\t\t\t\tconst ctx = new Context(\n\t\t\t\t\t\t\t\t\treq,\n\t\t\t\t\t\t\t\t\tthis.server,\n\t\t\t\t\t\t\t\t\tparams,\n\t\t\t\t\t\t\t\t\tcontextApplication,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tconst res = raw ? raw(ctx as never) : h(ctx);\n\t\t\t\t\t\t\t\tif (res instanceof Response) {\n\t\t\t\t\t\t\t\t\tif (!isHead && !ctx._hasPendingCookies) return res;\n\t\t\t\t\t\t\t\t\treturn finalizeResponse(ctx, res, isHead);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (!isThenable(res))\n\t\t\t\t\t\t\t\t\treturn finalizeResponse(\n\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\ttoResponse(res as HandlerResult),\n\t\t\t\t\t\t\t\t\t\tisHead,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\treturn Promise.resolve(res)\n\t\t\t\t\t\t\t\t\t.then((value) =>\n\t\t\t\t\t\t\t\t\t\tfinalizeResponse(\n\t\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\t\ttoResponse(value as HandlerResult),\n\t\t\t\t\t\t\t\t\t\t\tisHead,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.catch((err: unknown) =>\n\t\t\t\t\t\t\t\t\t\tfinalizeResponse(\n\t\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\t\terrorToResponse(err, this.development),\n\t\t\t\t\t\t\t\t\t\t\tisHead,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\treturn errorToResponse(err, this.development);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst allowMethods = Object.keys(methodMap);\n\t\t\t\tconst allowHeader =\n\t\t\t\t\tallowMethods.includes(\"GET\") && !allowMethods.includes(\"HEAD\")\n\t\t\t\t\t\t? [...allowMethods, \"HEAD\"].join(\", \")\n\t\t\t\t\t\t: allowMethods.join(\", \");\n\n\t\t\t\tif (isDynamic) {\n\t\t\t\t\tconst getFn = methodMap.GET;\n\t\t\t\t\tif (\n\t\t\t\t\t\tallowMethods.length === 1 &&\n\t\t\t\t\t\ttypeof getFn === \"function\" &&\n\t\t\t\t\t\tallowMethods[0] === \"GET\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tsystemRoutes[pattern] = methodMap;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsystemRoutes[pattern] = (req: Request) => {\n\t\t\t\t\t\t\tconst matched = methodMap[req.method];\n\t\t\t\t\t\t\tif (typeof matched === \"function\") return matched(req);\n\t\t\t\t\t\t\tif (matched instanceof Response)\n\t\t\t\t\t\t\t\treturn req.method === \"HEAD\" ? stripBody(matched) : matched;\n\t\t\t\t\t\t\tif (req.method === \"HEAD\") {\n\t\t\t\t\t\t\t\tconst gh = methodMap.GET;\n\t\t\t\t\t\t\t\tif (typeof gh === \"function\") {\n\t\t\t\t\t\t\t\t\tconst res = gh(req);\n\t\t\t\t\t\t\t\t\treturn isThenable(res)\n\t\t\t\t\t\t\t\t\t\t? (res as Promise<Response>).then(stripBody)\n\t\t\t\t\t\t\t\t\t\t: stripBody(res as Response);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn new Response('{\"error\":\"Method Not Allowed\"}', {\n\t\t\t\t\t\t\t\tstatus: 405,\n\t\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t\t\"content-type\": \"application/json; charset=utf-8\",\n\t\t\t\t\t\t\t\t\tAllow: allowHeader,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tsystemRoutes[pattern] = methodMap;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\topts.routes = systemRoutes;\n\t\t}\n\n\t\topts.port = listenPort;\n\t\tif (this._options.hostname !== undefined)\n\t\t\topts.hostname = this._options.hostname;\n\t\tif (this._options.tls !== undefined) opts.tls = this._options.tls;\n\t\tthis.server = Bun.serve(opts as unknown as ServeOptions);\n\t\treturn this.server;\n\t}\n\n\tprivate handle(\n\t\treq: Request,\n\t\tsrv?: Server<unknown>,\n\t): Response | Promise<Response> {\n\t\tconst isHead = req.method === \"HEAD\";\n\t\tconst serverInstance = srv ?? this.server;\n\t\tconst contextApplication = this as unknown as ContextApplication;\n\t\tlet currentCtx: Context | null = null;\n\t\tlet pathname: string | undefined;\n\n\t\ttry {\n\t\t\tpathname = scanPathname(req.url);\n\n\t\t\tconst matched = this.trie.match(req.method, pathname);\n\n\t\t\tif (matched === null) {\n\t\t\t\tif (\n\t\t\t\t\tthis.notFoundHandler === null &&\n\t\t\t\t\t!this.hasMiddlewares &&\n\t\t\t\t\tthis.errorResolver === undefined\n\t\t\t\t) {\n\t\t\t\t\treturn new Response('{\"error\":\"Not Found\"}', {\n\t\t\t\t\t\tstatus: 404,\n\t\t\t\t\t\theaders: { \"content-type\": \"application/json; charset=utf-8\" },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcurrentCtx = new Context(\n\t\t\t\t\treq,\n\t\t\t\t\tserverInstance,\n\t\t\t\t\tEMPTY_PARAMS,\n\t\t\t\t\tcontextApplication,\n\t\t\t\t\tpathname,\n\t\t\t\t);\n\t\t\t\tconst notFoundHandler =\n\t\t\t\t\tthis.notFoundHandler !== null\n\t\t\t\t\t\t? this.notFoundHandler\n\t\t\t\t\t\t: () =>\n\t\t\t\t\t\t\t\tnew Response('{\"error\":\"Not Found\"}', {\n\t\t\t\t\t\t\t\t\tstatus: 404,\n\t\t\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t\t\t\"content-type\": \"application/json; charset=utf-8\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t});\n\t\t\t\tconst result = this.globalPipeline(currentCtx, notFoundHandler);\n\t\t\t\treturn finalizeResponse(currentCtx, result, isHead);\n\t\t\t}\n\n\t\t\tif (!this.hasMiddlewares && this.errorResolver === undefined) {\n\t\t\t\tif (typeof matched === \"function\") {\n\t\t\t\t\tif (matched.length === 0) {\n\t\t\t\t\t\tconst res = (\n\t\t\t\t\t\t\tmatched as unknown as () => Response | Promise<Response>\n\t\t\t\t\t\t)();\n\t\t\t\t\t\tif (!isHead && !isThenable(res)) return res;\n\t\t\t\t\t\tif (isThenable(res)) {\n\t\t\t\t\t\t\treturn (res as Promise<Response>).then(\n\t\t\t\t\t\t\t\t(r) => (isHead ? stripBody(r) : r),\n\t\t\t\t\t\t\t\t(err) => errorToResponse(err, this.development),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn isHead ? stripBody(res) : res;\n\t\t\t\t\t}\n\t\t\t\t\tcurrentCtx = new Context(\n\t\t\t\t\t\treq,\n\t\t\t\t\t\tserverInstance,\n\t\t\t\t\t\tEMPTY_PARAMS,\n\t\t\t\t\t\tcontextApplication,\n\t\t\t\t\t\tpathname,\n\t\t\t\t\t);\n\t\t\t\t\tconst res = (matched as ResponseHandler)(currentCtx);\n\t\t\t\t\tif (!isHead && !isThenable(res)) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\ttypeof res === \"object\" &&\n\t\t\t\t\t\t\tres !== null &&\n\t\t\t\t\t\t\t!(res instanceof Response)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn new Response(JSON.stringify(res), {\n\t\t\t\t\t\t\t\theaders: FAST_JSON_HEADERS,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!currentCtx._hasPendingCookies) return res;\n\t\t\t\t\t}\n\t\t\t\t\treturn finalizeResponse(\n\t\t\t\t\t\tcurrentCtx,\n\t\t\t\t\t\tguardRejections(res, this.development),\n\t\t\t\t\t\tisHead,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst handler =\n\t\t\t\t\ttypeof matched === \"object\" && MATCH_HANDLER in matched\n\t\t\t\t\t\t? matched[MATCH_HANDLER]\n\t\t\t\t\t\t: undefined;\n\t\t\t\tif (handler !== undefined) {\n\t\t\t\t\tconst params = matched as TrieParams;\n\t\t\t\t\tcurrentCtx = new Context(\n\t\t\t\t\t\treq,\n\t\t\t\t\t\tserverInstance,\n\t\t\t\t\t\tparams,\n\t\t\t\t\t\tcontextApplication,\n\t\t\t\t\t\tpathname,\n\t\t\t\t\t);\n\t\t\t\t\tconst res = handler(currentCtx);\n\t\t\t\t\tif (!isHead && !isThenable(res)) {\n\t\t\t\t\t\tif (!currentCtx._hasPendingCookies) return res;\n\t\t\t\t\t}\n\t\t\t\t\treturn finalizeResponse(\n\t\t\t\t\t\tcurrentCtx,\n\t\t\t\t\t\tguardRejections(res, this.development),\n\t\t\t\t\t\tisHead,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (typeof matched === \"function\") {\n\t\t\t\tcurrentCtx = new Context(\n\t\t\t\t\treq,\n\t\t\t\t\tserverInstance,\n\t\t\t\t\tEMPTY_PARAMS,\n\t\t\t\t\tcontextApplication,\n\t\t\t\t\tpathname,\n\t\t\t\t);\n\t\t\t\tconst result = this.globalPipeline(currentCtx, matched);\n\t\t\t\treturn finalizeResponse(currentCtx, result, isHead);\n\t\t\t}\n\n\t\t\tif (MATCH_NOT_ALLOWED in matched) {\n\t\t\t\tconst allow = (matched as { [MATCH_NOT_ALLOWED]: string })[\n\t\t\t\t\tMATCH_NOT_ALLOWED\n\t\t\t\t];\n\t\t\t\tif (\n\t\t\t\t\tthis.errorHandler === null &&\n\t\t\t\t\t!this.hasMiddlewares &&\n\t\t\t\t\tthis.errorResolver === undefined\n\t\t\t\t) {\n\t\t\t\t\treturn new Response('{\"error\":\"Method Not Allowed\"}', {\n\t\t\t\t\t\tstatus: 405,\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\"content-type\": \"application/json; charset=utf-8\",\n\t\t\t\t\t\t\tAllow: allow,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcurrentCtx = new Context(\n\t\t\t\t\treq,\n\t\t\t\t\tserverInstance,\n\t\t\t\t\tEMPTY_PARAMS,\n\t\t\t\t\tcontextApplication,\n\t\t\t\t\tpathname,\n\t\t\t\t);\n\t\t\t\tconst notAllowedHandler = () =>\n\t\t\t\t\terrorToResponse(\n\t\t\t\t\t\tnew HttpError(\n\t\t\t\t\t\t\t405,\n\t\t\t\t\t\t\t{ error: \"Method Not Allowed\" },\n\t\t\t\t\t\t\t{ Allow: allow },\n\t\t\t\t\t\t),\n\t\t\t\t\t\tthis.development,\n\t\t\t\t\t);\n\t\t\t\tconst result = this.globalPipeline(currentCtx, notAllowedHandler);\n\t\t\t\treturn finalizeResponse(currentCtx, result, isHead);\n\t\t\t}\n\n\t\t\tconst params = matched as TrieParams;\n\t\t\tconst handler = params[MATCH_HANDLER] as ResponseHandler;\n\t\t\tcurrentCtx = new Context(\n\t\t\t\treq,\n\t\t\t\tserverInstance,\n\t\t\t\tparams,\n\t\t\t\tcontextApplication,\n\t\t\t\tpathname,\n\t\t\t);\n\t\t\tconst result = this.globalPipeline(currentCtx, handler);\n\t\t\treturn finalizeResponse(currentCtx, result, isHead);\n\t\t} catch (err) {\n\t\t\tconst activeCtx =\n\t\t\t\tcurrentCtx ??\n\t\t\t\tnew Context(\n\t\t\t\t\treq,\n\t\t\t\t\tserverInstance,\n\t\t\t\t\tEMPTY_PARAMS,\n\t\t\t\t\tcontextApplication,\n\t\t\t\t\tpathname,\n\t\t\t\t);\n\t\t\tif (this.errorHandler !== null) {\n\t\t\t\ttry {\n\t\t\t\t\tconst custom = this.errorHandler(err, activeCtx);\n\t\t\t\t\tconst result = isThenable(custom)\n\t\t\t\t\t\t? (custom as Promise<Response>).then((r) =>\n\t\t\t\t\t\t\t\tunwindAfter(\n\t\t\t\t\t\t\t\t\tthis.middlewares,\n\t\t\t\t\t\t\t\t\tactiveCtx,\n\t\t\t\t\t\t\t\t\tr,\n\t\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t\tthis.errorResolver,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: unwindAfter(\n\t\t\t\t\t\t\t\tthis.middlewares,\n\t\t\t\t\t\t\t\tactiveCtx,\n\t\t\t\t\t\t\t\tcustom as Response,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tthis.errorResolver,\n\t\t\t\t\t\t\t);\n\t\t\t\t\treturn finalizeResponse(activeCtx, result, isHead);\n\t\t\t\t} catch (e2) {\n\t\t\t\t\tconst fallback = errorToResponse(e2, this.development);\n\t\t\t\t\tconst result = unwindAfter(\n\t\t\t\t\t\tthis.middlewares,\n\t\t\t\t\t\tactiveCtx,\n\t\t\t\t\t\tfallback,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tthis.errorResolver,\n\t\t\t\t\t);\n\t\t\t\t\treturn finalizeResponse(activeCtx, result, isHead);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst routingErr = errorToResponse(err, this.development);\n\t\t\tconst result = unwindAfter(\n\t\t\t\tthis.middlewares,\n\t\t\t\tactiveCtx,\n\t\t\t\troutingErr,\n\t\t\t\t0,\n\t\t\t\tthis.errorResolver,\n\t\t\t);\n\t\t\treturn finalizeResponse(activeCtx, result, isHead);\n\t\t}\n\t}\n\n\tcluster(port?: number): Server<unknown> | void {\n\t\tconst listenPort = port ?? this._options.port ?? 3000;\n\t\tconst isWorker = Bun.env.BARQ_IS_WORKER === \"true\";\n\n\t\tif (!Number.isInteger(listenPort) || listenPort < 0 || listenPort > 65535) {\n\t\t\tthrow new RangeError(\"port must be an integer between 0 and 65535\");\n\t\t}\n\n\t\tif (isWorker || process.platform !== \"linux\") {\n\t\t\treturn this.listen(listenPort);\n\t\t}\n\t\tif (listenPort === 0) {\n\t\t\tthrow new RangeError(\"cluster requires a fixed, non-zero port\");\n\t\t}\n\t\tif (this.clusterProcesses !== null || this.server !== null) {\n\t\t\tthrow new Error(\"App is already listening or clustering\");\n\t\t}\n\t\tconst entry = process.argv[1];\n\t\tif (!entry) {\n\t\t\tthrow new Error(\"Cannot start cluster without an application entry file\");\n\t\t}\n\n\t\tconst processes: ReturnType<typeof Bun.spawn>[] = [];\n\t\tlet crashCount = 0;\n\t\tlet lastReset = Date.now();\n\n\t\tconst spawnWorker = () => {\n\t\t\tconst proc = Bun.spawn([process.execPath, \"run\", entry], {\n\t\t\t\tenv: {\n\t\t\t\t\t...process.env,\n\t\t\t\t\tBARQ_IS_WORKER: \"true\",\n\t\t\t\t\tPORT: String(listenPort),\n\t\t\t\t},\n\t\t\t\tstdio: [\"inherit\", \"inherit\", \"inherit\"],\n\t\t\t});\n\t\t\tproc.exited.then((_code) => {\n\t\t\t\tif (this.stopPromise === null && this.clusterProcesses !== null) {\n\t\t\t\t\tconst now = Date.now();\n\t\t\t\t\tif (now - lastReset > 5000) {\n\t\t\t\t\t\tcrashCount = 0;\n\t\t\t\t\t\tlastReset = now;\n\t\t\t\t\t}\n\t\t\t\t\tcrashCount++;\n\n\t\t\t\t\tconst idx = processes.indexOf(proc);\n\t\t\t\t\tif (idx !== -1) {\n\t\t\t\t\t\tprocesses.splice(idx, 1);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (crashCount > 15) {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\"[Barq Cluster] Workers restarting too fast. Throttling respawn.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tif (this.stopPromise === null && this.clusterProcesses !== null) {\n\t\t\t\t\t\t\t\tprocesses.push(spawnWorker());\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, 2000);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tprocesses.push(spawnWorker());\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn proc;\n\t\t};\n\n\t\ttry {\n\t\t\tfor (let i = 0; i < cpus().length; i++) {\n\t\t\t\tprocesses.push(spawnWorker());\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tfor (const process of processes) process.kill(\"SIGTERM\");\n\t\t\tthrow error;\n\t\t}\n\t\tthis.clusterProcesses = processes;\n\t\treturn;\n\t}\n\n\tasync stop(hardTimeoutMs = 5000): Promise<ShutdownResult> {\n\t\tif (!Number.isFinite(hardTimeoutMs) || hardTimeoutMs < 0) {\n\t\t\tthrow new RangeError(\n\t\t\t\t\"hardTimeoutMs must be a finite non-negative number\",\n\t\t\t);\n\t\t}\n\t\tif (this.stopPromise !== null) {\n\t\t\treturn this.stopPromise;\n\t\t}\n\t\tconst server = this.server;\n\t\tconst clusterProcesses = this.clusterProcesses;\n\t\tthis.server = null;\n\t\tthis.clusterProcesses = null;\n\t\tif (server === null && clusterProcesses === null) {\n\t\t\treturn { forced: false, pending: 0 };\n\t\t}\n\t\tthis.stopPromise = (async () => {\n\t\t\tlet serverResult: ShutdownResult = { forced: false, pending: 0 };\n\t\t\tlet workersForced = false;\n\t\t\ttry {\n\t\t\t\tif (server !== null) {\n\t\t\t\t\tserverResult = await stopServer(server, hardTimeoutMs);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (clusterProcesses !== null) {\n\t\t\t\t\tworkersForced = await stopClusterProcesses(\n\t\t\t\t\t\tclusterProcesses,\n\t\t\t\t\t\thardTimeoutMs,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tforced: serverResult.forced || workersForced,\n\t\t\t\tpending: serverResult.pending,\n\t\t\t};\n\t\t})();\n\t\ttry {\n\t\t\treturn await this.stopPromise;\n\t\t} finally {\n\t\t\tthis.stopPromise = null;\n\t\t}\n\t}\n}\n\nfunction guardRejections(\n\tres: Response | Promise<Response>,\n\tdevelopment: boolean,\n): Response | Promise<Response> {\n\treturn isThenable(res)\n\t\t? (res as Promise<Response>).catch((err: unknown) =>\n\t\t\t\terrorToResponse(err, development),\n\t\t\t)\n\t\t: (res as Response);\n}\n\nfunction applyCookies(ctx: Context, res: Response): Response {\n\tif (!ctx._hasPendingCookies) return res;\n\tconst cookies = ctx._cookieJarIfCreated();\n\tif (cookies === null) return res;\n\tconst headers = new Headers(res.headers);\n\tapplyPendingCookies(cookies, headers);\n\tctx._hasPendingCookies = false;\n\treturn new Response(res.body, {\n\t\tstatus: res.status,\n\t\tstatusText: res.statusText,\n\t\theaders,\n\t});\n}\n\nfunction finalizeResponse(\n\tctx: Context,\n\tres: Response | Promise<Response>,\n\tisHead: boolean,\n): Response | Promise<Response> {\n\tif (res instanceof Response) {\n\t\tif (!isHead && !ctx._hasPendingCookies) return res;\n\t\tconst withCookies = applyCookies(ctx, res);\n\t\treturn isHead ? stripBody(withCookies) : withCookies;\n\t}\n\tif (isThenable(res)) {\n\t\treturn res.then((response) => {\n\t\t\tconst withCookies = applyCookies(ctx, response);\n\t\t\treturn isHead ? stripBody(withCookies) : withCookies;\n\t\t});\n\t}\n\tif (!isHead) {\n\t\tif (!ctx._hasPendingCookies) return res as Response;\n\t\treturn applyCookies(ctx, res as Response);\n\t}\n\treturn stripBody(applyCookies(ctx, res as Response));\n}\n\nfunction stripBody(res: Response): Response {\n\tif (res.body === null) return res;\n\ttry {\n\t\tres.body.cancel?.().catch?.(() => {});\n\t} catch {}\n\treturn new Response(null, {\n\t\tstatus: res.status,\n\t\tstatusText: res.statusText,\n\t\theaders: res.headers,\n\t});\n}\n",
|
|
7
|
+
"import { timingSafeEqual } from \"node:crypto\";\nimport type { CookieJar, SetCookieOptions } from \"./types\";\n\ninterface PendingCookie {\n\tname: string;\n\theaderString: string;\n}\n\ninterface CookieState {\n\tcookies: Map<string, string> | null;\n\trequestHeaders: Headers | undefined;\n\tpending: PendingCookie[] | null;\n}\n\nclass CookieJarImpl implements CookieJar {\n\tprivate readonly state: CookieState;\n\n\tconstructor(\n\t\tprivate readonly secret: string,\n\t\trequestHeaders?: Headers,\n\t\tprivate readonly onMutation?: () => void,\n\t) {\n\t\tthis.state = { cookies: null, requestHeaders, pending: null };\n\t}\n\n\tget(name: string): string | undefined {\n\t\treturn getCookies(this.state).get(name);\n\t}\n\n\tgetSigned(name: string, customSecret?: string): string | null {\n\t\tconst signed = getCookies(this.state).get(name);\n\t\tif (!signed) return null;\n\t\tconst signingSecret = customSecret ?? this.secret;\n\t\tif (!signingSecret) return null;\n\t\treturn unsign(signed, signingSecret);\n\t}\n\n\tset(name: string, value: string, options?: SetCookieOptions): void {\n\t\tconst cookieOptions = snapshotOptions(options);\n\t\tvalidateCookie(name, cookieOptions);\n\t\tgetCookies(this.state).set(name, value);\n\t\tgetPending(this.state).push({\n\t\t\tname,\n\t\t\theaderString: buildCookieString(name, value, cookieOptions),\n\t\t});\n\t\tthis.onMutation?.();\n\t}\n\n\tsetSigned(\n\t\tname: string,\n\t\tvalue: string,\n\t\toptions?: SetCookieOptions,\n\t\tcustomSecret?: string,\n\t): void {\n\t\tconst signingSecret = customSecret ?? this.secret;\n\t\tif (!signingSecret) {\n\t\t\tthrow new Error(\"A non-empty secret is required to set a signed cookie\");\n\t\t}\n\t\tconst cookieOptions = snapshotOptions(options);\n\t\tvalidateCookie(name, cookieOptions);\n\t\tconst signed = sign(value, signingSecret);\n\t\tgetCookies(this.state).set(name, signed);\n\t\tgetPending(this.state).push({\n\t\t\tname,\n\t\t\theaderString: buildCookieString(name, signed, cookieOptions),\n\t\t});\n\t\tthis.onMutation?.();\n\t}\n\n\tdelete(name: string, options?: SetCookieOptions): void {\n\t\tconst cookieOptions = snapshotOptions(options);\n\t\tvalidateCookie(name, cookieOptions);\n\t\tgetCookies(this.state).delete(name);\n\t\tgetPending(this.state).push({\n\t\t\tname,\n\t\t\theaderString: buildCookieString(name, \"\", {\n\t\t\t\t...cookieOptions,\n\t\t\t\tmaxAge: 0,\n\t\t\t\texpires: new Date(0),\n\t\t\t}),\n\t\t});\n\t\tthis.onMutation?.();\n\t}\n\n\thasPending(): boolean {\n\t\treturn (this.state.pending?.length ?? 0) > 0;\n\t}\n\n\tapply(headers: Headers): void {\n\t\tconst pending = this.state.pending;\n\t\tif (pending === null) return;\n\t\tfor (const cookie of pending) {\n\t\t\theaders.append(\"set-cookie\", cookie.headerString);\n\t\t}\n\t\tpending.length = 0;\n\t}\n}\n\nfunction normalizeSameSite(value: string | undefined): string {\n\tif (!value) return \"Lax\";\n\tconst lower = value.toLowerCase();\n\tif (lower === \"strict\") return \"Strict\";\n\tif (lower === \"lax\") return \"Lax\";\n\tif (lower === \"none\") return \"None\";\n\treturn value;\n}\n\nfunction buildCookieString(\n\tname: string,\n\tvalue: string,\n\toptions: SetCookieOptions,\n): string {\n\tvalidateCookie(name, options);\n\tlet cookie = `${name}=${encodeURIComponent(value)}`;\n\n\tif (options.path) cookie += `; Path=${options.path}`;\n\tif (options.domain) cookie += `; Domain=${options.domain}`;\n\tif (options.maxAge !== undefined) cookie += `; Max-Age=${options.maxAge}`;\n\tif (options.expires) cookie += `; Expires=${options.expires.toUTCString()}`;\n\tif (options.httpOnly !== false) cookie += \"; HttpOnly\";\n\tif (options.secure) cookie += \"; Secure\";\n\tconst sameSite = normalizeSameSite(options.sameSite);\n\tif (sameSite) cookie += `; SameSite=${sameSite}`;\n\n\treturn cookie;\n}\n\nfunction sign(value: string, secret: string): string {\n\tconst hasher = new Bun.CryptoHasher(\"sha256\", secret);\n\thasher.update(value);\n\tconst sig = hasher.digest(\"base64url\");\n\treturn `${value}.${sig}`;\n}\n\nfunction unsign(signedValue: string, secret: string): string | null {\n\tconst lastDot = signedValue.lastIndexOf(\".\");\n\tif (lastDot <= 0 || lastDot === signedValue.length - 1) return null;\n\tconst value = signedValue.slice(0, lastDot);\n\tconst sig = signedValue.slice(lastDot + 1);\n\tconst hasher = new Bun.CryptoHasher(\"sha256\", secret);\n\thasher.update(value);\n\tconst expected = hasher.digest(\"base64url\");\n\tconst actualBytes = Buffer.from(sig);\n\tconst expectedBytes = Buffer.from(expected);\n\tif (actualBytes.length !== expectedBytes.length) return null;\n\tif (!timingSafeEqual(actualBytes, expectedBytes)) return null;\n\treturn value;\n}\n\nfunction decodeCookieValue(value: string): string {\n\ttry {\n\t\treturn decodeURIComponent(value);\n\t} catch {\n\t\t// A malformed percent escape is an invalid cookie value, not a request error.\n\t\treturn value;\n\t}\n}\n\nfunction validateCookie(name: string, options: SetCookieOptions): void {\n\tif (!/^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/.test(name)) {\n\t\tthrow new TypeError(\"Cookie name must be a valid HTTP token\");\n\t}\n\tif (\n\t\toptions.path !== undefined &&\n\t\t(!options.path.startsWith(\"/\") || /[;\\r\\n\\0]/.test(options.path))\n\t) {\n\t\tthrow new TypeError(\n\t\t\t\"Cookie path must start with '/' and contain no controls\",\n\t\t);\n\t}\n\tif (\n\t\toptions.domain !== undefined &&\n\t\t(!/^(?:\\.?[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\t\t\toptions.domain,\n\t\t) ||\n\t\t\toptions.domain.includes(\"..\"))\n\t) {\n\t\tthrow new TypeError(\"Cookie domain is invalid\");\n\t}\n\tif (\n\t\toptions.maxAge !== undefined &&\n\t\t(!Number.isSafeInteger(options.maxAge) || options.maxAge < 0)\n\t) {\n\t\tthrow new TypeError(\"Cookie maxAge must be a non-negative safe integer\");\n\t}\n\tif (\n\t\toptions.expires !== undefined &&\n\t\t!Number.isFinite(options.expires.getTime())\n\t) {\n\t\tthrow new TypeError(\"Cookie expires must be a valid Date\");\n\t}\n\tif (\n\t\toptions.sameSite !== undefined &&\n\t\t![\"strict\", \"lax\", \"none\"].includes(options.sameSite.toLowerCase())\n\t) {\n\t\tthrow new TypeError(\"Cookie sameSite must be Strict, Lax, or None\");\n\t}\n\tif (options.sameSite?.toLowerCase() === \"none\" && !options.secure) {\n\t\tthrow new TypeError(\"SameSite=None cookies must also be Secure\");\n\t}\n\tif (name.startsWith(\"__Secure-\") && !options.secure) {\n\t\tthrow new TypeError(\"__Secure- cookies must also be Secure\");\n\t}\n\tif (\n\t\tname.startsWith(\"__Host-\") &&\n\t\t(!options.secure || options.path !== \"/\" || options.domain !== undefined)\n\t) {\n\t\tthrow new TypeError(\n\t\t\t\"__Host- cookies must be Secure, use Path=/, and omit Domain\",\n\t\t);\n\t}\n}\n\nfunction snapshotOptions(options?: SetCookieOptions): SetCookieOptions {\n\tif (!options) return {};\n\treturn {\n\t\t...options,\n\t\t...(options.expires === undefined\n\t\t\t? {}\n\t\t\t: { expires: new Date(options.expires.getTime()) }),\n\t};\n}\n\nfunction parseCookieHeader(header: string): Map<string, string> {\n\tconst cookies = new Map<string, string>();\n\tlet pos = 0;\n\tconst len = header.length;\n\twhile (pos < len) {\n\t\twhile (pos < len && header.charCodeAt(pos) === 32) pos++;\n\t\tif (pos >= len) break;\n\t\tconst eq = header.indexOf(\"=\", pos);\n\t\tif (eq === -1) break;\n\t\tconst name = header.slice(pos, eq).trim();\n\t\tpos = eq + 1;\n\t\tlet end = header.indexOf(\";\", pos);\n\t\tif (end === -1) end = len;\n\t\tconst value = header.slice(pos, end);\n\t\tif (name) cookies.set(name, decodeCookieValue(value));\n\t\tpos = end + 1;\n\t}\n\treturn cookies;\n}\n\nfunction getCookies(state: CookieState): Map<string, string> {\n\tif (state.cookies !== null) return state.cookies;\n\tconst header = state.requestHeaders?.get(\"cookie\") ?? \"\";\n\tstate.requestHeaders = undefined;\n\tstate.cookies = header.length === 0 ? new Map() : parseCookieHeader(header);\n\treturn state.cookies;\n}\n\nfunction getPending(state: CookieState): PendingCookie[] {\n\tif (state.pending === null) state.pending = [];\n\treturn state.pending;\n}\n\nexport function createCookieJar(\n\tsecret?: string,\n\trequestHeaders?: Headers,\n\tonMutation?: () => void,\n): CookieJar {\n\treturn new CookieJarImpl(secret ?? \"\", requestHeaders, onMutation);\n}\n\nexport function hasPendingCookies(cookieJar: CookieJar): boolean {\n\treturn cookieJar instanceof CookieJarImpl && cookieJar.hasPending();\n}\n\nexport function applyPendingCookies(\n\tcookieJar: CookieJar,\n\theaders: Headers,\n): void {\n\tif (!(cookieJar instanceof CookieJarImpl)) {\n\t\tthrow new TypeError(\"CookieJar was not created by Barq\");\n\t}\n\tcookieJar.apply(headers);\n}\n",
|
|
8
|
+
"const NULL_BODY_STATUSES: ReadonlySet<number> = new Set([204, 205, 304]);\nconst DEFAULT_JSON_HEADERS = Object.freeze({\n\t\"content-type\": \"application/json; charset=utf-8\",\n});\nconst DEFAULT_JSON_INIT: ResponseInit = Object.freeze({\n\tstatus: 200,\n\theaders: DEFAULT_JSON_HEADERS,\n});\nconst DEFAULT_TEXT_HEADERS = Object.freeze({\n\t\"content-type\": \"text/plain; charset=utf-8\",\n});\nexport type HeadersInit = NonNullable<ResponseInit[\"headers\"]>;\n\nexport function isNullBodyStatus(status: number): boolean {\n\treturn (status >= 100 && status < 200) || NULL_BODY_STATUSES.has(status);\n}\n\nfunction createJsonResponse(data: unknown, init: ResponseInit): Response {\n\t// Preserve JSON.stringify's empty-body behavior for values that do not\n\t// produce a JSON value, while using Bun's native serializer otherwise.\n\tif (\n\t\tdata === undefined ||\n\t\ttypeof data === \"function\" ||\n\t\ttypeof data === \"symbol\"\n\t) {\n\t\treturn new Response(JSON.stringify(data), init);\n\t}\n\treturn Response.json(data, init);\n}\n\nexport function json(data: unknown, init?: number | ResponseInit): Response {\n\tif (init === undefined) {\n\t\tif (typeof data === \"object\" && data !== null) {\n\t\t\treturn new Response(JSON.stringify(data), DEFAULT_JSON_INIT);\n\t\t}\n\t\treturn createJsonResponse(data, DEFAULT_JSON_INIT);\n\t}\n\n\tif (typeof init === \"number\") {\n\t\tif (isNullBodyStatus(init)) {\n\t\t\treturn new Response(null, { status: init });\n\t\t}\n\t\treturn createJsonResponse(data, {\n\t\t\tstatus: init,\n\t\t\theaders: DEFAULT_JSON_HEADERS,\n\t\t});\n\t}\n\n\tconst status = init.status ?? 200;\n\tif (isNullBodyStatus(status)) {\n\t\treturn new Response(null, { ...init, status });\n\t}\n\n\tif (init.headers === undefined) {\n\t\treturn createJsonResponse(data, {\n\t\t\t...init,\n\t\t\tstatus,\n\t\t\theaders: DEFAULT_JSON_HEADERS,\n\t\t});\n\t}\n\n\tconst headers = new Headers(init.headers);\n\tif (!headers.has(\"content-type\")) {\n\t\theaders.set(\"content-type\", \"application/json; charset=utf-8\");\n\t}\n\treturn createJsonResponse(data, { ...init, status, headers });\n}\n\nexport function text(body: string, init?: number | ResponseInit): Response {\n\tif (init === undefined) {\n\t\treturn new Response(body);\n\t}\n\n\tif (typeof init === \"number\") {\n\t\tif (isNullBodyStatus(init)) {\n\t\t\treturn new Response(null, { status: init });\n\t\t}\n\t\treturn new Response(body, {\n\t\t\tstatus: init,\n\t\t\theaders: DEFAULT_TEXT_HEADERS,\n\t\t});\n\t}\n\n\tconst status = init.status ?? 200;\n\tif (isNullBodyStatus(status)) {\n\t\treturn new Response(null, { ...init, status });\n\t}\n\n\tif (init.headers === undefined) {\n\t\treturn new Response(body, {\n\t\t\t...init,\n\t\t\tstatus,\n\t\t\theaders: DEFAULT_TEXT_HEADERS,\n\t\t});\n\t}\n\n\tconst headers = new Headers(init.headers);\n\tif (!headers.has(\"content-type\")) {\n\t\theaders.set(\"content-type\", \"text/plain; charset=utf-8\");\n\t}\n\treturn new Response(body, { ...init, status, headers });\n}\n\nexport function empty(status = 204, headers?: HeadersInit): Response {\n\tconst init: ResponseInit =\n\t\theaders !== undefined ? { status, headers } : { status };\n\treturn 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\turl: string,\n\tstatus = 302,\n\tallowlist?: ReadonlySet<string>,\n): Response {\n\tif (!ALLOWED_REDIRECT_STATUSES.has(status)) {\n\t\tthrow new TypeError(\n\t\t\t`redirect status must be one of: ${Array.from(ALLOWED_REDIRECT_STATUSES).join(\", \")}`,\n\t\t);\n\t}\n\tif (CONTROL_CHARS.test(url) || url.includes(\"\\\\\")) {\n\t\tthrow new TypeError(\n\t\t\t\"redirect target contains control or backslash characters\",\n\t\t);\n\t}\n\tif (url.charCodeAt(0) === 47) {\n\t\tif (url.charCodeAt(1) === 47) {\n\t\t\tthrow new TypeError(\"redirect target must not be protocol-relative\");\n\t\t}\n\t} else {\n\t\tlet parsed: URL;\n\t\ttry {\n\t\t\tparsed = new URL(url);\n\t\t} catch {\n\t\t\tthrow new TypeError(\n\t\t\t\t\"redirect target must be a root-relative path or an absolute URL\",\n\t\t\t);\n\t\t}\n\t\tif (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n\t\t\tthrow new TypeError(\n\t\t\t\t`redirect target protocol is not allowed: ${parsed.protocol}`,\n\t\t\t);\n\t\t}\n\t\tconst host = parsed.host.toLowerCase();\n\t\tif (allowlist !== undefined && !allowlist.has(host)) {\n\t\t\tthrow new TypeError(`redirect target host is not allowlisted: ${host}`);\n\t\t}\n\t}\n\tconst res = new Response(null, { status });\n\tres.headers.set(\"location\", url);\n\treturn res;\n}\n",
|
|
9
|
+
"import { isIP } from \"node:net\";\n\nexport type IpMatcher = (ip: string) => boolean;\n\nfunction ipv4ToNumber(bytes: Uint8Array): number {\n\treturn (\n\t\t((bytes[0]! << 24) | (bytes[1]! << 16) | (bytes[2]! << 8) | bytes[3]!) >>> 0\n\t);\n}\n\nexport function compileTrustProxy(\n\ttrust:\n\t\t| boolean\n\t\t| string\n\t\t| readonly string[]\n\t\t| ((ip: string) => boolean)\n\t\t| undefined,\n): IpMatcher {\n\tif (!trust) return () => false;\n\tif (trust === true) return () => true;\n\tif (typeof trust === \"function\") return trust;\n\n\tconst ranges = typeof trust === \"string\" ? [trust] : trust;\n\tif (ranges.length === 0) return () => false;\n\n\tconst matchers: IpMatcher[] = [];\n\n\tfor (const range of ranges) {\n\t\tif (range === \"loopback\") {\n\t\t\tmatchers.push((ip) => {\n\t\t\t\tconst addr = parseIpAddress(ip);\n\t\t\t\tif (addr === null) return false;\n\t\t\t\tif (addr.length === 4) return addr[0] === 127;\n\t\t\t\treturn addr.slice(0, 15).every((b) => b === 0) && addr[15] === 1;\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst slash = range.indexOf(\"/\");\n\t\tconst netText = slash === -1 ? range : range.slice(0, slash);\n\t\tconst netBytes = parseIpAddress(netText);\n\t\tif (!netBytes) continue;\n\n\t\tconst bits =\n\t\t\tslash === -1 ? netBytes.length * 8 : Number(range.slice(slash + 1));\n\t\tif (netBytes.length === 4) {\n\t\t\tconst netNum = ipv4ToNumber(netBytes);\n\t\t\tconst mask = bits === 0 ? 0 : (~0 << (32 - bits)) >>> 0;\n\t\t\tconst expected = (netNum & mask) >>> 0;\n\t\t\tmatchers.push((ip) => {\n\t\t\t\tconst addr = parseIpAddress(ip);\n\t\t\t\tif (addr?.length !== 4) return false;\n\t\t\t\treturn (ipv4ToNumber(addr) & mask) >>> 0 === expected;\n\t\t\t});\n\t\t} else {\n\t\t\tmatchers.push((ip) => ipMatchesRange(ip, range));\n\t\t}\n\t}\n\n\treturn (ip: string) => matchers.some((m) => m(ip));\n}\n\nexport function isIpRange(value: string): boolean {\n\tif (value === \"loopback\") return true;\n\tconst slash = value.indexOf(\"/\");\n\tif (slash !== value.lastIndexOf(\"/\")) return false;\n\tconst address = slash === -1 ? value : value.slice(0, slash);\n\tconst bytes = parseIpAddress(address);\n\tif (bytes === null) return false;\n\tif (slash === -1) return true;\n\tconst bitsText = value.slice(slash + 1);\n\tif (!/^\\d+$/.test(bitsText)) return false;\n\tconst bits = Number(bitsText);\n\treturn Number.isInteger(bits) && bits >= 0 && bits <= bytes.length * 8;\n}\n\nexport function ipMatchesRange(ip: string, range: string): boolean {\n\tconst address = parseIpAddress(ip);\n\tif (address === null) return false;\n\tif (range === \"loopback\") {\n\t\tif (address.length === 4) return address[0] === 127;\n\t\treturn (\n\t\t\taddress.slice(0, 15).every((byte) => byte === 0) && address[15] === 1\n\t\t);\n\t}\n\n\tconst slash = range.indexOf(\"/\");\n\tconst networkText = slash === -1 ? range : range.slice(0, slash);\n\tconst network = parseIpAddress(networkText);\n\tif (network === null || address.length !== network.length) return false;\n\tconst bits =\n\t\tslash === -1 ? network.length * 8 : Number(range.slice(slash + 1));\n\tif (!Number.isInteger(bits) || bits < 0 || bits > network.length * 8) {\n\t\treturn false;\n\t}\n\n\tconst fullBytes = Math.floor(bits / 8);\n\tfor (let i = 0; i < fullBytes; i++) {\n\t\tif (address[i] !== network[i]) return false;\n\t}\n\tconst remainingBits = bits % 8;\n\tif (remainingBits === 0) return true;\n\tconst mask = (0xff << (8 - remainingBits)) & 0xff;\n\treturn (address[fullBytes]! & mask) === (network[fullBytes]! & mask);\n}\n\nexport function isValidIpAddress(value: string): boolean {\n\treturn parseIpAddress(value) !== null;\n}\n\nfunction parseIpAddress(value: string): Uint8Array | null {\n\tconst version = isIP(value);\n\tif (version === 4) {\n\t\tconst bytes = value.split(\".\").map(Number);\n\t\tif (bytes.length !== 4) return null;\n\t\treturn Uint8Array.from(bytes);\n\t}\n\tif (version !== 6) return null;\n\n\tlet address = value.toLowerCase();\n\tif (address.includes(\".\")) {\n\t\tconst separator = address.lastIndexOf(\":\");\n\t\tconst ipv4 = address\n\t\t\t.slice(separator + 1)\n\t\t\t.split(\".\")\n\t\t\t.map(Number);\n\t\tif (separator === -1 || ipv4.length !== 4) return null;\n\t\tconst high = ((ipv4[0]! << 8) | ipv4[1]!).toString(16);\n\t\tconst low = ((ipv4[2]! << 8) | ipv4[3]!).toString(16);\n\t\taddress = `${address.slice(0, separator + 1)}${high}:${low}`;\n\t}\n\n\tconst halves = address.split(\"::\");\n\tif (halves.length > 2) return null;\n\tconst left = halves[0] ? halves[0].split(\":\") : [];\n\tconst right = halves.length === 2 && halves[1] ? halves[1].split(\":\") : [];\n\tconst missing = 8 - left.length - right.length;\n\tif (\n\t\t(halves.length === 1 && missing !== 0) ||\n\t\t(halves.length === 2 && missing < 1)\n\t) {\n\t\treturn null;\n\t}\n\tconst groups = [\n\t\t...left,\n\t\t...new Array(halves.length === 2 ? missing : 0).fill(\"0\"),\n\t\t...right,\n\t];\n\tif (\n\t\tgroups.length !== 8 ||\n\t\tgroups.some((group) => !/^[0-9a-f]{1,4}$/.test(group))\n\t) {\n\t\treturn null;\n\t}\n\n\tconst bytes = new Uint8Array(16);\n\tfor (let i = 0; i < groups.length; i++) {\n\t\tconst group = Number.parseInt(groups[i]!, 16);\n\t\tbytes[i * 2] = group >>> 8;\n\t\tbytes[i * 2 + 1] = group & 0xff;\n\t}\n\treturn bytes;\n}\n",
|
|
10
|
+
"import { json } from \"./http\";\n\nexport type HeadersInit = NonNullable<ResponseInit[\"headers\"]>;\n\nexport class HttpError extends Error {\n\treadonly status: number;\n\treadonly body: unknown;\n\treadonly headers?: HeadersInit;\n\n\tconstructor(status: number, body?: unknown, headers?: HeadersInit) {\n\t\tif (!Number.isInteger(status) || status < 100 || status > 599) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid HTTP status code: ${status}. Must be an integer between 100 and 599.`,\n\t\t\t);\n\t\t}\n\t\tsuper(typeof body === \"string\" ? body : `HTTP ${status}`);\n\t\tthis.name = \"HttpError\";\n\t\tthis.status = status;\n\t\tthis.body = body ?? { error: defaultStatusText(status) };\n\t\tif (headers !== undefined) this.headers = headers;\n\t}\n}\n\nfunction defaultStatusText(status: number): string {\n\tswitch (status) {\n\t\tcase 400:\n\t\t\treturn \"Bad Request\";\n\t\tcase 401:\n\t\t\treturn \"Unauthorized\";\n\t\tcase 403:\n\t\t\treturn \"Forbidden\";\n\t\tcase 404:\n\t\t\treturn \"Not Found\";\n\t\tcase 405:\n\t\t\treturn \"Method Not Allowed\";\n\t\tcase 408:\n\t\t\treturn \"Request Timeout\";\n\t\tcase 409:\n\t\t\treturn \"Conflict\";\n\t\tcase 413:\n\t\t\treturn \"Payload Too Large\";\n\t\tcase 418:\n\t\t\treturn \"I'm a teapot\";\n\t\tcase 422:\n\t\t\treturn \"Unprocessable Entity\";\n\t\tcase 429:\n\t\t\treturn \"Too Many Requests\";\n\t\tcase 500:\n\t\t\treturn \"Internal Server Error\";\n\t\tcase 502:\n\t\t\treturn \"Bad Gateway\";\n\t\tcase 503:\n\t\t\treturn \"Service Unavailable\";\n\t\tcase 504:\n\t\t\treturn \"Gateway Timeout\";\n\t\tdefault:\n\t\t\treturn status >= 500 ? \"Internal Server Error\" : \"Error\";\n\t}\n}\n\nfunction safeJson(\n\tstatus: number,\n\tbody: unknown,\n\theaders?: HeadersInit,\n): Response {\n\ttry {\n\t\tconst init: ResponseInit =\n\t\t\theaders !== undefined ? { status, headers } : { status };\n\t\treturn json(body, init);\n\t} catch {\n\t\treturn new Response(\"Internal Server Error\", {\n\t\t\tstatus: 500,\n\t\t\theaders: { \"content-type\": \"text/plain; charset=utf-8\" },\n\t\t});\n\t}\n}\n\nexport function errorToResponse(err: unknown, development: boolean): Response {\n\tif (err instanceof Response) {\n\t\treturn err;\n\t}\n\tif (err instanceof HttpError) {\n\t\treturn safeJson(err.status, err.body, err.headers);\n\t}\n\tif (development) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tconst stack = err instanceof Error ? err.stack : undefined;\n\t\treturn safeJson(500, { error: \"Internal Server Error\", message, stack });\n\t}\n\treturn safeJson(500, { error: \"Internal Server Error\" });\n}\n\nexport const createErrorResponse = errorToResponse;\n",
|
|
11
|
+
"import { HttpError } from \"../errors\";\n\nexport interface ParsedTarget {\n\tpathname: string;\n\tquery: string | undefined;\n}\n\nfunction decodeSegment(seg: string): string {\n\tif (seg.indexOf(\"%\") === -1) return seg;\n\ttry {\n\t\treturn decodeURIComponent(seg);\n\t} catch {\n\t\treturn seg;\n\t}\n}\n\nfunction decodePercentSegment(seg: string): string {\n\ttry {\n\t\treturn decodeURIComponent(seg);\n\t} catch {\n\t\treturn seg;\n\t}\n}\n\nfunction isDotSegment(seg: string): boolean {\n\treturn seg === \".\" || seg === \"..\";\n}\n\nfunction hasDotSegment(path: string): boolean {\n\tlet i = 0;\n\tconst len = path.length;\n\twhile (i < len) {\n\t\twhile (i < len && path.charCodeAt(i) === 47) i++;\n\t\tif (i >= len) break;\n\t\tconst endIdx = path.indexOf(\"/\", i);\n\t\tconst segEnd = endIdx === -1 ? len : endIdx;\n\t\tconst segmentLength = segEnd - i;\n\t\tif (\n\t\t\t(segmentLength === 1 && path.charCodeAt(i) === 46) ||\n\t\t\t(segmentLength === 2 &&\n\t\t\t\tpath.charCodeAt(i) === 46 &&\n\t\t\t\tpath.charCodeAt(i + 1) === 46)\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst percent = path.indexOf(\"%\", i);\n\t\tif (percent !== -1 && percent < segEnd) {\n\t\t\tconst decoded = decodePercentSegment(path.slice(i, segEnd));\n\t\t\tif (isDotSegment(decoded)) return true;\n\t\t}\n\t\tif (endIdx === -1) break;\n\t\ti = endIdx + 1;\n\t}\n\treturn false;\n}\n\nexport function hasEncodedSlash(path: string): boolean {\n\treturn path.includes(\"%2f\") || path.includes(\"%2F\");\n}\n\nfunction targetStart(url: string): number {\n\tif (url.charCodeAt(0) === 47) return 0;\n\tif (\n\t\turl.charCodeAt(4) === 58 &&\n\t\turl.charCodeAt(5) === 47 &&\n\t\turl.charCodeAt(6) === 47\n\t)\n\t\treturn 7;\n\tif (\n\t\turl.charCodeAt(5) === 58 &&\n\t\turl.charCodeAt(6) === 47 &&\n\t\turl.charCodeAt(7) === 47\n\t)\n\t\treturn 8;\n\tconst scheme = url.indexOf(\"://\");\n\treturn scheme === -1 ? 0 : scheme + 3;\n}\n\nexport function normalizeDotSegments(path: string): string {\n\tconst len = path.length;\n\tconst segments: string[] = [];\n\tlet start = 0;\n\n\twhile (start < len) {\n\t\twhile (start < len && path.charCodeAt(start) === 47) start++;\n\t\tif (start >= len) break;\n\t\tconst end = path.indexOf(\"/\", start);\n\t\tconst segEnd = end === -1 ? len : end;\n\t\tconst rawSeg = path.slice(start, segEnd);\n\t\tconst decodedSeg = decodeSegment(rawSeg);\n\n\t\tif (decodedSeg === \".\") {\n\t\t} else if (decodedSeg === \"..\") {\n\t\t\tsegments.pop();\n\t\t} else {\n\t\t\tsegments.push(rawSeg);\n\t\t}\n\t\tif (end === -1) break;\n\t\tstart = end + 1;\n\t}\n\n\tconst res = `/${segments.join(\"/\")}`;\n\tconst endsWithSlash =\n\t\tpath.endsWith(\"/\") || path.endsWith(\"/.\") || path.endsWith(\"/..\");\n\treturn path.length > 1 && endsWithSlash && res !== \"/\" ? `${res}/` : res;\n}\n\nexport function scanPathname(url: string): string {\n\tconst s = targetStart(url);\n\tconst slash = url.indexOf(\"/\", s);\n\tif (slash === -1) return \"/\";\n\tlet end = url.indexOf(\"?\", slash);\n\tif (end === -1) {\n\t\tend = url.indexOf(\"#\", slash);\n\t\tif (end === -1) end = url.length;\n\t} else {\n\t\tconst hash = url.indexOf(\"#\", slash);\n\t\tif (hash !== -1 && hash < end) end = hash;\n\t}\n\tconst raw = url.slice(slash, end);\n\n\tif (raw.indexOf(\"%00\") !== -1 || raw.indexOf(\"\\0\") !== -1) {\n\t\tthrow new HttpError(400, { error: \"Bad Request\" });\n\t}\n\n\tif (raw.indexOf(\".\") === -1 && raw.indexOf(\"%\") === -1) return raw;\n\n\treturn hasDotSegment(raw) ? normalizeDotSegments(raw) : raw;\n}\n\nexport function parseRequestTarget(url: string): ParsedTarget {\n\tconst s = targetStart(url);\n\tconst slash = url.indexOf(\"/\", s);\n\n\tlet pathname: string;\n\tlet query: string | undefined;\n\n\tif (slash === -1) {\n\t\tpathname = \"/\";\n\t\tconst q = url.indexOf(\"?\", s);\n\t\tconst h = url.indexOf(\"#\", s);\n\t\tif (q !== -1 && (h === -1 || q < h)) {\n\t\t\tquery = h === -1 ? url.slice(q + 1) : url.slice(q + 1, h);\n\t\t}\n\t} else {\n\t\tlet end = url.indexOf(\"?\", slash);\n\t\tconst hash = url.indexOf(\"#\", slash);\n\n\t\tif (hash !== -1 && (end === -1 || hash < end)) end = hash;\n\n\t\tif (end === -1) {\n\t\t\tend = url.length;\n\t\t} else if (url.charCodeAt(end) === 63) {\n\t\t\tquery =\n\t\t\t\thash !== -1 && hash > end\n\t\t\t\t\t? url.slice(end + 1, hash)\n\t\t\t\t\t: url.slice(end + 1);\n\t\t}\n\n\t\tconst raw = url.slice(slash, end);\n\t\tif (raw.indexOf(\"%00\") !== -1 || raw.indexOf(\"\\0\") !== -1) {\n\t\t\tthrow new HttpError(400, { error: \"Bad Request\" });\n\t\t}\n\n\t\tpathname = hasDotSegment(raw) ? normalizeDotSegments(raw) : raw;\n\t}\n\n\treturn { pathname, query };\n}\n",
|
|
12
|
+
"function decodeQueryComponent(value: string): string {\n\tconst hasPlus = value.indexOf(\"+\") !== -1;\n\tconst hasPercent = value.indexOf(\"%\") !== -1;\n\tif (!hasPlus && !hasPercent) return value;\n\tconst formValue = hasPlus ? value.replace(/\\+/g, \" \") : value;\n\tif (!hasPercent) return formValue;\n\ttry {\n\t\treturn decodeURIComponent(formValue);\n\t} catch {\n\t\treturn new URLSearchParams(`v=${value}`).get(\"v\") ?? \"\";\n\t}\n}\n\nexport function findQueryParam(\n\turl: string,\n\tname: string,\n\tstartPos?: number,\n): string | null {\n\tconst queryStart =\n\t\tstartPos !== undefined && startPos >= 0 ? startPos : url.indexOf(\"?\");\n\tif (queryStart === -1) return null;\n\n\tconst hashPos = url.indexOf(\"#\", queryStart);\n\tconst len = hashPos === -1 ? url.length : hashPos;\n\tlet s = queryStart + 1;\n\tconst nameLen = name.length;\n\n\twhile (s < len) {\n\t\tif (url.startsWith(name, s)) {\n\t\t\tconst eqPos = s + nameLen;\n\t\t\tif (eqPos >= len) return \"\";\n\t\t\tconst nextChar = url.charCodeAt(eqPos);\n\t\t\tif (nextChar === 61) {\n\t\t\t\tconst valStart = eqPos + 1;\n\t\t\t\tlet amp = url.indexOf(\"&\", valStart);\n\t\t\t\tif (amp === -1 || amp > len) amp = len;\n\t\t\t\tconst val = url.slice(valStart, amp);\n\t\t\t\tif (val.indexOf(\"+\") === -1 && val.indexOf(\"%\") === -1) {\n\t\t\t\t\treturn val;\n\t\t\t\t}\n\t\t\t\treturn decodeQueryComponent(val);\n\t\t\t}\n\t\t\tif (nextChar === 38) {\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t}\n\n\t\tconst amp = url.indexOf(\"&\", s);\n\t\tif (amp === -1 || amp >= len) break;\n\t\ts = amp + 1;\n\t}\n\treturn null;\n}\n\nexport function findQueryParamAll(url: string, name: string): string[] {\n\tconst res: string[] = [];\n\tconst queryStart = url.indexOf(\"?\");\n\tif (queryStart === -1) return res;\n\tconst hashPos = url.indexOf(\"#\", queryStart);\n\tconst len = hashPos === -1 ? url.length : hashPos;\n\tlet s = queryStart + 1;\n\tconst nLen = name.length;\n\n\twhile (s < len) {\n\t\tlet amp = url.indexOf(\"&\", s);\n\t\tif (amp === -1 || amp > len) amp = len;\n\t\tlet eq = url.indexOf(\"=\", s);\n\t\tif (eq === -1 || eq > amp) eq = amp;\n\t\tif (eq - s === nLen && url.startsWith(name, s)) {\n\t\t\tconst val = eq < amp ? url.slice(eq + 1, amp) : \"\";\n\t\t\tif (val.indexOf(\"%\") === -1 && val.indexOf(\"+\") === -1) {\n\t\t\t\tres.push(val);\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tres.push(decodeURIComponent(val.replace(/\\+/g, \" \")));\n\t\t\t\t} catch {\n\t\t\t\t\tres.push(val);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ts = amp + 1;\n\t}\n\treturn res;\n}\n\nexport function parseAllQueryParams(url: string): Record<string, string> {\n\tconst qIdx = url.indexOf(\"?\");\n\tif (qIdx === -1) return Object.create(null);\n\tconst hashPos = url.indexOf(\"#\", qIdx);\n\tconst len = hashPos === -1 ? url.length : hashPos;\n\tconst res: Record<string, string> = Object.create(null);\n\tlet s = qIdx + 1;\n\n\twhile (s < len) {\n\t\tlet amp = url.indexOf(\"&\", s);\n\t\tif (amp === -1 || amp > len) amp = len;\n\t\tlet eq = url.indexOf(\"=\", s);\n\t\tif (eq === -1 || eq > amp) eq = amp;\n\t\tconst k = decodeQueryComponent(url.slice(s, eq));\n\t\tconst v = eq < amp ? decodeQueryComponent(url.slice(eq + 1, amp)) : \"\";\n\t\tif (res[k] === undefined) res[k] = v;\n\t\ts = amp + 1;\n\t}\n\treturn res;\n}\n\nexport function parseFastQuery(\n\turl: string,\n\tstartPos: number,\n): Record<string, string> {\n\tconst out: Record<string, string> = Object.create(null);\n\tconst hashPos = url.indexOf(\"#\", startPos);\n\tconst len = hashPos === -1 ? url.length : hashPos;\n\tlet s = startPos;\n\n\twhile (s < len) {\n\t\tlet eq = url.indexOf(\"=\", s);\n\t\tif (eq === -1 || eq > len) eq = len;\n\t\tlet amp = url.indexOf(\"&\", eq < len ? eq + 1 : s);\n\t\tif (amp === -1 || amp > len) amp = len;\n\t\tconst k = url.slice(s, eq);\n\t\tconst v = eq < amp ? url.slice(eq + 1, amp) : \"\";\n\t\tout[k] =\n\t\t\tv.indexOf(\"+\") === -1 && v.indexOf(\"%\") === -1\n\t\t\t\t? v\n\t\t\t\t: decodeURIComponent(v.replace(/\\+/g, \" \"));\n\t\ts = amp + 1;\n\t}\n\treturn out;\n}\n",
|
|
13
|
+
"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\treadonly development: boolean;\n\treadonly redirectHosts: ReadonlySet<string>;\n\treadonly trustProxy:\n\t\t| boolean\n\t\t| string\n\t\t| readonly string[]\n\t\t| ((ip: string) => boolean);\n\treadonly trustedProxyChecker?: (ip: string) => boolean;\n\treadonly cookieSecret?: string;\n}\n\ntype TrustProxy = ContextApplication[\"trustProxy\"];\nconst TEXT_DECODER = new TextDecoder();\n\ninterface LazyFields<TState> {\n\tcookies?: CookieJar | null;\n\tstate?: TState | null;\n\tip?: string | null;\n\tvalid?: unknown;\n\tbodyBufferPromise?: Promise<ArrayBuffer> | null;\n\ttextPromise?: Promise<string> | null;\n\tjsonPromise?: Promise<unknown> | null;\n\tblobPromise?: Promise<Blob> | null;\n\tformDataPromise?: ReturnType<Request[\"formData\"]> | null;\n}\n\nexport class Context<\n\tTParams extends object = Params,\n\tTState extends object = Record<string, unknown>,\n> {\n\treadonly req: Request;\n\treadonly params: TParams;\n\t_hasPendingCookies = false;\n\n\tprivate readonly server: Server<unknown> | null;\n\tprivate readonly application: ContextApplication;\n\tprivate _pathname: string | null;\n\tprivate _query: URLSearchParams | null = null;\n\tprivate _url: string | null = null;\n\tprivate _queryParams: Record<string, string> | null = null;\n\tprivate _lazy: LazyFields<TState> | null = null;\n\n\tconstructor(\n\t\treq: Request,\n\t\tserver: Server<unknown> | null,\n\t\tparams: TParams,\n\t\tapplication: ContextApplication,\n\t\tpathname?: string,\n\t) {\n\t\tthis.req = req;\n\t\tthis.server = server;\n\t\tthis.params = params;\n\t\tthis.application = application;\n\t\tthis._pathname = pathname ?? null;\n\t\tthis._query = null;\n\t}\n\n\tprivate _getLazy(): LazyFields<TState> {\n\t\tlet lazy = this._lazy;\n\t\tif (lazy === null) {\n\t\t\tlazy = {};\n\t\t\tthis._lazy = lazy;\n\t\t}\n\t\treturn lazy;\n\t}\n\n\tget development(): boolean {\n\t\treturn this.application.development;\n\t}\n\n\tget redirectHosts(): ReadonlySet<string> {\n\t\treturn this.application.redirectHosts;\n\t}\n\n\tget trustProxy(): TrustProxy {\n\t\treturn this.application.trustProxy;\n\t}\n\n\tget cookies(): CookieJar {\n\t\tconst lazy = this._getLazy();\n\t\tif (!lazy.cookies) {\n\t\t\tlazy.cookies = createCookieJar(\n\t\t\t\tthis.application.cookieSecret ?? \"\",\n\t\t\t\tthis.req.headers,\n\t\t\t\t() => {\n\t\t\t\t\tthis._hasPendingCookies = true;\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\treturn lazy.cookies as CookieJar;\n\t}\n\n\t_cookieJarIfCreated(): CookieJar | null {\n\t\treturn this._lazy?.cookies ?? null;\n\t}\n\n\tget state(): TState {\n\t\tconst lazy = this._getLazy();\n\t\tif (!lazy.state) {\n\t\t\tlazy.state = Object.create(null) as TState;\n\t\t}\n\t\treturn lazy.state;\n\t}\n\n\tget valid(): unknown {\n\t\tconst lazy = this._lazy;\n\t\tif (lazy && lazy.valid !== undefined) return lazy.valid;\n\t\treturn (lazy?.state as Record<string, unknown> | null | undefined)?.valid;\n\t}\n\n\tset valid(val: unknown) {\n\t\tthis._getLazy().valid = val;\n\t\t(this.state as Record<string, unknown>).valid = val;\n\t}\n\n\tget pathname(): string {\n\t\tif (this._pathname !== null) return this._pathname;\n\t\tconst p = scanPathname(this.req.url);\n\t\tthis._pathname = p;\n\t\treturn p;\n\t}\n\n\tget query(): URLSearchParams {\n\t\tif (this._query) return this._query;\n\t\tconst url = this.req.url;\n\t\tconst qIdx = url.indexOf(\"?\");\n\t\tif (qIdx === -1) {\n\t\t\tconst sp = new URLSearchParams(\"\");\n\t\t\tthis._query = sp;\n\t\t\treturn sp;\n\t\t}\n\t\tconst hashIdx = url.indexOf(\"#\", qIdx);\n\t\tconst qStr =\n\t\t\thashIdx === -1 ? url.slice(qIdx + 1) : url.slice(qIdx + 1, hashIdx);\n\t\tconst sp = new URLSearchParams(qStr);\n\t\tthis._query = sp;\n\t\treturn sp;\n\t}\n\n\tqueryParam(name: string): string | null {\n\t\tif (this._query) return this._query.get(name);\n\t\tif (this._queryParams === null) {\n\t\t\tif (this._url === null) this._url = this.req.url;\n\t\t\tthis._queryParams = parseAllQueryParams(this._url);\n\t\t}\n\t\treturn this._queryParams[name] ?? null;\n\t}\n\n\tqueryParamAll(name: string): string[] {\n\t\treturn this.query.getAll(name);\n\t}\n\n\tget ip(): string {\n\t\tconst lazy = this._lazy;\n\t\tif (lazy && typeof lazy.ip === \"string\") return lazy.ip;\n\t\tconst directIp = this.getDirectIp();\n\t\tif (!this.isTrustedProxy(directIp)) {\n\t\t\tthis._getLazy().ip = directIp;\n\t\t\treturn directIp;\n\t\t}\n\n\t\tconst forwarded = this.req.headers.get(\"x-forwarded-for\");\n\t\tif (forwarded) {\n\t\t\tconst hops = forwarded.split(\",\").map((hop) => hop.trim());\n\t\t\tif (hops.every(isValidIpAddress)) {\n\t\t\t\tlet clientIp = directIp;\n\t\t\t\tfor (let i = hops.length - 1; i >= 0; i--) {\n\t\t\t\t\tif (clientIp && !this.isTrustedProxy(clientIp)) break;\n\t\t\t\t\tclientIp = hops[i]!;\n\t\t\t\t}\n\t\t\t\tthis._getLazy().ip = clientIp;\n\t\t\t\treturn clientIp;\n\t\t\t}\n\t\t\tthis._getLazy().ip = directIp;\n\t\t\treturn directIp;\n\t\t}\n\n\t\tconst realIp = this.req.headers.get(\"x-real-ip\")?.trim();\n\t\tif (realIp && isValidIpAddress(realIp)) {\n\t\t\tthis._getLazy().ip = realIp;\n\t\t\treturn realIp;\n\t\t}\n\n\t\tthis._getLazy().ip = directIp;\n\t\treturn directIp;\n\t}\n\n\tprivate isTrustedProxy(ip: string): boolean {\n\t\tconst trust = this.trustProxy;\n\t\tif (trust === true) return true;\n\t\tif (trust === false || !ip) return false;\n\t\tif (this.application.trustedProxyChecker) {\n\t\t\treturn this.application.trustedProxyChecker(ip);\n\t\t}\n\t\tif (typeof trust === \"function\") return trust(ip);\n\t\tif (typeof trust !== \"string\") {\n\t\t\treturn trust.some((range) => ipMatchesRange(ip, range));\n\t\t}\n\t\treturn ipMatchesRange(ip, trust);\n\t}\n\n\tprivate getDirectIp(): string {\n\t\tconst info = this.server?.requestIP(this.req);\n\t\treturn info?.address ?? \"\";\n\t}\n\n\tget bodyStream(): ReadableStream<Uint8Array> | null {\n\t\treturn this.req.body;\n\t}\n\n\tstream(): ReadableStream<Uint8Array> | null {\n\t\treturn this.req.body;\n\t}\n\n\tprivate _getBodyBuffer(): Promise<ArrayBuffer> {\n\t\tconst lazy = this._getLazy();\n\t\tif (!lazy.bodyBufferPromise) {\n\t\t\tlazy.bodyBufferPromise = this.req.arrayBuffer().catch((err: unknown) => {\n\t\t\t\tlazy.bodyBufferPromise = null;\n\t\t\t\tthrow err;\n\t\t\t});\n\t\t}\n\t\treturn lazy.bodyBufferPromise;\n\t}\n\n\tarrayBuffer(): Promise<ArrayBuffer> {\n\t\treturn this._getBodyBuffer();\n\t}\n\n\ttext(): Promise<string> {\n\t\tconst lazy = this._getLazy();\n\t\tif (!lazy.textPromise) {\n\t\t\tlazy.textPromise = this._getBodyBuffer()\n\t\t\t\t.then((buf) => TEXT_DECODER.decode(buf))\n\t\t\t\t.catch((err: unknown) => {\n\t\t\t\t\tlazy.textPromise = null;\n\t\t\t\t\tthrow err;\n\t\t\t\t});\n\t\t}\n\t\treturn lazy.textPromise;\n\t}\n\n\tjson<T = unknown>(): Promise<T> {\n\t\tconst lazy = this._getLazy();\n\t\tif (!lazy.jsonPromise) {\n\t\t\tlazy.jsonPromise = this._getBodyBuffer()\n\t\t\t\t.then((buf) => JSON.parse(TEXT_DECODER.decode(buf)))\n\t\t\t\t.catch((err: unknown) => {\n\t\t\t\t\tlazy.jsonPromise = null;\n\t\t\t\t\tthrow err;\n\t\t\t\t});\n\t\t}\n\t\treturn lazy.jsonPromise as Promise<T>;\n\t}\n\n\tblob(): Promise<Blob> {\n\t\tconst lazy = this._getLazy();\n\t\tif (!lazy.blobPromise) {\n\t\t\tconst ct =\n\t\t\t\tthis.req.headers.get(\"content-type\") ?? \"application/octet-stream\";\n\t\t\tlazy.blobPromise = this._getBodyBuffer()\n\t\t\t\t.then((buf) => new Blob([buf], { type: ct }))\n\t\t\t\t.catch((err: unknown) => {\n\t\t\t\t\tlazy.blobPromise = null;\n\t\t\t\t\tthrow err;\n\t\t\t\t});\n\t\t}\n\t\treturn lazy.blobPromise;\n\t}\n\n\tformData(): ReturnType<Request[\"formData\"]> {\n\t\tconst lazy = this._getLazy();\n\t\tif (!lazy.formDataPromise) {\n\t\t\tlazy.formDataPromise = this._getBodyBuffer()\n\t\t\t\t.then((buf) => {\n\t\t\t\t\tconst ct = this.req.headers.get(\"content-type\") ?? \"\";\n\t\t\t\t\tconst tempRes = new Response(buf, {\n\t\t\t\t\t\theaders: { \"content-type\": ct },\n\t\t\t\t\t});\n\t\t\t\t\treturn tempRes.formData();\n\t\t\t\t})\n\t\t\t\t.catch((err: unknown) => {\n\t\t\t\t\tlazy.formDataPromise = null;\n\t\t\t\t\tthrow err;\n\t\t\t\t}) as ReturnType<Request[\"formData\"]>;\n\t\t}\n\t\treturn lazy.formDataPromise;\n\t}\n\n\tredirect(url: string, status = 302): Response {\n\t\treturn redirect(url, status, this.redirectHosts);\n\t}\n\n\tupgrade<TData = unknown>(data?: TData): boolean {\n\t\tif (!this.server) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Cannot upgrade WebSocket: server instance is not available\",\n\t\t\t);\n\t\t}\n\t\treturn this.server.upgrade(this.req, { data });\n\t}\n\n\ttimeout(seconds: number): this {\n\t\tif (this.server) {\n\t\t\tthis.server.timeout(this.req, seconds);\n\t\t}\n\t\treturn this;\n\t}\n\n\tdisableTimeout(): this {\n\t\tif (this.server) {\n\t\t\tthis.server.timeout(this.req, 0);\n\t\t}\n\t\treturn this;\n\t}\n}\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\tkind: \"string\" | \"json\";\n\tvalue: string;\n}\n\nexport type HandlerFunction = (...args: never[]) => unknown;\nexport type ParamSerializer = (\n\tparams: Record<string, string> | string,\n) => string;\n\nexport interface ParamEntry {\n\tkey: string;\n\tisParam: boolean;\n\tparamKey?: string;\n\tliteralValue?: string;\n}\n\nexport interface HandlerAnalysis {\n\tisNoArg: boolean;\n\tcontextProps: Set<string>;\n\thasDynamicAccess: boolean;\n\tisDestructured: boolean;\n\tdestructuredProps: Set<string>;\n\tliteral: LiteralInfo | null;\n\targlessJsonCall: boolean;\n\tisParamJson?: boolean;\n\tparamJsonKey?: string;\n\tparamSerializer?: ParamSerializer | null;\n\tparamParts?: ParamEntry[] | null;\n}\n\ninterface Token {\n\ttype: \"ident\" | \"str\" | \"num\" | \"regex\" | \"punct\" | \"eof\";\n\tvalue: string;\n\tstart: number;\n\tend: 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\tif (!ESCAPE_JSON_CHARS_RE.test(value)) return value;\n\treturn JSON.stringify(value).slice(1, -1);\n}\n\nfunction isIdentStart(c: number): boolean {\n\treturn (\n\t\t(c >= 97 && c <= 122) ||\n\t\t(c >= 65 && c <= 90) ||\n\t\tc === 95 ||\n\t\tc === 36 ||\n\t\tc > 127\n\t);\n}\nfunction isIdentPart(c: number): boolean {\n\treturn isIdentStart(c) || (c >= 48 && c <= 57);\n}\nfunction isSpace(c: number): boolean {\n\treturn c === 32 || c === 9 || c === 10 || c === 13 || c === 12 || c === 11;\n}\n\nconst KEYWORDS_BEFORE_REGEX = new Set([\n\t\"return\",\n\t\"typeof\",\n\t\"instanceof\",\n\t\"in\",\n\t\"of\",\n\t\"new\",\n\t\"delete\",\n\t\"void\",\n\t\"throw\",\n\t\"case\",\n\t\"do\",\n\t\"else\",\n\t\"yield\",\n\t\"await\",\n]);\n\nconst PUNCT_BEFORE_REGEX = new Set([\n\t\"(\",\n\t\"[\",\n\t\"{\",\n\t\",\",\n\t\";\",\n\t\":\",\n\t\"?\",\n\t\"!\",\n\t\"=\",\n\t\"==\",\n\t\"===\",\n\t\"!=\",\n\t\"!==\",\n\t\"&&\",\n\t\"||\",\n\t\"??\",\n\t\"+\",\n\t\"-\",\n\t\"*\",\n\t\"/\",\n\t\"%\",\n\t\"&\",\n\t\"|\",\n\t\"^\",\n\t\"~\",\n\t\"<\",\n\t\">\",\n\t\"<=\",\n\t\">=\",\n\t\"=>\",\n\t\"+=\",\n\t\"-=\",\n\t\"*=\",\n\t\"/=\",\n\t\"%=\",\n\t\"&=\",\n\t\"|=\",\n\t\"^=\",\n\t\"&&=\",\n\t\"||=\",\n\t\"??=\",\n\t\"<<\",\n\t\">>\",\n\t\">>>\",\n\t\"<<=\",\n\t\">>=\",\n\t\">>>=\",\n]);\n\nfunction tokenize(src: string): Token[] {\n\tconst tokens: Token[] = [];\n\tconst len = src.length;\n\tlet i = 0;\n\tlet last = \"\";\n\n\twhile (i < len) {\n\t\tconst c = src.charCodeAt(i);\n\t\tif (isSpace(c)) {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (c === 47 && src.charCodeAt(i + 1) === 47) {\n\t\t\ti += 2;\n\t\t\twhile (i < len && src.charCodeAt(i) !== 10) i++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (c === 47 && src.charCodeAt(i + 1) === 42) {\n\t\t\ti += 2;\n\t\t\twhile (\n\t\t\t\ti < len &&\n\t\t\t\t!(src.charCodeAt(i) === 42 && src.charCodeAt(i + 1) === 47)\n\t\t\t)\n\t\t\t\ti++;\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (c === 34 || c === 39) {\n\t\t\tconst q = c;\n\t\t\tconst start = i;\n\t\t\ti++;\n\t\t\twhile (i < len) {\n\t\t\t\tconst cc = src.charCodeAt(i);\n\t\t\t\tif (cc === 92) {\n\t\t\t\t\ti += 2;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (cc === q) {\n\t\t\t\t\ti++;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (cc === 10) break;\n\t\t\t\ti++;\n\t\t\t}\n\t\t\ttokens.push({\n\t\t\t\ttype: \"str\",\n\t\t\t\tvalue: src.slice(start + 1, i - 1),\n\t\t\t\tstart,\n\t\t\t\tend: i,\n\t\t\t});\n\t\t\tlast = \"str\";\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (c === 96) {\n\t\t\ti = tokenizeTemplate(src, i, tokens);\n\t\t\tlast = \"template\";\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (c === 47) {\n\t\t\tlet isRegex: boolean;\n\t\t\tif (last === \"\" || last === \"regex\" || last === \"num\") isRegex = true;\n\t\t\telse if (last === \"str\" || last === \"template\") isRegex = false;\n\t\t\telse if (last === \"ident\") isRegex = KEYWORDS_BEFORE_REGEX.has(last);\n\t\t\telse isRegex = PUNCT_BEFORE_REGEX.has(last);\n\n\t\t\tif (isRegex) {\n\t\t\t\tconst start = i;\n\t\t\t\ti++;\n\t\t\t\tlet inClass = false;\n\t\t\t\twhile (i < len) {\n\t\t\t\t\tconst cc = src.charCodeAt(i);\n\t\t\t\t\tif (cc === 92) {\n\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (cc === 91) {\n\t\t\t\t\t\tinClass = true;\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (cc === 93) {\n\t\t\t\t\t\tinClass = false;\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (cc === 47 && !inClass) {\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (cc === 10) break;\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t\twhile (i < len && isIdentPart(src.charCodeAt(i))) i++;\n\t\t\t\ttokens.push({ type: \"regex\", value: \"\", start, end: i });\n\t\t\t\tlast = \"regex\";\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttokens.push({ type: \"punct\", value: \"/\", start: i, end: i + 1 });\n\t\t\tlast = \"/\";\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (isIdentStart(c)) {\n\t\t\tconst start = i;\n\t\t\ti++;\n\t\t\twhile (i < len && isIdentPart(src.charCodeAt(i))) i++;\n\t\t\tconst value = src.slice(start, i);\n\t\t\ttokens.push({ type: \"ident\", value, start, end: i });\n\t\t\tlast = value;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (c >= 48 && c <= 57) {\n\t\t\tconst start = i;\n\t\t\ti++;\n\t\t\twhile (i < len) {\n\t\t\t\tconst cc = src.charCodeAt(i);\n\t\t\t\tif (\n\t\t\t\t\t(cc >= 48 && cc <= 57) ||\n\t\t\t\t\tcc === 46 ||\n\t\t\t\t\tcc === 95 ||\n\t\t\t\t\t(cc >= 97 && cc <= 122) ||\n\t\t\t\t\t(cc >= 65 && cc <= 90)\n\t\t\t\t)\n\t\t\t\t\ti++;\n\t\t\t\telse if (\n\t\t\t\t\t(cc === 43 || cc === 45) &&\n\t\t\t\t\t(src.charCodeAt(i - 1) === 101 || src.charCodeAt(i - 1) === 69)\n\t\t\t\t)\n\t\t\t\t\ti++;\n\t\t\t\telse break;\n\t\t\t}\n\t\t\ttokens.push({ type: \"num\", value: src.slice(start, i), start, end: i });\n\t\t\tlast = \"num\";\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst start = i;\n\t\tconst cc2 = src.charCodeAt(i + 1);\n\t\tconst cc3 = src.charCodeAt(i + 2);\n\t\tconst cc4 = src.charCodeAt(i + 3);\n\t\tlet op = src[i]!;\n\n\t\tif (c === 62 && cc2 === 62 && cc3 === 62 && cc4 === 61) op = \">>>=\";\n\t\telse if (c === 61 && cc2 === 61 && cc3 === 61) op = \"===\";\n\t\telse if (c === 33 && cc2 === 61 && cc3 === 61) op = \"!==\";\n\t\telse if (c === 42 && cc2 === 42 && cc3 === 61) op = \"**=\";\n\t\telse if (c === 60 && cc2 === 60 && cc3 === 61) op = \"<<=\";\n\t\telse if (c === 62 && cc2 === 62 && cc3 === 61) op = \">>=\";\n\t\telse if (c === 62 && cc2 === 62 && cc3 === 62) op = \">>>\";\n\t\telse if (c === 46 && cc2 === 46 && cc3 === 46) op = \"...\";\n\t\telse if (c === 63 && cc2 === 63 && cc3 === 61) op = \"??=\";\n\t\telse if (c === 38 && cc2 === 38 && cc3 === 61) op = \"&&=\";\n\t\telse if (c === 124 && cc2 === 124 && cc3 === 61) op = \"||=\";\n\t\telse if (c === 61 && cc2 === 62) op = \"=>\";\n\t\telse if (c === 61 && cc2 === 61) op = \"==\";\n\t\telse if (c === 33 && cc2 === 61) op = \"!=\";\n\t\telse if (c === 60 && cc2 === 61) op = \"<=\";\n\t\telse if (c === 62 && cc2 === 61) op = \">=\";\n\t\telse if (c === 38 && cc2 === 38) op = \"&&\";\n\t\telse if (c === 124 && cc2 === 124) op = \"||\";\n\t\telse if (c === 63 && cc2 === 46) op = \"?.\";\n\t\telse if (c === 63 && cc2 === 63) op = \"??\";\n\t\telse if (c === 43 && cc2 === 43) op = \"++\";\n\t\telse if (c === 45 && cc2 === 45) op = \"--\";\n\t\telse if (c === 42 && cc2 === 42) op = \"**\";\n\t\telse if (c === 60 && cc2 === 60) op = \"<<\";\n\t\telse if (c === 62 && cc2 === 62) op = \">>\";\n\t\telse if (c === 43 && cc2 === 61) op = \"+=\";\n\t\telse if (c === 45 && cc2 === 61) op = \"-=\";\n\t\telse if (c === 42 && cc2 === 61) op = \"*=\";\n\t\telse if (c === 47 && cc2 === 61) op = \"/=\";\n\t\telse if (c === 37 && cc2 === 61) op = \"%=\";\n\t\telse if (c === 38 && cc2 === 61) op = \"&=\";\n\t\telse if (c === 124 && cc2 === 61) op = \"|=\";\n\t\telse if (c === 94 && cc2 === 61) op = \"^=\";\n\n\t\ti += op.length;\n\t\ttokens.push({ type: \"punct\", value: op, start, end: i });\n\t\tlast = op;\n\t}\n\n\ttokens.push({ type: \"eof\", value: \"\", start: len, end: len });\n\treturn tokens;\n}\n\nfunction tokenizeTemplate(src: string, start: number, out: Token[]): number {\n\tlet i = start + 1;\n\tconst len = src.length;\n\tlet strStart = i;\n\n\twhile (i < len) {\n\t\tconst c = src.charCodeAt(i);\n\t\tif (c === 92) {\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\t\tif (c === 96) {\n\t\t\tif (i > strStart) {\n\t\t\t\tout.push({\n\t\t\t\t\ttype: \"str\",\n\t\t\t\t\tvalue: src.slice(strStart, i),\n\t\t\t\t\tstart: strStart,\n\t\t\t\t\tend: i,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn i + 1;\n\t\t}\n\t\tif (c === 36 && src.charCodeAt(i + 1) === 123) {\n\t\t\tif (i > strStart) {\n\t\t\t\tout.push({\n\t\t\t\t\ttype: \"str\",\n\t\t\t\t\tvalue: src.slice(strStart, i),\n\t\t\t\t\tstart: strStart,\n\t\t\t\t\tend: i,\n\t\t\t\t});\n\t\t\t}\n\t\t\tout.push({ type: \"punct\", value: \"${\", start: i, end: i + 2 });\n\t\t\ti += 2;\n\n\t\t\tconst exprStart = i;\n\t\t\tlet depth = 1;\n\t\t\twhile (i < len && depth > 0) {\n\t\t\t\tconst cc = src.charCodeAt(i);\n\t\t\t\tif (cc === 92) {\n\t\t\t\t\ti += 2;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (cc === 34 || cc === 39) {\n\t\t\t\t\tconst q = cc;\n\t\t\t\t\ti++;\n\t\t\t\t\twhile (i < len) {\n\t\t\t\t\t\tconst c2 = src.charCodeAt(i);\n\t\t\t\t\t\tif (c2 === 92) {\n\t\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (c2 === q) {\n\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ti++;\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (cc === 96) {\n\t\t\t\t\ti = tokenizeTemplate(src, i, out);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (cc === 123) {\n\t\t\t\t\tdepth++;\n\t\t\t\t\ti++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (cc === 125) {\n\t\t\t\t\tdepth--;\n\t\t\t\t\tif (depth === 0) break;\n\t\t\t\t\ti++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\tconst inner = src.slice(exprStart, i);\n\t\t\tconst innerTokens = tokenize(inner);\n\t\t\tfor (const t of innerTokens) {\n\t\t\t\tif (t.type === \"eof\") continue;\n\t\t\t\tout.push({ ...t, start: t.start + exprStart, end: t.end + exprStart });\n\t\t\t}\n\t\t\tout.push({ type: \"punct\", value: \"}\", start: i, end: i + 1 });\n\t\t\ti++;\n\t\t\tstrStart = i;\n\t\t\tcontinue;\n\t\t}\n\t\ti++;\n\t}\n\n\tif (i > strStart) {\n\t\tout.push({\n\t\t\ttype: \"str\",\n\t\t\tvalue: src.slice(strStart, i),\n\t\t\tstart: strStart,\n\t\t\tend: i,\n\t\t});\n\t}\n\treturn i;\n}\n\nexport function analyzeHandler(fn: HandlerFunction): HandlerAnalysis {\n\tlet src: string;\n\ttry {\n\t\tsrc = fn.toString();\n\t} catch {\n\t\treturn makeUnknown();\n\t}\n\n\tconst tokens = tokenize(src);\n\tlet i = 0;\n\n\tif (tokens[i]?.type === \"ident\" && tokens[i]!.value === \"async\") i++;\n\tif (tokens[i]?.type === \"ident\" && tokens[i]!.value === \"function\") {\n\t\ti++;\n\t\tif (tokens[i]?.type === \"ident\") i++;\n\t}\n\n\tif (tokens[i]?.type === \"punct\" && tokens[i]!.value === \"(\") {\n\t\ti++;\n\t\tconst first = tokens[i];\n\n\t\tif (first?.type === \"punct\" && first.value === \")\") {\n\t\t\ti++;\n\t\t\tconst body = walkBody(tokens, i, null);\n\t\t\treturn {\n\t\t\t\tisNoArg: true,\n\t\t\t\tcontextProps: new Set(),\n\t\t\t\thasDynamicAccess: false,\n\t\t\t\tisDestructured: false,\n\t\t\t\tdestructuredProps: new Set(),\n\t\t\t\tliteral: body.literal,\n\t\t\t\targlessJsonCall: false,\n\t\t\t\tparamSerializer: null,\n\t\t\t\tparamParts: null,\n\t\t\t};\n\t\t}\n\n\t\tif (first?.type === \"punct\" && first.value === \"{\") {\n\t\t\tconst { names, next } = parseDestructure(tokens, i);\n\t\t\tconst body = walkBody(tokens, next, null);\n\t\t\treturn {\n\t\t\t\tisNoArg: false,\n\t\t\t\tcontextProps: new Set(),\n\t\t\t\thasDynamicAccess: false,\n\t\t\t\tisDestructured: true,\n\t\t\t\tdestructuredProps: names,\n\t\t\t\tliteral: body.literal,\n\t\t\t\targlessJsonCall: false,\n\t\t\t\tparamSerializer: body.paramSerializer,\n\t\t\t\tparamParts: body.paramParts,\n\t\t\t};\n\t\t}\n\n\t\tif (first?.type === \"ident\") {\n\t\t\tconst name = first.value;\n\t\t\ti++;\n\t\t\tconst body = walkBody(tokens, i, name);\n\t\t\treturn {\n\t\t\t\tisNoArg: false,\n\t\t\t\tcontextProps: body.props,\n\t\t\t\thasDynamicAccess: body.hasDynamic,\n\t\t\t\tisDestructured: false,\n\t\t\t\tdestructuredProps: new Set(),\n\t\t\t\tliteral: body.literal,\n\t\t\t\targlessJsonCall: body.arglessJsonCall,\n\t\t\t\tparamSerializer: body.paramSerializer,\n\t\t\t\tparamParts: body.paramParts,\n\t\t\t};\n\t\t}\n\n\t\treturn makeUnknown();\n\t}\n\n\tif (tokens[i]?.type === \"ident\") {\n\t\tconst name = tokens[i]!.value;\n\t\ti++;\n\t\tconst body = walkBody(tokens, i, name);\n\t\treturn {\n\t\t\tisNoArg: false,\n\t\t\tcontextProps: body.props,\n\t\t\thasDynamicAccess: body.hasDynamic,\n\t\t\tisDestructured: false,\n\t\t\tdestructuredProps: new Set(),\n\t\t\tliteral: body.literal,\n\t\t\targlessJsonCall: body.arglessJsonCall,\n\t\t\tparamSerializer: body.paramSerializer,\n\t\t\tparamParts: body.paramParts,\n\t\t};\n\t}\n\n\treturn makeUnknown();\n}\n\nfunction parseDestructure(\n\ttokens: Token[],\n\tbraceStart: number,\n): { names: Set<string>; next: number } {\n\tconst names = new Set<string>();\n\tlet i = braceStart + 1;\n\tlet depth = 1;\n\twhile (i < tokens.length) {\n\t\tconst t = tokens[i]!;\n\t\tif (t.type === \"eof\") break;\n\t\tif (t.type === \"punct\") {\n\t\t\tif (t.value === \"{\") depth++;\n\t\t\telse if (t.value === \"}\") {\n\t\t\t\tdepth--;\n\t\t\t\ti++;\n\t\t\t\tif (depth === 0) break;\n\t\t\t\tcontinue;\n\t\t\t} else if (t.value === \"[\") depth += 100;\n\t\t\telse if (t.value === \"]\") depth -= 100;\n\t\t}\n\t\tif (t.type === \"ident\" && depth === 1) {\n\t\t\tconst prev = tokens[i - 1];\n\t\t\tconst next = tokens[i + 1];\n\t\t\tif (prev?.type === \"punct\" && prev.value === \":\") {\n\t\t\t\tnames.add(t.value);\n\t\t\t} else if (next?.type !== \"punct\" || next.value !== \":\") {\n\t\t\t\tnames.add(t.value);\n\t\t\t}\n\t\t}\n\t\ti++;\n\t}\n\twhile (i < tokens.length) {\n\t\tconst t = tokens[i]!;\n\t\tif (t.type === \"eof\") break;\n\t\tif (t.type === \"punct\" && t.value === \")\") {\n\t\t\ti++;\n\t\t\tbreak;\n\t\t}\n\t\ti++;\n\t}\n\treturn { names, next: i };\n}\n\ninterface BodyResult {\n\tprops: Set<string>;\n\thasDynamic: boolean;\n\tliteral: LiteralInfo | null;\n\targlessJsonCall: boolean;\n\tparamSerializer: ParamSerializer | null;\n\tparamParts: ParamEntry[] | null;\n}\n\nfunction walkBody(\n\ttokens: Token[],\n\tfrom: number,\n\tparamName: string | null,\n): BodyResult {\n\tconst props = new Set<string>();\n\tlet hasDynamic = false;\n\tlet arglessJsonCall = false;\n\n\tlet bodyStart = -1;\n\tlet i = from;\n\tlet parenDepth = 0;\n\n\tif (tokens[from]?.type === \"punct\" && tokens[from]!.value === \"{\") {\n\t\tbodyStart = from + 1;\n\t} else {\n\t\twhile (i < tokens.length) {\n\t\t\tconst t = tokens[i]!;\n\t\t\tif (t.type === \"eof\") break;\n\t\t\tif (t.type === \"punct\") {\n\t\t\t\tif (t.value === \"(\" || t.value === \"[\" || t.value === \"{\") {\n\t\t\t\t\tparenDepth++;\n\t\t\t\t} else if (t.value === \")\" || t.value === \"]\" || t.value === \"}\") {\n\t\t\t\t\tif (parenDepth > 0) parenDepth--;\n\t\t\t\t} else if (t.value === \"=>\" && parenDepth === 0) {\n\t\t\t\t\tconst next = tokens[i + 1];\n\t\t\t\t\tif (next?.type === \"punct\" && next.value === \"{\") {\n\t\t\t\t\t\tbodyStart = i + 2;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbodyStart = i + 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (t.value === \")\" && parenDepth === 0 && i + 1 < tokens.length) {\n\t\t\t\t\tconst next = tokens[i + 1];\n\t\t\t\t\tif (next?.type === \"punct\" && next.value === \"{\") {\n\t\t\t\t\t\tbodyStart = i + 2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\t}\n\n\tif (bodyStart < 0) {\n\t\treturn {\n\t\t\tprops,\n\t\t\thasDynamic,\n\t\t\tliteral: null,\n\t\t\targlessJsonCall: false,\n\t\t\tparamSerializer: null,\n\t\t\tparamParts: null,\n\t\t};\n\t}\n\n\tif (paramName !== null) {\n\t\tfor (let j = bodyStart; j < tokens.length; j++) {\n\t\t\tconst t = tokens[j]!;\n\t\t\tif (t.type === \"eof\") break;\n\t\t\tif (t.type !== \"ident\" || t.value !== paramName) continue;\n\n\t\t\tconst n = tokens[j + 1];\n\t\t\tif (!n) continue;\n\n\t\t\tif (n.type === \"punct\" && (n.value === \".\" || n.value === \"?.\")) {\n\t\t\t\tconst key = tokens[j + 2];\n\t\t\t\tif (key?.type === \"ident\") {\n\t\t\t\t\tprops.add(key.value);\n\n\t\t\t\t\tif (key.value === \"json\") {\n\t\t\t\t\t\tconst pOpen = tokens[j + 3];\n\t\t\t\t\t\tconst pClose = tokens[j + 4];\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tpOpen?.type === \"punct\" &&\n\t\t\t\t\t\t\tpOpen.value === \"(\" &&\n\t\t\t\t\t\t\tpClose?.type === \"punct\" &&\n\t\t\t\t\t\t\tpClose.value === \")\"\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst prev1 = tokens[j - 1];\n\t\t\t\t\t\t\tconst prev2 = tokens[j - 2];\n\t\t\t\t\t\t\tconst isPrecededByReturn =\n\t\t\t\t\t\t\t\t(prev1?.type === \"punct\" && prev1.value === \"=>\") ||\n\t\t\t\t\t\t\t\t(prev1?.type === \"ident\" && prev1.value === \"return\") ||\n\t\t\t\t\t\t\t\t(prev1?.type === \"ident\" &&\n\t\t\t\t\t\t\t\t\tprev1.value === \"await\" &&\n\t\t\t\t\t\t\t\t\t((prev2?.type === \"punct\" && prev2.value === \"=>\") ||\n\t\t\t\t\t\t\t\t\t\t(prev2?.type === \"ident\" && prev2.value === \"return\")));\n\n\t\t\t\t\t\t\tconst next1 = tokens[j + 5];\n\t\t\t\t\t\t\tconst next2 = tokens[j + 6];\n\t\t\t\t\t\t\tconst isEndOfBody =\n\t\t\t\t\t\t\t\tisBodyEnd(next1) && (next1?.value !== \";\" || isBodyEnd(next2));\n\n\t\t\t\t\t\t\tif (isPrecededByReturn && isEndOfBody) {\n\t\t\t\t\t\t\t\targlessJsonCall = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tj += 2;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\thasDynamic = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (n.type === \"punct\" && n.value === \"[\") {\n\t\t\t\tconst key = tokens[j + 2];\n\t\t\t\tconst close = tokens[j + 3];\n\t\t\t\tif (\n\t\t\t\t\tkey?.type === \"str\" &&\n\t\t\t\t\tclose?.type === \"punct\" &&\n\t\t\t\t\tclose.value === \"]\"\n\t\t\t\t) {\n\t\t\t\t\tprops.add(key.value);\n\t\t\t\t\tj += 3;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\thasDynamic = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst prev = tokens[j - 1];\n\t\t\tif (prev?.type === \"punct\" && prev.value === \"...\") {\n\t\t\t\thasDynamic = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst literal = tryExtractLiteral(tokens, bodyStart);\n\tconst paramExtraction =\n\t\tliteral === null\n\t\t\t? tryExtractParamSerializer(tokens, bodyStart, paramName)\n\t\t\t: null;\n\tconst paramSerializer = paramExtraction?.serializer ?? null;\n\tconst paramParts = paramExtraction?.parts ?? null;\n\n\treturn {\n\t\tprops,\n\t\thasDynamic,\n\t\tliteral,\n\t\targlessJsonCall,\n\t\tparamSerializer,\n\t\tparamParts,\n\t};\n}\n\nfunction isBodyEnd(t: Token | undefined): boolean {\n\tif (!t) return true;\n\tif (t.type === \"eof\") return true;\n\tif (t.type === \"punct\" && (t.value === \";\" || t.value === \"}\")) return true;\n\treturn false;\n}\n\nfunction tryExtractLiteral(\n\ttokens: Token[],\n\tbodyStart: number,\n): LiteralInfo | null {\n\tconst t = tokens[bodyStart];\n\tif (!t || t.type === \"eof\") return null;\n\n\tif (t.type === \"ident\" && t.value === \"return\") {\n\t\treturn tryExtractLiteral(tokens, bodyStart + 1);\n\t}\n\n\tif (t.type === \"str\") {\n\t\tif (isBodyEnd(tokens[bodyStart + 1])) {\n\t\t\treturn { kind: \"string\", value: t.value };\n\t\t}\n\t\treturn null;\n\t}\n\n\tif (t.type === \"punct\" && t.value === \"(\") {\n\t\tconst inner = tokens[bodyStart + 1];\n\t\tif (inner?.type === \"punct\" && inner.value === \"{\") {\n\t\t\tconst obj = extractFlatObject(tokens, bodyStart + 1);\n\t\t\tif (!obj.ok) return null;\n\t\t\tconst afterBrace = tokens[obj.end];\n\t\t\tif (afterBrace?.type !== \"punct\" || afterBrace.value !== \")\") return null;\n\t\t\tif (!isBodyEnd(tokens[obj.end + 1])) return null;\n\t\t\treturn { kind: \"json\", value: JSON.stringify(obj.value) };\n\t\t}\n\t\treturn null;\n\t}\n\n\tif (t.type === \"punct\" && t.value === \"{\") {\n\t\tconst next = tokens[bodyStart + 1];\n\t\tif (\n\t\t\tnext &&\n\t\t\t(next.type === \"ident\" || next.type === \"str\" || next.type === \"num\") &&\n\t\t\ttokens[bodyStart + 2]?.type === \"punct\" &&\n\t\t\ttokens[bodyStart + 2]!.value === \":\"\n\t\t) {\n\t\t\tconst obj = extractFlatObject(tokens, bodyStart);\n\t\t\tif (obj.ok) {\n\t\t\t\tif (isBodyEnd(tokens[obj.end])) {\n\t\t\t\t\treturn { kind: \"json\", value: JSON.stringify(obj.value) };\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\tlet j = bodyStart + 1;\n\t\twhile (j < tokens.length) {\n\t\t\tconst tt = tokens[j]!;\n\t\t\tif (tt.type === \"eof\") return null;\n\t\t\tif (tt.type === \"punct\" && tt.value === \"}\") return null;\n\t\t\tif (tt.type === \"ident\" && tt.value === \"return\") {\n\t\t\t\treturn tryExtractLiteral(tokens, j + 1);\n\t\t\t}\n\t\t\tif (tt.type === \"punct\" && tt.value === \";\") return null;\n\t\t\tif (tt.type === \"ident\" && tt.value !== \"return\") return null;\n\t\t\tj++;\n\t\t}\n\t\treturn null;\n\t}\n\n\treturn null;\n}\n\ninterface FlatObjectResult {\n\tok: true;\n\tend: number;\n\tvalue: Record<string, unknown>;\n}\ninterface FlatObjectError {\n\tok: false;\n}\n\nfunction extractFlatObject(\n\ttokens: Token[],\n\tbraceStart: number,\n): FlatObjectResult | FlatObjectError {\n\tlet i = braceStart + 1;\n\tconst obj: Record<string, unknown> = {};\n\tlet expectKey = true;\n\tlet key: string | null = null;\n\n\twhile (i < tokens.length) {\n\t\tconst t = tokens[i]!;\n\t\tif (t.type === \"eof\") return { ok: false };\n\n\t\tif (t.type === \"punct\" && t.value === \"}\") {\n\t\t\tif (!expectKey) return { ok: false };\n\t\t\treturn { ok: true, end: i + 1, value: obj };\n\t\t}\n\n\t\tif (expectKey) {\n\t\t\tif (t.type === \"ident\" || t.type === \"str\" || t.type === \"num\")\n\t\t\t\tkey = t.value;\n\t\t\telse return { ok: false };\n\t\t\ti++;\n\t\t\tconst colon = tokens[i];\n\t\t\tif (colon?.type !== \"punct\" || colon.value !== \":\") return { ok: false };\n\t\t\ti++;\n\t\t\texpectKey = false;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (t.type === \"str\") {\n\t\t\tobj[key!] = t.value;\n\t\t\ti++;\n\t\t} else if (t.type === \"num\") {\n\t\t\tobj[key!] = Number(t.value);\n\t\t\ti++;\n\t\t} else if (t.type === \"ident\") {\n\t\t\tif (t.value === \"true\") obj[key!] = true;\n\t\t\telse if (t.value === \"false\") obj[key!] = false;\n\t\t\telse if (t.value === \"null\") obj[key!] = null;\n\t\t\telse return { ok: false };\n\t\t\ti++;\n\t\t} else if (\n\t\t\tt.type === \"punct\" &&\n\t\t\tt.value === \"!\" &&\n\t\t\ttokens[i + 1]?.type === \"num\"\n\t\t) {\n\t\t\tconst n = tokens[i + 1]!.value;\n\t\t\tobj[key!] = n === \"1\";\n\t\t\ti += 2;\n\t\t} else if (\n\t\t\tt.type === \"punct\" &&\n\t\t\tt.value === \"-\" &&\n\t\t\ttokens[i + 1]?.type === \"num\"\n\t\t) {\n\t\t\tobj[key!] = -Number(tokens[i + 1]!.value);\n\t\t\ti += 2;\n\t\t} else {\n\t\t\treturn { ok: false };\n\t\t}\n\n\t\tconst sep = tokens[i];\n\t\tif (sep?.type === \"punct\" && sep.value === \",\") {\n\t\t\ti++;\n\t\t\texpectKey = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (sep?.type === \"punct\" && sep.value === \"}\") {\n\t\t\treturn { ok: true, end: i + 1, value: obj };\n\t\t}\n\t\treturn { ok: false };\n\t}\n\n\treturn { ok: false };\n}\n\ninterface ParamObjectResult {\n\tok: true;\n\tend: number;\n\tparts: ParamEntry[];\n}\n\nfunction extractParamObject(\n\ttokens: Token[],\n\tbraceStart: number,\n\tparamName: string | null,\n): ParamObjectResult | FlatObjectError {\n\tlet i = braceStart + 1;\n\tconst parts: ParamEntry[] = [];\n\tlet expectKey = true;\n\tlet key: string | null = null;\n\tlet hasParam = false;\n\n\twhile (i < tokens.length) {\n\t\tconst t = tokens[i]!;\n\t\tif (t.type === \"eof\") return { ok: false };\n\n\t\tif (t.type === \"punct\" && t.value === \"}\") {\n\t\t\tif (!expectKey) return { ok: false };\n\t\t\treturn hasParam ? { ok: true, end: i + 1, parts } : { ok: false };\n\t\t}\n\n\t\tif (expectKey) {\n\t\t\tif (t.type === \"ident\" || t.type === \"str\" || t.type === \"num\") {\n\t\t\t\tkey = t.value;\n\t\t\t} else {\n\t\t\t\treturn { ok: false };\n\t\t\t}\n\t\t\ti++;\n\t\t\tconst colon = tokens[i];\n\t\t\tif (colon?.type !== \"punct\" || colon.value !== \":\") return { ok: false };\n\t\t\ti++;\n\t\t\texpectKey = false;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (paramName !== null && t.type === \"ident\" && t.value === paramName) {\n\t\t\tconst dot1 = tokens[i + 1];\n\t\t\tconst pIdent = tokens[i + 2];\n\t\t\tconst dot2 = tokens[i + 3];\n\t\t\tconst pKey = tokens[i + 4];\n\t\t\tif (\n\t\t\t\tdot1?.type === \"punct\" &&\n\t\t\t\t(dot1.value === \".\" || dot1.value === \"?.\") &&\n\t\t\t\tpIdent?.type === \"ident\" &&\n\t\t\t\tpIdent.value === \"params\" &&\n\t\t\t\tdot2?.type === \"punct\" &&\n\t\t\t\t(dot2.value === \".\" || dot2.value === \"?.\") &&\n\t\t\t\tpKey?.type === \"ident\"\n\t\t\t) {\n\t\t\t\thasParam = true;\n\t\t\t\tparts.push({ key: key!, isParam: true, paramKey: pKey.value });\n\t\t\t\ti += 5;\n\t\t\t\tconst sep = tokens[i];\n\t\t\t\tif (sep?.type === \"punct\" && sep.value === \",\") {\n\t\t\t\t\ti++;\n\t\t\t\t\texpectKey = true;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (sep?.type === \"punct\" && sep.value === \"}\") {\n\t\t\t\t\treturn { ok: true, end: i + 1, parts };\n\t\t\t\t}\n\t\t\t\treturn { ok: false };\n\t\t\t}\n\t\t}\n\n\t\tif (t.type === \"ident\" && t.value === \"params\") {\n\t\t\tconst dot = tokens[i + 1];\n\t\t\tconst pKey = tokens[i + 2];\n\t\t\tif (\n\t\t\t\tdot?.type === \"punct\" &&\n\t\t\t\t(dot.value === \".\" || dot.value === \"?.\") &&\n\t\t\t\tpKey?.type === \"ident\"\n\t\t\t) {\n\t\t\t\thasParam = true;\n\t\t\t\tparts.push({ key: key!, isParam: true, paramKey: pKey.value });\n\t\t\t\ti += 3;\n\t\t\t\tconst sep = tokens[i];\n\t\t\t\tif (sep?.type === \"punct\" && sep.value === \",\") {\n\t\t\t\t\ti++;\n\t\t\t\t\texpectKey = true;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (sep?.type === \"punct\" && sep.value === \"}\") {\n\t\t\t\t\treturn { ok: true, end: i + 1, parts };\n\t\t\t\t}\n\t\t\t\treturn { ok: false };\n\t\t\t}\n\t\t}\n\n\t\tif (t.type === \"str\") {\n\t\t\tparts.push({\n\t\t\t\tkey: key!,\n\t\t\t\tisParam: false,\n\t\t\t\tliteralValue: JSON.stringify(t.value),\n\t\t\t});\n\t\t\ti++;\n\t\t} else if (t.type === \"num\") {\n\t\t\tparts.push({\n\t\t\t\tkey: key!,\n\t\t\t\tisParam: false,\n\t\t\t\tliteralValue: t.value,\n\t\t\t});\n\t\t\ti++;\n\t\t} else if (t.type === \"ident\") {\n\t\t\tif (t.value === \"true\" || t.value === \"false\" || t.value === \"null\") {\n\t\t\t\tparts.push({\n\t\t\t\t\tkey: key!,\n\t\t\t\t\tisParam: false,\n\t\t\t\t\tliteralValue: t.value,\n\t\t\t\t});\n\t\t\t\ti++;\n\t\t\t} else {\n\t\t\t\treturn { ok: false };\n\t\t\t}\n\t\t} else if (\n\t\t\tt.type === \"punct\" &&\n\t\t\tt.value === \"!\" &&\n\t\t\ttokens[i + 1]?.type === \"num\"\n\t\t) {\n\t\t\tparts.push({\n\t\t\t\tkey: key!,\n\t\t\t\tisParam: false,\n\t\t\t\tliteralValue: tokens[i + 1]!.value === \"1\" ? \"true\" : \"false\",\n\t\t\t});\n\t\t\ti += 2;\n\t\t} else if (\n\t\t\tt.type === \"punct\" &&\n\t\t\tt.value === \"-\" &&\n\t\t\ttokens[i + 1]?.type === \"num\"\n\t\t) {\n\t\t\tparts.push({\n\t\t\t\tkey: key!,\n\t\t\t\tisParam: false,\n\t\t\t\tliteralValue: `-${tokens[i + 1]!.value}`,\n\t\t\t});\n\t\t\ti += 2;\n\t\t} else {\n\t\t\treturn { ok: false };\n\t\t}\n\n\t\tconst sep = tokens[i];\n\t\tif (sep?.type === \"punct\" && sep.value === \",\") {\n\t\t\ti++;\n\t\t\texpectKey = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (sep?.type === \"punct\" && sep.value === \"}\") {\n\t\t\treturn hasParam ? { ok: true, end: i + 1, parts } : { ok: false };\n\t\t}\n\t\treturn { ok: false };\n\t}\n\n\treturn { ok: false };\n}\n\nfunction buildParamSerializer(parts: ParamEntry[]): ParamSerializer {\n\tconst chunks: string[] = [];\n\tconst keys: string[] = [];\n\tlet current = \"{\";\n\n\tfor (let i = 0; i < parts.length; i++) {\n\t\tconst part = parts[i]!;\n\t\tif (i > 0) current += \",\";\n\t\tcurrent += `${JSON.stringify(part.key)}:`;\n\n\t\tif (part.isParam) {\n\t\t\tcurrent += '\"';\n\t\t\tchunks.push(current);\n\t\t\tkeys.push(part.paramKey!);\n\t\t\tcurrent = '\"';\n\t\t} else {\n\t\t\tcurrent += part.literalValue!;\n\t\t}\n\t}\n\tcurrent += \"}\";\n\tchunks.push(current);\n\n\tif (keys.length === 1) {\n\t\tconst c0 = chunks[0]!;\n\t\tconst c1 = chunks[1]!;\n\t\tconst k0 = keys[0]!;\n\t\treturn (p: Record<string, string> | string) =>\n\t\t\tc0 + escapeJsonString(typeof p === \"string\" ? p : (p[k0] ?? \"\")) + c1;\n\t}\n\n\tif (keys.length === 2) {\n\t\tconst c0 = chunks[0]!;\n\t\tconst c1 = chunks[1]!;\n\t\tconst c2 = chunks[2]!;\n\t\tconst k0 = keys[0]!;\n\t\tconst k1 = keys[1]!;\n\t\treturn (p: Record<string, string> | string) =>\n\t\t\t`${c0}${escapeJsonString(typeof p === \"string\" ? p : (p[k0] ?? \"\"))}${c1}${typeof p === \"string\" ? \"\" : escapeJsonString(p[k1] ?? \"\")}${c2}`;\n\t}\n\n\treturn (p: Record<string, string> | string) => {\n\t\tlet out = chunks[0]!;\n\t\tfor (let j = 0; j < keys.length; j++) {\n\t\t\tout +=\n\t\t\t\tescapeJsonString(\n\t\t\t\t\ttypeof p === \"string\" ? (j === 0 ? p : \"\") : (p[keys[j]!] ?? \"\"),\n\t\t\t\t) + chunks[j + 1]!;\n\t\t}\n\t\treturn out;\n\t};\n}\n\ninterface ParamSerializerResult {\n\tserializer: ParamSerializer;\n\tparts: ParamEntry[];\n}\n\nfunction tryExtractParamSerializer(\n\ttokens: Token[],\n\tbodyStart: number,\n\tparamName: string | null,\n): ParamSerializerResult | null {\n\tconst t = tokens[bodyStart];\n\tif (!t || t.type === \"eof\") return null;\n\n\tif (t.type === \"punct\" && t.value === \"(\") {\n\t\tconst inner = tokens[bodyStart + 1];\n\t\tif (inner?.type === \"punct\" && inner.value === \"{\") {\n\t\t\tconst res = extractParamObject(tokens, bodyStart + 1, paramName);\n\t\t\tif (!res.ok) return null;\n\t\t\tconst afterBrace = tokens[res.end];\n\t\t\tif (afterBrace?.type !== \"punct\" || afterBrace.value !== \")\") return null;\n\t\t\tif (!isBodyEnd(tokens[res.end + 1])) return null;\n\t\t\treturn { serializer: buildParamSerializer(res.parts), parts: res.parts };\n\t\t}\n\t\treturn null;\n\t}\n\n\tif (t.type === \"punct\" && t.value === \"{\") {\n\t\tconst next = tokens[bodyStart + 1];\n\t\tif (\n\t\t\tnext &&\n\t\t\t(next.type === \"ident\" || next.type === \"str\" || next.type === \"num\") &&\n\t\t\ttokens[bodyStart + 2]?.type === \"punct\" &&\n\t\t\ttokens[bodyStart + 2]!.value === \":\"\n\t\t) {\n\t\t\tconst res = extractParamObject(tokens, bodyStart, paramName);\n\t\t\tif (res.ok && isBodyEnd(tokens[res.end])) {\n\t\t\t\treturn {\n\t\t\t\t\tserializer: buildParamSerializer(res.parts),\n\t\t\t\t\tparts: res.parts,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\tlet j = bodyStart + 1;\n\t\twhile (j < tokens.length) {\n\t\t\tconst tt = tokens[j]!;\n\t\t\tif (tt.type === \"eof\") return null;\n\t\t\tif (tt.type === \"punct\" && tt.value === \"}\") return null;\n\t\t\tif (tt.type === \"ident\" && tt.value === \"return\") {\n\t\t\t\treturn tryExtractParamSerializer(tokens, j + 1, paramName);\n\t\t\t}\n\t\t\tif (tt.type === \"punct\" && tt.value === \";\") return null;\n\t\t\tif (tt.type === \"ident\" && tt.value !== \"return\") return null;\n\t\t\tj++;\n\t\t}\n\t\treturn null;\n\t}\n\n\treturn null;\n}\n\nfunction makeUnknown(): HandlerAnalysis {\n\treturn {\n\t\tisNoArg: false,\n\t\tcontextProps: new Set(),\n\t\thasDynamicAccess: true,\n\t\tisDestructured: false,\n\t\tdestructuredProps: new Set(),\n\t\tliteral: null,\n\t\targlessJsonCall: false,\n\t\tparamSerializer: null,\n\t\tparamParts: null,\n\t};\n}\n",
|
|
15
|
+
"import type { Server } from \"bun\";\n\nexport interface ShutdownResult {\n\tforced: boolean;\n\tpending: number;\n}\n\nexport async function stopServer(\n\tserver: Server<unknown>,\n\thardTimeoutMs: number,\n): Promise<ShutdownResult> {\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet forced = false;\n\tlet stopPromise: Promise<void> | null = null;\n\n\ttry {\n\t\tstopPromise = Promise.resolve(server.stop()).then(() => {});\n\t\tawait Promise.race([\n\t\t\tstopPromise,\n\t\t\tnew Promise<void>((resolve) => {\n\t\t\t\ttimer = setTimeout(() => {\n\t\t\t\t\tforced = true;\n\t\t\t\t\tstopPromise = Promise.resolve(server.stop(true)).then(() => {});\n\t\t\t\t\tresolve();\n\t\t\t\t}, hardTimeoutMs);\n\t\t\t\ttimer?.unref?.();\n\t\t\t}),\n\t\t]);\n\t} finally {\n\t\tif (timer !== undefined) {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t}\n\n\tawait stopPromise;\n\n\treturn {\n\t\tforced,\n\t\tpending: 0,\n\t};\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\t\"barq.match.not-allowed\",\n);\n\nexport type RouteParams = Record<string, string> & {\n\t[MATCH_HANDLER]?: ResponseHandler;\n};\n\nexport interface NotAllowed {\n\treadonly [MATCH_NOT_ALLOWED]: string;\n}\n\nexport type RouteResult = ResponseHandler | RouteParams | NotAllowed | null;\n\nconst METHOD_BITS: Record<HttpMethod, number> = {\n\tGET: 1 << 0,\n\tPOST: 1 << 1,\n\tPUT: 1 << 2,\n\tDELETE: 1 << 3,\n\tPATCH: 1 << 4,\n\tHEAD: 1 << 5,\n\tOPTIONS: 1 << 6,\n};\n\nconst STATIC_CHILD_SCAN_THRESHOLD = 4;\n\nfunction methodBit(method: HttpMethod): number {\n\treturn METHOD_BITS[method] ?? 0;\n}\n\ninterface TrieNode {\n\tstaticChildren: Map<string, TrieNode> | null;\n\tstaticChildKeys: string[];\n\tstaticChildNodes: TrieNode[];\n\tparamChildren: Map<string, TrieNode> | null;\n\tparamChild: TrieNode | null;\n\tparamName: string | null;\n\twildcardChild: TrieNode | null;\n\twildcardName: string | null;\n\thandlers: Record<string, ResponseHandler> | null;\n\tallow: string | null;\n\tnotAllowed: NotAllowed | null;\n}\n\nfunction createNode(): TrieNode {\n\treturn {\n\t\tstaticChildren: null,\n\t\tstaticChildKeys: [],\n\t\tstaticChildNodes: [],\n\t\tparamChildren: null,\n\t\tparamChild: null,\n\t\tparamName: null,\n\t\twildcardChild: null,\n\t\twildcardName: null,\n\t\thandlers: null,\n\t\tallow: null,\n\t\tnotAllowed: null,\n\t};\n}\n\nfunction cloneNode(node: TrieNode): TrieNode {\n\tconst staticChildren = node.staticChildren\n\t\t? new Map(\n\t\t\t\tArray.from(node.staticChildren, ([key, child]) => [\n\t\t\t\t\tkey,\n\t\t\t\t\tcloneNode(child),\n\t\t\t\t]),\n\t\t\t)\n\t\t: null;\n\tconst staticChildKeys = node.staticChildKeys.slice();\n\tconst staticChildNodes = staticChildren\n\t\t? staticChildKeys.map((key) => staticChildren.get(key)!)\n\t\t: [];\n\tconst paramChildren = node.paramChildren\n\t\t? new Map(\n\t\t\t\tArray.from(node.paramChildren, ([name, child]) => [\n\t\t\t\t\tname,\n\t\t\t\t\tcloneNode(child),\n\t\t\t\t]),\n\t\t\t)\n\t\t: null;\n\tlet handlers: Record<string, ResponseHandler> | null = null;\n\tif (node.handlers !== null) {\n\t\thandlers = Object.assign(Object.create(null), node.handlers) as Record<\n\t\t\tstring,\n\t\t\tResponseHandler\n\t\t>;\n\t}\n\treturn {\n\t\tstaticChildren,\n\t\tstaticChildKeys,\n\t\tstaticChildNodes,\n\t\tparamChildren,\n\t\tparamChild: node.paramChild ? cloneNode(node.paramChild) : null,\n\t\tparamName: node.paramName,\n\t\twildcardChild: node.wildcardChild ? cloneNode(node.wildcardChild) : null,\n\t\twildcardName: node.wildcardName,\n\t\thandlers,\n\t\tallow: node.allow,\n\t\tnotAllowed: node.notAllowed,\n\t};\n}\n\ntype PatternSegment =\n\t| { readonly kind: \"static\"; readonly value: string }\n\t| {\n\t\t\treadonly kind: \"param\";\n\t\t\treadonly name: string;\n\t\t\treadonly optional?: boolean;\n\t }\n\t| { readonly kind: \"wildcard\"; readonly name: string | null };\n\nconst MAX_OPTIONAL_PARAMS = 8;\n\nexport function parsePattern(pattern: string): PatternSegment[] {\n\tif (pattern.length === 0 || pattern.charCodeAt(0) !== 47) {\n\t\tthrow new Error(`Invalid route pattern \"${pattern}\": must start with /`);\n\t}\n\tif (pattern.indexOf(\"#\") !== -1) {\n\t\tthrow new Error(`Invalid route pattern \"${pattern}\": must not contain #`);\n\t}\n\tlet p = pattern;\n\tif (p.length > 1 && p.charCodeAt(p.length - 1) === 47) {\n\t\tp = p.slice(0, -1);\n\t}\n\n\tconst segments: PatternSegment[] = [];\n\tconst names = new Set<string>();\n\tlet i = 1;\n\twhile (i < p.length) {\n\t\tconst slash = p.indexOf(\"/\", i);\n\t\tconst end = slash === -1 ? p.length : slash;\n\t\tconst seg = p.slice(i, end);\n\t\tif (seg.length === 0) {\n\t\t\tthrow new Error(`Invalid route pattern \"${pattern}\": empty segment (//)`);\n\t\t}\n\t\tconst c0 = seg.charCodeAt(0);\n\t\tif (\n\t\t\tseg.includes(\"?\") &&\n\t\t\t!(c0 === 58 && seg.endsWith(\"?\") && seg.indexOf(\"?\") === seg.length - 1)\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid route pattern \"${pattern}\": malformed optional parameter`,\n\t\t\t);\n\t\t}\n\t\tif (c0 === 58) {\n\t\t\tconst optional = seg.endsWith(\"?\");\n\t\t\tconst name = optional ? seg.slice(1, -1) : seg.slice(1);\n\t\t\tif (name.length === 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid route pattern \"${pattern}\": empty parameter name in segment \":${name}\"`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (names.has(name)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid route pattern \"${pattern}\": duplicate parameter name \"${name}\"`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tnames.add(name);\n\t\t\tif (name.includes(\"?\")) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid route pattern \"${pattern}\": malformed optional parameter`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tsegments.push(\n\t\t\t\toptional\n\t\t\t\t\t? { kind: \"param\", name, optional: true }\n\t\t\t\t\t: { kind: \"param\", name },\n\t\t\t);\n\t\t} else if (c0 === 42) {\n\t\t\tif (end !== p.length) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid route pattern \"${pattern}\": wildcard * must be the final segment`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst name = seg.length > 1 ? seg.slice(1) : null;\n\t\t\tif (name !== null) {\n\t\t\t\tif (names.has(name)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Invalid route pattern \"${pattern}\": duplicate parameter name \"${name}\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tnames.add(name);\n\t\t\t}\n\t\t\tsegments.push({ kind: \"wildcard\", name });\n\t\t} else {\n\t\t\tsegments.push({ kind: \"static\", value: seg });\n\t\t}\n\t\ti = end + 1;\n\t}\n\tconst optionalCount = segments.reduce(\n\t\t(count, segment) =>\n\t\t\tcount + (segment.kind === \"param\" && segment.optional ? 1 : 0),\n\t\t0,\n\t);\n\tif (optionalCount > MAX_OPTIONAL_PARAMS) {\n\t\tthrow new RangeError(\n\t\t\t`Route pattern exceeds the limit of ${MAX_OPTIONAL_PARAMS} optional parameters`,\n\t\t);\n\t}\n\treturn segments;\n}\n\nfunction _segmentEquals(\n\tpath: string,\n\tstart: number,\n\tend: number,\n\tkey: string,\n): boolean {\n\tconst n = end - start;\n\tif (key.length !== n) return false;\n\tfor (let i = 0; i < n; i++) {\n\t\tif (path.charCodeAt(start + i) !== key.charCodeAt(i)) return false;\n\t}\n\treturn true;\n}\n\nfunction decodeParam(raw: string): string {\n\tif (raw.indexOf(\"%\") === -1) return raw;\n\ttry {\n\t\treturn decodeURIComponent(raw);\n\t} catch {\n\t\tthrow new HttpError(400, { error: \"Bad Request\" });\n\t}\n}\n\nfunction matchNode(\n\trootNode: TrieNode,\n\tpathname: string,\n\tstartI: number,\n\tmethod: string,\n\tparamNames: string[],\n\tparamValues: string[],\n\tstartDepth: number,\n): RouteResult {\n\tlet node = rootNode;\n\tlet i = startI;\n\tconst depth = startDepth;\n\twhile (true) {\n\t\tconst len = pathname.length;\n\t\tif (i >= len) {\n\t\t\tconst handlers = node.handlers;\n\t\t\tif (handlers === null) return null;\n\n\t\t\tlet handler = handlers[method];\n\t\t\tif (handler === undefined && method === \"HEAD\") {\n\t\t\t\thandler = handlers.GET;\n\t\t\t}\n\t\t\tif (handler === undefined) {\n\t\t\t\treturn node.notAllowed;\n\t\t\t}\n\t\t\tif (depth === 0) return handler;\n\n\t\t\tconst p = Object.create(null) as RouteParams;\n\t\t\tp[MATCH_HANDLER] = handler;\n\t\t\tfor (let k = 0; k < depth; k++) {\n\t\t\t\tp[paramNames[k]!] = paramValues[k]!;\n\t\t\t}\n\t\t\treturn p;\n\t\t}\n\n\t\tconst slash = pathname.indexOf(\"/\", i);\n\t\tconst segEnd = slash === -1 ? len : slash;\n\n\t\tif (segEnd === i) {\n\t\t\tif (slash === len - 1) {\n\t\t\t\treturn matchNode(\n\t\t\t\t\tnode,\n\t\t\t\t\tpathname,\n\t\t\t\t\tlen,\n\t\t\t\t\tmethod,\n\t\t\t\t\tparamNames,\n\t\t\t\t\tparamValues,\n\t\t\t\t\tdepth,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tconst nextI = slash === -1 ? len : slash + 1;\n\t\tlet notAllowedCandidate: NotAllowed | null = null;\n\n\t\tconst staticChildren = node.staticChildren;\n\t\tif (staticChildren !== null) {\n\t\t\tlet child: TrieNode | undefined;\n\t\t\tif (staticChildren.size <= STATIC_CHILD_SCAN_THRESHOLD) {\n\t\t\t\tconst keys = node.staticChildKeys;\n\t\t\t\tconst nodes = node.staticChildNodes;\n\t\t\t\tfor (let childIndex = 0; childIndex < keys.length; childIndex++) {\n\t\t\t\t\tif (_segmentEquals(pathname, i, segEnd, keys[childIndex]!)) {\n\t\t\t\t\t\tchild = nodes[childIndex];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tchild = staticChildren.get(pathname.slice(i, segEnd));\n\t\t\t}\n\t\t\tif (child !== undefined) {\n\t\t\t\tconst hasParamChildren =\n\t\t\t\t\tnode.paramChild !== null ||\n\t\t\t\t\t(node.paramChildren !== null && node.paramChildren.size > 0);\n\t\t\t\tif (!hasParamChildren && node.wildcardChild === null) {\n\t\t\t\t\tnode = child;\n\t\t\t\t\ti = nextI;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst res = matchNode(\n\t\t\t\t\tchild,\n\t\t\t\t\tpathname,\n\t\t\t\t\tnextI,\n\t\t\t\t\tmethod,\n\t\t\t\t\tparamNames,\n\t\t\t\t\tparamValues,\n\t\t\t\t\tdepth,\n\t\t\t\t);\n\t\t\t\tif (res !== null) {\n\t\t\t\t\tif (MATCH_NOT_ALLOWED in res) {\n\t\t\t\t\t\tnotAllowedCandidate = res as NotAllowed;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn res;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (node.paramChild !== null && node.paramName !== null) {\n\t\t\tconst child = node.paramChild;\n\t\t\tconst paramName = node.paramName;\n\n\t\t\tif (nextI >= len && child.handlers !== null) {\n\t\t\t\tlet leafH = child.handlers[method];\n\t\t\t\tif (leafH === undefined && method === \"HEAD\")\n\t\t\t\t\tleafH = child.handlers.GET;\n\t\t\t\tif (leafH !== undefined) {\n\t\t\t\t\tconst paramVal =\n\t\t\t\t\t\tpathname.indexOf(\"%\", i) !== -1\n\t\t\t\t\t\t\t? decodeParam(pathname.slice(i, segEnd))\n\t\t\t\t\t\t\t: pathname.slice(i, segEnd);\n\t\t\t\t\tconst p: RouteParams = {\n\t\t\t\t\t\t[paramName]: paramVal,\n\t\t\t\t\t\t[MATCH_HANDLER]: leafH,\n\t\t\t\t\t};\n\t\t\t\t\tif (depth === 0) return p;\n\t\t\t\t\tfor (let k = 0; k < depth; k++) {\n\t\t\t\t\t\tp[paramNames[k]!] = paramValues[k]!;\n\t\t\t\t\t}\n\t\t\t\t\treturn p;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tparamNames[depth] = paramName;\n\t\t\tparamValues[depth] = decodeParam(pathname.slice(i, segEnd));\n\n\t\t\tconst res = matchNode(\n\t\t\t\tchild,\n\t\t\t\tpathname,\n\t\t\t\tnextI,\n\t\t\t\tmethod,\n\t\t\t\tparamNames,\n\t\t\t\tparamValues,\n\t\t\t\tdepth + 1,\n\t\t\t);\n\t\t\tif (res !== null) {\n\t\t\t\tif (MATCH_NOT_ALLOWED in res) {\n\t\t\t\t\tnotAllowedCandidate ??= res as NotAllowed;\n\t\t\t\t} else {\n\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (node.paramChildren !== null && node.paramChildren.size > 0) {\n\t\t\tfor (const [paramName, child] of node.paramChildren) {\n\t\t\t\tif (nextI >= len && child.handlers !== null) {\n\t\t\t\t\tlet leafH = child.handlers[method];\n\t\t\t\t\tif (leafH === undefined && method === \"HEAD\")\n\t\t\t\t\t\tleafH = child.handlers.GET;\n\t\t\t\t\tif (leafH !== undefined) {\n\t\t\t\t\t\tconst paramVal =\n\t\t\t\t\t\t\tpathname.indexOf(\"%\", i) !== -1\n\t\t\t\t\t\t\t\t? decodeParam(pathname.slice(i, segEnd))\n\t\t\t\t\t\t\t\t: pathname.slice(i, segEnd);\n\t\t\t\t\t\tconst p: RouteParams = {\n\t\t\t\t\t\t\t[paramName]: paramVal,\n\t\t\t\t\t\t\t[MATCH_HANDLER]: leafH,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif (depth === 0) return p;\n\t\t\t\t\t\tfor (let k = 0; k < depth; k++) {\n\t\t\t\t\t\t\tp[paramNames[k]!] = paramValues[k]!;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn p;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tparamNames[depth] = paramName;\n\t\t\t\tparamValues[depth] = decodeParam(pathname.slice(i, segEnd));\n\n\t\t\t\tconst res = matchNode(\n\t\t\t\t\tchild,\n\t\t\t\t\tpathname,\n\t\t\t\t\tnextI,\n\t\t\t\t\tmethod,\n\t\t\t\t\tparamNames,\n\t\t\t\t\tparamValues,\n\t\t\t\t\tdepth + 1,\n\t\t\t\t);\n\t\t\t\tif (res !== null) {\n\t\t\t\t\tif (MATCH_NOT_ALLOWED in res) {\n\t\t\t\t\t\tnotAllowedCandidate ??= res as NotAllowed;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn res;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (node.wildcardChild !== null) {\n\t\t\tlet wildcardDepth = depth;\n\t\t\tif (node.wildcardName !== null) {\n\t\t\t\tlet rest = pathname.slice(i);\n\t\t\t\tif (rest.length > 1 && rest.charCodeAt(rest.length - 1) === 47) {\n\t\t\t\t\trest = rest.slice(0, -1);\n\t\t\t\t}\n\t\t\t\tparamNames[wildcardDepth] = node.wildcardName;\n\t\t\t\tparamValues[wildcardDepth] = decodeParam(rest);\n\t\t\t\twildcardDepth++;\n\t\t\t}\n\t\t\tconst handlers = node.wildcardChild.handlers;\n\t\t\tif (handlers !== null) {\n\t\t\t\tlet handler = handlers[method];\n\t\t\t\tif (handler === undefined && method === \"HEAD\") {\n\t\t\t\t\thandler = handlers.GET;\n\t\t\t\t}\n\t\t\t\tif (handler === undefined) {\n\t\t\t\t\treturn node.wildcardChild.notAllowed;\n\t\t\t\t}\n\t\t\t\tif (wildcardDepth === 0) return handler;\n\n\t\t\t\tconst p = Object.create(null) as RouteParams;\n\t\t\t\tfor (let k = 0; k < wildcardDepth; k++) {\n\t\t\t\t\tp[paramNames[k]!] = paramValues[k]!;\n\t\t\t\t}\n\t\t\t\tp[MATCH_HANDLER] = handler;\n\t\t\t\treturn p;\n\t\t\t}\n\t\t}\n\n\t\treturn notAllowedCandidate;\n\t}\n}\n\nexport class SegmentTrie {\n\tprivate root: TrieNode = createNode();\n\tprivate staticRoutes = new Map<string, Record<string, ResponseHandler>>();\n\tprivate staticNotAllowed = new Map<string, NotAllowed>();\n\tprivate maxStaticLength = 0;\n\tprivate readonly paramNameBuffer: string[] = [];\n\tprivate readonly paramValueBuffer: string[] = [];\n\n\taddBatch(\n\t\troutes: readonly {\n\t\t\tmethod: HttpMethod;\n\t\t\tpattern: string;\n\t\t\thandler: ResponseHandler;\n\t\t}[],\n\t): void {\n\t\tif (routes.length === 0) return;\n\t\tif (routes.length === 1) {\n\t\t\tconst route = routes[0]!;\n\t\t\tthis.add(route.method, route.pattern, route.handler);\n\t\t\treturn;\n\t\t}\n\n\t\tconst staged = this.clone();\n\t\tconst parsedPatterns = new Map<string, readonly PatternSegment[]>();\n\t\tfor (const route of routes) {\n\t\t\tlet segments = parsedPatterns.get(route.pattern);\n\t\t\tif (segments === undefined) {\n\t\t\t\tsegments = parsePattern(route.pattern);\n\t\t\t\tparsedPatterns.set(route.pattern, segments);\n\t\t\t}\n\t\t\tstaged.addWithSegments(\n\t\t\t\troute.method,\n\t\t\t\troute.pattern,\n\t\t\t\tsegments,\n\t\t\t\troute.handler,\n\t\t\t);\n\t\t}\n\t\tthis.root = staged.root;\n\t\tthis.staticRoutes = staged.staticRoutes;\n\t\tthis.staticNotAllowed = staged.staticNotAllowed;\n\t\tthis.maxStaticLength = staged.maxStaticLength;\n\t}\n\n\tprivate clone(): SegmentTrie {\n\t\tconst copy = new SegmentTrie();\n\t\tcopy.root = cloneNode(this.root);\n\t\tcopy.staticRoutes = new Map(\n\t\t\tArray.from(this.staticRoutes, ([path, handlers]) => [\n\t\t\t\tpath,\n\t\t\t\tObject.assign(Object.create(null), handlers) as Record<\n\t\t\t\t\tstring,\n\t\t\t\t\tResponseHandler\n\t\t\t\t>,\n\t\t\t]),\n\t\t);\n\t\tcopy.staticNotAllowed = new Map(this.staticNotAllowed);\n\t\tcopy.maxStaticLength = this.maxStaticLength;\n\t\treturn copy;\n\t}\n\n\tadd(method: HttpMethod, pattern: string, handler: ResponseHandler): void {\n\t\tconst segments = parsePattern(pattern);\n\t\tlet optionalCount = 0;\n\t\tfor (const segment of segments) {\n\t\t\tif (segment.kind === \"param\" && segment.optional) optionalCount++;\n\t\t}\n\t\tif (optionalCount === 0) {\n\t\t\tthis.addParsed(method, pattern, segments, handler, false);\n\t\t\treturn;\n\t\t}\n\n\t\tconst staged = this.clone();\n\t\tstaged.addWithSegments(method, pattern, segments, handler);\n\t\tthis.root = staged.root;\n\t\tthis.staticRoutes = staged.staticRoutes;\n\t\tthis.staticNotAllowed = staged.staticNotAllowed;\n\t}\n\n\tprivate addWithSegments(\n\t\tmethod: HttpMethod,\n\t\tpattern: string,\n\t\tsegments: readonly PatternSegment[],\n\t\thandler: ResponseHandler,\n\t): void {\n\t\tlet optionalCount = 0;\n\t\tfor (const segment of segments) {\n\t\t\tif (segment.kind === \"param\" && segment.optional) optionalCount++;\n\t\t}\n\t\tif (optionalCount === 0) {\n\t\t\tthis.addParsed(method, pattern, segments, handler, false);\n\t\t\treturn;\n\t\t}\n\n\t\tconst selected: PatternSegment[] = [];\n\t\tconst addVariants = (index: number): void => {\n\t\t\tif (index === segments.length) {\n\t\t\t\tconst variant =\n\t\t\t\t\tselected.length === 0\n\t\t\t\t\t\t? \"/\"\n\t\t\t\t\t\t: `/${selected.map((segment) => (segment.kind === \"static\" ? segment.value : segment.kind === \"param\" ? `:${segment.name}` : `*${segment.name ?? \"\"}`)).join(\"/\")}`;\n\t\t\t\tthis.addParsed(method, variant, selected, handler, true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst segment = segments[index]!;\n\t\t\tif (segment.kind === \"param\" && segment.optional) {\n\t\t\t\tselected.push({ kind: \"param\", name: segment.name });\n\t\t\t\taddVariants(index + 1);\n\t\t\t\tselected.pop();\n\t\t\t\taddVariants(index + 1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tselected.push(segment);\n\t\t\taddVariants(index + 1);\n\t\t\tselected.pop();\n\t\t};\n\t\taddVariants(0);\n\t}\n\n\tprivate addParsed(\n\t\tmethod: HttpMethod,\n\t\tpattern: string,\n\t\tsegments: readonly PatternSegment[],\n\t\thandler: ResponseHandler,\n\t\t_allowConflictingParamNames: boolean,\n\t): void {\n\t\tconst bit = methodBit(method);\n\t\tif (bit === 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`Unsupported HTTP method \"${method}\" for route \"${pattern}\"`,\n\t\t\t);\n\t\t}\n\n\t\tconst isPureStatic = segments.every((s) => s.kind === \"static\");\n\t\tlet cleanPattern: string;\n\t\tif (isPureStatic) {\n\t\t\tcleanPattern =\n\t\t\t\tpattern.length > 1 && pattern.charCodeAt(pattern.length - 1) === 47\n\t\t\t\t\t? pattern.slice(0, -1)\n\t\t\t\t\t: pattern;\n\t\t\tif (cleanPattern.length > this.maxStaticLength) {\n\t\t\t\tthis.maxStaticLength = cleanPattern.length;\n\t\t\t}\n\t\t}\n\n\t\tlet node = this.root;\n\t\tfor (const seg of segments) {\n\t\t\tif (seg.kind === \"static\") {\n\t\t\t\tif (node.staticChildren === null) {\n\t\t\t\t\tnode.staticChildren = new Map();\n\t\t\t\t}\n\t\t\t\tlet child = node.staticChildren.get(seg.value);\n\t\t\t\tif (child === undefined) {\n\t\t\t\t\tchild = createNode();\n\t\t\t\t\tnode.staticChildren.set(seg.value, child);\n\t\t\t\t\tnode.staticChildKeys.push(seg.value);\n\t\t\t\t\tnode.staticChildNodes.push(child);\n\t\t\t\t}\n\t\t\t\tnode = child;\n\t\t\t} else if (seg.kind === \"param\") {\n\t\t\t\tif (node.wildcardChild !== null) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Ambiguous routes: wildcard \"${node.wildcardName ?? \"*\"}\" and param \":${seg.name}\" compete at the same position in \"${pattern}\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (node.paramChildren === null) {\n\t\t\t\t\tnode.paramChildren = new Map();\n\t\t\t\t}\n\t\t\t\tlet child = node.paramChildren.get(seg.name);\n\t\t\t\tif (child === undefined) {\n\t\t\t\t\tchild = createNode();\n\t\t\t\t\tnode.paramChildren.set(seg.name, child);\n\t\t\t\t\tif (node.paramChild === null && node.paramChildren.size === 1) {\n\t\t\t\t\t\tnode.paramChild = child;\n\t\t\t\t\t\tnode.paramName = seg.name;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnode.paramChild = null;\n\t\t\t\t\t\tnode.paramName = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnode = child;\n\t\t\t} else {\n\t\t\t\tif (node.wildcardChild !== null) {\n\t\t\t\t\tif (node.wildcardName !== seg.name) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Conflicting wildcards at the same position: \"*${node.wildcardName ?? \"\"}\" vs \"*${seg.name ?? \"\"}\" (route \"${pattern}\")`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (node.paramChildren !== null && node.paramChildren.size > 0) {\n\t\t\t\t\t\tconst existingParam = node.paramChildren.keys().next().value;\n\t\t\t\t\t\tif (existingParam !== undefined) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Ambiguous routes: param \":${existingParam}\" and wildcard \"*${seg.name ?? \"\"}\" compete at the same position in \"${pattern}\"`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnode.wildcardChild = createNode();\n\t\t\t\t\tnode.wildcardName = seg.name;\n\t\t\t\t}\n\t\t\t\tnode = node.wildcardChild;\n\t\t\t}\n\t\t}\n\n\t\tif (node.handlers?.[method] !== undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`Duplicate route: ${method} ${pattern} is already registered`,\n\t\t\t);\n\t\t}\n\t\tif (node.handlers === null) node.handlers = Object.create(null);\n\t\tnode.handlers![method] = handler;\n\t\tnode.allow = SegmentTrie.computeAllow(node.handlers!);\n\t\tnode.notAllowed = Object.freeze({\n\t\t\t[MATCH_NOT_ALLOWED]: node.allow,\n\t\t}) as NotAllowed;\n\n\t\tif (isPureStatic) {\n\t\t\tlet sHandlers = this.staticRoutes.get(cleanPattern!);\n\t\t\tif (sHandlers === undefined) {\n\t\t\t\tsHandlers = Object.create(null) as Record<string, ResponseHandler>;\n\t\t\t\tthis.staticRoutes.set(cleanPattern!, sHandlers);\n\t\t\t}\n\t\t\tsHandlers[method] = handler;\n\t\t\tconst sAllow = SegmentTrie.computeAllow(sHandlers);\n\t\t\tthis.staticNotAllowed.set(\n\t\t\t\tcleanPattern!,\n\t\t\t\tObject.freeze({ [MATCH_NOT_ALLOWED]: sAllow }) as NotAllowed,\n\t\t\t);\n\t\t}\n\t}\n\n\tstatic computeAllow(handlers: Record<string, ResponseHandler>): string {\n\t\tconst methods = Object.keys(handlers);\n\t\tif (methods.includes(\"GET\") && !methods.includes(\"HEAD\")) {\n\t\t\treturn [...methods, \"HEAD\"].join(\", \");\n\t\t}\n\t\treturn methods.join(\", \");\n\t}\n\n\tmatch(method: string, pathname: string): RouteResult {\n\t\tconst len = pathname.length;\n\t\tconst cleanPath =\n\t\t\tlen > 1 && pathname.charCodeAt(len - 1) === 47\n\t\t\t\t? pathname.slice(0, -1)\n\t\t\t\t: pathname;\n\n\t\tif (cleanPath.length <= this.maxStaticLength) {\n\t\t\tconst sHandlers = this.staticRoutes.get(cleanPath);\n\t\t\tif (sHandlers !== undefined) {\n\t\t\t\tlet handler = sHandlers[method];\n\t\t\t\tif (handler === undefined && method === \"HEAD\") {\n\t\t\t\t\thandler = sHandlers.GET;\n\t\t\t\t}\n\t\t\t\tif (handler !== undefined) {\n\t\t\t\t\treturn handler;\n\t\t\t\t}\n\t\t\t\tconst dynamicMatch = matchNode(\n\t\t\t\t\tthis.root,\n\t\t\t\t\tpathname,\n\t\t\t\t\t1,\n\t\t\t\t\tmethod,\n\t\t\t\t\tthis.paramNameBuffer,\n\t\t\t\t\tthis.paramValueBuffer,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\t\tif (this.paramNameBuffer.length > 0) {\n\t\t\t\t\tthis.paramNameBuffer.length = 0;\n\t\t\t\t\tthis.paramValueBuffer.length = 0;\n\t\t\t\t}\n\t\t\t\tif (dynamicMatch !== null && !(MATCH_NOT_ALLOWED in dynamicMatch)) {\n\t\t\t\t\treturn dynamicMatch;\n\t\t\t\t}\n\t\t\t\treturn this.staticNotAllowed.get(cleanPath)!;\n\t\t\t}\n\t\t}\n\n\t\tconst res = matchNode(\n\t\t\tthis.root,\n\t\t\tpathname,\n\t\t\t1,\n\t\t\tmethod,\n\t\t\tthis.paramNameBuffer,\n\t\t\tthis.paramValueBuffer,\n\t\t\t0,\n\t\t);\n\t\tif (this.paramNameBuffer.length > 0) {\n\t\t\tthis.paramNameBuffer.length = 0;\n\t\t\tthis.paramValueBuffer.length = 0;\n\t\t}\n\t\treturn res;\n\t}\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\tctx: Context,\n\thandler: PipelineHandler,\n) => Response | Promise<Response>;\n\nexport function isThenable(value: unknown): value is PromiseLike<unknown> {\n\treturn (\n\t\t(typeof value === \"object\" || typeof value === \"function\") &&\n\t\tvalue !== null &&\n\t\ttypeof (value as { then?: unknown }).then === \"function\"\n\t);\n}\n\nfunction mergeState(ctx: Context, value: unknown): void {\n\tif (typeof value === \"object\" && value !== null) {\n\t\tObject.assign(ctx.state as Record<string, unknown>, value as object);\n\t}\n}\n\n/** Compile a middleware chain once for reuse by native and fallback routes. */\nexport function composeMiddlewareDispatcher(\n\tmws: readonly Middleware[],\n\terrorResolver?: ErrorResolver,\n): MiddlewareDispatcher {\n\t// Keep pathological chains on the iterative implementation to avoid deep\n\t// call stacks. The usual short chains are compiled into direct closures.\n\tif (\n\t\tmws.length > 64 ||\n\t\tmws.some((middleware) => middleware.after !== undefined)\n\t) {\n\t\treturn (ctx, handler) => runPipeline(mws, ctx, handler, errorResolver);\n\t}\n\n\tlet next: MiddlewareDispatcher = (ctx, handler) => {\n\t\tlet result: Response | Promise<Response>;\n\t\ttry {\n\t\t\tresult = handler(ctx);\n\t\t} catch (error) {\n\t\t\treturn handlePipelineError(mws, ctx, error, mws.length, errorResolver);\n\t\t}\n\t\tif (isThenable(result)) {\n\t\t\treturn Promise.resolve(result).catch((error: unknown) =>\n\t\t\t\thandlePipelineError(mws, ctx, error, mws.length, errorResolver),\n\t\t\t);\n\t\t}\n\t\treturn result;\n\t};\n\n\tfor (let i = mws.length - 1; i >= 0; i--) {\n\t\tconst middleware = mws[i]!;\n\t\tconst hook = middleware.before;\n\t\tconst following = next;\n\t\tnext = (ctx, handler) => {\n\t\t\tif (!hook) return following(ctx, handler);\n\t\t\tlet result: unknown;\n\t\t\ttry {\n\t\t\t\tresult = hook(ctx);\n\t\t\t} catch (error) {\n\t\t\t\treturn handlePipelineError(mws, ctx, error, i, errorResolver);\n\t\t\t}\n\t\t\tif (result === undefined) return following(ctx, handler);\n\t\t\tif (isThenable(result)) {\n\t\t\t\treturn Promise.resolve(result).then(\n\t\t\t\t\t(value: unknown) => {\n\t\t\t\t\t\tif (value instanceof Response) return value;\n\t\t\t\t\t\tmergeState(ctx, value);\n\t\t\t\t\t\treturn following(ctx, handler);\n\t\t\t\t\t},\n\t\t\t\t\t(error: unknown) =>\n\t\t\t\t\t\thandlePipelineError(mws, ctx, error, i, errorResolver),\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (result instanceof Response) return result;\n\t\t\tmergeState(ctx, result);\n\t\t\treturn following(ctx, handler);\n\t\t};\n\t}\n\n\treturn next;\n}\n\n/** Compile a route-specific chain around its handler. */\nexport function composeMiddlewares(\n\tmws: readonly Middleware[],\n\thandler: PipelineHandler,\n\terrorResolver?: ErrorResolver,\n): PipelineHandler {\n\tconst dispatch = composeMiddlewareDispatcher(mws, errorResolver);\n\treturn (ctx) => dispatch(ctx, handler);\n}\n\nexport function runPipeline(\n\tmws: readonly Middleware[],\n\tctx: Context,\n\thandler: (ctx: Context) => Response | Promise<Response>,\n\terrorResolver?: ErrorResolver,\n): Response | Promise<Response> {\n\tlet i = 0;\n\tconst len = mws.length;\n\n\twhile (i < len) {\n\t\tconst hook = mws[i]!.before;\n\t\tif (hook) {\n\t\t\tlet r: unknown;\n\t\t\ttry {\n\t\t\t\tr = hook(ctx);\n\t\t\t} catch (err) {\n\t\t\t\treturn handlePipelineError(mws, ctx, err, i, errorResolver);\n\t\t\t}\n\t\t\tif (r !== undefined) {\n\t\t\t\tif (r instanceof Response) {\n\t\t\t\t\treturn unwindAfter(mws, ctx, r, i + 1, errorResolver);\n\t\t\t\t}\n\t\t\t\tif (isThenable(r)) {\n\t\t\t\t\treturn resumeBefore(mws, ctx, handler, r, i, errorResolver);\n\t\t\t\t}\n\t\t\t\tmergeState(ctx, r);\n\t\t\t}\n\t\t}\n\t\ti++;\n\t}\n\n\treturn invokeHandler(mws, ctx, handler, len, errorResolver);\n}\n\nfunction continueBefore(\n\tmws: readonly Middleware[],\n\tctx: Context,\n\thandler: (ctx: Context) => Response | Promise<Response>,\n\tstartIndex: number,\n\terrorResolver?: ErrorResolver,\n): Response | Promise<Response> {\n\tlet i = startIndex;\n\tconst len = mws.length;\n\twhile (i < len) {\n\t\tconst hook = mws[i]!.before;\n\t\tif (hook) {\n\t\t\tlet r: unknown;\n\t\t\ttry {\n\t\t\t\tr = hook(ctx);\n\t\t\t} catch (err) {\n\t\t\t\treturn handlePipelineError(mws, ctx, err, i, errorResolver);\n\t\t\t}\n\t\t\tif (r !== undefined) {\n\t\t\t\tif (r instanceof Response) {\n\t\t\t\t\treturn unwindAfter(mws, ctx, r, i + 1, errorResolver);\n\t\t\t\t}\n\t\t\t\tif (isThenable(r)) {\n\t\t\t\t\treturn resumeBefore(mws, ctx, handler, r, i, errorResolver);\n\t\t\t\t}\n\t\t\t\tmergeState(ctx, r);\n\t\t\t}\n\t\t}\n\t\ti++;\n\t}\n\treturn invokeHandler(mws, ctx, handler, len, errorResolver);\n}\n\nfunction invokeHandler(\n\tmws: readonly Middleware[],\n\tctx: Context,\n\thandler: (ctx: Context) => Response | Promise<Response>,\n\tentered: number,\n\terrorResolver?: ErrorResolver,\n): Response | Promise<Response> {\n\tlet res: Response | Promise<Response>;\n\ttry {\n\t\tres = handler(ctx);\n\t} catch (err) {\n\t\treturn handlePipelineError(mws, ctx, err, entered, errorResolver);\n\t}\n\tif (isThenable(res)) {\n\t\treturn resumeHandler(mws, ctx, res, entered, errorResolver);\n\t}\n\treturn unwindAfter(mws, ctx, res, entered, errorResolver);\n}\n\nfunction resumeBefore(\n\tmws: readonly Middleware[],\n\tctx: Context,\n\thandler: (ctx: Context) => Response | Promise<Response>,\n\tpromise: PromiseLike<unknown>,\n\tindex: number,\n\terrorResolver?: ErrorResolver,\n): Promise<Response> {\n\treturn Promise.resolve(promise).then(\n\t\t(r) => {\n\t\t\tif (r instanceof Response) {\n\t\t\t\treturn unwindAfter(mws, ctx, r, index + 1, errorResolver);\n\t\t\t}\n\t\t\tmergeState(ctx, r);\n\t\t\treturn continueBefore(mws, ctx, handler, index + 1, errorResolver);\n\t\t},\n\t\t(err: unknown) => handlePipelineError(mws, ctx, err, index, errorResolver),\n\t);\n}\n\nfunction resumeHandler(\n\tmws: readonly Middleware[],\n\tctx: Context,\n\tpromise: PromiseLike<unknown>,\n\tentered: number,\n\terrorResolver?: ErrorResolver,\n): Promise<Response> {\n\treturn Promise.resolve(promise).then(\n\t\t(res) => unwindAfter(mws, ctx, res as Response, entered, errorResolver),\n\t\t(err: unknown) =>\n\t\t\thandlePipelineError(mws, ctx, err, entered, errorResolver),\n\t);\n}\n\nfunction handlePipelineError(\n\tmws: readonly Middleware[],\n\tctx: Context,\n\terr: unknown,\n\tentered: number,\n\terrorResolver?: ErrorResolver,\n): Response | Promise<Response> {\n\tif (errorResolver !== undefined) {\n\t\tlet res: Response | Promise<Response>;\n\t\ttry {\n\t\t\tres = errorResolver(err, ctx);\n\t\t} catch (resolverErr) {\n\t\t\tconst fallback = errorToResponse(resolverErr, ctx.development);\n\t\t\treturn unwindAfter(mws, ctx, fallback, entered, errorResolver);\n\t\t}\n\t\tif (isThenable(res)) {\n\t\t\treturn (res as Promise<Response>).then(\n\t\t\t\t(resolved) => unwindAfter(mws, ctx, resolved, entered, errorResolver),\n\t\t\t\t(resolverErr) => {\n\t\t\t\t\tconst fallback = errorToResponse(resolverErr, ctx.development);\n\t\t\t\t\treturn unwindAfter(mws, ctx, fallback, entered, errorResolver);\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\treturn unwindAfter(mws, ctx, res as Response, entered, errorResolver);\n\t}\n\tconst res = errorToResponse(err, ctx.development);\n\treturn unwindAfter(mws, ctx, res, entered, errorResolver);\n}\n\nexport function unwindAfter(\n\tmws: readonly Middleware[],\n\tctx: Context,\n\tres: Response,\n\tenteredCount: number,\n\terrorResolver?: ErrorResolver,\n): Response | Promise<Response> {\n\tlet currentRes = res;\n\n\tfor (let j = enteredCount - 1; j >= 0; j--) {\n\t\tconst hook = mws[j]!.after;\n\t\tif (hook) {\n\t\t\tlet r: unknown;\n\t\t\ttry {\n\t\t\t\tr = hook(ctx, currentRes);\n\t\t\t} catch (err) {\n\t\t\t\tif (errorResolver !== undefined) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst resolved = errorResolver(err, ctx);\n\t\t\t\t\t\tif (isThenable(resolved)) {\n\t\t\t\t\t\t\treturn (resolved as Promise<Response>).then(\n\t\t\t\t\t\t\t\t(resolvedRes) =>\n\t\t\t\t\t\t\t\t\tcontinueUnwind(mws, ctx, j - 1, resolvedRes, errorResolver),\n\t\t\t\t\t\t\t\t(resolverErr) =>\n\t\t\t\t\t\t\t\t\tcontinueUnwind(\n\t\t\t\t\t\t\t\t\t\tmws,\n\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\tj - 1,\n\t\t\t\t\t\t\t\t\t\terrorToResponse(resolverErr, ctx.development),\n\t\t\t\t\t\t\t\t\t\terrorResolver,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrentRes = resolved;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} catch (resolverErr) {\n\t\t\t\t\t\tcurrentRes = errorToResponse(resolverErr, ctx.development);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcurrentRes = errorToResponse(err, ctx.development);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (r !== undefined) {\n\t\t\t\tif (isThenable(r)) {\n\t\t\t\t\treturn resumeUnwind(mws, ctx, r, j - 1, currentRes, errorResolver);\n\t\t\t\t}\n\t\t\t\tif (r instanceof Response) {\n\t\t\t\t\tcurrentRes = r;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn currentRes;\n}\n\nfunction resumeUnwind(\n\tmws: readonly Middleware[],\n\tctx: Context,\n\tpromise: PromiseLike<unknown>,\n\tnextIndex: number,\n\tcurrentRes: Response,\n\terrorResolver?: ErrorResolver,\n): Promise<Response> {\n\treturn Promise.resolve(promise).then(\n\t\t(r) => {\n\t\t\tconst next = r instanceof Response ? r : currentRes;\n\t\t\treturn continueUnwind(mws, ctx, nextIndex, next, errorResolver);\n\t\t},\n\t\t(err: unknown) => {\n\t\t\tif (errorResolver !== undefined) {\n\t\t\t\ttry {\n\t\t\t\t\tconst resolved = errorResolver(err, ctx);\n\t\t\t\t\tif (isThenable(resolved)) {\n\t\t\t\t\t\treturn (resolved as Promise<Response>).then(\n\t\t\t\t\t\t\t(resolvedRes) =>\n\t\t\t\t\t\t\t\tcontinueUnwind(mws, ctx, nextIndex, resolvedRes, errorResolver),\n\t\t\t\t\t\t\t(resolverErr) =>\n\t\t\t\t\t\t\t\tcontinueUnwind(\n\t\t\t\t\t\t\t\t\tmws,\n\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\tnextIndex,\n\t\t\t\t\t\t\t\t\terrorToResponse(resolverErr, ctx.development),\n\t\t\t\t\t\t\t\t\terrorResolver,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn continueUnwind(mws, ctx, nextIndex, resolved, errorResolver);\n\t\t\t\t} catch (resolverErr) {\n\t\t\t\t\treturn continueUnwind(\n\t\t\t\t\t\tmws,\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tnextIndex,\n\t\t\t\t\t\terrorToResponse(resolverErr, ctx.development),\n\t\t\t\t\t\terrorResolver,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst next = errorToResponse(err, ctx.development);\n\t\t\treturn continueUnwind(mws, ctx, nextIndex, next, errorResolver);\n\t\t},\n\t);\n}\n\nfunction continueUnwind(\n\tmws: readonly Middleware[],\n\tctx: Context,\n\tstartIndex: number,\n\tcurrentRes: Response,\n\terrorResolver?: ErrorResolver,\n): Response | Promise<Response> {\n\tlet cur = currentRes;\n\tfor (let j = startIndex; j >= 0; j--) {\n\t\tconst hook = mws[j]!.after;\n\t\tif (hook) {\n\t\t\tlet r: unknown;\n\t\t\ttry {\n\t\t\t\tr = hook(ctx, cur);\n\t\t\t} catch (err) {\n\t\t\t\tif (errorResolver !== undefined) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst resolved = errorResolver(err, ctx);\n\t\t\t\t\t\tif (isThenable(resolved)) {\n\t\t\t\t\t\t\treturn (resolved as Promise<Response>).then(\n\t\t\t\t\t\t\t\t(resolvedRes) =>\n\t\t\t\t\t\t\t\t\tcontinueUnwind(mws, ctx, j - 1, resolvedRes, errorResolver),\n\t\t\t\t\t\t\t\t(resolverErr) =>\n\t\t\t\t\t\t\t\t\tcontinueUnwind(\n\t\t\t\t\t\t\t\t\t\tmws,\n\t\t\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t\t\tj - 1,\n\t\t\t\t\t\t\t\t\t\terrorToResponse(resolverErr, ctx.development),\n\t\t\t\t\t\t\t\t\t\terrorResolver,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcur = resolved;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} catch (resolverErr) {\n\t\t\t\t\t\tcur = errorToResponse(resolverErr, ctx.development);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcur = errorToResponse(err, ctx.development);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (r !== undefined) {\n\t\t\t\tif (isThenable(r)) {\n\t\t\t\t\treturn resumeUnwind(mws, ctx, r, j - 1, cur, errorResolver);\n\t\t\t\t}\n\t\t\t\tif (r instanceof Response) {\n\t\t\t\t\tcur = r;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn cur;\n}\n",
|
|
18
|
+
"import type { Context } from \"./context\";\nimport type { Middleware } from \"./types\";\n\nexport interface CorsOptions {\n\torigin?: string | string[] | ((origin: string) => boolean | string);\n\tmethods?: string[];\n\tallowedHeaders?: string[];\n\texposedHeaders?: string[];\n\tcredentials?: boolean;\n\tmaxAge?: number;\n}\n\nexport function cors(options: CorsOptions = {}): Middleware {\n\tconst methods = (\n\t\toptions.methods ?? [\"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\", \"PATCH\"]\n\t).join(\", \");\n\tconst allowedHeaders = options.allowedHeaders?.join(\", \");\n\tconst exposedHeaders = options.exposedHeaders?.join(\", \");\n\tconst maxAge = options.maxAge !== undefined ? String(options.maxAge) : null;\n\tconst credentials = options.credentials === true;\n\n\tfunction resolveOrigin(reqOrigin: string | null): string | null {\n\t\tif (!options.origin || options.origin === \"*\") {\n\t\t\treturn credentials ? (reqOrigin ?? \"*\") : \"*\";\n\t\t}\n\t\tif (!reqOrigin) return null;\n\t\tif (typeof options.origin === \"string\") {\n\t\t\treturn options.origin === reqOrigin ? reqOrigin : null;\n\t\t}\n\t\tif (Array.isArray(options.origin)) {\n\t\t\treturn options.origin.includes(reqOrigin) ? reqOrigin : null;\n\t\t}\n\t\tif (typeof options.origin === \"function\") {\n\t\t\tconst result = options.origin(reqOrigin);\n\t\t\tif (typeof result === \"string\") return result;\n\t\t\treturn result ? reqOrigin : null;\n\t\t}\n\t\treturn null;\n\t}\n\n\tfunction setCorsHeaders(\n\t\theaders: Headers,\n\t\tmatchedOrigin: string | null,\n\t): void {\n\t\tif (matchedOrigin) {\n\t\t\theaders.set(\"access-control-allow-origin\", matchedOrigin);\n\t\t\tif (matchedOrigin !== \"*\") {\n\t\t\t\theaders.append(\"vary\", \"Origin\");\n\t\t\t}\n\t\t}\n\t\tif (credentials) {\n\t\t\theaders.set(\"access-control-allow-credentials\", \"true\");\n\t\t}\n\t\tif (exposedHeaders) {\n\t\t\theaders.set(\"access-control-expose-headers\", exposedHeaders);\n\t\t}\n\t}\n\n\treturn {\n\t\tbefore(ctx: Context) {\n\t\t\tconst reqOrigin = ctx.req.headers.get(\"origin\");\n\t\t\tconst matchedOrigin = resolveOrigin(reqOrigin);\n\n\t\t\tif (ctx.req.method === \"OPTIONS\") {\n\t\t\t\tconst headers = new Headers();\n\t\t\t\tsetCorsHeaders(headers, matchedOrigin);\n\t\t\t\theaders.set(\"access-control-allow-methods\", methods);\n\t\t\t\tif (allowedHeaders) {\n\t\t\t\t\theaders.set(\"access-control-allow-headers\", allowedHeaders);\n\t\t\t\t} else {\n\t\t\t\t\tconst reqHeaders = ctx.req.headers.get(\n\t\t\t\t\t\t\"access-control-request-headers\",\n\t\t\t\t\t);\n\t\t\t\t\tif (reqHeaders) {\n\t\t\t\t\t\theaders.set(\"access-control-allow-headers\", reqHeaders);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (maxAge) {\n\t\t\t\t\theaders.set(\"access-control-max-age\", maxAge);\n\t\t\t\t}\n\t\t\t\theaders.set(\"content-length\", \"0\");\n\t\t\t\treturn new Response(null, { status: 204, headers });\n\t\t\t}\n\n\t\t\t(ctx.state as Record<string, unknown>)._corsOrigin = matchedOrigin;\n\t\t},\n\t\tafter(ctx: Context, res: Response) {\n\t\t\tconst matchedOrigin = (ctx.state as Record<string, unknown>)\n\t\t\t\t._corsOrigin as string | null | undefined;\n\t\t\tif (matchedOrigin !== undefined) {\n\t\t\t\tconst headers = new Headers(res.headers);\n\t\t\t\tsetCorsHeaders(headers, matchedOrigin);\n\t\t\t\treturn new Response(res.body, {\n\t\t\t\t\tstatus: res.status,\n\t\t\t\t\tstatusText: res.statusText,\n\t\t\t\t\theaders,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn res;\n\t\t},\n\t};\n}\n",
|
|
19
|
+
"import type { Context } from \"./context\";\nimport { HttpError } from \"./errors\";\nimport type { Params, ResponseHandler } from \"./types\";\n\nexport interface StandardSchemaV1Issue {\n\treadonly message: string;\n\treadonly path?: ReadonlyArray<PropertyKey | { readonly key: PropertyKey }>;\n}\n\nexport type StandardSchemaV1Result<TOutput> =\n\t| { readonly value: TOutput; readonly issues?: undefined }\n\t| { readonly issues: ReadonlyArray<StandardSchemaV1Issue> };\n\nexport interface StandardSchemaV1<_TInput = unknown, TOutput = unknown> {\n\treadonly \"~standard\": {\n\t\treadonly version: 1;\n\t\treadonly vendor: string;\n\t\treadonly validate: (\n\t\t\tvalue: unknown,\n\t\t) =>\n\t\t\t| StandardSchemaV1Result<TOutput>\n\t\t\t| Promise<StandardSchemaV1Result<TOutput>>;\n\t};\n}\n\nexport interface LegacyValidator<TOutput> {\n\tparse(data: unknown): TOutput;\n}\n\nexport type Validator<TOutput> =\n\t| LegacyValidator<TOutput>\n\t| StandardSchemaV1<unknown, TOutput>\n\t| ((data: unknown) => TOutput | Promise<TOutput>);\n\nexport function validateJson<\n\tTOutput,\n\tTParams extends object = Params,\n\tTState extends object = Record<string, unknown>,\n>(\n\tvalidator: Validator<TOutput>,\n\thandler: (\n\t\tctx: Context<TParams, TState>,\n\t\tbody: TOutput,\n\t) => Response | Promise<Response>,\n): ResponseHandler<TParams, TState> {\n\treturn async (ctx) => {\n\t\tconst raw = await ctx.json<unknown>();\n\t\tlet body: TOutput;\n\n\t\tif (\n\t\t\ttypeof validator === \"object\" &&\n\t\t\tvalidator !== null &&\n\t\t\t\"~standard\" in validator\n\t\t) {\n\t\t\tconst res = await validator[\"~standard\"].validate(raw);\n\t\t\tif (res.issues) {\n\t\t\t\tthrow new HttpError(422, {\n\t\t\t\t\terror: \"Validation Failed\",\n\t\t\t\t\tissues: res.issues,\n\t\t\t\t});\n\t\t\t}\n\t\t\tbody = res.value;\n\t\t} else if (typeof validator === \"function\") {\n\t\t\tbody = await validator(raw);\n\t\t} else if (\n\t\t\ttypeof validator === \"object\" &&\n\t\t\tvalidator !== null &&\n\t\t\t\"parse\" in validator\n\t\t) {\n\t\t\tbody = (validator as LegacyValidator<TOutput>).parse(raw);\n\t\t} else {\n\t\t\tthrow new TypeError(\"Invalid validator provided to validateJson\");\n\t\t}\n\n\t\treturn handler(ctx, body);\n\t};\n}\n"
|
|
20
20
|
],
|
|
21
|
-
"mappings": "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",
|
|
22
|
-
"debugId": "
|
|
21
|
+
"mappings": "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",
|
|
22
|
+
"debugId": "883AC01877895D9164756E2164756E21",
|
|
23
23
|
"names": []
|
|
24
24
|
}
|