nestjs-slightly-better-auth 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +57 -0
  3. package/dist/admin.cjs +88 -0
  4. package/dist/admin.cjs.map +1 -0
  5. package/dist/admin.d.cts +14 -0
  6. package/dist/admin.d.cts.map +1 -0
  7. package/dist/admin.d.mts +14 -0
  8. package/dist/admin.d.mts.map +1 -0
  9. package/dist/admin.mjs +85 -0
  10. package/dist/admin.mjs.map +1 -0
  11. package/dist/api-key.cjs +163 -0
  12. package/dist/api-key.cjs.map +1 -0
  13. package/dist/api-key.d.cts +42 -0
  14. package/dist/api-key.d.cts.map +1 -0
  15. package/dist/api-key.d.mts +42 -0
  16. package/dist/api-key.d.mts.map +1 -0
  17. package/dist/api-key.mjs +159 -0
  18. package/dist/api-key.mjs.map +1 -0
  19. package/dist/auth-contracts-BBA1C1gj.d.cts +1635 -0
  20. package/dist/auth-contracts-BBA1C1gj.d.cts.map +1 -0
  21. package/dist/auth-contracts-tqsfBZ8B.d.mts +1635 -0
  22. package/dist/auth-contracts-tqsfBZ8B.d.mts.map +1 -0
  23. package/dist/auth-decorators-CwW5JY4y.cjs +1274 -0
  24. package/dist/auth-decorators-CwW5JY4y.cjs.map +1 -0
  25. package/dist/auth-decorators-DfAJbHar.mjs +849 -0
  26. package/dist/auth-decorators-DfAJbHar.mjs.map +1 -0
  27. package/dist/auth-errors-CQjfgjaO.mjs +283 -0
  28. package/dist/auth-errors-CQjfgjaO.mjs.map +1 -0
  29. package/dist/auth-errors-CsERBNWI.cjs +348 -0
  30. package/dist/auth-errors-CsERBNWI.cjs.map +1 -0
  31. package/dist/express.cjs +247 -0
  32. package/dist/express.cjs.map +1 -0
  33. package/dist/express.d.cts +37 -0
  34. package/dist/express.d.cts.map +1 -0
  35. package/dist/express.d.mts +37 -0
  36. package/dist/express.d.mts.map +1 -0
  37. package/dist/express.mjs +245 -0
  38. package/dist/express.mjs.map +1 -0
  39. package/dist/fastify.cjs +215 -0
  40. package/dist/fastify.cjs.map +1 -0
  41. package/dist/fastify.d.cts +28 -0
  42. package/dist/fastify.d.cts.map +1 -0
  43. package/dist/fastify.d.mts +28 -0
  44. package/dist/fastify.d.mts.map +1 -0
  45. package/dist/fastify.mjs +213 -0
  46. package/dist/fastify.mjs.map +1 -0
  47. package/dist/index.cjs +2634 -0
  48. package/dist/index.cjs.map +1 -0
  49. package/dist/index.d.cts +2 -0
  50. package/dist/index.d.mts +2 -0
  51. package/dist/index.mjs +2556 -0
  52. package/dist/index.mjs.map +1 -0
  53. package/dist/organization.cjs +191 -0
  54. package/dist/organization.cjs.map +1 -0
  55. package/dist/organization.d.cts +40 -0
  56. package/dist/organization.d.cts.map +1 -0
  57. package/dist/organization.d.mts +40 -0
  58. package/dist/organization.d.mts.map +1 -0
  59. package/dist/organization.mjs +177 -0
  60. package/dist/organization.mjs.map +1 -0
  61. package/dist/platform.cjs +393 -0
  62. package/dist/platform.cjs.map +1 -0
  63. package/dist/platform.d.cts +43 -0
  64. package/dist/platform.d.cts.map +1 -0
  65. package/dist/platform.d.mts +43 -0
  66. package/dist/platform.d.mts.map +1 -0
  67. package/dist/platform.mjs +385 -0
  68. package/dist/platform.mjs.map +1 -0
  69. package/dist/plugin.cjs +312 -0
  70. package/dist/plugin.cjs.map +1 -0
  71. package/dist/plugin.d.cts +26 -0
  72. package/dist/plugin.d.cts.map +1 -0
  73. package/dist/plugin.d.mts +26 -0
  74. package/dist/plugin.d.mts.map +1 -0
  75. package/dist/plugin.mjs +310 -0
  76. package/dist/plugin.mjs.map +1 -0
  77. package/package.json +186 -0
@@ -0,0 +1,385 @@
1
+ import { AsyncResource } from "node:async_hooks";
2
+ //#region src/platform.ts
3
+ function appendHeaderValue(headers, name, value) {
4
+ if (typeof value === "string") {
5
+ headers.append(name, value);
6
+ return;
7
+ }
8
+ if (Array.isArray(value)) {
9
+ for (const item of value) if (typeof item === "string") headers.append(name, item);
10
+ }
11
+ }
12
+ /** Convert Node headers to Web headers without exposing HTTP/2 metadata. */
13
+ function toWebHeaders(raw) {
14
+ const headers = new Headers();
15
+ let authority;
16
+ for (const [name, value] of Object.entries(raw)) {
17
+ if (name === ":authority") authority = value;
18
+ if (name.startsWith(":")) continue;
19
+ appendHeaderValue(headers, name, value);
20
+ }
21
+ if (!headers.has("host")) appendHeaderValue(headers, "host", authority);
22
+ return headers;
23
+ }
24
+ /** Determine whether Node request framing permits a request body. */
25
+ function mayHaveBody(method, headers) {
26
+ const normalizedMethod = method.toUpperCase();
27
+ if (normalizedMethod === "GET" || normalizedMethod === "HEAD") return false;
28
+ if (headers["transfer-encoding"] !== void 0) return true;
29
+ const declaredLength = headers["content-length"]?.trim();
30
+ return declaredLength !== void 0 && /^\d+$/.test(declaredLength) && BigInt(declaredLength) > 0n;
31
+ }
32
+ function assertByteLimit(value, name) {
33
+ if (!Number.isSafeInteger(value) || value < 0) throw new RangeError(`${name} must be a non-negative safe integer`);
34
+ }
35
+ function joinBytes(chunks, length) {
36
+ const bytes = new Uint8Array(length);
37
+ let offset = 0;
38
+ for (const chunk of chunks) {
39
+ bytes.set(chunk, offset);
40
+ offset += chunk.byteLength;
41
+ }
42
+ return bytes;
43
+ }
44
+ async function readBoundedWebBody(stream, options) {
45
+ const reader = stream.getReader();
46
+ const chunks = [];
47
+ let length = 0;
48
+ try {
49
+ if (options.declaredLength !== void 0 && options.declaredLength > options.limit) {
50
+ await reader.cancel().catch(() => void 0);
51
+ return {
52
+ ok: false,
53
+ reason: "too-large"
54
+ };
55
+ }
56
+ while (true) {
57
+ const next = await reader.read();
58
+ if (next.done) return {
59
+ ok: true,
60
+ bytes: joinBytes(chunks, length)
61
+ };
62
+ length += next.value.byteLength;
63
+ if (length > options.limit) {
64
+ await reader.cancel().catch(() => void 0);
65
+ return {
66
+ ok: false,
67
+ reason: "too-large"
68
+ };
69
+ }
70
+ chunks.push(next.value);
71
+ }
72
+ } catch {
73
+ await reader.cancel().catch(() => void 0);
74
+ return {
75
+ ok: false,
76
+ reason: "aborted"
77
+ };
78
+ } finally {
79
+ reader.releaseLock();
80
+ }
81
+ }
82
+ function nodeChunkBytes(chunk) {
83
+ if (typeof chunk === "string") return Buffer.from(chunk);
84
+ if (chunk instanceof Uint8Array) return chunk;
85
+ return null;
86
+ }
87
+ function readBoundedNodeBody(stream, options) {
88
+ const drainCap = options.drainCap ?? options.limit * 8;
89
+ assertByteLimit(drainCap, "drainCap");
90
+ return new Promise((resolve) => {
91
+ const chunks = [];
92
+ let length = 0;
93
+ let overflow = options.declaredLength !== void 0 && options.declaredLength > options.limit;
94
+ let settled = false;
95
+ const cleanup = () => {
96
+ stream.removeListener("data", onData);
97
+ stream.removeListener("end", onEnd);
98
+ stream.removeListener("aborted", onAborted);
99
+ stream.removeListener("error", onAborted);
100
+ stream.removeListener("close", onClose);
101
+ };
102
+ const destroy = () => {
103
+ if (!stream.destroyed) {
104
+ const absorbDestroyError = () => void 0;
105
+ const removeDestroyErrorHandler = () => {
106
+ stream.removeListener("error", absorbDestroyError);
107
+ };
108
+ stream.once("error", absorbDestroyError);
109
+ stream.once("close", removeDestroyErrorHandler);
110
+ try {
111
+ stream.destroy?.();
112
+ } catch {
113
+ stream.removeListener("error", absorbDestroyError);
114
+ stream.removeListener("close", removeDestroyErrorHandler);
115
+ }
116
+ }
117
+ };
118
+ const finish = (result, destroyStream = false) => {
119
+ if (settled) return;
120
+ settled = true;
121
+ cleanup();
122
+ resolve(result);
123
+ if (destroyStream) destroy();
124
+ };
125
+ const tooLarge = () => {
126
+ finish({
127
+ ok: false,
128
+ reason: "too-large"
129
+ }, true);
130
+ };
131
+ const onData = (chunk) => {
132
+ const bytes = nodeChunkBytes(chunk);
133
+ if (bytes === null) {
134
+ finish({
135
+ ok: false,
136
+ reason: "aborted"
137
+ }, true);
138
+ return;
139
+ }
140
+ length += bytes.byteLength;
141
+ if (!overflow && length <= options.limit) {
142
+ chunks.push(bytes);
143
+ return;
144
+ }
145
+ overflow = true;
146
+ chunks.length = 0;
147
+ if (!options.drainOnOverflow || length > drainCap) tooLarge();
148
+ };
149
+ const onEnd = () => {
150
+ if (overflow) {
151
+ finish({
152
+ ok: false,
153
+ reason: "too-large"
154
+ });
155
+ return;
156
+ }
157
+ finish({
158
+ ok: true,
159
+ bytes: joinBytes(chunks, length)
160
+ });
161
+ };
162
+ const onAborted = () => {
163
+ finish({
164
+ ok: false,
165
+ reason: "aborted"
166
+ }, true);
167
+ };
168
+ const onClose = () => {
169
+ finish({
170
+ ok: false,
171
+ reason: "aborted"
172
+ });
173
+ };
174
+ stream.once("end", onEnd);
175
+ stream.once("aborted", onAborted);
176
+ stream.once("error", onAborted);
177
+ stream.once("close", onClose);
178
+ if (overflow && !options.drainOnOverflow) {
179
+ tooLarge();
180
+ return;
181
+ }
182
+ if (overflow && options.declaredLength !== void 0 && options.declaredLength > drainCap) {
183
+ tooLarge();
184
+ return;
185
+ }
186
+ stream.on("data", onData);
187
+ });
188
+ }
189
+ /** Read a Node or Web body stream without retaining bytes past the limit. */
190
+ function readBoundedBody(stream, options) {
191
+ assertByteLimit(options.limit, "limit");
192
+ if (options.declaredLength !== void 0 && (!Number.isSafeInteger(options.declaredLength) || options.declaredLength < 0)) throw new RangeError("declaredLength must be a non-negative safe integer");
193
+ if ("getReader" in stream) return readBoundedWebBody(stream, options);
194
+ return readBoundedNodeBody(stream, options);
195
+ }
196
+ /** Append response cookies without replacing values already set by the host. */
197
+ function appendSetCookie(res, values) {
198
+ if (res.headersSent) return false;
199
+ const current = res.getHeader("set-cookie");
200
+ const existing = Array.isArray(current) ? current.map(String) : current === void 0 ? [] : [String(current)];
201
+ if (values.length > 0) res.setHeader("set-cookie", [...existing, ...values]);
202
+ return true;
203
+ }
204
+ function varyValues(value) {
205
+ return (Array.isArray(value) ? value : value === void 0 ? [] : [value]).flatMap((item) => String(item).split(","));
206
+ }
207
+ function mergeVary(current, added) {
208
+ const values = [...varyValues(current), ...varyValues(added)].map((value) => value.trim()).filter(Boolean);
209
+ if (values.includes("*")) return "*";
210
+ const seen = /* @__PURE__ */ new Set();
211
+ return values.filter((value) => {
212
+ const normalized = value.toLowerCase();
213
+ if (seen.has(normalized)) return false;
214
+ seen.add(normalized);
215
+ return true;
216
+ }).join(", ");
217
+ }
218
+ function endServerResponse(res) {
219
+ if (res.writableEnded) return Promise.resolve();
220
+ return new Promise((resolve, reject) => {
221
+ let settled = false;
222
+ const cleanup = () => {
223
+ res.removeListener("error", onError);
224
+ res.removeListener("close", onClose);
225
+ };
226
+ const finish = (error) => {
227
+ if (settled) return;
228
+ settled = true;
229
+ cleanup();
230
+ if (error) reject(error);
231
+ else resolve();
232
+ };
233
+ const onError = (error) => {
234
+ finish(error);
235
+ };
236
+ const onClose = () => {
237
+ finish();
238
+ };
239
+ res.once("error", onError);
240
+ res.once("close", onClose);
241
+ res.end(() => finish());
242
+ });
243
+ }
244
+ function waitForDrainOrStop(res, stopped) {
245
+ return new Promise((resolve) => {
246
+ let settled = false;
247
+ const finish = () => {
248
+ if (settled) return;
249
+ settled = true;
250
+ res.removeListener("drain", finish);
251
+ resolve();
252
+ };
253
+ res.once("drain", finish);
254
+ stopped.then(finish);
255
+ });
256
+ }
257
+ /** Write a Web response while retaining host headers and Node backpressure. */
258
+ async function writeWebResponse(res, response, options) {
259
+ res.statusCode = response.status;
260
+ for (const [name, value] of response.headers) {
261
+ if (name === "set-cookie") continue;
262
+ if (name === "vary") res.setHeader("vary", mergeVary(res.getHeader("vary"), value));
263
+ else res.setHeader(name, value);
264
+ }
265
+ appendSetCookie(res, response.headers.getSetCookie());
266
+ if (options?.head || response.body === null) {
267
+ if (options?.head && response.body !== null) await response.body.cancel().catch(() => void 0);
268
+ await endServerResponse(res);
269
+ return;
270
+ }
271
+ const reader = response.body.getReader();
272
+ let stopped = false;
273
+ let writeError;
274
+ let stop;
275
+ const stoppedPromise = new Promise((resolve) => {
276
+ stop = resolve;
277
+ });
278
+ const onClose = () => {
279
+ stopped = true;
280
+ stop();
281
+ reader.cancel().catch(() => void 0);
282
+ };
283
+ const onError = (error) => {
284
+ writeError = error;
285
+ stopped = true;
286
+ stop();
287
+ reader.cancel(error).catch(() => void 0);
288
+ };
289
+ res.once("close", onClose);
290
+ res.once("error", onError);
291
+ try {
292
+ while (!stopped) {
293
+ const read = reader.read().then((value) => ({
294
+ type: "read",
295
+ value
296
+ }), (error) => ({
297
+ type: "read-error",
298
+ error
299
+ }));
300
+ const outcome = await Promise.race([read, stoppedPromise.then(() => ({ type: "stopped" }))]);
301
+ if (outcome.type === "stopped") break;
302
+ if (outcome.type === "read-error") throw outcome.error;
303
+ if (outcome.value.done) break;
304
+ if (!res.write(outcome.value.value)) await waitForDrainOrStop(res, stoppedPromise);
305
+ }
306
+ } catch (error) {
307
+ await reader.cancel(error).catch(() => void 0);
308
+ throw error;
309
+ } finally {
310
+ res.removeListener("close", onClose);
311
+ res.removeListener("error", onError);
312
+ reader.releaseLock();
313
+ }
314
+ if (writeError) throw writeError;
315
+ if (!stopped) await endServerResponse(res);
316
+ }
317
+ /** Capture the active async resource for a later stream continuation. */
318
+ function bindAsyncContext(fn) {
319
+ return AsyncResource.bind(fn);
320
+ }
321
+ function contentTypeOf(req) {
322
+ const raw = req.headers["content-type"];
323
+ return (Array.isArray(raw) ? raw[0] : raw)?.split(";", 1)[0]?.trim().toLowerCase() ?? "";
324
+ }
325
+ function serializeFormBody(body) {
326
+ if (typeof body === "string" || body instanceof URLSearchParams) return new URLSearchParams(body).toString();
327
+ if (body === null || typeof body !== "object" || Array.isArray(body)) return null;
328
+ const parameters = new URLSearchParams();
329
+ for (const [name, value] of Object.entries(body)) if (Array.isArray(value)) for (const item of value) parameters.append(name, String(item));
330
+ else parameters.append(name, String(value));
331
+ return parameters.toString();
332
+ }
333
+ /** Recover bytes after an earlier host parser consumed the request stream. */
334
+ function recoverConsumedBody(req) {
335
+ if (Buffer.isBuffer(req.rawBody)) return Uint8Array.from(req.rawBody);
336
+ const contentType = contentTypeOf(req);
337
+ try {
338
+ if (contentType === "application/json" || contentType.endsWith("+json")) {
339
+ const serialized = JSON.stringify(req.body);
340
+ return serialized === void 0 ? null : new TextEncoder().encode(serialized);
341
+ }
342
+ if (contentType === "application/x-www-form-urlencoded") {
343
+ const serialized = serializeFormBody(req.body);
344
+ return serialized === null ? null : new TextEncoder().encode(serialized);
345
+ }
346
+ } catch {
347
+ return null;
348
+ }
349
+ return null;
350
+ }
351
+ function hostHeader(headers) {
352
+ if (headers instanceof Headers) return headers.get("host");
353
+ for (const [name, value] of Object.entries(headers)) {
354
+ if (name.toLowerCase() !== "host") continue;
355
+ if (typeof value === "string") return value;
356
+ if (Array.isArray(value) && typeof value[0] === "string") return value[0];
357
+ }
358
+ return null;
359
+ }
360
+ /** Build an upgrade URL from socket TLS state, Host, and the raw target. */
361
+ function upgradeRequestUrl(request) {
362
+ const scheme = request.secure || request.socket?.encrypted ? "https" : "http";
363
+ const host = hostHeader(request.headers);
364
+ if (host === null || host.length === 0 || [...host].some((character) => {
365
+ const code = character.charCodeAt(0);
366
+ return code <= 32 || code === 127 || "/\\?#@".includes(character);
367
+ })) throw new TypeError("A valid Host header is required for an upgrade URL");
368
+ let origin;
369
+ try {
370
+ origin = new URL(`${scheme}://${host}`);
371
+ } catch {
372
+ throw new TypeError("A valid Host header is required for an upgrade URL");
373
+ }
374
+ if (origin.username !== "" || origin.password !== "" || origin.pathname !== "/" || origin.search !== "" || origin.hash !== "" || origin.host === "") throw new TypeError("A valid Host header is required for an upgrade URL");
375
+ const target = request.url ?? "/";
376
+ if ([...target].some((character) => {
377
+ const code = character.charCodeAt(0);
378
+ return code <= 32 || code === 127 || character === "#";
379
+ })) throw new TypeError("A valid request target is required for an upgrade URL");
380
+ return `${scheme}://${host}${target.startsWith("/") ? target : `/${target}`}`;
381
+ }
382
+ //#endregion
383
+ export { appendSetCookie, bindAsyncContext, mayHaveBody, readBoundedBody, recoverConsumedBody, toWebHeaders, upgradeRequestUrl, writeWebResponse };
384
+
385
+ //# sourceMappingURL=platform.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.mjs","names":[],"sources":["../src/platform.ts"],"sourcesContent":["import { AsyncResource } from \"node:async_hooks\";\nimport type {\n IncomingHttpHeaders,\n IncomingMessage,\n ServerResponse,\n} from \"node:http\";\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 current = res.getHeader(\"set-cookie\");\n const existing = Array.isArray(current)\n ? current.map(String)\n : current === undefined\n ? []\n : [String(current)];\n if (values.length > 0) {\n res.setHeader(\"set-cookie\", [...existing, ...values]);\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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"}