@nestjs-kit/better-auth 2.1.0 → 2.1.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 +3 -3
- package/dist/admin.cjs +3 -4
- package/dist/admin.d.cts +1 -3
- package/dist/admin.d.cts.map +1 -1
- package/dist/admin.d.mts +1 -3
- package/dist/admin.d.mts.map +1 -1
- package/dist/admin.mjs +3 -4
- package/dist/api-key.cjs +4 -5
- package/dist/api-key.d.cts +1 -3
- package/dist/api-key.d.cts.map +1 -1
- package/dist/api-key.d.mts +1 -3
- package/dist/api-key.d.mts.map +1 -1
- package/dist/api-key.mjs +4 -5
- package/dist/{auth-contracts-Brh_Qko9.d.cts → auth-contracts-CADGyI0O.d.mts} +3 -53
- package/dist/auth-contracts-CADGyI0O.d.mts.map +1 -0
- package/dist/{auth-contracts-Cz7C4_Ch.d.mts → auth-contracts-zvt8ysoZ.d.cts} +3 -53
- package/dist/auth-contracts-zvt8ysoZ.d.cts.map +1 -0
- package/dist/{auth-decorators-Cu_nxWnF.cjs → auth-decorators-CJKE9wlT.cjs} +8 -10
- package/dist/{auth-decorators-Cu_nxWnF.cjs.map → auth-decorators-CJKE9wlT.cjs.map} +1 -1
- package/dist/{auth-decorators-B1mFnGJ6.mjs → auth-decorators-CkNkLNpU.mjs} +8 -10
- package/dist/{auth-decorators-B1mFnGJ6.mjs.map → auth-decorators-CkNkLNpU.mjs.map} +1 -1
- package/dist/{auth-errors-C3rbTV9p.mjs → auth-errors-JjxGDVSt.mjs} +3 -5
- package/dist/{auth-errors-C3rbTV9p.mjs.map → auth-errors-JjxGDVSt.mjs.map} +1 -1
- package/dist/{auth-errors-DmiKl0L_.cjs → auth-errors-RW7hOVI-.cjs} +3 -5
- package/dist/{auth-errors-DmiKl0L_.cjs.map → auth-errors-RW7hOVI-.cjs.map} +1 -1
- package/dist/{auth-guard-h9QB_l11.mjs → auth-guard-Da92QEK5.mjs} +4 -5
- package/dist/{auth-guard-h9QB_l11.mjs.map → auth-guard-Da92QEK5.mjs.map} +1 -1
- package/dist/{auth-guard-CLyhAEEj.cjs → auth-guard-wapEh_M_.cjs} +4 -5
- package/dist/{auth-guard-CLyhAEEj.cjs.map → auth-guard-wapEh_M_.cjs.map} +1 -1
- package/dist/{auth-module-BgcY2HpA.cjs → auth-module-ab60-WJZ.cjs} +28 -47
- package/dist/auth-module-ab60-WJZ.cjs.map +1 -0
- package/dist/{auth-module-CtHx3gRU.mjs → auth-module-uy3BBWwR.mjs} +28 -47
- package/dist/auth-module-uy3BBWwR.mjs.map +1 -0
- package/dist/{auth-scope-interceptor-BjxAL1-S.cjs → auth-scope-interceptor-Bui20-Ps.cjs} +5 -7
- package/dist/{auth-scope-interceptor-BjxAL1-S.cjs.map → auth-scope-interceptor-Bui20-Ps.cjs.map} +1 -1
- package/dist/{auth-scope-interceptor-DYPn3b8M.mjs → auth-scope-interceptor-CvCQ52dV.mjs} +5 -7
- package/dist/{auth-scope-interceptor-DYPn3b8M.mjs.map → auth-scope-interceptor-CvCQ52dV.mjs.map} +1 -1
- package/dist/{bridge-protocol-c66aEkr5.mjs → bridge-protocol-CmRsff2P.mjs} +2 -3
- package/dist/{bridge-protocol-BDw8opAG.cjs.map → bridge-protocol-CmRsff2P.mjs.map} +1 -1
- package/dist/{bridge-protocol-BDw8opAG.cjs → bridge-protocol-DNFhIKdo.cjs} +2 -3
- package/dist/{bridge-protocol-c66aEkr5.mjs.map → bridge-protocol-DNFhIKdo.cjs.map} +1 -1
- package/dist/{decorate-Dt0e9K6R.mjs → decorate-bO-rBn-G.mjs} +5 -9
- package/dist/{decorate-Dt0e9K6R.mjs.map → decorate-bO-rBn-G.mjs.map} +1 -1
- package/dist/{decorate-Cr4Q7bNE.cjs → decorate-fMNf0caZ.cjs} +5 -9
- package/dist/{decorate-Cr4Q7bNE.cjs.map → decorate-fMNf0caZ.cjs.map} +1 -1
- package/dist/express.cjs +3 -4
- package/dist/express.d.cts +1 -3
- package/dist/express.d.cts.map +1 -1
- package/dist/express.d.mts +1 -3
- package/dist/express.d.mts.map +1 -1
- package/dist/express.mjs +3 -4
- package/dist/fastify.cjs +2 -3
- package/dist/fastify.d.cts +1 -3
- package/dist/fastify.d.cts.map +1 -1
- package/dist/fastify.d.mts +1 -3
- package/dist/fastify.d.mts.map +1 -1
- package/dist/fastify.mjs +2 -3
- package/dist/graphql.cjs +7 -9
- package/dist/graphql.cjs.map +1 -1
- package/dist/graphql.d.cts +1 -3
- package/dist/graphql.d.cts.map +1 -1
- package/dist/graphql.d.mts +1 -3
- package/dist/graphql.d.mts.map +1 -1
- package/dist/graphql.mjs +7 -9
- package/dist/graphql.mjs.map +1 -1
- package/dist/index.cjs +7 -7
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +7 -7
- package/dist/microservices.cjs +4 -6
- package/dist/microservices.cjs.map +1 -1
- package/dist/microservices.d.cts +1 -5
- package/dist/microservices.d.cts.map +1 -1
- package/dist/microservices.d.mts +1 -5
- package/dist/microservices.d.mts.map +1 -1
- package/dist/microservices.mjs +3 -5
- package/dist/microservices.mjs.map +1 -1
- package/dist/organization.cjs +3 -4
- package/dist/organization.d.cts +1 -3
- package/dist/organization.d.cts.map +1 -1
- package/dist/organization.d.mts +1 -3
- package/dist/organization.d.mts.map +1 -1
- package/dist/organization.mjs +3 -4
- package/dist/{platform-CZl7TY8j.mjs → platform-BKYVzAv1.mjs} +3 -5
- package/dist/{platform-CZl7TY8j.mjs.map → platform-BKYVzAv1.mjs.map} +1 -1
- package/dist/{platform-YICqqYv6.cjs → platform-C67dxSls.cjs} +3 -5
- package/dist/{platform-YICqqYv6.cjs.map → platform-C67dxSls.cjs.map} +1 -1
- package/dist/platform.cjs +1 -1
- package/dist/platform.d.cts +0 -2
- package/dist/platform.d.cts.map +1 -1
- package/dist/platform.d.mts +0 -2
- package/dist/platform.d.mts.map +1 -1
- package/dist/platform.mjs +1 -1
- package/dist/plugin.cjs +4 -8
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.cts +0 -4
- package/dist/plugin.d.cts.map +1 -1
- package/dist/plugin.d.mts +0 -4
- package/dist/plugin.d.mts.map +1 -1
- package/dist/plugin.mjs +4 -8
- package/dist/plugin.mjs.map +1 -1
- package/dist/{principal-readings-Ied2staw.mjs → principal-readings-BuXTU0-2.mjs} +3 -4
- package/dist/{principal-readings-Ied2staw.mjs.map → principal-readings-BuXTU0-2.mjs.map} +1 -1
- package/dist/{principal-readings-Chmt6rQV.cjs → principal-readings-JLNT58k0.cjs} +3 -4
- package/dist/{principal-readings-Chmt6rQV.cjs.map → principal-readings-JLNT58k0.cjs.map} +1 -1
- package/dist/{rolldown-runtime-VH7oDXx4.cjs → rolldown-runtime-CmQyd0Gu.cjs} +1 -2
- package/dist/testing/conformance.cjs +24 -31
- package/dist/testing/conformance.cjs.map +1 -1
- package/dist/testing/conformance.d.cts +4 -14
- package/dist/testing/conformance.d.cts.map +1 -1
- package/dist/testing/conformance.d.mts +4 -14
- package/dist/testing/conformance.d.mts.map +1 -1
- package/dist/testing/conformance.mjs +23 -30
- package/dist/testing/conformance.mjs.map +1 -1
- package/dist/testing.cjs +6 -7
- package/dist/testing.d.cts +1 -3
- package/dist/testing.d.cts.map +1 -1
- package/dist/testing.d.mts +1 -3
- package/dist/testing.d.mts.map +1 -1
- package/dist/testing.mjs +6 -7
- package/dist/websockets.cjs +7 -10
- package/dist/websockets.cjs.map +1 -1
- package/dist/websockets.d.cts +1 -7
- package/dist/websockets.d.cts.map +1 -1
- package/dist/websockets.d.mts +1 -7
- package/dist/websockets.d.mts.map +1 -1
- package/dist/websockets.mjs +7 -10
- package/dist/websockets.mjs.map +1 -1
- package/package.json +24 -24
- package/dist/auth-contracts-Brh_Qko9.d.cts.map +0 -1
- package/dist/auth-contracts-Cz7C4_Ch.d.mts.map +0 -1
- package/dist/auth-module-BgcY2HpA.cjs.map +0 -1
- package/dist/auth-module-CtHx3gRU.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"microservices.mjs","names":[],"sources":["../src/rpc-carriers.ts","../src/rpc-transport.ts"],"sourcesContent":["import type { ExecutionContext } from \"@nestjs/common\";\nimport * as microservices from \"@nestjs/microservices\";\nimport { AuthFailures, type AuthFailure } from \"./auth-errors.js\";\n\nexport interface RpcCredentialCarrier {\n readonly id: string;\n matches(context: ExecutionContext): boolean;\n headers(context: ExecutionContext): HeadersInit | undefined;\n toException?(failure: AuthFailure, context: ExecutionContext): unknown;\n}\n\nconst credentialNames = [\"authorization\", \"cookie\", \"x-api-key\"] as const;\n\ntype RecordValue = Record<string, unknown>;\nfunction record(value: unknown): RecordValue | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as RecordValue)\n : undefined;\n}\nfunction method(\n value: unknown,\n name: string,\n): ((...args: unknown[]) => unknown) | undefined {\n const target = record(value);\n const candidate = target?.[name];\n return typeof candidate === \"function\" ? candidate.bind(value) : undefined;\n}\nfunction contextOf(context: ExecutionContext): unknown {\n return context.switchToRpc().getContext<unknown>();\n}\nfunction extract(input: unknown, allow: readonly string[]): Headers {\n const headers = new Headers();\n const allowed = new Set(allow.map((name) => name.toLowerCase()));\n // Host and forwarding metadata must never influence hostless authentication.\n for (const name of [\n \"host\",\n \"x-forwarded-host\",\n \"x-forwarded-proto\",\n \"set-cookie\",\n ]) {\n allowed.delete(name);\n }\n const source = record(input);\n if (!source) {\n return headers;\n }\n for (const name of Object.keys(source)) {\n const normalized = name.toLowerCase();\n if (!allowed.has(normalized)) {\n continue;\n }\n const value = source[name];\n const values = Array.isArray(value) ? value : [value];\n if (values.length === 0) {\n throw AuthFailures.rejected({\n status: 401,\n reason: \"MALFORMED_CREDENTIALS\",\n });\n }\n for (const item of values) {\n const text =\n typeof item === \"string\"\n ? item\n : Buffer.isBuffer(item)\n ? item.toString(\"utf8\")\n : undefined;\n if (text === undefined || /[\\r\\n\\0]/.test(text)) {\n throw AuthFailures.rejected({\n status: 401,\n reason: \"MALFORMED_CREDENTIALS\",\n });\n }\n try {\n headers.append(normalized, text);\n } catch {\n // Web Headers errors can embed credentials in their message. Never retain\n // that error, and never discard one bad credential to try another one.\n throw AuthFailures.rejected({\n status: 401,\n reason: \"MALFORMED_CREDENTIALS\",\n });\n }\n }\n }\n return headers;\n}\n\nexport function grpcCarrier(\n options: { metadata?: readonly string[] } = {},\n): RpcCredentialCarrier {\n return {\n id: \"grpc\",\n matches: (context) =>\n !!method(context.getArgByIndex(1), \"get\") &&\n !!method(context.getArgByIndex(1), \"getMap\"),\n headers: (context) =>\n extract(\n method(context.getArgByIndex(1), \"getMap\")?.(),\n options.metadata ?? credentialNames,\n ),\n toException(failure) {\n const name =\n failure.status === 401\n ? \"GrpcUnauthenticatedException\"\n : failure.status === 403\n ? \"GrpcPermissionDeniedException\"\n : \"GrpcResourceExhaustedException\";\n const Native = (\n microservices as unknown as Record<\n string,\n new (\n message: string,\n ) => Error & { getError(): object }\n >\n )[name];\n // Native gRPC exceptions require an opt-in Nest filter. Wrap their payload\n // so the default RPC filter also delivers the numeric status.\n return new microservices.RpcException(\n Native\n ? new Native(failure.message).getError()\n : {\n code:\n failure.status === 401 ? 16 : failure.status === 403 ? 7 : 8,\n message: failure.message,\n },\n );\n },\n };\n}\n\nexport function natsCarrier(\n options: { headers?: readonly string[] } = {},\n): RpcCredentialCarrier {\n return {\n id: \"nats\",\n matches: (context) => !!method(contextOf(context), \"getHeaders\"),\n headers(context) {\n const input = method(contextOf(context), \"getHeaders\")?.();\n const keys = method(input, \"keys\")?.();\n const get = method(input, \"get\");\n const values: RecordValue = Object.create(null);\n if (Array.isArray(keys) && get) {\n for (const key of keys) {\n if (typeof key === \"string\") {\n values[key] = get(key);\n }\n }\n }\n return extract(values, options.headers ?? credentialNames);\n },\n };\n}\n\nexport function kafkaCarrier(\n options: { headers?: readonly string[] } = {},\n): RpcCredentialCarrier {\n const message = (context: ExecutionContext) =>\n record(method(contextOf(context), \"getMessage\")?.());\n return {\n id: \"kafka\",\n matches: (context) =>\n message(context) !== undefined && \"headers\" in message(context)!,\n headers: (context) =>\n extract(message(context)?.headers, options.headers ?? credentialNames),\n };\n}\n\nexport function rmqCarrier(\n options: { headers?: readonly string[] } = {},\n): RpcCredentialCarrier {\n const message = (context: ExecutionContext) =>\n record(method(contextOf(context), \"getMessage\")?.());\n return {\n id: \"rmq\",\n matches: (context) =>\n message(context) !== undefined && \"properties\" in message(context)!,\n headers: (context) =>\n extract(\n record(message(context)?.properties)?.headers,\n options.headers ?? credentialNames,\n ),\n };\n}\n\nexport function mqttCarrier(\n options: { userProperties?: readonly string[] } = {},\n): RpcCredentialCarrier {\n return {\n id: \"mqtt\",\n matches: (context) => !!method(contextOf(context), \"getPacket\"),\n headers: (context) =>\n extract(\n record(record(method(contextOf(context), \"getPacket\")?.())?.properties)\n ?.userProperties,\n options.userProperties ?? credentialNames,\n ),\n };\n}\n\nexport function payloadCarrier(\n options: { field?: string } = {},\n): RpcCredentialCarrier {\n const payload = (context: ExecutionContext) => {\n const data = record(context.switchToRpc().getData<unknown>());\n const field = options.field ?? \"auth\";\n return data && Object.hasOwn(data, field) ? record(data[field]) : undefined;\n };\n return {\n id: \"payload\",\n matches: (context) => payload(context) !== undefined,\n headers: (context) => extract(payload(context), credentialNames),\n };\n}\n\nexport const defaultCarriers: readonly RpcCredentialCarrier[] = Object.freeze([\n grpcCarrier(),\n natsCarrier(),\n kafkaCarrier(),\n rmqCarrier(),\n mqttCarrier(),\n payloadCarrier(),\n]);\n","import { Logger, type ExecutionContext } from \"@nestjs/common\";\nimport { MetadataScanner } from \"@nestjs/core\";\nimport { MessagePattern, RpcException } from \"@nestjs/microservices\";\nimport type {\n AuthTransport,\n BootAdvice,\n ExtensionRef,\n TransportCall,\n TransportValidationContext,\n} from \"./auth-contracts.js\";\nimport {\n BetterAuthConfigurationError,\n AuthFailures,\n type AuthFailure,\n} from \"./auth-errors.js\";\nimport {\n defaultCarriers,\n grpcCarrier,\n type RpcCredentialCarrier,\n} from \"./rpc-carriers.js\";\n\nexport interface RpcTransportOptions {\n carriers?: readonly RpcCredentialCarrier[];\n hybridCoverage?: \"error\" | \"warn\" | \"off\";\n inheritAppConfig?: boolean;\n}\n\nexport function rpcTransport(\n options: RpcTransportOptions = {},\n): ExtensionRef<AuthTransport> {\n const carriers = [...(options.carriers ?? defaultCarriers)];\n const select = (context: ExecutionContext) =>\n carriers.find((carrier) => carrier.matches(context));\n const grpc = grpcCarrier();\n return {\n id: \"rpc\",\n requires: { hostlessCalls: true },\n handles: (context) => context.getType() === \"rpc\",\n describe(context): TransportCall {\n const candidate = context.switchToRpc().getContext<unknown>();\n const key =\n candidate !== null && typeof candidate === \"object\"\n ? candidate\n : context.getArgs();\n return {\n key,\n invocation: key,\n cookies: null,\n clientIp: null,\n headers() {\n const input = select(context)?.headers(context);\n try {\n return new Headers(input);\n } catch {\n // Custom carriers may return a raw HeadersInit. Conversion errors\n // include its values, so discard the original error and its cause.\n throw AuthFailures.rejected({\n status: 401,\n reason: \"MALFORMED_CREDENTIALS\",\n });\n }\n },\n param(name) {\n const data = context.switchToRpc().getData<unknown>();\n return data !== null &&\n typeof data === \"object\" &&\n Object.hasOwn(data, name)\n ? (data as Record<string, unknown>)[name]\n : undefined;\n },\n };\n },\n toException(failure: AuthFailure, context) {\n const carrier = select(context);\n return carrier?.toException\n ? carrier.toException(failure, context)\n : new RpcException({\n status: \"error\",\n statusCode: failure.status,\n code: failure.code,\n ...(failure.reason ? { reason: failure.reason } : {}),\n message: failure.message,\n });\n },\n toInternalException(error, context, info) {\n if (!grpc.matches(context)) {\n return error;\n }\n if (!info.repeated) {\n new Logger(\"BetterAuthRpc\").error(error);\n }\n return new RpcException({ code: 13, message: \"Internal server error\" });\n },\n validate(context: TransportValidationContext) {\n class Probe {\n handler(): void {}\n }\n MessagePattern(\"nestjs-kit-better-auth-probe\")(\n Probe.prototype,\n \"handler\",\n Object.getOwnPropertyDescriptor(Probe.prototype, \"handler\")!,\n );\n const patterns: unknown = Reflect.getMetadata(\n \"microservices:pattern\",\n Probe.prototype.handler,\n );\n if (\n !Array.isArray(patterns) ||\n patterns[0] !== \"nestjs-kit-better-auth-probe\"\n ) {\n throw new BetterAuthConfigurationError(\n \"NEST_METADATA_KEY_CHANGED\",\n \"Nest RPC pattern metadata failed its canary\",\n );\n }\n const explicit = context.hasHttpAdapter && !options.inheritAppConfig;\n const scanner = new MetadataScanner();\n for (const wrapper of context.discovery.getControllers()) {\n const target = wrapper.metatype;\n if (!target?.prototype || wrapper.isAlias) {\n continue;\n }\n for (const name of scanner.getAllMethodNames(target.prototype)) {\n if (\n Reflect.getMetadata(\n \"microservices:pattern\",\n target.prototype[name],\n ) === undefined\n ) {\n continue;\n }\n context.claim(target, name, explicit ? \"explicit\" : \"global\", {\n code: \"RPC_HANDLER_UNGUARDED\",\n everyHandler: explicit,\n coverage: explicit ? (options.hybridCoverage ?? \"error\") : \"error\",\n hint: \"Add @UseBetterAuth() or @Public() to the RPC controller/handler, or assert inheritAppConfig and pass { inheritAppConfig: true } to every connectMicroservice call.\",\n });\n }\n }\n },\n advise(): readonly BootAdvice[] {\n return options.inheritAppConfig\n ? [\n {\n level: \"warn\",\n code: \"W_RPC_INHERIT_APP_CONFIG_ASSERTED\",\n message:\n \"RPC coverage assumes every connectMicroservice() call passes { inheritAppConfig: true }. Prefer @UseBetterAuth() on message controllers for verifiable coverage.\",\n },\n ]\n : [];\n },\n } satisfies AuthTransport;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"microservices.mjs","names":[],"sources":["../src/rpc-carriers.ts","../src/rpc-transport.ts"],"sourcesContent":["import type { ExecutionContext } from \"@nestjs/common\";\nimport * as microservices from \"@nestjs/microservices\";\nimport { AuthFailures, type AuthFailure } from \"./auth-errors.js\";\n\nexport interface RpcCredentialCarrier {\n readonly id: string;\n matches(context: ExecutionContext): boolean;\n headers(context: ExecutionContext): HeadersInit | undefined;\n toException?(failure: AuthFailure, context: ExecutionContext): unknown;\n}\n\nconst credentialNames = [\"authorization\", \"cookie\", \"x-api-key\"] as const;\n\ntype RecordValue = Record<string, unknown>;\nfunction record(value: unknown): RecordValue | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as RecordValue)\n : undefined;\n}\nfunction method(\n value: unknown,\n name: string,\n): ((...args: unknown[]) => unknown) | undefined {\n const target = record(value);\n const candidate = target?.[name];\n return typeof candidate === \"function\" ? candidate.bind(value) : undefined;\n}\nfunction contextOf(context: ExecutionContext): unknown {\n return context.switchToRpc().getContext<unknown>();\n}\nfunction extract(input: unknown, allow: readonly string[]): Headers {\n const headers = new Headers();\n const allowed = new Set(allow.map((name) => name.toLowerCase()));\n // Host and forwarding metadata must never influence hostless authentication.\n for (const name of [\n \"host\",\n \"x-forwarded-host\",\n \"x-forwarded-proto\",\n \"set-cookie\",\n ]) {\n allowed.delete(name);\n }\n const source = record(input);\n if (!source) {\n return headers;\n }\n for (const name of Object.keys(source)) {\n const normalized = name.toLowerCase();\n if (!allowed.has(normalized)) {\n continue;\n }\n const value = source[name];\n const values = Array.isArray(value) ? value : [value];\n if (values.length === 0) {\n throw AuthFailures.rejected({\n status: 401,\n reason: \"MALFORMED_CREDENTIALS\",\n });\n }\n for (const item of values) {\n const text =\n typeof item === \"string\"\n ? item\n : Buffer.isBuffer(item)\n ? item.toString(\"utf8\")\n : undefined;\n if (text === undefined || /[\\r\\n\\0]/.test(text)) {\n throw AuthFailures.rejected({\n status: 401,\n reason: \"MALFORMED_CREDENTIALS\",\n });\n }\n try {\n headers.append(normalized, text);\n } catch {\n // Web Headers errors can embed credentials in their message. Never retain\n // that error, and never discard one bad credential to try another one.\n throw AuthFailures.rejected({\n status: 401,\n reason: \"MALFORMED_CREDENTIALS\",\n });\n }\n }\n }\n return headers;\n}\n\nexport function grpcCarrier(\n options: { metadata?: readonly string[] } = {},\n): RpcCredentialCarrier {\n return {\n id: \"grpc\",\n matches: (context) =>\n !!method(context.getArgByIndex(1), \"get\") &&\n !!method(context.getArgByIndex(1), \"getMap\"),\n headers: (context) =>\n extract(\n method(context.getArgByIndex(1), \"getMap\")?.(),\n options.metadata ?? credentialNames,\n ),\n toException(failure) {\n const name =\n failure.status === 401\n ? \"GrpcUnauthenticatedException\"\n : failure.status === 403\n ? \"GrpcPermissionDeniedException\"\n : \"GrpcResourceExhaustedException\";\n const Native = (\n microservices as unknown as Record<\n string,\n new (message: string) => Error & { getError(): object }\n >\n )[name];\n // Native gRPC exceptions require an opt-in Nest filter. Wrap their payload\n // so the default RPC filter also delivers the numeric status.\n return new microservices.RpcException(\n Native\n ? new Native(failure.message).getError()\n : {\n code:\n failure.status === 401 ? 16 : failure.status === 403 ? 7 : 8,\n message: failure.message,\n },\n );\n },\n };\n}\n\nexport function natsCarrier(\n options: { headers?: readonly string[] } = {},\n): RpcCredentialCarrier {\n return {\n id: \"nats\",\n matches: (context) => !!method(contextOf(context), \"getHeaders\"),\n headers(context) {\n const input = method(contextOf(context), \"getHeaders\")?.();\n const keys = method(input, \"keys\")?.();\n const get = method(input, \"get\");\n const values: RecordValue = Object.create(null);\n if (Array.isArray(keys) && get) {\n for (const key of keys) {\n if (typeof key === \"string\") {\n values[key] = get(key);\n }\n }\n }\n return extract(values, options.headers ?? credentialNames);\n },\n };\n}\n\nexport function kafkaCarrier(\n options: { headers?: readonly string[] } = {},\n): RpcCredentialCarrier {\n const message = (context: ExecutionContext) =>\n record(method(contextOf(context), \"getMessage\")?.());\n return {\n id: \"kafka\",\n matches: (context) =>\n message(context) !== undefined && \"headers\" in message(context)!,\n headers: (context) =>\n extract(message(context)?.headers, options.headers ?? credentialNames),\n };\n}\n\nexport function rmqCarrier(\n options: { headers?: readonly string[] } = {},\n): RpcCredentialCarrier {\n const message = (context: ExecutionContext) =>\n record(method(contextOf(context), \"getMessage\")?.());\n return {\n id: \"rmq\",\n matches: (context) =>\n message(context) !== undefined && \"properties\" in message(context)!,\n headers: (context) =>\n extract(\n record(message(context)?.properties)?.headers,\n options.headers ?? credentialNames,\n ),\n };\n}\n\nexport function mqttCarrier(\n options: { userProperties?: readonly string[] } = {},\n): RpcCredentialCarrier {\n return {\n id: \"mqtt\",\n matches: (context) => !!method(contextOf(context), \"getPacket\"),\n headers: (context) =>\n extract(\n record(record(method(contextOf(context), \"getPacket\")?.())?.properties)\n ?.userProperties,\n options.userProperties ?? credentialNames,\n ),\n };\n}\n\nexport function payloadCarrier(\n options: { field?: string } = {},\n): RpcCredentialCarrier {\n const payload = (context: ExecutionContext) => {\n const data = record(context.switchToRpc().getData<unknown>());\n const field = options.field ?? \"auth\";\n return data && Object.hasOwn(data, field) ? record(data[field]) : undefined;\n };\n return {\n id: \"payload\",\n matches: (context) => payload(context) !== undefined,\n headers: (context) => extract(payload(context), credentialNames),\n };\n}\n\nexport const defaultCarriers: readonly RpcCredentialCarrier[] = Object.freeze([\n grpcCarrier(),\n natsCarrier(),\n kafkaCarrier(),\n rmqCarrier(),\n mqttCarrier(),\n payloadCarrier(),\n]);\n","import { Logger, type ExecutionContext } from \"@nestjs/common\";\nimport { MetadataScanner } from \"@nestjs/core\";\nimport { MessagePattern, RpcException } from \"@nestjs/microservices\";\nimport type {\n AuthTransport,\n BootAdvice,\n ExtensionRef,\n TransportCall,\n TransportValidationContext,\n} from \"./auth-contracts.js\";\nimport {\n BetterAuthConfigurationError,\n AuthFailures,\n type AuthFailure,\n} from \"./auth-errors.js\";\nimport {\n defaultCarriers,\n grpcCarrier,\n type RpcCredentialCarrier,\n} from \"./rpc-carriers.js\";\n\nexport interface RpcTransportOptions {\n carriers?: readonly RpcCredentialCarrier[];\n hybridCoverage?: \"error\" | \"warn\" | \"off\";\n inheritAppConfig?: boolean;\n}\n\nexport function rpcTransport(\n options: RpcTransportOptions = {},\n): ExtensionRef<AuthTransport> {\n const carriers = [...(options.carriers ?? defaultCarriers)];\n const select = (context: ExecutionContext) =>\n carriers.find((carrier) => carrier.matches(context));\n const grpc = grpcCarrier();\n return {\n id: \"rpc\",\n requires: { hostlessCalls: true },\n handles: (context) => context.getType() === \"rpc\",\n describe(context): TransportCall {\n const candidate = context.switchToRpc().getContext<unknown>();\n const key =\n candidate !== null && typeof candidate === \"object\"\n ? candidate\n : context.getArgs();\n return {\n key,\n invocation: key,\n cookies: null,\n clientIp: null,\n headers() {\n const input = select(context)?.headers(context);\n try {\n return new Headers(input);\n } catch {\n // Custom carriers may return a raw HeadersInit. Conversion errors\n // include its values, so discard the original error and its cause.\n throw AuthFailures.rejected({\n status: 401,\n reason: \"MALFORMED_CREDENTIALS\",\n });\n }\n },\n param(name) {\n const data = context.switchToRpc().getData<unknown>();\n return data !== null &&\n typeof data === \"object\" &&\n Object.hasOwn(data, name)\n ? (data as Record<string, unknown>)[name]\n : undefined;\n },\n };\n },\n toException(failure: AuthFailure, context) {\n const carrier = select(context);\n return carrier?.toException\n ? carrier.toException(failure, context)\n : new RpcException({\n status: \"error\",\n statusCode: failure.status,\n code: failure.code,\n ...(failure.reason ? { reason: failure.reason } : {}),\n message: failure.message,\n });\n },\n toInternalException(error, context, info) {\n if (!grpc.matches(context)) {\n return error;\n }\n if (!info.repeated) {\n new Logger(\"BetterAuthRpc\").error(error);\n }\n return new RpcException({ code: 13, message: \"Internal server error\" });\n },\n validate(context: TransportValidationContext) {\n class Probe {\n handler(): void {}\n }\n MessagePattern(\"nestjs-kit-better-auth-probe\")(\n Probe.prototype,\n \"handler\",\n Object.getOwnPropertyDescriptor(Probe.prototype, \"handler\")!,\n );\n const patterns: unknown = Reflect.getMetadata(\n \"microservices:pattern\",\n Probe.prototype.handler,\n );\n if (\n !Array.isArray(patterns) ||\n patterns[0] !== \"nestjs-kit-better-auth-probe\"\n ) {\n throw new BetterAuthConfigurationError(\n \"NEST_METADATA_KEY_CHANGED\",\n \"Nest RPC pattern metadata failed its canary\",\n );\n }\n const explicit = context.hasHttpAdapter && !options.inheritAppConfig;\n const scanner = new MetadataScanner();\n for (const wrapper of context.discovery.getControllers()) {\n const target = wrapper.metatype;\n if (!target?.prototype || wrapper.isAlias) {\n continue;\n }\n for (const name of scanner.getAllMethodNames(target.prototype)) {\n if (\n Reflect.getMetadata(\n \"microservices:pattern\",\n target.prototype[name],\n ) === undefined\n ) {\n continue;\n }\n context.claim(target, name, explicit ? \"explicit\" : \"global\", {\n code: \"RPC_HANDLER_UNGUARDED\",\n everyHandler: explicit,\n coverage: explicit ? (options.hybridCoverage ?? \"error\") : \"error\",\n hint: \"Add @UseBetterAuth() or @Public() to the RPC controller/handler, or assert inheritAppConfig and pass { inheritAppConfig: true } to every connectMicroservice call.\",\n });\n }\n }\n },\n advise(): readonly BootAdvice[] {\n return options.inheritAppConfig\n ? [\n {\n level: \"warn\",\n code: \"W_RPC_INHERIT_APP_CONFIG_ASSERTED\",\n message:\n \"RPC coverage assumes every connectMicroservice() call passes { inheritAppConfig: true }. Prefer @UseBetterAuth() on message controllers for verifiable coverage.\",\n },\n ]\n : [];\n },\n } satisfies AuthTransport;\n}\n"],"mappings":"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"}
|
package/dist/organization.cjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const
|
|
3
|
-
const
|
|
2
|
+
const require_auth_decorators = require("./auth-decorators-CJKE9wlT.cjs");
|
|
3
|
+
const require_auth_errors = require("./auth-errors-RW7hOVI-.cjs");
|
|
4
4
|
let better_auth_api = require("better-auth/api");
|
|
5
|
-
|
|
5
|
+
// src/organization.ts
|
|
6
6
|
const ACTIVE_ORGANIZATION_ID = Symbol.for("@nestjs-kit/better-auth:org:active-organization-id");
|
|
7
7
|
const ACTIVE_MEMBER_ROLE = Symbol.for("@nestjs-kit/better-auth:org:active-member-role");
|
|
8
8
|
const ActiveOrganizationId = require_auth_decorators.defineInvocationParam(ACTIVE_ORGANIZATION_ID, { missing: "ORGANIZATION_REQUIRED" });
|
|
@@ -172,7 +172,6 @@ function orgMember(options = {}) {
|
|
|
172
172
|
function RequireOrgMember(options) {
|
|
173
173
|
return require_auth_decorators.Require(orgMember(options));
|
|
174
174
|
}
|
|
175
|
-
//#endregion
|
|
176
175
|
exports.ACTIVE_MEMBER_ROLE = ACTIVE_MEMBER_ROLE;
|
|
177
176
|
exports.ACTIVE_ORGANIZATION_ID = ACTIVE_ORGANIZATION_ID;
|
|
178
177
|
exports.ActiveMemberRole = ActiveMemberRole;
|
package/dist/organization.d.cts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { Mt as OrgPermissions, f as AuthorizationPolicy, l as AuthorizationContext, ot as Requirement, zt as SessionPrincipal } from "./auth-contracts-
|
|
2
|
-
//#region src/organization.d.ts
|
|
1
|
+
import { Mt as OrgPermissions, f as AuthorizationPolicy, l as AuthorizationContext, ot as Requirement, zt as SessionPrincipal } from "./auth-contracts-zvt8ysoZ.cjs";
|
|
3
2
|
export interface OrganizationRef {
|
|
4
3
|
(ctx: AuthorizationContext): unknown | Promise<unknown>;
|
|
5
4
|
readonly missingReason?: string;
|
|
@@ -35,6 +34,5 @@ export declare function orgMember(options?: {
|
|
|
35
34
|
export declare function RequireOrgMember(options?: {
|
|
36
35
|
organization?: OrganizationRef;
|
|
37
36
|
}): ClassDecorator & MethodDecorator;
|
|
38
|
-
//#endregion
|
|
39
37
|
export type { OrgPermissions };
|
|
40
38
|
//# sourceMappingURL=organization.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organization.d.cts","names":[],"sources":["../src/organization.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"organization.d.cts","names":[],"sources":["../src/organization.ts"],"mappings":";iBAaiB;GACd,KAAK,iCAAiC;WAC9B;;iBAEM;WACN,aAAa;WACb,cAAc;;iBAER;WACN,cAAc;;qBAEZ;qBAGA;qBAGA,4BAAoB;qBAIpB,wBAAgB;wBAoBb,gBACd,UAAU,KAAK,mCAAmC,kBAClD;EAAW;IACV;wBAGa,sBAAsB;wBAgDtB,UAAU,eAAe;wBAMzB,WAAW,eAAe;qBA4D7B,qBAAqB,oBAChC,qBACA;qBAiEW,iBAAiB,oBAC5B,iBACA;wBAqDc,cAAc,8BAC5B,aAAa,eAAe,IAC5B;EAAW,eAAe;IACzB,YAAY;wBASC,qBAAqB,8BACnC,aAAa,eAAe,IAC5B;EAAY,eAAe;IAC1B,iBAAiB;wBAGJ,UACd;EAAW,eAAe;IACzB,YAAY;wBAMC,iBAAiB;EAC/B,eAAe;IACb,iBAAiB"}
|
package/dist/organization.d.mts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { Mt as OrgPermissions, f as AuthorizationPolicy, l as AuthorizationContext, ot as Requirement, zt as SessionPrincipal } from "./auth-contracts-
|
|
2
|
-
//#region src/organization.d.ts
|
|
1
|
+
import { Mt as OrgPermissions, f as AuthorizationPolicy, l as AuthorizationContext, ot as Requirement, zt as SessionPrincipal } from "./auth-contracts-CADGyI0O.mjs";
|
|
3
2
|
export interface OrganizationRef {
|
|
4
3
|
(ctx: AuthorizationContext): unknown | Promise<unknown>;
|
|
5
4
|
readonly missingReason?: string;
|
|
@@ -35,6 +34,5 @@ export declare function orgMember(options?: {
|
|
|
35
34
|
export declare function RequireOrgMember(options?: {
|
|
36
35
|
organization?: OrganizationRef;
|
|
37
36
|
}): ClassDecorator & MethodDecorator;
|
|
38
|
-
//#endregion
|
|
39
37
|
export type { OrgPermissions };
|
|
40
38
|
//# sourceMappingURL=organization.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organization.d.mts","names":[],"sources":["../src/organization.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"organization.d.mts","names":[],"sources":["../src/organization.ts"],"mappings":";iBAaiB;GACd,KAAK,iCAAiC;WAC9B;;iBAEM;WACN,aAAa;WACb,cAAc;;iBAER;WACN,cAAc;;qBAEZ;qBAGA;qBAGA,4BAAoB;qBAIpB,wBAAgB;wBAoBb,gBACd,UAAU,KAAK,mCAAmC,kBAClD;EAAW;IACV;wBAGa,sBAAsB;wBAgDtB,UAAU,eAAe;wBAMzB,WAAW,eAAe;qBA4D7B,qBAAqB,oBAChC,qBACA;qBAiEW,iBAAiB,oBAC5B,iBACA;wBAqDc,cAAc,8BAC5B,aAAa,eAAe,IAC5B;EAAW,eAAe;IACzB,YAAY;wBASC,qBAAqB,8BACnC,aAAa,eAAe,IAC5B;EAAY,eAAe;IAC1B,iBAAiB;wBAGJ,UACd;EAAW,eAAe;IACzB,YAAY;wBAMC,iBAAiB;EAC/B,eAAe;IACb,iBAAiB"}
|
package/dist/organization.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { u as Require, v as defineInvocationParam } from "./auth-decorators-CkNkLNpU.mjs";
|
|
2
|
+
import { n as BetterAuthConfigurationError } from "./auth-errors-JjxGDVSt.mjs";
|
|
3
3
|
import { isAPIError } from "better-auth/api";
|
|
4
|
-
|
|
4
|
+
// src/organization.ts
|
|
5
5
|
const ACTIVE_ORGANIZATION_ID = Symbol.for("@nestjs-kit/better-auth:org:active-organization-id");
|
|
6
6
|
const ACTIVE_MEMBER_ROLE = Symbol.for("@nestjs-kit/better-auth:org:active-member-role");
|
|
7
7
|
const ActiveOrganizationId = defineInvocationParam(ACTIVE_ORGANIZATION_ID, { missing: "ORGANIZATION_REQUIRED" });
|
|
@@ -171,7 +171,6 @@ function orgMember(options = {}) {
|
|
|
171
171
|
function RequireOrgMember(options) {
|
|
172
172
|
return Require(orgMember(options));
|
|
173
173
|
}
|
|
174
|
-
//#endregion
|
|
175
174
|
export { ACTIVE_MEMBER_ROLE, ACTIVE_ORGANIZATION_ID, ActiveMemberRole, ActiveOrganizationId, RequireOrgMember, RequireOrgPermission, activeOrganization, fromHeader, fromParam, orgMember, orgMemberPolicy, orgPermission, orgPermissionPolicy, organizationRef };
|
|
176
175
|
|
|
177
176
|
//# sourceMappingURL=organization.mjs.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AsyncResource } from "node:async_hooks";
|
|
2
|
-
|
|
2
|
+
// src/set-cookies.ts
|
|
3
3
|
/** Set-Cookie line handling shared by the built-in platforms' cookie sinks. */
|
|
4
4
|
function cookieName(line) {
|
|
5
5
|
const separator = line.indexOf("=");
|
|
@@ -27,8 +27,7 @@ function setCookieAdditions(existing, values) {
|
|
|
27
27
|
}
|
|
28
28
|
return additions;
|
|
29
29
|
}
|
|
30
|
-
|
|
31
|
-
//#region src/platform.ts
|
|
30
|
+
// src/platform.ts
|
|
32
31
|
function appendHeaderValue(headers, name, value) {
|
|
33
32
|
if (typeof value === "string") {
|
|
34
33
|
headers.append(name, value);
|
|
@@ -408,7 +407,6 @@ function upgradeRequestUrl(request) {
|
|
|
408
407
|
})) throw new TypeError("A valid request target is required for an upgrade URL");
|
|
409
408
|
return `${scheme}://${host}${target.startsWith("/") ? target : `/${target}`}`;
|
|
410
409
|
}
|
|
411
|
-
//#endregion
|
|
412
410
|
export { recoverConsumedBody as a, writeWebResponse as c, readBoundedBody as i, headerLines as l, bindAsyncContext as n, toWebHeaders as o, mayHaveBody as r, upgradeRequestUrl as s, appendSetCookie as t, setCookieAdditions as u };
|
|
413
411
|
|
|
414
|
-
//# sourceMappingURL=platform-
|
|
412
|
+
//# sourceMappingURL=platform-BKYVzAv1.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-CZl7TY8j.mjs","names":[],"sources":["../src/set-cookies.ts","../src/platform.ts"],"sourcesContent":["/** Set-Cookie line handling shared by the built-in platforms' cookie sinks. */\nfunction cookieName(line: string): string {\n const separator = line.indexOf(\"=\");\n return (separator === -1 ? line : line.slice(0, separator)).trim();\n}\n\n/** A header value as the list of lines it holds. */\nexport function headerLines(\n value: string | number | readonly string[] | undefined,\n): string[] {\n return Array.isArray(value)\n ? value.map(String)\n : value === undefined\n ? []\n : [String(value)];\n}\n\n/**\n * The lines of `values` to append after `existing`. A line identical to the latest line already set for its cookie name\n * changes nothing and is skipped (ADR-09: the kernel's cookie sink de-duplicates identical Set-Cookie values, for example\n * a source that appends a call's cookies that the bridge also forwarded). Any other line is kept, so an identical line\n * after a different one for the same cookie still restores it.\n */\nexport function setCookieAdditions(\n existing: readonly string[],\n values: readonly string[],\n): string[] {\n const latest = new Map<string, string>();\n for (const line of existing) {\n latest.set(cookieName(line), line);\n }\n const additions: string[] = [];\n for (const line of values) {\n const name = cookieName(line);\n if (latest.get(name) === line) {\n continue;\n }\n latest.set(name, line);\n additions.push(line);\n }\n return additions;\n}\n","import { AsyncResource } from \"node:async_hooks\";\nimport type {\n IncomingHttpHeaders,\n IncomingMessage,\n ServerResponse,\n} from \"node:http\";\nimport { headerLines, setCookieAdditions } from \"./set-cookies.js\";\n\nfunction appendHeaderValue(\n headers: Headers,\n name: string,\n value: unknown,\n): void {\n if (typeof value === \"string\") {\n headers.append(name, value);\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n if (typeof item === \"string\") {\n headers.append(name, item);\n }\n }\n }\n}\n\n/** Convert Node headers to Web headers without exposing HTTP/2 metadata. */\nexport function toWebHeaders(\n raw: IncomingHttpHeaders | Record<string | symbol, unknown>,\n): Headers {\n const headers = new Headers();\n let authority: unknown;\n for (const [name, value] of Object.entries(raw)) {\n if (name === \":authority\") {\n authority = value;\n }\n if (name.startsWith(\":\")) {\n continue;\n }\n appendHeaderValue(headers, name, value);\n }\n if (!headers.has(\"host\")) {\n appendHeaderValue(headers, \"host\", authority);\n }\n return headers;\n}\n\n/** Determine whether Node request framing permits a request body. */\nexport function mayHaveBody(\n method: string,\n headers: IncomingHttpHeaders,\n): boolean {\n const normalizedMethod = method.toUpperCase();\n if (normalizedMethod === \"GET\" || normalizedMethod === \"HEAD\") {\n return false;\n }\n if (headers[\"transfer-encoding\"] !== undefined) {\n return true;\n }\n const declaredLength = headers[\"content-length\"]?.trim();\n return (\n declaredLength !== undefined &&\n /^\\d+$/.test(declaredLength) &&\n BigInt(declaredLength) > 0n\n );\n}\n\ninterface ReadBoundedBodyOptions {\n limit: number;\n declaredLength?: number;\n drainOnOverflow?: boolean;\n drainCap?: number;\n}\n\ntype ReadBoundedBodyResult =\n | { ok: true; bytes: Uint8Array }\n | { ok: false; reason: \"too-large\" | \"aborted\" };\n\nfunction assertByteLimit(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new RangeError(`${name} must be a non-negative safe integer`);\n }\n}\n\nfunction joinBytes(chunks: readonly Uint8Array[], length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n}\n\nasync function readBoundedWebBody(\n stream: ReadableStream<Uint8Array>,\n options: ReadBoundedBodyOptions,\n): Promise<ReadBoundedBodyResult> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let length = 0;\n try {\n if (\n options.declaredLength !== undefined &&\n options.declaredLength > options.limit\n ) {\n await reader.cancel().catch(() => undefined);\n return { ok: false, reason: \"too-large\" };\n }\n while (true) {\n const next = await reader.read();\n if (next.done) {\n return { ok: true, bytes: joinBytes(chunks, length) };\n }\n length += next.value.byteLength;\n if (length > options.limit) {\n await reader.cancel().catch(() => undefined);\n return { ok: false, reason: \"too-large\" };\n }\n chunks.push(next.value);\n }\n } catch {\n await reader.cancel().catch(() => undefined);\n return { ok: false, reason: \"aborted\" };\n } finally {\n reader.releaseLock();\n }\n}\n\ntype DestroyableReadable = NodeJS.ReadableStream & {\n destroyed?: boolean;\n destroy?: () => unknown;\n};\n\nfunction nodeChunkBytes(chunk: unknown): Uint8Array | null {\n if (typeof chunk === \"string\") {\n return Buffer.from(chunk);\n }\n if (chunk instanceof Uint8Array) {\n return chunk;\n }\n return null;\n}\n\nfunction readBoundedNodeBody(\n stream: DestroyableReadable,\n options: ReadBoundedBodyOptions,\n): Promise<ReadBoundedBodyResult> {\n const drainCap = options.drainCap ?? options.limit * 8;\n assertByteLimit(drainCap, \"drainCap\");\n\n return new Promise((resolve) => {\n const chunks: Uint8Array[] = [];\n let length = 0;\n let overflow =\n options.declaredLength !== undefined &&\n options.declaredLength > options.limit;\n let settled = false;\n\n const cleanup = () => {\n stream.removeListener(\"data\", onData);\n stream.removeListener(\"end\", onEnd);\n stream.removeListener(\"aborted\", onAborted);\n stream.removeListener(\"error\", onAborted);\n stream.removeListener(\"close\", onClose);\n };\n const destroy = () => {\n if (!stream.destroyed) {\n const absorbDestroyError = () => undefined;\n const removeDestroyErrorHandler = () => {\n stream.removeListener(\"error\", absorbDestroyError);\n };\n stream.once(\"error\", absorbDestroyError);\n stream.once(\"close\", removeDestroyErrorHandler);\n try {\n stream.destroy?.();\n } catch {\n stream.removeListener(\"error\", absorbDestroyError);\n stream.removeListener(\"close\", removeDestroyErrorHandler);\n }\n }\n };\n const finish = (result: ReadBoundedBodyResult, destroyStream = false) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(result);\n if (destroyStream) {\n destroy();\n }\n };\n const tooLarge = () => {\n finish({ ok: false, reason: \"too-large\" }, true);\n };\n const onData = (chunk: unknown) => {\n const bytes = nodeChunkBytes(chunk);\n if (bytes === null) {\n finish({ ok: false, reason: \"aborted\" }, true);\n return;\n }\n length += bytes.byteLength;\n if (!overflow && length <= options.limit) {\n chunks.push(bytes);\n return;\n }\n overflow = true;\n chunks.length = 0;\n if (!options.drainOnOverflow || length > drainCap) {\n tooLarge();\n }\n };\n const onEnd = () => {\n if (overflow) {\n finish({ ok: false, reason: \"too-large\" });\n return;\n }\n finish({ ok: true, bytes: joinBytes(chunks, length) });\n };\n const onAborted = () => {\n finish({ ok: false, reason: \"aborted\" }, true);\n };\n const onClose = () => {\n finish({ ok: false, reason: \"aborted\" });\n };\n\n stream.once(\"end\", onEnd);\n stream.once(\"aborted\", onAborted);\n stream.once(\"error\", onAborted);\n stream.once(\"close\", onClose);\n\n if (overflow && !options.drainOnOverflow) {\n tooLarge();\n return;\n }\n if (\n overflow &&\n options.declaredLength !== undefined &&\n options.declaredLength > drainCap\n ) {\n tooLarge();\n return;\n }\n stream.on(\"data\", onData);\n });\n}\n\n/** Read a Node or Web body stream without retaining bytes past the limit. */\nexport function readBoundedBody(\n stream: NodeJS.ReadableStream | ReadableStream<Uint8Array>,\n options: {\n limit: number;\n declaredLength?: number;\n drainOnOverflow?: boolean;\n drainCap?: number;\n },\n): Promise<\n | { ok: true; bytes: Uint8Array }\n | { ok: false; reason: \"too-large\" | \"aborted\" }\n> {\n assertByteLimit(options.limit, \"limit\");\n if (\n options.declaredLength !== undefined &&\n (!Number.isSafeInteger(options.declaredLength) ||\n options.declaredLength < 0)\n ) {\n throw new RangeError(\"declaredLength must be a non-negative safe integer\");\n }\n if (\"getReader\" in stream) {\n return readBoundedWebBody(stream, options);\n }\n return readBoundedNodeBody(stream, options);\n}\n\n/** Append response cookies without replacing values already set by the host. */\nexport function appendSetCookie(\n res: ServerResponse,\n values: readonly string[],\n): boolean {\n if (res.headersSent) {\n return false;\n }\n const existing = headerLines(res.getHeader(\"set-cookie\"));\n const additions = setCookieAdditions(existing, values);\n if (additions.length > 0) {\n res.setHeader(\"set-cookie\", [...existing, ...additions]);\n }\n return true;\n}\n\nfunction varyValues(value: string | number | readonly string[] | undefined) {\n const raw = Array.isArray(value) ? value : value === undefined ? [] : [value];\n return raw.flatMap((item) => String(item).split(\",\"));\n}\n\nfunction mergeVary(\n current: string | number | readonly string[] | undefined,\n added: string,\n): string {\n const values = [...varyValues(current), ...varyValues(added)]\n .map((value) => value.trim())\n .filter(Boolean);\n if (values.includes(\"*\")) {\n return \"*\";\n }\n const seen = new Set<string>();\n return values\n .filter((value) => {\n const normalized = value.toLowerCase();\n if (seen.has(normalized)) {\n return false;\n }\n seen.add(normalized);\n return true;\n })\n .join(\", \");\n}\n\nfunction endServerResponse(res: ServerResponse): Promise<void> {\n if (res.writableEnded) {\n return Promise.resolve();\n }\n return new Promise((resolve, reject) => {\n let settled = false;\n const cleanup = () => {\n res.removeListener(\"error\", onError);\n res.removeListener(\"close\", onClose);\n };\n const finish = (error?: Error) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n };\n const onError = (error: Error) => {\n finish(error);\n };\n const onClose = () => {\n finish();\n };\n res.once(\"error\", onError);\n res.once(\"close\", onClose);\n res.end(() => finish());\n });\n}\n\ntype ReadOutcome =\n | { type: \"read\"; value: ReadableStreamReadResult<Uint8Array> }\n | { type: \"read-error\"; error: unknown }\n | { type: \"stopped\" };\n\nfunction waitForDrainOrStop(\n res: ServerResponse,\n stopped: Promise<void>,\n): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n const finish = () => {\n if (settled) {\n return;\n }\n settled = true;\n res.removeListener(\"drain\", finish);\n resolve();\n };\n res.once(\"drain\", finish);\n void stopped.then(finish);\n });\n}\n\n/** Write a Web response while retaining host headers and Node backpressure. */\nexport async function writeWebResponse(\n res: ServerResponse,\n response: Response,\n options?: { head?: boolean },\n): Promise<void> {\n res.statusCode = response.status;\n for (const [name, value] of response.headers) {\n if (name === \"set-cookie\") {\n continue;\n }\n if (name === \"vary\") {\n res.setHeader(\"vary\", mergeVary(res.getHeader(\"vary\"), value));\n } else {\n res.setHeader(name, value);\n }\n }\n appendSetCookie(res, response.headers.getSetCookie());\n\n if (options?.head || response.body === null) {\n if (options?.head && response.body !== null) {\n await response.body.cancel().catch(() => undefined);\n }\n await endServerResponse(res);\n return;\n }\n\n const reader = response.body.getReader();\n let stopped = false;\n let writeError: Error | undefined;\n let stop!: () => void;\n const stoppedPromise = new Promise<void>((resolve) => {\n stop = resolve;\n });\n const onClose = () => {\n stopped = true;\n stop();\n void reader.cancel().catch(() => undefined);\n };\n const onError = (error: Error) => {\n writeError = error;\n stopped = true;\n stop();\n void reader.cancel(error).catch(() => undefined);\n };\n res.once(\"close\", onClose);\n res.once(\"error\", onError);\n\n try {\n while (!stopped) {\n const read: Promise<ReadOutcome> = reader.read().then(\n (value): ReadOutcome => ({ type: \"read\", value }),\n (error: unknown): ReadOutcome => ({ type: \"read-error\", error }),\n );\n const outcome = await Promise.race<ReadOutcome>([\n read,\n stoppedPromise.then(() => ({ type: \"stopped\" })),\n ]);\n if (outcome.type === \"stopped\") {\n break;\n }\n if (outcome.type === \"read-error\") {\n throw outcome.error;\n }\n if (outcome.value.done) {\n break;\n }\n if (!res.write(outcome.value.value)) {\n await waitForDrainOrStop(res, stoppedPromise);\n }\n }\n } catch (error) {\n await reader.cancel(error).catch(() => undefined);\n throw error;\n } finally {\n res.removeListener(\"close\", onClose);\n res.removeListener(\"error\", onError);\n reader.releaseLock();\n }\n\n if (writeError) {\n throw writeError;\n }\n if (!stopped) {\n await endServerResponse(res);\n }\n}\n\n/** Capture the active async resource for a later stream continuation. */\nexport function bindAsyncContext<F extends (...args: any[]) => any>(fn: F): F {\n return AsyncResource.bind(fn) as F;\n}\n\nfunction contentTypeOf(req: IncomingMessage): string {\n const raw = req.headers[\"content-type\"];\n return (\n (Array.isArray(raw) ? raw[0] : raw)\n ?.split(\";\", 1)[0]\n ?.trim()\n .toLowerCase() ?? \"\"\n );\n}\n\nfunction serializeFormBody(body: unknown): string | null {\n if (typeof body === \"string\" || body instanceof URLSearchParams) {\n return new URLSearchParams(body).toString();\n }\n if (body === null || typeof body !== \"object\" || Array.isArray(body)) {\n return null;\n }\n const parameters = new URLSearchParams();\n for (const [name, value] of Object.entries(body)) {\n if (Array.isArray(value)) {\n for (const item of value) {\n parameters.append(name, String(item));\n }\n } else {\n parameters.append(name, String(value));\n }\n }\n return parameters.toString();\n}\n\n/** Recover bytes after an earlier host parser consumed the request stream. */\nexport function recoverConsumedBody(\n req: IncomingMessage & { body?: unknown; rawBody?: Buffer },\n): Uint8Array | null {\n if (Buffer.isBuffer(req.rawBody)) {\n return Uint8Array.from(req.rawBody);\n }\n const contentType = contentTypeOf(req);\n try {\n if (contentType === \"application/json\" || contentType.endsWith(\"+json\")) {\n const serialized = JSON.stringify(req.body);\n return serialized === undefined\n ? null\n : new TextEncoder().encode(serialized);\n }\n if (contentType === \"application/x-www-form-urlencoded\") {\n const serialized = serializeFormBody(req.body);\n return serialized === null ? null : new TextEncoder().encode(serialized);\n }\n } catch {\n return null;\n }\n return null;\n}\n\nfunction hostHeader(headers: IncomingHttpHeaders | Headers): string | null {\n if (headers instanceof Headers) {\n return headers.get(\"host\");\n }\n for (const [name, value] of Object.entries(headers)) {\n if (name.toLowerCase() !== \"host\") {\n continue;\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (Array.isArray(value) && typeof value[0] === \"string\") {\n return value[0];\n }\n }\n return null;\n}\n\n/** Build an upgrade URL from socket TLS state, Host, and the raw target. */\nexport function upgradeRequestUrl(request: {\n headers: IncomingHttpHeaders | Headers;\n url?: string;\n secure?: boolean;\n socket?: { encrypted?: boolean };\n}): string {\n const scheme = request.secure || request.socket?.encrypted ? \"https\" : \"http\";\n const host = hostHeader(request.headers);\n if (\n host === null ||\n host.length === 0 ||\n [...host].some((character) => {\n const code = character.charCodeAt(0);\n return code <= 0x20 || code === 0x7f || \"/\\\\?#@\".includes(character);\n })\n ) {\n throw new TypeError(\"A valid Host header is required for an upgrade URL\");\n }\n let origin: URL;\n try {\n origin = new URL(`${scheme}://${host}`);\n } catch {\n throw new TypeError(\"A valid Host header is required for an upgrade URL\");\n }\n if (\n origin.username !== \"\" ||\n origin.password !== \"\" ||\n origin.pathname !== \"/\" ||\n origin.search !== \"\" ||\n origin.hash !== \"\" ||\n origin.host === \"\"\n ) {\n throw new TypeError(\"A valid Host header is required for an upgrade URL\");\n }\n const target = request.url ?? \"/\";\n if (\n [...target].some((character) => {\n const code = character.charCodeAt(0);\n return code <= 0x20 || code === 0x7f || character === \"#\";\n })\n ) {\n throw new TypeError(\n \"A valid request target is required for an upgrade URL\",\n );\n }\n const path = target.startsWith(\"/\") ? target : `/${target}`;\n return `${scheme}://${host}${path}`;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"platform-BKYVzAv1.mjs","names":[],"sources":["../src/set-cookies.ts","../src/platform.ts"],"sourcesContent":["/** Set-Cookie line handling shared by the built-in platforms' cookie sinks. */\nfunction cookieName(line: string): string {\n const separator = line.indexOf(\"=\");\n return (separator === -1 ? line : line.slice(0, separator)).trim();\n}\n\n/** A header value as the list of lines it holds. */\nexport function headerLines(\n value: string | number | readonly string[] | undefined,\n): string[] {\n return Array.isArray(value)\n ? value.map(String)\n : value === undefined\n ? []\n : [String(value)];\n}\n\n/**\n * The lines of `values` to append after `existing`. A line identical to the latest line already set for its cookie name\n * changes nothing and is skipped (ADR-09: the kernel's cookie sink de-duplicates identical Set-Cookie values, for example\n * a source that appends a call's cookies that the bridge also forwarded). Any other line is kept, so an identical line\n * after a different one for the same cookie still restores it.\n */\nexport function setCookieAdditions(\n existing: readonly string[],\n values: readonly string[],\n): string[] {\n const latest = new Map<string, string>();\n for (const line of existing) {\n latest.set(cookieName(line), line);\n }\n const additions: string[] = [];\n for (const line of values) {\n const name = cookieName(line);\n if (latest.get(name) === line) {\n continue;\n }\n latest.set(name, line);\n additions.push(line);\n }\n return additions;\n}\n","import { AsyncResource } from \"node:async_hooks\";\nimport type {\n IncomingHttpHeaders,\n IncomingMessage,\n ServerResponse,\n} from \"node:http\";\nimport { headerLines, setCookieAdditions } from \"./set-cookies.js\";\n\nfunction appendHeaderValue(\n headers: Headers,\n name: string,\n value: unknown,\n): void {\n if (typeof value === \"string\") {\n headers.append(name, value);\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n if (typeof item === \"string\") {\n headers.append(name, item);\n }\n }\n }\n}\n\n/** Convert Node headers to Web headers without exposing HTTP/2 metadata. */\nexport function toWebHeaders(\n raw: IncomingHttpHeaders | Record<string | symbol, unknown>,\n): Headers {\n const headers = new Headers();\n let authority: unknown;\n for (const [name, value] of Object.entries(raw)) {\n if (name === \":authority\") {\n authority = value;\n }\n if (name.startsWith(\":\")) {\n continue;\n }\n appendHeaderValue(headers, name, value);\n }\n if (!headers.has(\"host\")) {\n appendHeaderValue(headers, \"host\", authority);\n }\n return headers;\n}\n\n/** Determine whether Node request framing permits a request body. */\nexport function mayHaveBody(\n method: string,\n headers: IncomingHttpHeaders,\n): boolean {\n const normalizedMethod = method.toUpperCase();\n if (normalizedMethod === \"GET\" || normalizedMethod === \"HEAD\") {\n return false;\n }\n if (headers[\"transfer-encoding\"] !== undefined) {\n return true;\n }\n const declaredLength = headers[\"content-length\"]?.trim();\n return (\n declaredLength !== undefined &&\n /^\\d+$/.test(declaredLength) &&\n BigInt(declaredLength) > 0n\n );\n}\n\ninterface ReadBoundedBodyOptions {\n limit: number;\n declaredLength?: number;\n drainOnOverflow?: boolean;\n drainCap?: number;\n}\n\ntype ReadBoundedBodyResult =\n | { ok: true; bytes: Uint8Array }\n | { ok: false; reason: \"too-large\" | \"aborted\" };\n\nfunction assertByteLimit(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new RangeError(`${name} must be a non-negative safe integer`);\n }\n}\n\nfunction joinBytes(chunks: readonly Uint8Array[], length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n}\n\nasync function readBoundedWebBody(\n stream: ReadableStream<Uint8Array>,\n options: ReadBoundedBodyOptions,\n): Promise<ReadBoundedBodyResult> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let length = 0;\n try {\n if (\n options.declaredLength !== undefined &&\n options.declaredLength > options.limit\n ) {\n await reader.cancel().catch(() => undefined);\n return { ok: false, reason: \"too-large\" };\n }\n while (true) {\n const next = await reader.read();\n if (next.done) {\n return { ok: true, bytes: joinBytes(chunks, length) };\n }\n length += next.value.byteLength;\n if (length > options.limit) {\n await reader.cancel().catch(() => undefined);\n return { ok: false, reason: \"too-large\" };\n }\n chunks.push(next.value);\n }\n } catch {\n await reader.cancel().catch(() => undefined);\n return { ok: false, reason: \"aborted\" };\n } finally {\n reader.releaseLock();\n }\n}\n\ntype DestroyableReadable = NodeJS.ReadableStream & {\n destroyed?: boolean;\n destroy?: () => unknown;\n};\n\nfunction nodeChunkBytes(chunk: unknown): Uint8Array | null {\n if (typeof chunk === \"string\") {\n return Buffer.from(chunk);\n }\n if (chunk instanceof Uint8Array) {\n return chunk;\n }\n return null;\n}\n\nfunction readBoundedNodeBody(\n stream: DestroyableReadable,\n options: ReadBoundedBodyOptions,\n): Promise<ReadBoundedBodyResult> {\n const drainCap = options.drainCap ?? options.limit * 8;\n assertByteLimit(drainCap, \"drainCap\");\n\n return new Promise((resolve) => {\n const chunks: Uint8Array[] = [];\n let length = 0;\n let overflow =\n options.declaredLength !== undefined &&\n options.declaredLength > options.limit;\n let settled = false;\n\n const cleanup = () => {\n stream.removeListener(\"data\", onData);\n stream.removeListener(\"end\", onEnd);\n stream.removeListener(\"aborted\", onAborted);\n stream.removeListener(\"error\", onAborted);\n stream.removeListener(\"close\", onClose);\n };\n const destroy = () => {\n if (!stream.destroyed) {\n const absorbDestroyError = () => undefined;\n const removeDestroyErrorHandler = () => {\n stream.removeListener(\"error\", absorbDestroyError);\n };\n stream.once(\"error\", absorbDestroyError);\n stream.once(\"close\", removeDestroyErrorHandler);\n try {\n stream.destroy?.();\n } catch {\n stream.removeListener(\"error\", absorbDestroyError);\n stream.removeListener(\"close\", removeDestroyErrorHandler);\n }\n }\n };\n const finish = (result: ReadBoundedBodyResult, destroyStream = false) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(result);\n if (destroyStream) {\n destroy();\n }\n };\n const tooLarge = () => {\n finish({ ok: false, reason: \"too-large\" }, true);\n };\n const onData = (chunk: unknown) => {\n const bytes = nodeChunkBytes(chunk);\n if (bytes === null) {\n finish({ ok: false, reason: \"aborted\" }, true);\n return;\n }\n length += bytes.byteLength;\n if (!overflow && length <= options.limit) {\n chunks.push(bytes);\n return;\n }\n overflow = true;\n chunks.length = 0;\n if (!options.drainOnOverflow || length > drainCap) {\n tooLarge();\n }\n };\n const onEnd = () => {\n if (overflow) {\n finish({ ok: false, reason: \"too-large\" });\n return;\n }\n finish({ ok: true, bytes: joinBytes(chunks, length) });\n };\n const onAborted = () => {\n finish({ ok: false, reason: \"aborted\" }, true);\n };\n const onClose = () => {\n finish({ ok: false, reason: \"aborted\" });\n };\n\n stream.once(\"end\", onEnd);\n stream.once(\"aborted\", onAborted);\n stream.once(\"error\", onAborted);\n stream.once(\"close\", onClose);\n\n if (overflow && !options.drainOnOverflow) {\n tooLarge();\n return;\n }\n if (\n overflow &&\n options.declaredLength !== undefined &&\n options.declaredLength > drainCap\n ) {\n tooLarge();\n return;\n }\n stream.on(\"data\", onData);\n });\n}\n\n/** Read a Node or Web body stream without retaining bytes past the limit. */\nexport function readBoundedBody(\n stream: NodeJS.ReadableStream | ReadableStream<Uint8Array>,\n options: {\n limit: number;\n declaredLength?: number;\n drainOnOverflow?: boolean;\n drainCap?: number;\n },\n): Promise<\n | { ok: true; bytes: Uint8Array }\n | { ok: false; reason: \"too-large\" | \"aborted\" }\n> {\n assertByteLimit(options.limit, \"limit\");\n if (\n options.declaredLength !== undefined &&\n (!Number.isSafeInteger(options.declaredLength) ||\n options.declaredLength < 0)\n ) {\n throw new RangeError(\"declaredLength must be a non-negative safe integer\");\n }\n if (\"getReader\" in stream) {\n return readBoundedWebBody(stream, options);\n }\n return readBoundedNodeBody(stream, options);\n}\n\n/** Append response cookies without replacing values already set by the host. */\nexport function appendSetCookie(\n res: ServerResponse,\n values: readonly string[],\n): boolean {\n if (res.headersSent) {\n return false;\n }\n const existing = headerLines(res.getHeader(\"set-cookie\"));\n const additions = setCookieAdditions(existing, values);\n if (additions.length > 0) {\n res.setHeader(\"set-cookie\", [...existing, ...additions]);\n }\n return true;\n}\n\nfunction varyValues(value: string | number | readonly string[] | undefined) {\n const raw = Array.isArray(value) ? value : value === undefined ? [] : [value];\n return raw.flatMap((item) => String(item).split(\",\"));\n}\n\nfunction mergeVary(\n current: string | number | readonly string[] | undefined,\n added: string,\n): string {\n const values = [...varyValues(current), ...varyValues(added)]\n .map((value) => value.trim())\n .filter(Boolean);\n if (values.includes(\"*\")) {\n return \"*\";\n }\n const seen = new Set<string>();\n return values\n .filter((value) => {\n const normalized = value.toLowerCase();\n if (seen.has(normalized)) {\n return false;\n }\n seen.add(normalized);\n return true;\n })\n .join(\", \");\n}\n\nfunction endServerResponse(res: ServerResponse): Promise<void> {\n if (res.writableEnded) {\n return Promise.resolve();\n }\n return new Promise((resolve, reject) => {\n let settled = false;\n const cleanup = () => {\n res.removeListener(\"error\", onError);\n res.removeListener(\"close\", onClose);\n };\n const finish = (error?: Error) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n };\n const onError = (error: Error) => {\n finish(error);\n };\n const onClose = () => {\n finish();\n };\n res.once(\"error\", onError);\n res.once(\"close\", onClose);\n res.end(() => finish());\n });\n}\n\ntype ReadOutcome =\n | { type: \"read\"; value: ReadableStreamReadResult<Uint8Array> }\n | { type: \"read-error\"; error: unknown }\n | { type: \"stopped\" };\n\nfunction waitForDrainOrStop(\n res: ServerResponse,\n stopped: Promise<void>,\n): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n const finish = () => {\n if (settled) {\n return;\n }\n settled = true;\n res.removeListener(\"drain\", finish);\n resolve();\n };\n res.once(\"drain\", finish);\n void stopped.then(finish);\n });\n}\n\n/** Write a Web response while retaining host headers and Node backpressure. */\nexport async function writeWebResponse(\n res: ServerResponse,\n response: Response,\n options?: { head?: boolean },\n): Promise<void> {\n res.statusCode = response.status;\n for (const [name, value] of response.headers) {\n if (name === \"set-cookie\") {\n continue;\n }\n if (name === \"vary\") {\n res.setHeader(\"vary\", mergeVary(res.getHeader(\"vary\"), value));\n } else {\n res.setHeader(name, value);\n }\n }\n appendSetCookie(res, response.headers.getSetCookie());\n\n if (options?.head || response.body === null) {\n if (options?.head && response.body !== null) {\n await response.body.cancel().catch(() => undefined);\n }\n await endServerResponse(res);\n return;\n }\n\n const reader = response.body.getReader();\n let stopped = false;\n let writeError: Error | undefined;\n let stop!: () => void;\n const stoppedPromise = new Promise<void>((resolve) => {\n stop = resolve;\n });\n const onClose = () => {\n stopped = true;\n stop();\n void reader.cancel().catch(() => undefined);\n };\n const onError = (error: Error) => {\n writeError = error;\n stopped = true;\n stop();\n void reader.cancel(error).catch(() => undefined);\n };\n res.once(\"close\", onClose);\n res.once(\"error\", onError);\n\n try {\n while (!stopped) {\n const read: Promise<ReadOutcome> = reader.read().then(\n (value): ReadOutcome => ({ type: \"read\", value }),\n (error: unknown): ReadOutcome => ({ type: \"read-error\", error }),\n );\n const outcome = await Promise.race<ReadOutcome>([\n read,\n stoppedPromise.then(() => ({ type: \"stopped\" })),\n ]);\n if (outcome.type === \"stopped\") {\n break;\n }\n if (outcome.type === \"read-error\") {\n throw outcome.error;\n }\n if (outcome.value.done) {\n break;\n }\n if (!res.write(outcome.value.value)) {\n await waitForDrainOrStop(res, stoppedPromise);\n }\n }\n } catch (error) {\n await reader.cancel(error).catch(() => undefined);\n throw error;\n } finally {\n res.removeListener(\"close\", onClose);\n res.removeListener(\"error\", onError);\n reader.releaseLock();\n }\n\n if (writeError) {\n throw writeError;\n }\n if (!stopped) {\n await endServerResponse(res);\n }\n}\n\n/** Capture the active async resource for a later stream continuation. */\nexport function bindAsyncContext<F extends (...args: any[]) => any>(fn: F): F {\n return AsyncResource.bind(fn) as F;\n}\n\nfunction contentTypeOf(req: IncomingMessage): string {\n const raw = req.headers[\"content-type\"];\n return (\n (Array.isArray(raw) ? raw[0] : raw)\n ?.split(\";\", 1)[0]\n ?.trim()\n .toLowerCase() ?? \"\"\n );\n}\n\nfunction serializeFormBody(body: unknown): string | null {\n if (typeof body === \"string\" || body instanceof URLSearchParams) {\n return new URLSearchParams(body).toString();\n }\n if (body === null || typeof body !== \"object\" || Array.isArray(body)) {\n return null;\n }\n const parameters = new URLSearchParams();\n for (const [name, value] of Object.entries(body)) {\n if (Array.isArray(value)) {\n for (const item of value) {\n parameters.append(name, String(item));\n }\n } else {\n parameters.append(name, String(value));\n }\n }\n return parameters.toString();\n}\n\n/** Recover bytes after an earlier host parser consumed the request stream. */\nexport function recoverConsumedBody(\n req: IncomingMessage & { body?: unknown; rawBody?: Buffer },\n): Uint8Array | null {\n if (Buffer.isBuffer(req.rawBody)) {\n return Uint8Array.from(req.rawBody);\n }\n const contentType = contentTypeOf(req);\n try {\n if (contentType === \"application/json\" || contentType.endsWith(\"+json\")) {\n const serialized = JSON.stringify(req.body);\n return serialized === undefined\n ? null\n : new TextEncoder().encode(serialized);\n }\n if (contentType === \"application/x-www-form-urlencoded\") {\n const serialized = serializeFormBody(req.body);\n return serialized === null ? null : new TextEncoder().encode(serialized);\n }\n } catch {\n return null;\n }\n return null;\n}\n\nfunction hostHeader(headers: IncomingHttpHeaders | Headers): string | null {\n if (headers instanceof Headers) {\n return headers.get(\"host\");\n }\n for (const [name, value] of Object.entries(headers)) {\n if (name.toLowerCase() !== \"host\") {\n continue;\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (Array.isArray(value) && typeof value[0] === \"string\") {\n return value[0];\n }\n }\n return null;\n}\n\n/** Build an upgrade URL from socket TLS state, Host, and the raw target. */\nexport function upgradeRequestUrl(request: {\n headers: IncomingHttpHeaders | Headers;\n url?: string;\n secure?: boolean;\n socket?: { encrypted?: boolean };\n}): string {\n const scheme = request.secure || request.socket?.encrypted ? \"https\" : \"http\";\n const host = hostHeader(request.headers);\n if (\n host === null ||\n host.length === 0 ||\n [...host].some((character) => {\n const code = character.charCodeAt(0);\n return code <= 0x20 || code === 0x7f || \"/\\\\?#@\".includes(character);\n })\n ) {\n throw new TypeError(\"A valid Host header is required for an upgrade URL\");\n }\n let origin: URL;\n try {\n origin = new URL(`${scheme}://${host}`);\n } catch {\n throw new TypeError(\"A valid Host header is required for an upgrade URL\");\n }\n if (\n origin.username !== \"\" ||\n origin.password !== \"\" ||\n origin.pathname !== \"/\" ||\n origin.search !== \"\" ||\n origin.hash !== \"\" ||\n origin.host === \"\"\n ) {\n throw new TypeError(\"A valid Host header is required for an upgrade URL\");\n }\n const target = request.url ?? \"/\";\n if (\n [...target].some((character) => {\n const code = character.charCodeAt(0);\n return code <= 0x20 || code === 0x7f || character === \"#\";\n })\n ) {\n throw new TypeError(\n \"A valid request target is required for an upgrade URL\",\n );\n }\n const path = target.startsWith(\"/\") ? target : `/${target}`;\n return `${scheme}://${host}${path}`;\n}\n"],"mappings":";;;AACA,SAAS,WAAW,MAAsB;CACxC,MAAM,YAAY,KAAK,QAAQ,GAAG;CAClC,QAAQ,cAAc,KAAK,OAAO,KAAK,MAAM,GAAG,SAAS,EAAA,CAAG,KAAK;AACnE;;AAGA,SAAgB,YACd,OACU;CACV,OAAO,MAAM,QAAQ,KAAK,IACtB,MAAM,IAAI,MAAM,IAChB,UAAU,KAAA,IACR,CAAC,IACD,CAAC,OAAO,KAAK,CAAC;AACtB;;;;;;;AAQA,SAAgB,mBACd,UACA,QACU;CACV,MAAM,yBAAS,IAAI,IAAoB;CACvC,KAAK,MAAM,QAAQ,UACjB,OAAO,IAAI,WAAW,IAAI,GAAG,IAAI;CAEnC,MAAM,YAAsB,CAAC;CAC7B,KAAK,MAAM,QAAQ,QAAQ;EACzB,MAAM,OAAO,WAAW,IAAI;EAC5B,IAAI,OAAO,IAAI,IAAI,MAAM,MACvB;EAEF,OAAO,IAAI,MAAM,IAAI;EACrB,UAAU,KAAK,IAAI;CACrB;CACA,OAAO;AACT;;ACjCA,SAAS,kBACP,SACA,MACA,OACM;CACN,IAAI,OAAO,UAAU,UAAU;EAC7B,QAAQ,OAAO,MAAM,KAAK;EAC1B;CACF;CACA,IAAI,MAAM,QAAQ,KAAK,GAChB;OAAA,MAAM,QAAQ,OACjB,IAAI,OAAO,SAAS,UAClB,QAAQ,OAAO,MAAM,IAAI;CAAA;AAIjC;;AAGA,SAAgB,aACd,KACS;CACT,MAAM,UAAU,IAAI,QAAQ;CAC5B,IAAI;CACJ,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,GAAG,GAAG;EAC/C,IAAI,SAAS,cACX,YAAY;EAEd,IAAI,KAAK,WAAW,GAAG,GACrB;EAEF,kBAAkB,SAAS,MAAM,KAAK;CACxC;CACA,IAAI,CAAC,QAAQ,IAAI,MAAM,GACrB,kBAAkB,SAAS,QAAQ,SAAS;CAE9C,OAAO;AACT;;AAGA,SAAgB,YACd,QACA,SACS;CACT,MAAM,mBAAmB,OAAO,YAAY;CAC5C,IAAI,qBAAqB,SAAS,qBAAqB,QACrD,OAAO;CAET,IAAI,QAAQ,yBAAyB,KAAA,GACnC,OAAO;CAET,MAAM,iBAAiB,QAAQ,iBAAiB,EAAE,KAAK;CACvD,OACE,mBAAmB,KAAA,KACnB,QAAQ,KAAK,cAAc,KAC3B,OAAO,cAAc,IAAI;AAE7B;AAaA,SAAS,gBAAgB,OAAe,MAAoB;CAC1D,IAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GAC1C,MAAM,IAAI,WAAW,GAAG,KAAK,qCAAqC;AAEtE;AAEA,SAAS,UAAU,QAA+B,QAA4B;CAC5E,MAAM,QAAQ,IAAI,WAAW,MAAM;CACnC,IAAI,SAAS;CACb,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,IAAI,OAAO,MAAM;EACvB,UAAU,MAAM;CAClB;CACA,OAAO;AACT;AAEA,eAAe,mBACb,QACA,SACgC;CAChC,MAAM,SAAS,OAAO,UAAU;CAChC,MAAM,SAAuB,CAAC;CAC9B,IAAI,SAAS;CACb,IAAI;EACF,IACE,QAAQ,mBAAmB,KAAA,KAC3B,QAAQ,iBAAiB,QAAQ,OACjC;GACA,MAAM,OAAO,OAAO,CAAC,CAAC,YAAY,KAAA,CAAS;GAC3C,OAAO;IAAE,IAAI;IAAO,QAAQ;GAAY;EAC1C;EACA,OAAO,MAAM;GACX,MAAM,OAAO,MAAM,OAAO,KAAK;GAC/B,IAAI,KAAK,MACP,OAAO;IAAE,IAAI;IAAM,OAAO,UAAU,QAAQ,MAAM;GAAE;GAEtD,UAAU,KAAK,MAAM;GACrB,IAAI,SAAS,QAAQ,OAAO;IAC1B,MAAM,OAAO,OAAO,CAAC,CAAC,YAAY,KAAA,CAAS;IAC3C,OAAO;KAAE,IAAI;KAAO,QAAQ;IAAY;GAC1C;GACA,OAAO,KAAK,KAAK,KAAK;EACxB;CACF,QAAQ;EACN,MAAM,OAAO,OAAO,CAAC,CAAC,YAAY,KAAA,CAAS;EAC3C,OAAO;GAAE,IAAI;GAAO,QAAQ;EAAU;CACxC,UAAU;EACR,OAAO,YAAY;CACrB;AACF;AAOA,SAAS,eAAe,OAAmC;CACzD,IAAI,OAAO,UAAU,UACnB,OAAO,OAAO,KAAK,KAAK;CAE1B,IAAI,iBAAiB,YACnB,OAAO;CAET,OAAO;AACT;AAEA,SAAS,oBACP,QACA,SACgC;CAChC,MAAM,WAAW,QAAQ,YAAY,QAAQ,QAAQ;CACrD,gBAAgB,UAAU,UAAU;CAEpC,OAAO,IAAI,SAAS,YAAY;EAC9B,MAAM,SAAuB,CAAC;EAC9B,IAAI,SAAS;EACb,IAAI,WACF,QAAQ,mBAAmB,KAAA,KAC3B,QAAQ,iBAAiB,QAAQ;EACnC,IAAI,UAAU;EAEd,MAAM,gBAAgB;GACpB,OAAO,eAAe,QAAQ,MAAM;GACpC,OAAO,eAAe,OAAO,KAAK;GAClC,OAAO,eAAe,WAAW,SAAS;GAC1C,OAAO,eAAe,SAAS,SAAS;GACxC,OAAO,eAAe,SAAS,OAAO;EACxC;EACA,MAAM,gBAAgB;GACpB,IAAI,CAAC,OAAO,WAAW;IACrB,MAAM,2BAA2B,KAAA;IACjC,MAAM,kCAAkC;KACtC,OAAO,eAAe,SAAS,kBAAkB;IACnD;IACA,OAAO,KAAK,SAAS,kBAAkB;IACvC,OAAO,KAAK,SAAS,yBAAyB;IAC9C,IAAI;KACF,OAAO,UAAU;IACnB,QAAQ;KACN,OAAO,eAAe,SAAS,kBAAkB;KACjD,OAAO,eAAe,SAAS,yBAAyB;IAC1D;GACF;EACF;EACA,MAAM,UAAU,QAA+B,gBAAgB,UAAU;GACvE,IAAI,SACF;GAEF,UAAU;GACV,QAAQ;GACR,QAAQ,MAAM;GACd,IAAI,eACF,QAAQ;EAEZ;EACA,MAAM,iBAAiB;GACrB,OAAO;IAAE,IAAI;IAAO,QAAQ;GAAY,GAAG,IAAI;EACjD;EACA,MAAM,UAAU,UAAmB;GACjC,MAAM,QAAQ,eAAe,KAAK;GAClC,IAAI,UAAU,MAAM;IAClB,OAAO;KAAE,IAAI;KAAO,QAAQ;IAAU,GAAG,IAAI;IAC7C;GACF;GACA,UAAU,MAAM;GAChB,IAAI,CAAC,YAAY,UAAU,QAAQ,OAAO;IACxC,OAAO,KAAK,KAAK;IACjB;GACF;GACA,WAAW;GACX,OAAO,SAAS;GAChB,IAAI,CAAC,QAAQ,mBAAmB,SAAS,UACvC,SAAS;EAEb;EACA,MAAM,cAAc;GAClB,IAAI,UAAU;IACZ,OAAO;KAAE,IAAI;KAAO,QAAQ;IAAY,CAAC;IACzC;GACF;GACA,OAAO;IAAE,IAAI;IAAM,OAAO,UAAU,QAAQ,MAAM;GAAE,CAAC;EACvD;EACA,MAAM,kBAAkB;GACtB,OAAO;IAAE,IAAI;IAAO,QAAQ;GAAU,GAAG,IAAI;EAC/C;EACA,MAAM,gBAAgB;GACpB,OAAO;IAAE,IAAI;IAAO,QAAQ;GAAU,CAAC;EACzC;EAEA,OAAO,KAAK,OAAO,KAAK;EACxB,OAAO,KAAK,WAAW,SAAS;EAChC,OAAO,KAAK,SAAS,SAAS;EAC9B,OAAO,KAAK,SAAS,OAAO;EAE5B,IAAI,YAAY,CAAC,QAAQ,iBAAiB;GACxC,SAAS;GACT;EACF;EACA,IACE,YACA,QAAQ,mBAAmB,KAAA,KAC3B,QAAQ,iBAAiB,UACzB;GACA,SAAS;GACT;EACF;EACA,OAAO,GAAG,QAAQ,MAAM;CAC1B,CAAC;AACH;;AAGA,SAAgB,gBACd,QACA,SASA;CACA,gBAAgB,QAAQ,OAAO,OAAO;CACtC,IACE,QAAQ,mBAAmB,KAAA,MAC1B,CAAC,OAAO,cAAc,QAAQ,cAAc,KAC3C,QAAQ,iBAAiB,IAE3B,MAAM,IAAI,WAAW,oDAAoD;CAE3E,IAAI,eAAe,QACjB,OAAO,mBAAmB,QAAQ,OAAO;CAE3C,OAAO,oBAAoB,QAAQ,OAAO;AAC5C;;AAGA,SAAgB,gBACd,KACA,QACS;CACT,IAAI,IAAI,aACN,OAAO;CAET,MAAM,WAAW,YAAY,IAAI,UAAU,YAAY,CAAC;CACxD,MAAM,YAAY,mBAAmB,UAAU,MAAM;CACrD,IAAI,UAAU,SAAS,GACrB,IAAI,UAAU,cAAc,CAAC,GAAG,UAAU,GAAG,SAAS,CAAC;CAEzD,OAAO;AACT;AAEA,SAAS,WAAW,OAAwD;CAE1E,QADY,MAAM,QAAQ,KAAK,IAAI,QAAQ,UAAU,KAAA,IAAY,CAAC,IAAI,CAAC,KAAK,EAAA,CACjE,SAAS,SAAS,OAAO,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;AACtD;AAEA,SAAS,UACP,SACA,OACQ;CACR,MAAM,SAAS,CAAC,GAAG,WAAW,OAAO,GAAG,GAAG,WAAW,KAAK,CAAC,CAAC,CAC1D,KAAK,UAAU,MAAM,KAAK,CAAC,CAAC,CAC5B,OAAO,OAAO;CACjB,IAAI,OAAO,SAAS,GAAG,GACrB,OAAO;CAET,MAAM,uBAAO,IAAI,IAAY;CAC7B,OAAO,OACJ,QAAQ,UAAU;EACjB,MAAM,aAAa,MAAM,YAAY;EACrC,IAAI,KAAK,IAAI,UAAU,GACrB,OAAO;EAET,KAAK,IAAI,UAAU;EACnB,OAAO;CACT,CAAC,CAAC,CACD,KAAK,IAAI;AACd;AAEA,SAAS,kBAAkB,KAAoC;CAC7D,IAAI,IAAI,eACN,OAAO,QAAQ,QAAQ;CAEzB,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,IAAI,UAAU;EACd,MAAM,gBAAgB;GACpB,IAAI,eAAe,SAAS,OAAO;GACnC,IAAI,eAAe,SAAS,OAAO;EACrC;EACA,MAAM,UAAU,UAAkB;GAChC,IAAI,SACF;GAEF,UAAU;GACV,QAAQ;GACR,IAAI,OACF,OAAO,KAAK;QAEZ,QAAQ;EAEZ;EACA,MAAM,WAAW,UAAiB;GAChC,OAAO,KAAK;EACd;EACA,MAAM,gBAAgB;GACpB,OAAO;EACT;EACA,IAAI,KAAK,SAAS,OAAO;EACzB,IAAI,KAAK,SAAS,OAAO;EACzB,IAAI,UAAU,OAAO,CAAC;CACxB,CAAC;AACH;AAOA,SAAS,mBACP,KACA,SACe;CACf,OAAO,IAAI,SAAS,YAAY;EAC9B,IAAI,UAAU;EACd,MAAM,eAAe;GACnB,IAAI,SACF;GAEF,UAAU;GACV,IAAI,eAAe,SAAS,MAAM;GAClC,QAAQ;EACV;EACA,IAAI,KAAK,SAAS,MAAM;EACxB,QAAa,KAAK,MAAM;CAC1B,CAAC;AACH;;AAGA,eAAsB,iBACpB,KACA,UACA,SACe;CACf,IAAI,aAAa,SAAS;CAC1B,KAAK,MAAM,CAAC,MAAM,UAAU,SAAS,SAAS;EAC5C,IAAI,SAAS,cACX;EAEF,IAAI,SAAS,QACX,IAAI,UAAU,QAAQ,UAAU,IAAI,UAAU,MAAM,GAAG,KAAK,CAAC;OAE7D,IAAI,UAAU,MAAM,KAAK;CAE7B;CACA,gBAAgB,KAAK,SAAS,QAAQ,aAAa,CAAC;CAEpD,IAAI,SAAS,QAAQ,SAAS,SAAS,MAAM;EAC3C,IAAI,SAAS,QAAQ,SAAS,SAAS,MACrC,MAAM,SAAS,KAAK,OAAO,CAAC,CAAC,YAAY,KAAA,CAAS;EAEpD,MAAM,kBAAkB,GAAG;EAC3B;CACF;CAEA,MAAM,SAAS,SAAS,KAAK,UAAU;CACvC,IAAI,UAAU;CACd,IAAI;CACJ,IAAI;CACJ,MAAM,iBAAiB,IAAI,SAAe,YAAY;EACpD,OAAO;CACT,CAAC;CACD,MAAM,gBAAgB;EACpB,UAAU;EACV,KAAK;EACL,OAAY,OAAO,CAAC,CAAC,YAAY,KAAA,CAAS;CAC5C;CACA,MAAM,WAAW,UAAiB;EAChC,aAAa;EACb,UAAU;EACV,KAAK;EACL,OAAY,OAAO,KAAK,CAAC,CAAC,YAAY,KAAA,CAAS;CACjD;CACA,IAAI,KAAK,SAAS,OAAO;CACzB,IAAI,KAAK,SAAS,OAAO;CAEzB,IAAI;EACF,OAAO,CAAC,SAAS;GACf,MAAM,OAA6B,OAAO,KAAK,CAAC,CAAC,MAC9C,WAAwB;IAAE,MAAM;IAAQ;GAAM,KAC9C,WAAiC;IAAE,MAAM;IAAc;GAAM,EAChE;GACA,MAAM,UAAU,MAAM,QAAQ,KAAkB,CAC9C,MACA,eAAe,YAAY,EAAE,MAAM,UAAU,EAAE,CACjD,CAAC;GACD,IAAI,QAAQ,SAAS,WACnB;GAEF,IAAI,QAAQ,SAAS,cACnB,MAAM,QAAQ;GAEhB,IAAI,QAAQ,MAAM,MAChB;GAEF,IAAI,CAAC,IAAI,MAAM,QAAQ,MAAM,KAAK,GAChC,MAAM,mBAAmB,KAAK,cAAc;EAEhD;CACF,SAAS,OAAO;EACd,MAAM,OAAO,OAAO,KAAK,CAAC,CAAC,YAAY,KAAA,CAAS;EAChD,MAAM;CACR,UAAU;EACR,IAAI,eAAe,SAAS,OAAO;EACnC,IAAI,eAAe,SAAS,OAAO;EACnC,OAAO,YAAY;CACrB;CAEA,IAAI,YACF,MAAM;CAER,IAAI,CAAC,SACH,MAAM,kBAAkB,GAAG;AAE/B;;AAGA,SAAgB,iBAAoD,IAAU;CAC5E,OAAO,cAAc,KAAK,EAAE;AAC9B;AAEA,SAAS,cAAc,KAA8B;CACnD,MAAM,MAAM,IAAI,QAAQ;CACxB,QACG,MAAM,QAAQ,GAAG,IAAI,IAAI,KAAK,IAAA,EAC3B,MAAM,KAAK,CAAC,CAAC,CAAC,EAAE,EAChB,KAAK,CAAC,CACP,YAAY,KAAK;AAExB;AAEA,SAAS,kBAAkB,MAA8B;CACvD,IAAI,OAAO,SAAS,YAAY,gBAAgB,iBAC9C,OAAO,IAAI,gBAAgB,IAAI,CAAC,CAAC,SAAS;CAE5C,IAAI,SAAS,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,GACjE,OAAO;CAET,MAAM,aAAa,IAAI,gBAAgB;CACvC,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,IAAI,GAC7C,IAAI,MAAM,QAAQ,KAAK,GACrB,KAAK,MAAM,QAAQ,OACjB,WAAW,OAAO,MAAM,OAAO,IAAI,CAAC;MAGtC,WAAW,OAAO,MAAM,OAAO,KAAK,CAAC;CAGzC,OAAO,WAAW,SAAS;AAC7B;;AAGA,SAAgB,oBACd,KACmB;CACnB,IAAI,OAAO,SAAS,IAAI,OAAO,GAC7B,OAAO,WAAW,KAAK,IAAI,OAAO;CAEpC,MAAM,cAAc,cAAc,GAAG;CACrC,IAAI;EACF,IAAI,gBAAgB,sBAAsB,YAAY,SAAS,OAAO,GAAG;GACvE,MAAM,aAAa,KAAK,UAAU,IAAI,IAAI;GAC1C,OAAO,eAAe,KAAA,IAClB,OACA,IAAI,YAAY,CAAC,CAAC,OAAO,UAAU;EACzC;EACA,IAAI,gBAAgB,qCAAqC;GACvD,MAAM,aAAa,kBAAkB,IAAI,IAAI;GAC7C,OAAO,eAAe,OAAO,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,UAAU;EACzE;CACF,QAAQ;EACN,OAAO;CACT;CACA,OAAO;AACT;AAEA,SAAS,WAAW,SAAuD;CACzE,IAAI,mBAAmB,SACrB,OAAO,QAAQ,IAAI,MAAM;CAE3B,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,OAAO,GAAG;EACnD,IAAI,KAAK,YAAY,MAAM,QACzB;EAEF,IAAI,OAAO,UAAU,UACnB,OAAO;EAET,IAAI,MAAM,QAAQ,KAAK,KAAK,OAAO,MAAM,OAAO,UAC9C,OAAO,MAAM;CAEjB;CACA,OAAO;AACT;;AAGA,SAAgB,kBAAkB,SAKvB;CACT,MAAM,SAAS,QAAQ,UAAU,QAAQ,QAAQ,YAAY,UAAU;CACvE,MAAM,OAAO,WAAW,QAAQ,OAAO;CACvC,IACE,SAAS,QACT,KAAK,WAAW,KAChB,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,cAAc;EAC5B,MAAM,OAAO,UAAU,WAAW,CAAC;EACnC,OAAO,QAAQ,MAAQ,SAAS,OAAQ,SAAS,SAAS,SAAS;CACrE,CAAC,GAED,MAAM,IAAI,UAAU,oDAAoD;CAE1E,IAAI;CACJ,IAAI;EACF,SAAS,IAAI,IAAI,GAAG,OAAO,KAAK,MAAM;CACxC,QAAQ;EACN,MAAM,IAAI,UAAU,oDAAoD;CAC1E;CACA,IACE,OAAO,aAAa,MACpB,OAAO,aAAa,MACpB,OAAO,aAAa,OACpB,OAAO,WAAW,MAClB,OAAO,SAAS,MAChB,OAAO,SAAS,IAEhB,MAAM,IAAI,UAAU,oDAAoD;CAE1E,MAAM,SAAS,QAAQ,OAAO;CAC9B,IACE,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,cAAc;EAC9B,MAAM,OAAO,UAAU,WAAW,CAAC;EACnC,OAAO,QAAQ,MAAQ,SAAS,OAAQ,cAAc;CACxD,CAAC,GAED,MAAM,IAAI,UACR,uDACF;CAGF,OAAO,GAAG,OAAO,KAAK,OADT,OAAO,WAAW,GAAG,IAAI,SAAS,IAAI;AAErD"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
let node_async_hooks = require("node:async_hooks");
|
|
2
|
-
|
|
2
|
+
// src/set-cookies.ts
|
|
3
3
|
/** Set-Cookie line handling shared by the built-in platforms' cookie sinks. */
|
|
4
4
|
function cookieName(line) {
|
|
5
5
|
const separator = line.indexOf("=");
|
|
@@ -27,8 +27,7 @@ function setCookieAdditions(existing, values) {
|
|
|
27
27
|
}
|
|
28
28
|
return additions;
|
|
29
29
|
}
|
|
30
|
-
|
|
31
|
-
//#region src/platform.ts
|
|
30
|
+
// src/platform.ts
|
|
32
31
|
function appendHeaderValue(headers, name, value) {
|
|
33
32
|
if (typeof value === "string") {
|
|
34
33
|
headers.append(name, value);
|
|
@@ -408,7 +407,6 @@ function upgradeRequestUrl(request) {
|
|
|
408
407
|
})) throw new TypeError("A valid request target is required for an upgrade URL");
|
|
409
408
|
return `${scheme}://${host}${target.startsWith("/") ? target : `/${target}`}`;
|
|
410
409
|
}
|
|
411
|
-
//#endregion
|
|
412
410
|
Object.defineProperty(exports, "appendSetCookie", {
|
|
413
411
|
enumerable: true,
|
|
414
412
|
get: function() {
|
|
@@ -470,4 +468,4 @@ Object.defineProperty(exports, "writeWebResponse", {
|
|
|
470
468
|
}
|
|
471
469
|
});
|
|
472
470
|
|
|
473
|
-
//# sourceMappingURL=platform-
|
|
471
|
+
//# sourceMappingURL=platform-C67dxSls.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-YICqqYv6.cjs","names":["AsyncResource"],"sources":["../src/set-cookies.ts","../src/platform.ts"],"sourcesContent":["/** Set-Cookie line handling shared by the built-in platforms' cookie sinks. */\nfunction cookieName(line: string): string {\n const separator = line.indexOf(\"=\");\n return (separator === -1 ? line : line.slice(0, separator)).trim();\n}\n\n/** A header value as the list of lines it holds. */\nexport function headerLines(\n value: string | number | readonly string[] | undefined,\n): string[] {\n return Array.isArray(value)\n ? value.map(String)\n : value === undefined\n ? []\n : [String(value)];\n}\n\n/**\n * The lines of `values` to append after `existing`. A line identical to the latest line already set for its cookie name\n * changes nothing and is skipped (ADR-09: the kernel's cookie sink de-duplicates identical Set-Cookie values, for example\n * a source that appends a call's cookies that the bridge also forwarded). Any other line is kept, so an identical line\n * after a different one for the same cookie still restores it.\n */\nexport function setCookieAdditions(\n existing: readonly string[],\n values: readonly string[],\n): string[] {\n const latest = new Map<string, string>();\n for (const line of existing) {\n latest.set(cookieName(line), line);\n }\n const additions: string[] = [];\n for (const line of values) {\n const name = cookieName(line);\n if (latest.get(name) === line) {\n continue;\n }\n latest.set(name, line);\n additions.push(line);\n }\n return additions;\n}\n","import { AsyncResource } from \"node:async_hooks\";\nimport type {\n IncomingHttpHeaders,\n IncomingMessage,\n ServerResponse,\n} from \"node:http\";\nimport { headerLines, setCookieAdditions } from \"./set-cookies.js\";\n\nfunction appendHeaderValue(\n headers: Headers,\n name: string,\n value: unknown,\n): void {\n if (typeof value === \"string\") {\n headers.append(name, value);\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n if (typeof item === \"string\") {\n headers.append(name, item);\n }\n }\n }\n}\n\n/** Convert Node headers to Web headers without exposing HTTP/2 metadata. */\nexport function toWebHeaders(\n raw: IncomingHttpHeaders | Record<string | symbol, unknown>,\n): Headers {\n const headers = new Headers();\n let authority: unknown;\n for (const [name, value] of Object.entries(raw)) {\n if (name === \":authority\") {\n authority = value;\n }\n if (name.startsWith(\":\")) {\n continue;\n }\n appendHeaderValue(headers, name, value);\n }\n if (!headers.has(\"host\")) {\n appendHeaderValue(headers, \"host\", authority);\n }\n return headers;\n}\n\n/** Determine whether Node request framing permits a request body. */\nexport function mayHaveBody(\n method: string,\n headers: IncomingHttpHeaders,\n): boolean {\n const normalizedMethod = method.toUpperCase();\n if (normalizedMethod === \"GET\" || normalizedMethod === \"HEAD\") {\n return false;\n }\n if (headers[\"transfer-encoding\"] !== undefined) {\n return true;\n }\n const declaredLength = headers[\"content-length\"]?.trim();\n return (\n declaredLength !== undefined &&\n /^\\d+$/.test(declaredLength) &&\n BigInt(declaredLength) > 0n\n );\n}\n\ninterface ReadBoundedBodyOptions {\n limit: number;\n declaredLength?: number;\n drainOnOverflow?: boolean;\n drainCap?: number;\n}\n\ntype ReadBoundedBodyResult =\n | { ok: true; bytes: Uint8Array }\n | { ok: false; reason: \"too-large\" | \"aborted\" };\n\nfunction assertByteLimit(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new RangeError(`${name} must be a non-negative safe integer`);\n }\n}\n\nfunction joinBytes(chunks: readonly Uint8Array[], length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n}\n\nasync function readBoundedWebBody(\n stream: ReadableStream<Uint8Array>,\n options: ReadBoundedBodyOptions,\n): Promise<ReadBoundedBodyResult> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let length = 0;\n try {\n if (\n options.declaredLength !== undefined &&\n options.declaredLength > options.limit\n ) {\n await reader.cancel().catch(() => undefined);\n return { ok: false, reason: \"too-large\" };\n }\n while (true) {\n const next = await reader.read();\n if (next.done) {\n return { ok: true, bytes: joinBytes(chunks, length) };\n }\n length += next.value.byteLength;\n if (length > options.limit) {\n await reader.cancel().catch(() => undefined);\n return { ok: false, reason: \"too-large\" };\n }\n chunks.push(next.value);\n }\n } catch {\n await reader.cancel().catch(() => undefined);\n return { ok: false, reason: \"aborted\" };\n } finally {\n reader.releaseLock();\n }\n}\n\ntype DestroyableReadable = NodeJS.ReadableStream & {\n destroyed?: boolean;\n destroy?: () => unknown;\n};\n\nfunction nodeChunkBytes(chunk: unknown): Uint8Array | null {\n if (typeof chunk === \"string\") {\n return Buffer.from(chunk);\n }\n if (chunk instanceof Uint8Array) {\n return chunk;\n }\n return null;\n}\n\nfunction readBoundedNodeBody(\n stream: DestroyableReadable,\n options: ReadBoundedBodyOptions,\n): Promise<ReadBoundedBodyResult> {\n const drainCap = options.drainCap ?? options.limit * 8;\n assertByteLimit(drainCap, \"drainCap\");\n\n return new Promise((resolve) => {\n const chunks: Uint8Array[] = [];\n let length = 0;\n let overflow =\n options.declaredLength !== undefined &&\n options.declaredLength > options.limit;\n let settled = false;\n\n const cleanup = () => {\n stream.removeListener(\"data\", onData);\n stream.removeListener(\"end\", onEnd);\n stream.removeListener(\"aborted\", onAborted);\n stream.removeListener(\"error\", onAborted);\n stream.removeListener(\"close\", onClose);\n };\n const destroy = () => {\n if (!stream.destroyed) {\n const absorbDestroyError = () => undefined;\n const removeDestroyErrorHandler = () => {\n stream.removeListener(\"error\", absorbDestroyError);\n };\n stream.once(\"error\", absorbDestroyError);\n stream.once(\"close\", removeDestroyErrorHandler);\n try {\n stream.destroy?.();\n } catch {\n stream.removeListener(\"error\", absorbDestroyError);\n stream.removeListener(\"close\", removeDestroyErrorHandler);\n }\n }\n };\n const finish = (result: ReadBoundedBodyResult, destroyStream = false) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(result);\n if (destroyStream) {\n destroy();\n }\n };\n const tooLarge = () => {\n finish({ ok: false, reason: \"too-large\" }, true);\n };\n const onData = (chunk: unknown) => {\n const bytes = nodeChunkBytes(chunk);\n if (bytes === null) {\n finish({ ok: false, reason: \"aborted\" }, true);\n return;\n }\n length += bytes.byteLength;\n if (!overflow && length <= options.limit) {\n chunks.push(bytes);\n return;\n }\n overflow = true;\n chunks.length = 0;\n if (!options.drainOnOverflow || length > drainCap) {\n tooLarge();\n }\n };\n const onEnd = () => {\n if (overflow) {\n finish({ ok: false, reason: \"too-large\" });\n return;\n }\n finish({ ok: true, bytes: joinBytes(chunks, length) });\n };\n const onAborted = () => {\n finish({ ok: false, reason: \"aborted\" }, true);\n };\n const onClose = () => {\n finish({ ok: false, reason: \"aborted\" });\n };\n\n stream.once(\"end\", onEnd);\n stream.once(\"aborted\", onAborted);\n stream.once(\"error\", onAborted);\n stream.once(\"close\", onClose);\n\n if (overflow && !options.drainOnOverflow) {\n tooLarge();\n return;\n }\n if (\n overflow &&\n options.declaredLength !== undefined &&\n options.declaredLength > drainCap\n ) {\n tooLarge();\n return;\n }\n stream.on(\"data\", onData);\n });\n}\n\n/** Read a Node or Web body stream without retaining bytes past the limit. */\nexport function readBoundedBody(\n stream: NodeJS.ReadableStream | ReadableStream<Uint8Array>,\n options: {\n limit: number;\n declaredLength?: number;\n drainOnOverflow?: boolean;\n drainCap?: number;\n },\n): Promise<\n | { ok: true; bytes: Uint8Array }\n | { ok: false; reason: \"too-large\" | \"aborted\" }\n> {\n assertByteLimit(options.limit, \"limit\");\n if (\n options.declaredLength !== undefined &&\n (!Number.isSafeInteger(options.declaredLength) ||\n options.declaredLength < 0)\n ) {\n throw new RangeError(\"declaredLength must be a non-negative safe integer\");\n }\n if (\"getReader\" in stream) {\n return readBoundedWebBody(stream, options);\n }\n return readBoundedNodeBody(stream, options);\n}\n\n/** Append response cookies without replacing values already set by the host. */\nexport function appendSetCookie(\n res: ServerResponse,\n values: readonly string[],\n): boolean {\n if (res.headersSent) {\n return false;\n }\n const existing = headerLines(res.getHeader(\"set-cookie\"));\n const additions = setCookieAdditions(existing, values);\n if (additions.length > 0) {\n res.setHeader(\"set-cookie\", [...existing, ...additions]);\n }\n return true;\n}\n\nfunction varyValues(value: string | number | readonly string[] | undefined) {\n const raw = Array.isArray(value) ? value : value === undefined ? [] : [value];\n return raw.flatMap((item) => String(item).split(\",\"));\n}\n\nfunction mergeVary(\n current: string | number | readonly string[] | undefined,\n added: string,\n): string {\n const values = [...varyValues(current), ...varyValues(added)]\n .map((value) => value.trim())\n .filter(Boolean);\n if (values.includes(\"*\")) {\n return \"*\";\n }\n const seen = new Set<string>();\n return values\n .filter((value) => {\n const normalized = value.toLowerCase();\n if (seen.has(normalized)) {\n return false;\n }\n seen.add(normalized);\n return true;\n })\n .join(\", \");\n}\n\nfunction endServerResponse(res: ServerResponse): Promise<void> {\n if (res.writableEnded) {\n return Promise.resolve();\n }\n return new Promise((resolve, reject) => {\n let settled = false;\n const cleanup = () => {\n res.removeListener(\"error\", onError);\n res.removeListener(\"close\", onClose);\n };\n const finish = (error?: Error) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n };\n const onError = (error: Error) => {\n finish(error);\n };\n const onClose = () => {\n finish();\n };\n res.once(\"error\", onError);\n res.once(\"close\", onClose);\n res.end(() => finish());\n });\n}\n\ntype ReadOutcome =\n | { type: \"read\"; value: ReadableStreamReadResult<Uint8Array> }\n | { type: \"read-error\"; error: unknown }\n | { type: \"stopped\" };\n\nfunction waitForDrainOrStop(\n res: ServerResponse,\n stopped: Promise<void>,\n): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n const finish = () => {\n if (settled) {\n return;\n }\n settled = true;\n res.removeListener(\"drain\", finish);\n resolve();\n };\n res.once(\"drain\", finish);\n void stopped.then(finish);\n });\n}\n\n/** Write a Web response while retaining host headers and Node backpressure. */\nexport async function writeWebResponse(\n res: ServerResponse,\n response: Response,\n options?: { head?: boolean },\n): Promise<void> {\n res.statusCode = response.status;\n for (const [name, value] of response.headers) {\n if (name === \"set-cookie\") {\n continue;\n }\n if (name === \"vary\") {\n res.setHeader(\"vary\", mergeVary(res.getHeader(\"vary\"), value));\n } else {\n res.setHeader(name, value);\n }\n }\n appendSetCookie(res, response.headers.getSetCookie());\n\n if (options?.head || response.body === null) {\n if (options?.head && response.body !== null) {\n await response.body.cancel().catch(() => undefined);\n }\n await endServerResponse(res);\n return;\n }\n\n const reader = response.body.getReader();\n let stopped = false;\n let writeError: Error | undefined;\n let stop!: () => void;\n const stoppedPromise = new Promise<void>((resolve) => {\n stop = resolve;\n });\n const onClose = () => {\n stopped = true;\n stop();\n void reader.cancel().catch(() => undefined);\n };\n const onError = (error: Error) => {\n writeError = error;\n stopped = true;\n stop();\n void reader.cancel(error).catch(() => undefined);\n };\n res.once(\"close\", onClose);\n res.once(\"error\", onError);\n\n try {\n while (!stopped) {\n const read: Promise<ReadOutcome> = reader.read().then(\n (value): ReadOutcome => ({ type: \"read\", value }),\n (error: unknown): ReadOutcome => ({ type: \"read-error\", error }),\n );\n const outcome = await Promise.race<ReadOutcome>([\n read,\n stoppedPromise.then(() => ({ type: \"stopped\" })),\n ]);\n if (outcome.type === \"stopped\") {\n break;\n }\n if (outcome.type === \"read-error\") {\n throw outcome.error;\n }\n if (outcome.value.done) {\n break;\n }\n if (!res.write(outcome.value.value)) {\n await waitForDrainOrStop(res, stoppedPromise);\n }\n }\n } catch (error) {\n await reader.cancel(error).catch(() => undefined);\n throw error;\n } finally {\n res.removeListener(\"close\", onClose);\n res.removeListener(\"error\", onError);\n reader.releaseLock();\n }\n\n if (writeError) {\n throw writeError;\n }\n if (!stopped) {\n await endServerResponse(res);\n }\n}\n\n/** Capture the active async resource for a later stream continuation. */\nexport function bindAsyncContext<F extends (...args: any[]) => any>(fn: F): F {\n return AsyncResource.bind(fn) as F;\n}\n\nfunction contentTypeOf(req: IncomingMessage): string {\n const raw = req.headers[\"content-type\"];\n return (\n (Array.isArray(raw) ? raw[0] : raw)\n ?.split(\";\", 1)[0]\n ?.trim()\n .toLowerCase() ?? \"\"\n );\n}\n\nfunction serializeFormBody(body: unknown): string | null {\n if (typeof body === \"string\" || body instanceof URLSearchParams) {\n return new URLSearchParams(body).toString();\n }\n if (body === null || typeof body !== \"object\" || Array.isArray(body)) {\n return null;\n }\n const parameters = new URLSearchParams();\n for (const [name, value] of Object.entries(body)) {\n if (Array.isArray(value)) {\n for (const item of value) {\n parameters.append(name, String(item));\n }\n } else {\n parameters.append(name, String(value));\n }\n }\n return parameters.toString();\n}\n\n/** Recover bytes after an earlier host parser consumed the request stream. */\nexport function recoverConsumedBody(\n req: IncomingMessage & { body?: unknown; rawBody?: Buffer },\n): Uint8Array | null {\n if (Buffer.isBuffer(req.rawBody)) {\n return Uint8Array.from(req.rawBody);\n }\n const contentType = contentTypeOf(req);\n try {\n if (contentType === \"application/json\" || contentType.endsWith(\"+json\")) {\n const serialized = JSON.stringify(req.body);\n return serialized === undefined\n ? null\n : new TextEncoder().encode(serialized);\n }\n if (contentType === \"application/x-www-form-urlencoded\") {\n const serialized = serializeFormBody(req.body);\n return serialized === null ? null : new TextEncoder().encode(serialized);\n }\n } catch {\n return null;\n }\n return null;\n}\n\nfunction hostHeader(headers: IncomingHttpHeaders | Headers): string | null {\n if (headers instanceof Headers) {\n return headers.get(\"host\");\n }\n for (const [name, value] of Object.entries(headers)) {\n if (name.toLowerCase() !== \"host\") {\n continue;\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (Array.isArray(value) && typeof value[0] === \"string\") {\n return value[0];\n }\n }\n return null;\n}\n\n/** Build an upgrade URL from socket TLS state, Host, and the raw target. */\nexport function upgradeRequestUrl(request: {\n headers: IncomingHttpHeaders | Headers;\n url?: string;\n secure?: boolean;\n socket?: { encrypted?: boolean };\n}): string {\n const scheme = request.secure || request.socket?.encrypted ? \"https\" : \"http\";\n const host = hostHeader(request.headers);\n if (\n host === null ||\n host.length === 0 ||\n [...host].some((character) => {\n const code = character.charCodeAt(0);\n return code <= 0x20 || code === 0x7f || \"/\\\\?#@\".includes(character);\n })\n ) {\n throw new TypeError(\"A valid Host header is required for an upgrade URL\");\n }\n let origin: URL;\n try {\n origin = new URL(`${scheme}://${host}`);\n } catch {\n throw new TypeError(\"A valid Host header is required for an upgrade URL\");\n }\n if (\n origin.username !== \"\" ||\n origin.password !== \"\" ||\n origin.pathname !== \"/\" ||\n origin.search !== \"\" ||\n origin.hash !== \"\" ||\n origin.host === \"\"\n ) {\n throw new TypeError(\"A valid Host header is required for an upgrade URL\");\n }\n const target = request.url ?? \"/\";\n if (\n [...target].some((character) => {\n const code = character.charCodeAt(0);\n return code <= 0x20 || code === 0x7f || character === \"#\";\n })\n ) {\n throw new TypeError(\n \"A valid request target is required for an upgrade URL\",\n );\n }\n const path = target.startsWith(\"/\") ? target : `/${target}`;\n return `${scheme}://${host}${path}`;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"platform-C67dxSls.cjs","names":["AsyncResource"],"sources":["../src/set-cookies.ts","../src/platform.ts"],"sourcesContent":["/** Set-Cookie line handling shared by the built-in platforms' cookie sinks. */\nfunction cookieName(line: string): string {\n const separator = line.indexOf(\"=\");\n return (separator === -1 ? line : line.slice(0, separator)).trim();\n}\n\n/** A header value as the list of lines it holds. */\nexport function headerLines(\n value: string | number | readonly string[] | undefined,\n): string[] {\n return Array.isArray(value)\n ? value.map(String)\n : value === undefined\n ? []\n : [String(value)];\n}\n\n/**\n * The lines of `values` to append after `existing`. A line identical to the latest line already set for its cookie name\n * changes nothing and is skipped (ADR-09: the kernel's cookie sink de-duplicates identical Set-Cookie values, for example\n * a source that appends a call's cookies that the bridge also forwarded). Any other line is kept, so an identical line\n * after a different one for the same cookie still restores it.\n */\nexport function setCookieAdditions(\n existing: readonly string[],\n values: readonly string[],\n): string[] {\n const latest = new Map<string, string>();\n for (const line of existing) {\n latest.set(cookieName(line), line);\n }\n const additions: string[] = [];\n for (const line of values) {\n const name = cookieName(line);\n if (latest.get(name) === line) {\n continue;\n }\n latest.set(name, line);\n additions.push(line);\n }\n return additions;\n}\n","import { AsyncResource } from \"node:async_hooks\";\nimport type {\n IncomingHttpHeaders,\n IncomingMessage,\n ServerResponse,\n} from \"node:http\";\nimport { headerLines, setCookieAdditions } from \"./set-cookies.js\";\n\nfunction appendHeaderValue(\n headers: Headers,\n name: string,\n value: unknown,\n): void {\n if (typeof value === \"string\") {\n headers.append(name, value);\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n if (typeof item === \"string\") {\n headers.append(name, item);\n }\n }\n }\n}\n\n/** Convert Node headers to Web headers without exposing HTTP/2 metadata. */\nexport function toWebHeaders(\n raw: IncomingHttpHeaders | Record<string | symbol, unknown>,\n): Headers {\n const headers = new Headers();\n let authority: unknown;\n for (const [name, value] of Object.entries(raw)) {\n if (name === \":authority\") {\n authority = value;\n }\n if (name.startsWith(\":\")) {\n continue;\n }\n appendHeaderValue(headers, name, value);\n }\n if (!headers.has(\"host\")) {\n appendHeaderValue(headers, \"host\", authority);\n }\n return headers;\n}\n\n/** Determine whether Node request framing permits a request body. */\nexport function mayHaveBody(\n method: string,\n headers: IncomingHttpHeaders,\n): boolean {\n const normalizedMethod = method.toUpperCase();\n if (normalizedMethod === \"GET\" || normalizedMethod === \"HEAD\") {\n return false;\n }\n if (headers[\"transfer-encoding\"] !== undefined) {\n return true;\n }\n const declaredLength = headers[\"content-length\"]?.trim();\n return (\n declaredLength !== undefined &&\n /^\\d+$/.test(declaredLength) &&\n BigInt(declaredLength) > 0n\n );\n}\n\ninterface ReadBoundedBodyOptions {\n limit: number;\n declaredLength?: number;\n drainOnOverflow?: boolean;\n drainCap?: number;\n}\n\ntype ReadBoundedBodyResult =\n | { ok: true; bytes: Uint8Array }\n | { ok: false; reason: \"too-large\" | \"aborted\" };\n\nfunction assertByteLimit(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new RangeError(`${name} must be a non-negative safe integer`);\n }\n}\n\nfunction joinBytes(chunks: readonly Uint8Array[], length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n}\n\nasync function readBoundedWebBody(\n stream: ReadableStream<Uint8Array>,\n options: ReadBoundedBodyOptions,\n): Promise<ReadBoundedBodyResult> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let length = 0;\n try {\n if (\n options.declaredLength !== undefined &&\n options.declaredLength > options.limit\n ) {\n await reader.cancel().catch(() => undefined);\n return { ok: false, reason: \"too-large\" };\n }\n while (true) {\n const next = await reader.read();\n if (next.done) {\n return { ok: true, bytes: joinBytes(chunks, length) };\n }\n length += next.value.byteLength;\n if (length > options.limit) {\n await reader.cancel().catch(() => undefined);\n return { ok: false, reason: \"too-large\" };\n }\n chunks.push(next.value);\n }\n } catch {\n await reader.cancel().catch(() => undefined);\n return { ok: false, reason: \"aborted\" };\n } finally {\n reader.releaseLock();\n }\n}\n\ntype DestroyableReadable = NodeJS.ReadableStream & {\n destroyed?: boolean;\n destroy?: () => unknown;\n};\n\nfunction nodeChunkBytes(chunk: unknown): Uint8Array | null {\n if (typeof chunk === \"string\") {\n return Buffer.from(chunk);\n }\n if (chunk instanceof Uint8Array) {\n return chunk;\n }\n return null;\n}\n\nfunction readBoundedNodeBody(\n stream: DestroyableReadable,\n options: ReadBoundedBodyOptions,\n): Promise<ReadBoundedBodyResult> {\n const drainCap = options.drainCap ?? options.limit * 8;\n assertByteLimit(drainCap, \"drainCap\");\n\n return new Promise((resolve) => {\n const chunks: Uint8Array[] = [];\n let length = 0;\n let overflow =\n options.declaredLength !== undefined &&\n options.declaredLength > options.limit;\n let settled = false;\n\n const cleanup = () => {\n stream.removeListener(\"data\", onData);\n stream.removeListener(\"end\", onEnd);\n stream.removeListener(\"aborted\", onAborted);\n stream.removeListener(\"error\", onAborted);\n stream.removeListener(\"close\", onClose);\n };\n const destroy = () => {\n if (!stream.destroyed) {\n const absorbDestroyError = () => undefined;\n const removeDestroyErrorHandler = () => {\n stream.removeListener(\"error\", absorbDestroyError);\n };\n stream.once(\"error\", absorbDestroyError);\n stream.once(\"close\", removeDestroyErrorHandler);\n try {\n stream.destroy?.();\n } catch {\n stream.removeListener(\"error\", absorbDestroyError);\n stream.removeListener(\"close\", removeDestroyErrorHandler);\n }\n }\n };\n const finish = (result: ReadBoundedBodyResult, destroyStream = false) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(result);\n if (destroyStream) {\n destroy();\n }\n };\n const tooLarge = () => {\n finish({ ok: false, reason: \"too-large\" }, true);\n };\n const onData = (chunk: unknown) => {\n const bytes = nodeChunkBytes(chunk);\n if (bytes === null) {\n finish({ ok: false, reason: \"aborted\" }, true);\n return;\n }\n length += bytes.byteLength;\n if (!overflow && length <= options.limit) {\n chunks.push(bytes);\n return;\n }\n overflow = true;\n chunks.length = 0;\n if (!options.drainOnOverflow || length > drainCap) {\n tooLarge();\n }\n };\n const onEnd = () => {\n if (overflow) {\n finish({ ok: false, reason: \"too-large\" });\n return;\n }\n finish({ ok: true, bytes: joinBytes(chunks, length) });\n };\n const onAborted = () => {\n finish({ ok: false, reason: \"aborted\" }, true);\n };\n const onClose = () => {\n finish({ ok: false, reason: \"aborted\" });\n };\n\n stream.once(\"end\", onEnd);\n stream.once(\"aborted\", onAborted);\n stream.once(\"error\", onAborted);\n stream.once(\"close\", onClose);\n\n if (overflow && !options.drainOnOverflow) {\n tooLarge();\n return;\n }\n if (\n overflow &&\n options.declaredLength !== undefined &&\n options.declaredLength > drainCap\n ) {\n tooLarge();\n return;\n }\n stream.on(\"data\", onData);\n });\n}\n\n/** Read a Node or Web body stream without retaining bytes past the limit. */\nexport function readBoundedBody(\n stream: NodeJS.ReadableStream | ReadableStream<Uint8Array>,\n options: {\n limit: number;\n declaredLength?: number;\n drainOnOverflow?: boolean;\n drainCap?: number;\n },\n): Promise<\n | { ok: true; bytes: Uint8Array }\n | { ok: false; reason: \"too-large\" | \"aborted\" }\n> {\n assertByteLimit(options.limit, \"limit\");\n if (\n options.declaredLength !== undefined &&\n (!Number.isSafeInteger(options.declaredLength) ||\n options.declaredLength < 0)\n ) {\n throw new RangeError(\"declaredLength must be a non-negative safe integer\");\n }\n if (\"getReader\" in stream) {\n return readBoundedWebBody(stream, options);\n }\n return readBoundedNodeBody(stream, options);\n}\n\n/** Append response cookies without replacing values already set by the host. */\nexport function appendSetCookie(\n res: ServerResponse,\n values: readonly string[],\n): boolean {\n if (res.headersSent) {\n return false;\n }\n const existing = headerLines(res.getHeader(\"set-cookie\"));\n const additions = setCookieAdditions(existing, values);\n if (additions.length > 0) {\n res.setHeader(\"set-cookie\", [...existing, ...additions]);\n }\n return true;\n}\n\nfunction varyValues(value: string | number | readonly string[] | undefined) {\n const raw = Array.isArray(value) ? value : value === undefined ? [] : [value];\n return raw.flatMap((item) => String(item).split(\",\"));\n}\n\nfunction mergeVary(\n current: string | number | readonly string[] | undefined,\n added: string,\n): string {\n const values = [...varyValues(current), ...varyValues(added)]\n .map((value) => value.trim())\n .filter(Boolean);\n if (values.includes(\"*\")) {\n return \"*\";\n }\n const seen = new Set<string>();\n return values\n .filter((value) => {\n const normalized = value.toLowerCase();\n if (seen.has(normalized)) {\n return false;\n }\n seen.add(normalized);\n return true;\n })\n .join(\", \");\n}\n\nfunction endServerResponse(res: ServerResponse): Promise<void> {\n if (res.writableEnded) {\n return Promise.resolve();\n }\n return new Promise((resolve, reject) => {\n let settled = false;\n const cleanup = () => {\n res.removeListener(\"error\", onError);\n res.removeListener(\"close\", onClose);\n };\n const finish = (error?: Error) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n };\n const onError = (error: Error) => {\n finish(error);\n };\n const onClose = () => {\n finish();\n };\n res.once(\"error\", onError);\n res.once(\"close\", onClose);\n res.end(() => finish());\n });\n}\n\ntype ReadOutcome =\n | { type: \"read\"; value: ReadableStreamReadResult<Uint8Array> }\n | { type: \"read-error\"; error: unknown }\n | { type: \"stopped\" };\n\nfunction waitForDrainOrStop(\n res: ServerResponse,\n stopped: Promise<void>,\n): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n const finish = () => {\n if (settled) {\n return;\n }\n settled = true;\n res.removeListener(\"drain\", finish);\n resolve();\n };\n res.once(\"drain\", finish);\n void stopped.then(finish);\n });\n}\n\n/** Write a Web response while retaining host headers and Node backpressure. */\nexport async function writeWebResponse(\n res: ServerResponse,\n response: Response,\n options?: { head?: boolean },\n): Promise<void> {\n res.statusCode = response.status;\n for (const [name, value] of response.headers) {\n if (name === \"set-cookie\") {\n continue;\n }\n if (name === \"vary\") {\n res.setHeader(\"vary\", mergeVary(res.getHeader(\"vary\"), value));\n } else {\n res.setHeader(name, value);\n }\n }\n appendSetCookie(res, response.headers.getSetCookie());\n\n if (options?.head || response.body === null) {\n if (options?.head && response.body !== null) {\n await response.body.cancel().catch(() => undefined);\n }\n await endServerResponse(res);\n return;\n }\n\n const reader = response.body.getReader();\n let stopped = false;\n let writeError: Error | undefined;\n let stop!: () => void;\n const stoppedPromise = new Promise<void>((resolve) => {\n stop = resolve;\n });\n const onClose = () => {\n stopped = true;\n stop();\n void reader.cancel().catch(() => undefined);\n };\n const onError = (error: Error) => {\n writeError = error;\n stopped = true;\n stop();\n void reader.cancel(error).catch(() => undefined);\n };\n res.once(\"close\", onClose);\n res.once(\"error\", onError);\n\n try {\n while (!stopped) {\n const read: Promise<ReadOutcome> = reader.read().then(\n (value): ReadOutcome => ({ type: \"read\", value }),\n (error: unknown): ReadOutcome => ({ type: \"read-error\", error }),\n );\n const outcome = await Promise.race<ReadOutcome>([\n read,\n stoppedPromise.then(() => ({ type: \"stopped\" })),\n ]);\n if (outcome.type === \"stopped\") {\n break;\n }\n if (outcome.type === \"read-error\") {\n throw outcome.error;\n }\n if (outcome.value.done) {\n break;\n }\n if (!res.write(outcome.value.value)) {\n await waitForDrainOrStop(res, stoppedPromise);\n }\n }\n } catch (error) {\n await reader.cancel(error).catch(() => undefined);\n throw error;\n } finally {\n res.removeListener(\"close\", onClose);\n res.removeListener(\"error\", onError);\n reader.releaseLock();\n }\n\n if (writeError) {\n throw writeError;\n }\n if (!stopped) {\n await endServerResponse(res);\n }\n}\n\n/** Capture the active async resource for a later stream continuation. */\nexport function bindAsyncContext<F extends (...args: any[]) => any>(fn: F): F {\n return AsyncResource.bind(fn) as F;\n}\n\nfunction contentTypeOf(req: IncomingMessage): string {\n const raw = req.headers[\"content-type\"];\n return (\n (Array.isArray(raw) ? raw[0] : raw)\n ?.split(\";\", 1)[0]\n ?.trim()\n .toLowerCase() ?? \"\"\n );\n}\n\nfunction serializeFormBody(body: unknown): string | null {\n if (typeof body === \"string\" || body instanceof URLSearchParams) {\n return new URLSearchParams(body).toString();\n }\n if (body === null || typeof body !== \"object\" || Array.isArray(body)) {\n return null;\n }\n const parameters = new URLSearchParams();\n for (const [name, value] of Object.entries(body)) {\n if (Array.isArray(value)) {\n for (const item of value) {\n parameters.append(name, String(item));\n }\n } else {\n parameters.append(name, String(value));\n }\n }\n return parameters.toString();\n}\n\n/** Recover bytes after an earlier host parser consumed the request stream. */\nexport function recoverConsumedBody(\n req: IncomingMessage & { body?: unknown; rawBody?: Buffer },\n): Uint8Array | null {\n if (Buffer.isBuffer(req.rawBody)) {\n return Uint8Array.from(req.rawBody);\n }\n const contentType = contentTypeOf(req);\n try {\n if (contentType === \"application/json\" || contentType.endsWith(\"+json\")) {\n const serialized = JSON.stringify(req.body);\n return serialized === undefined\n ? null\n : new TextEncoder().encode(serialized);\n }\n if (contentType === \"application/x-www-form-urlencoded\") {\n const serialized = serializeFormBody(req.body);\n return serialized === null ? null : new TextEncoder().encode(serialized);\n }\n } catch {\n return null;\n }\n return null;\n}\n\nfunction hostHeader(headers: IncomingHttpHeaders | Headers): string | null {\n if (headers instanceof Headers) {\n return headers.get(\"host\");\n }\n for (const [name, value] of Object.entries(headers)) {\n if (name.toLowerCase() !== \"host\") {\n continue;\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (Array.isArray(value) && typeof value[0] === \"string\") {\n return value[0];\n }\n }\n return null;\n}\n\n/** Build an upgrade URL from socket TLS state, Host, and the raw target. */\nexport function upgradeRequestUrl(request: {\n headers: IncomingHttpHeaders | Headers;\n url?: string;\n secure?: boolean;\n socket?: { encrypted?: boolean };\n}): string {\n const scheme = request.secure || request.socket?.encrypted ? \"https\" : \"http\";\n const host = hostHeader(request.headers);\n if (\n host === null ||\n host.length === 0 ||\n [...host].some((character) => {\n const code = character.charCodeAt(0);\n return code <= 0x20 || code === 0x7f || \"/\\\\?#@\".includes(character);\n })\n ) {\n throw new TypeError(\"A valid Host header is required for an upgrade URL\");\n }\n let origin: URL;\n try {\n origin = new URL(`${scheme}://${host}`);\n } catch {\n throw new TypeError(\"A valid Host header is required for an upgrade URL\");\n }\n if (\n origin.username !== \"\" ||\n origin.password !== \"\" ||\n origin.pathname !== \"/\" ||\n origin.search !== \"\" ||\n origin.hash !== \"\" ||\n origin.host === \"\"\n ) {\n throw new TypeError(\"A valid Host header is required for an upgrade URL\");\n }\n const target = request.url ?? \"/\";\n if (\n [...target].some((character) => {\n const code = character.charCodeAt(0);\n return code <= 0x20 || code === 0x7f || character === \"#\";\n })\n ) {\n throw new TypeError(\n \"A valid request target is required for an upgrade URL\",\n );\n }\n const path = target.startsWith(\"/\") ? target : `/${target}`;\n return `${scheme}://${host}${path}`;\n}\n"],"mappings":"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"}
|
package/dist/platform.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_platform = require("./platform-
|
|
2
|
+
const require_platform = require("./platform-C67dxSls.cjs");
|
|
3
3
|
exports.appendSetCookie = require_platform.appendSetCookie;
|
|
4
4
|
exports.bindAsyncContext = require_platform.bindAsyncContext;
|
|
5
5
|
exports.mayHaveBody = require_platform.mayHaveBody;
|
package/dist/platform.d.cts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { IncomingHttpHeaders, IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
-
//#region src/platform.d.ts
|
|
3
2
|
/** Convert Node headers to Web headers without exposing HTTP/2 metadata. */
|
|
4
3
|
export declare function toWebHeaders(raw: IncomingHttpHeaders | Record<string | symbol, unknown>): Headers;
|
|
5
4
|
/** Determine whether Node request framing permits a request body. */
|
|
@@ -39,5 +38,4 @@ export declare function upgradeRequestUrl(request: {
|
|
|
39
38
|
encrypted?: boolean;
|
|
40
39
|
};
|
|
41
40
|
}): string;
|
|
42
|
-
//#endregion
|
|
43
41
|
//# sourceMappingURL=platform.d.cts.map
|
package/dist/platform.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.d.cts","names":[],"sources":["../src/platform.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"platform.d.cts","names":[],"sources":["../src/platform.ts"],"mappings":";;wBA2BgB,aACd,KAAK,sBAAsB,mCAC1B;;wBAmBa,YACd,gBACA,SAAS;;wBAuMK,gBACd,QAAQ,OAAO,iBAAiB,eAAe,aAC/C;EACE;EACA;EACA;EACA;IAED;EACG;EAAU,OAAO;;EACjB;EAAW;;;wBAiBD,gBACd,KAAK,gBACL;;wBAoGoB,iBACpB,KAAK,gBACL,UAAU,UACV;EAAY;IACX;;wBAoFa,iBAAiB,cAAc,qBAAqB,IAAI,IAAI;;wBAmC5D,oBACd,KAAK;EAAoB;EAAgB,UAAU;IAClD;;wBAyCa,kBAAkB;EAChC,SAAS,sBAAsB;EAC/B;EACA;EACA;IAAW"}
|
package/dist/platform.d.mts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { IncomingHttpHeaders, IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
-
//#region src/platform.d.ts
|
|
3
2
|
/** Convert Node headers to Web headers without exposing HTTP/2 metadata. */
|
|
4
3
|
export declare function toWebHeaders(raw: IncomingHttpHeaders | Record<string | symbol, unknown>): Headers;
|
|
5
4
|
/** Determine whether Node request framing permits a request body. */
|
|
@@ -39,5 +38,4 @@ export declare function upgradeRequestUrl(request: {
|
|
|
39
38
|
encrypted?: boolean;
|
|
40
39
|
};
|
|
41
40
|
}): string;
|
|
42
|
-
//#endregion
|
|
43
41
|
//# sourceMappingURL=platform.d.mts.map
|
package/dist/platform.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.d.mts","names":[],"sources":["../src/platform.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"platform.d.mts","names":[],"sources":["../src/platform.ts"],"mappings":";;wBA2BgB,aACd,KAAK,sBAAsB,mCAC1B;;wBAmBa,YACd,gBACA,SAAS;;wBAuMK,gBACd,QAAQ,OAAO,iBAAiB,eAAe,aAC/C;EACE;EACA;EACA;EACA;IAED;EACG;EAAU,OAAO;;EACjB;EAAW;;;wBAiBD,gBACd,KAAK,gBACL;;wBAoGoB,iBACpB,KAAK,gBACL,UAAU,UACV;EAAY;IACX;;wBAoFa,iBAAiB,cAAc,qBAAqB,IAAI,IAAI;;wBAmC5D,oBACd,KAAK;EAAoB;EAAgB,UAAU;IAClD;;wBAyCa,kBAAkB;EAChC,SAAS,sBAAsB;EAC/B;EACA;EACA;IAAW"}
|
package/dist/platform.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { t as appendSetCookie, n as bindAsyncContext, r as mayHaveBody, i as readBoundedBody, a as recoverConsumedBody, o as toWebHeaders, s as upgradeRequestUrl, c as writeWebResponse } from "./platform-
|
|
1
|
+
export { t as appendSetCookie, n as bindAsyncContext, r as mayHaveBody, i as readBoundedBody, a as recoverConsumedBody, o as toWebHeaders, s as upgradeRequestUrl, c as writeWebResponse } from "./platform-BKYVzAv1.mjs";
|
package/dist/plugin.cjs
CHANGED
|
@@ -2,10 +2,9 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
2
2
|
let better_auth_api = require("better-auth/api");
|
|
3
3
|
let better_auth_cookies = require("better-auth/cookies");
|
|
4
4
|
let defu = require("defu");
|
|
5
|
-
|
|
5
|
+
// src/bridge-protocol.ts
|
|
6
6
|
const BRIDGE_HANDLE = Symbol.for("@nestjs-kit/better-auth:bridge");
|
|
7
|
-
|
|
8
|
-
//#region src/database-hook-dispatcher.ts
|
|
7
|
+
// src/database-hook-dispatcher.ts
|
|
9
8
|
/**
|
|
10
9
|
* Construct all dispatchers once; bindings supply only the late-bound methods.
|
|
11
10
|
*
|
|
@@ -77,8 +76,7 @@ function createDatabaseDispatchers(getBinding, countUnbound) {
|
|
|
77
76
|
}
|
|
78
77
|
};
|
|
79
78
|
}
|
|
80
|
-
|
|
81
|
-
//#region src/hook-dispatcher.ts
|
|
79
|
+
// src/hook-dispatcher.ts
|
|
82
80
|
const API_ERROR_HEADERS = Symbol.for("better-call:api-error-headers");
|
|
83
81
|
const mergeContext = (0, defu.createDefu)((object, key, value) => {
|
|
84
82
|
if (Array.isArray(object[key]) && Array.isArray(value)) {
|
|
@@ -172,8 +170,7 @@ async function runAfter(binding, ctx, scope, relayMatcherError) {
|
|
|
172
170
|
}
|
|
173
171
|
return ctx.context.returned;
|
|
174
172
|
}
|
|
175
|
-
|
|
176
|
-
//#region src/plugin.ts
|
|
173
|
+
// src/plugin.ts
|
|
177
174
|
const NESTJS_PLUGIN_ID = "@nestjs-kit/better-auth";
|
|
178
175
|
const isRouter = (ctx) => "_flag" in ctx && ctx._flag === "router";
|
|
179
176
|
const separator = "\0";
|
|
@@ -316,7 +313,6 @@ function nestjs(options = {}) {
|
|
|
316
313
|
}
|
|
317
314
|
};
|
|
318
315
|
}
|
|
319
|
-
//#endregion
|
|
320
316
|
exports.NESTJS_PLUGIN_ID = NESTJS_PLUGIN_ID;
|
|
321
317
|
exports.nestjs = nestjs;
|
|
322
318
|
|