elysia 2.0.0-exp.45 → 2.0.0-exp.47
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/dist/adapter/index.d.ts +1 -1
- package/dist/adapter/index.js +1 -3
- package/dist/adapter/index.mjs +1 -3
- package/dist/adapter/response-ownership.d.ts +5 -0
- package/dist/adapter/response-ownership.js +13 -0
- package/dist/adapter/response-ownership.mjs +10 -0
- package/dist/adapter/utils.d.ts +4 -4
- package/dist/adapter/utils.js +59 -24
- package/dist/adapter/utils.mjs +60 -25
- package/dist/adapter/web-standard/handler.d.ts +3 -3
- package/dist/adapter/web-standard/handler.js +42 -49
- package/dist/adapter/web-standard/handler.mjs +42 -49
- package/dist/base.js +101 -128
- package/dist/base.mjs +101 -128
- package/dist/compile/analysis-cache.d.ts +6 -0
- package/dist/compile/analysis-cache.js +14 -0
- package/dist/compile/analysis-cache.mjs +13 -0
- package/dist/compile/aot-capture.d.ts +18 -2
- package/dist/compile/aot-capture.js +174 -7
- package/dist/compile/aot-capture.mjs +165 -5
- package/dist/compile/aot-emit.d.ts +29 -0
- package/dist/compile/aot-emit.js +107 -0
- package/dist/compile/aot-emit.mjs +101 -0
- package/dist/compile/aot-reconstruct.d.ts +3 -27
- package/dist/compile/aot-reconstruct.js +4 -97
- package/dist/compile/aot-reconstruct.mjs +5 -92
- package/dist/compile/aot.d.ts +17 -30
- package/dist/compile/aot.js +46 -146
- package/dist/compile/aot.mjs +45 -142
- package/dist/compile/handler/descriptor.d.ts +3 -13
- package/dist/compile/handler/descriptor.js +0 -11
- package/dist/compile/handler/descriptor.mjs +0 -11
- package/dist/compile/handler/frozen-validator.js +15 -6
- package/dist/compile/handler/frozen-validator.mjs +15 -6
- package/dist/compile/handler/index.d.ts +6 -3
- package/dist/compile/handler/index.js +9 -40
- package/dist/compile/handler/index.mjs +9 -40
- package/dist/compile/handler/jit.d.ts +1 -1
- package/dist/compile/handler/jit.js +22 -16
- package/dist/compile/handler/jit.mjs +23 -17
- package/dist/compile/handler/params.d.ts +2 -1
- package/dist/compile/handler/params.js +2 -0
- package/dist/compile/handler/params.mjs +3 -1
- package/dist/compile/handler/reconstruct.d.ts +1 -1
- package/dist/compile/handler/utils.js +1 -1
- package/dist/compile/handler/utils.mjs +1 -1
- package/dist/compile/jit-probe.d.ts +0 -2
- package/dist/compile/jit-probe.js +1 -3
- package/dist/compile/jit-probe.mjs +1 -3
- package/dist/context.d.ts +10 -44
- package/dist/context.js +1 -10
- package/dist/context.mjs +1 -10
- package/dist/cookie/config.d.ts +2 -1
- package/dist/cookie/config.js +13 -18
- package/dist/cookie/config.mjs +12 -18
- package/dist/cookie/crypto.d.ts +6 -1
- package/dist/cookie/crypto.js +56 -17
- package/dist/cookie/crypto.mjs +51 -17
- package/dist/cookie/lib.d.ts +1 -1
- package/dist/cookie/lib.js +3 -11
- package/dist/cookie/lib.mjs +3 -11
- package/dist/cookie/utils.d.ts +11 -4
- package/dist/cookie/utils.js +41 -70
- package/dist/cookie/utils.mjs +38 -63
- package/dist/error.d.ts +3 -2
- package/dist/error.js +4 -3
- package/dist/error.mjs +4 -4
- package/dist/handler/error.js +2 -3
- package/dist/handler/error.mjs +2 -3
- package/dist/handler/fetch.js +10 -8
- package/dist/handler/fetch.mjs +10 -8
- package/dist/handler/index.d.ts +1 -3
- package/dist/handler/index.js +1 -5
- package/dist/handler/index.mjs +1 -3
- package/dist/handler/utils.d.ts +1 -2
- package/dist/handler/utils.js +0 -1
- package/dist/handler/utils.mjs +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.js +3 -0
- package/dist/index.mjs +3 -2
- package/dist/package.js +1 -1
- package/dist/package.mjs +1 -1
- package/dist/plugin/aot/bun.js +3 -10
- package/dist/plugin/aot/bun.mjs +3 -10
- package/dist/plugin/aot/core.d.ts +10 -51
- package/dist/plugin/aot/core.js +24 -135
- package/dist/plugin/aot/core.mjs +24 -134
- package/dist/plugin/aot/esbuild.js +5 -36
- package/dist/plugin/aot/esbuild.mjs +6 -37
- package/dist/plugin/aot/hooks.d.ts +15 -1
- package/dist/plugin/aot/hooks.js +40 -1
- package/dist/plugin/aot/hooks.mjs +39 -1
- package/dist/plugin/aot/rspack.js +1 -2
- package/dist/plugin/aot/rspack.mjs +2 -3
- package/dist/plugin/aot/source.d.ts +3 -33
- package/dist/plugin/aot/source.js +26 -41
- package/dist/plugin/aot/source.mjs +14 -28
- package/dist/plugin/aot/treeshake.d.ts +2 -8
- package/dist/plugin/aot/treeshake.js +6 -24
- package/dist/plugin/aot/treeshake.mjs +7 -24
- package/dist/route-table.d.ts +1 -2
- package/dist/route-table.js +2 -6
- package/dist/route-table.mjs +2 -6
- package/dist/sucrose.d.ts +1 -13
- package/dist/sucrose.js +447 -249
- package/dist/sucrose.mjs +448 -247
- package/dist/type/bridge-live.d.ts +2 -2
- package/dist/type/bridge.d.ts +2 -2
- package/dist/type/coerce.d.ts +0 -4
- package/dist/type/coerce.js +0 -1
- package/dist/type/coerce.mjs +0 -1
- package/dist/type/constants.d.ts +1 -1
- package/dist/type/elysia/file-type.d.ts +2 -1
- package/dist/type/elysia/file-type.js +3 -0
- package/dist/type/elysia/file-type.mjs +4 -1
- package/dist/type/exports.d.ts +1 -1
- package/dist/type/index.d.ts +1 -1
- package/dist/type/utils.js +20 -45
- package/dist/type/utils.mjs +20 -45
- package/dist/type/validator/clean-safe.d.ts +1 -1
- package/dist/type/validator/clean-safe.js +9 -8
- package/dist/type/validator/clean-safe.mjs +9 -8
- package/dist/type/validator/custom-error.js +4 -11
- package/dist/type/validator/custom-error.mjs +1 -8
- package/dist/type/validator/default-precompute.d.ts +7 -1
- package/dist/type/validator/default-precompute.js +11 -83
- package/dist/type/validator/default-precompute.mjs +10 -84
- package/dist/type/validator/frozen-check.js +3 -2
- package/dist/type/validator/frozen-check.mjs +2 -1
- package/dist/type/validator/index.d.ts +3 -4
- package/dist/type/validator/index.js +2 -5
- package/dist/type/validator/index.mjs +3 -5
- package/dist/type/validator/string-codec-aot.js +4 -3
- package/dist/type/validator/string-codec-aot.mjs +3 -2
- package/dist/type/validator/validator-cache.js +7 -3
- package/dist/type/validator/validator-cache.mjs +7 -3
- package/dist/types.d.ts +3 -46
- package/dist/universal/file.d.ts +1 -0
- package/dist/universal/file.js +1 -0
- package/dist/universal/file.mjs +1 -0
- package/dist/utils.d.ts +13 -12
- package/dist/utils.js +20 -1
- package/dist/utils.mjs +18 -1
- package/dist/validator/index.d.ts +1 -5
- package/dist/validator/index.js +20 -62
- package/dist/validator/index.mjs +21 -63
- package/dist/validator/route.d.ts +1 -1
- package/dist/ws/context.d.ts +11 -11
- package/dist/ws/context.js +21 -42
- package/dist/ws/context.mjs +21 -42
- package/dist/ws/route.js +88 -126
- package/dist/ws/route.mjs +89 -127
- package/dist/ws/types.d.ts +2 -4
- package/package.json +1 -10
- package/dist/compile/plan/emit.d.ts +0 -21
- package/dist/compile/plan/emit.js +0 -457
- package/dist/compile/plan/emit.mjs +0 -456
- package/dist/compile/plan/plan.d.ts +0 -76
- package/dist/compile/plan/plan.js +0 -130
- package/dist/compile/plan/plan.mjs +0 -128
- package/dist/experimental/resume.d.ts +0 -11
- package/dist/experimental/resume.js +0 -12
- package/dist/experimental/resume.mjs +0 -11
package/dist/adapter/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ElysiaAdapterOptions } from "./types.js";
|
|
2
2
|
|
|
3
3
|
//#region src/adapter/index.d.ts
|
|
4
|
-
declare
|
|
4
|
+
declare const createAdapter: (adapter: ElysiaAdapterOptions) => ElysiaAdapterOptions;
|
|
5
5
|
type ElysiaAdapter = ReturnType<typeof createAdapter>;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { ElysiaAdapter, type ElysiaAdapterOptions, createAdapter };
|
package/dist/adapter/index.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
|
|
3
3
|
//#region src/adapter/index.ts
|
|
4
|
-
|
|
5
|
-
return adapter;
|
|
6
|
-
}
|
|
4
|
+
const createAdapter = (adapter) => adapter;
|
|
7
5
|
|
|
8
6
|
//#endregion
|
|
9
7
|
exports.createAdapter = createAdapter;
|
package/dist/adapter/index.mjs
CHANGED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
//#region src/adapter/response-ownership.ts
|
|
4
|
+
const borrowedResponses = /* @__PURE__ */ new WeakSet();
|
|
5
|
+
function borrow(response) {
|
|
6
|
+
borrowedResponses.add(response);
|
|
7
|
+
return response;
|
|
8
|
+
}
|
|
9
|
+
const isBorrowedResponse = (response) => borrowedResponses.has(response);
|
|
10
|
+
|
|
11
|
+
//#endregion
|
|
12
|
+
exports.borrow = borrow;
|
|
13
|
+
exports.isBorrowedResponse = isBorrowedResponse;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//#region src/adapter/response-ownership.ts
|
|
2
|
+
const borrowedResponses = /* @__PURE__ */ new WeakSet();
|
|
3
|
+
function borrow(response) {
|
|
4
|
+
borrowedResponses.add(response);
|
|
5
|
+
return response;
|
|
6
|
+
}
|
|
7
|
+
const isBorrowedResponse = (response) => borrowedResponses.has(response);
|
|
8
|
+
|
|
9
|
+
//#endregion
|
|
10
|
+
export { borrow, isBorrowedResponse };
|
package/dist/adapter/utils.d.ts
CHANGED
|
@@ -17,16 +17,16 @@ declare function responseToSetHeaders(response: Response, set?: Context['set']):
|
|
|
17
17
|
status: number | "Continue" | "Switching Protocols" | "Processing" | "Early Hints" | "OK" | "Created" | "Accepted" | "Non-Authoritative Information" | "No Content" | "Reset Content" | "Partial Content" | "Multi-Status" | "Already Reported" | "Multiple Choices" | "Moved Permanently" | "Found" | "See Other" | "Not Modified" | "Temporary Redirect" | "Permanent Redirect" | "Bad Request" | "Unauthorized" | "Payment Required" | "Forbidden" | "Not Found" | "Method Not Allowed" | "Not Acceptable" | "Proxy Authentication Required" | "Request Timeout" | "Conflict" | "Gone" | "Length Required" | "Precondition Failed" | "Payload Too Large" | "URI Too Long" | "Unsupported Media Type" | "Range Not Satisfiable" | "Expectation Failed" | "I'm a teapot" | "Enhance Your Calm" | "Misdirected Request" | "Unprocessable Content" | "Locked" | "Failed Dependency" | "Too Early" | "Upgrade Required" | "Precondition Required" | "Too Many Requests" | "Request Header Fields Too Large" | "Unavailable For Legal Reasons" | "Internal Server Error" | "Not Implemented" | "Bad Gateway" | "Service Unavailable" | "Gateway Timeout" | "HTTP Version Not Supported" | "Variant Also Negotiates" | "Insufficient Storage" | "Loop Detected" | "Not Extended" | "Network Authentication Required";
|
|
18
18
|
};
|
|
19
19
|
interface CreateHandlerParameter {
|
|
20
|
-
mapResponse(response: unknown, set: Context['set'], request?: Request): Response;
|
|
21
|
-
mapCompactResponse(response: unknown, request?: Request): Response;
|
|
20
|
+
mapResponse(response: unknown, set: Context['set'], request?: Request, owned?: boolean): Response;
|
|
21
|
+
mapCompactResponse(response: unknown, request?: Request, owned?: boolean): Response;
|
|
22
22
|
}
|
|
23
23
|
declare function createStreamHandler({
|
|
24
24
|
mapResponse,
|
|
25
25
|
mapCompactResponse
|
|
26
|
-
}: CreateHandlerParameter): (generator: Generator | AsyncGenerator | ReadableStream, set?: Context["set"], request?: Request, skipFormat?: boolean) => Promise<Response>;
|
|
26
|
+
}: CreateHandlerParameter): (generator: Generator | AsyncGenerator | ReadableStream, set?: Context["set"], request?: Request, skipFormat?: boolean, owned?: boolean) => Promise<Response>;
|
|
27
27
|
declare function streamResponse(response: Response): AsyncGenerator<any, void, any>;
|
|
28
28
|
declare function handleSet(set: Context['set']): void;
|
|
29
|
-
declare function createResponseHandler(handler: CreateHandlerParameter): (response: Response, set?: Context["set"], request?: Request) => any;
|
|
29
|
+
declare function createResponseHandler(handler: CreateHandlerParameter): (response: Response, set?: Context["set"], request?: Request, owned?: boolean) => any;
|
|
30
30
|
/**
|
|
31
31
|
* Split async source into `branches` independent iterators
|
|
32
32
|
*
|
package/dist/adapter/utils.js
CHANGED
|
@@ -4,6 +4,7 @@ const require_constants = require('../constants.js');
|
|
|
4
4
|
const require_utils = require('../utils.js');
|
|
5
5
|
const require_adapter_skip_clone = require('./skip-clone.js');
|
|
6
6
|
const require_cookie_serialize = require('../cookie/serialize.js');
|
|
7
|
+
const require_adapter_response_ownership = require('./response-ownership.js');
|
|
7
8
|
const require_adapter_default_headers = require('./default-headers.js');
|
|
8
9
|
|
|
9
10
|
//#region src/adapter/utils.ts
|
|
@@ -95,10 +96,7 @@ function normalizeHeaders(set) {
|
|
|
95
96
|
function parseSetCookies(headers, setCookie) {
|
|
96
97
|
if (!headers) return headers;
|
|
97
98
|
headers.delete("set-cookie");
|
|
98
|
-
for (let i = 0; i < setCookie.length; i++)
|
|
99
|
-
const index = setCookie[i].indexOf("=");
|
|
100
|
-
headers.append("set-cookie", `${setCookie[i].slice(0, index)}=${setCookie[i].slice(index + 1) || ""}`);
|
|
101
|
-
}
|
|
99
|
+
for (let i = 0; i < setCookie.length; i++) headers.append("set-cookie", setCookie[i]);
|
|
102
100
|
return headers;
|
|
103
101
|
}
|
|
104
102
|
function responseToSetHeaders(response, set) {
|
|
@@ -123,9 +121,7 @@ function responseToSetHeaders(response, set) {
|
|
|
123
121
|
};
|
|
124
122
|
for (const [key, value] of response.headers.entries()) set.headers[key] = value;
|
|
125
123
|
}
|
|
126
|
-
if (set.headers
|
|
127
|
-
if (set.headers.has("content-encoding")) set.headers.delete("content-encoding");
|
|
128
|
-
} else if (set.headers["content-encoding"]) delete set.headers["content-encoding"];
|
|
124
|
+
if (set.headers["content-encoding"]) delete set.headers["content-encoding"];
|
|
129
125
|
return set;
|
|
130
126
|
}
|
|
131
127
|
function enqueueBinaryChunk(controller, chunk) {
|
|
@@ -148,29 +144,49 @@ function enqueueBinaryChunk(controller, chunk) {
|
|
|
148
144
|
return false;
|
|
149
145
|
}
|
|
150
146
|
function createStreamHandler({ mapResponse, mapCompactResponse }) {
|
|
151
|
-
return async (generator, set, request, skipFormat) => {
|
|
152
|
-
|
|
147
|
+
return async (generator, set, request, skipFormat, owned = false) => {
|
|
148
|
+
if (require_utils.isByteStream(generator)) {
|
|
149
|
+
if (generator.locked) throw new TypeError("Cannot transfer a locked or consumed byte stream");
|
|
150
|
+
if (set) {
|
|
151
|
+
handleSet(set);
|
|
152
|
+
const headers = materializeSetHeaders(set);
|
|
153
|
+
if (headers instanceof Headers) {
|
|
154
|
+
if (!headers.has("content-type")) headers.set("content-type", "application/octet-stream");
|
|
155
|
+
} else if (!headers["content-type"]) headers["content-type"] = "application/octet-stream";
|
|
156
|
+
return new Response(generator, set);
|
|
157
|
+
}
|
|
158
|
+
return new Response(generator, { headers: { "content-type": "application/octet-stream" } });
|
|
159
|
+
}
|
|
160
|
+
const typedSSE = !skipFormat && "sse" in generator && generator.sse === true;
|
|
161
|
+
let init = typedSSE ? void 0 : generator.next?.();
|
|
153
162
|
if (set) handleSet(set);
|
|
154
163
|
if (init instanceof Promise) init = await init;
|
|
155
164
|
if (init?.value instanceof ReadableStream) generator = init.value;
|
|
156
165
|
else if (init && (typeof init?.done === "undefined" || init?.done)) {
|
|
157
|
-
if (set) return mapResponse(init.value, set, request);
|
|
158
|
-
return mapCompactResponse(init.value, request);
|
|
166
|
+
if (set) return mapResponse(init.value, set, request, owned);
|
|
167
|
+
return mapCompactResponse(init.value, request, owned);
|
|
159
168
|
}
|
|
160
|
-
const isSSE = !skipFormat && (init?.value?.sse ?? generator?.sse ?? (set?.headers instanceof Headers ? set.headers.get("content-type")?.startsWith("text/event-stream") : set?.headers["content-type"]?.startsWith("text/event-stream")));
|
|
169
|
+
const isSSE = typedSSE || !skipFormat && (init?.value?.sse ?? generator?.sse ?? (set?.headers instanceof Headers ? set.headers.get("content-type")?.startsWith("text/event-stream") : set?.headers["content-type"]?.startsWith("text/event-stream")));
|
|
161
170
|
const format = isSSE ? sseFormat : identityFormat;
|
|
162
171
|
const contentType = isSSE ? "text/event-stream" : init?.value && typeof init?.value === "object" ? ArrayBuffer.isView(init.value) ? "application/octet-stream" : "application/json" : "text/plain";
|
|
163
172
|
if (set) materializeSetHeaders(set);
|
|
164
173
|
const headers = set?.headers;
|
|
165
174
|
if (headers instanceof Headers) {
|
|
166
|
-
if (!headers.has("transfer-encoding")) headers.set("transfer-encoding", "chunked");
|
|
175
|
+
if (!typedSSE && !headers.has("transfer-encoding")) headers.set("transfer-encoding", "chunked");
|
|
167
176
|
if (!headers.has("content-type")) headers.set("content-type", contentType);
|
|
168
177
|
if (!headers.has("cache-control")) headers.set("cache-control", "no-cache");
|
|
169
178
|
} else if (headers) {
|
|
170
|
-
if (!headers["transfer-encoding"]) headers["transfer-encoding"] = "chunked";
|
|
179
|
+
if (!typedSSE && !headers["transfer-encoding"]) headers["transfer-encoding"] = "chunked";
|
|
171
180
|
if (!headers["content-type"]) headers["content-type"] = contentType;
|
|
172
181
|
if (!headers["cache-control"]) headers["cache-control"] = "no-cache";
|
|
173
|
-
} else set = {
|
|
182
|
+
} else if (typedSSE) set = {
|
|
183
|
+
status: 200,
|
|
184
|
+
headers: {
|
|
185
|
+
"content-type": contentType,
|
|
186
|
+
"cache-control": "no-cache"
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
else set = {
|
|
174
190
|
status: 200,
|
|
175
191
|
headers: {
|
|
176
192
|
"content-type": contentType,
|
|
@@ -255,7 +271,7 @@ function createStreamHandler({ mapResponse, mapCompactResponse }) {
|
|
|
255
271
|
cleanupAbort();
|
|
256
272
|
safeReturn();
|
|
257
273
|
}
|
|
258
|
-
}), set);
|
|
274
|
+
}, typedSSE ? { highWaterMark: 0 } : void 0), set);
|
|
259
275
|
};
|
|
260
276
|
}
|
|
261
277
|
async function* streamResponse(response) {
|
|
@@ -315,7 +331,7 @@ function mergeStatus(responseStatus, setStatus) {
|
|
|
315
331
|
if (responseStatus === 200) return setStatus;
|
|
316
332
|
return responseStatus;
|
|
317
333
|
}
|
|
318
|
-
function cancelPropagatingBody(clonedBody, orphanedBranch) {
|
|
334
|
+
function cancelPropagatingBody(clonedBody, orphanedBranch, preserveOrphan = false) {
|
|
319
335
|
const reader = clonedBody.getReader();
|
|
320
336
|
return new ReadableStream({
|
|
321
337
|
async pull(controller) {
|
|
@@ -324,23 +340,42 @@ function cancelPropagatingBody(clonedBody, orphanedBranch) {
|
|
|
324
340
|
else controller.enqueue(value);
|
|
325
341
|
},
|
|
326
342
|
cancel(reason) {
|
|
343
|
+
if (preserveOrphan) {
|
|
344
|
+
reader.cancel(reason).catch(() => {});
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
327
347
|
orphanedBranch.cancel(reason);
|
|
328
348
|
return reader.cancel(reason);
|
|
329
349
|
}
|
|
330
350
|
});
|
|
331
351
|
}
|
|
352
|
+
const warnedStreamBorrows = /* @__PURE__ */ new WeakSet();
|
|
332
353
|
function createResponseHandler(handler) {
|
|
333
354
|
const handleStream = createStreamHandler(handler);
|
|
334
|
-
return (response, set, request) => {
|
|
355
|
+
return (response, set, request, owned = false) => {
|
|
356
|
+
if (require_adapter_skip_clone.skipClone.has(response) && !response.bodyUsed) {
|
|
357
|
+
require_adapter_skip_clone.skipClone.delete(response);
|
|
358
|
+
owned = true;
|
|
359
|
+
}
|
|
360
|
+
const explicitlyBorrowed = require_adapter_response_ownership.isBorrowedResponse(response);
|
|
361
|
+
const borrowed = !owned || explicitlyBorrowed;
|
|
362
|
+
const mustClone = owned && explicitlyBorrowed;
|
|
363
|
+
if (!borrowed && response.bodyUsed) throw new TypeError("Cannot reuse a consumed Response across requests — a returned Response is request-owned; call borrow(response) to mark it reusable");
|
|
335
364
|
if (set) {
|
|
336
365
|
const status = mergeStatus(response.status, set.status);
|
|
337
|
-
|
|
338
|
-
|
|
366
|
+
const statusUnchanged = status === void 0 || status === response.status;
|
|
367
|
+
if (!mustClone && statusUnchanged && !set.cookie && !require_utils.isNotEmpty(set.headers)) return response;
|
|
368
|
+
} else if (!mustClone) return response;
|
|
369
|
+
if (!borrowed && response.body?.locked) throw new TypeError("Cannot patch a Response whose body is locked — release the reader, or call borrow(response) if it must be reused");
|
|
339
370
|
let body = response.body;
|
|
340
|
-
if (
|
|
341
|
-
|
|
371
|
+
if (borrowed) {
|
|
372
|
+
const bodyBefore = body;
|
|
342
373
|
const cloned = response.clone();
|
|
343
|
-
|
|
374
|
+
if (explicitlyBorrowed && bodyBefore && response.body !== bodyBefore && !warnedStreamBorrows.has(response)) {
|
|
375
|
+
warnedStreamBorrows.add(response);
|
|
376
|
+
console.warn("[elysia] borrow() was called on a stream-backed Response — its entire body will stay buffered in memory for as long as the borrowed object lives, and every reuse adds a tee layer. Borrow only buffered Responses (string / ArrayBuffer / Blob bodies), or construct a fresh Response per request.");
|
|
377
|
+
}
|
|
378
|
+
body = cloned.body && response.body ? cancelPropagatingBody(cloned.body, response.body, explicitlyBorrowed) : cloned.body;
|
|
344
379
|
}
|
|
345
380
|
const newResponse = new Response(body, set ? {
|
|
346
381
|
headers: mergeHeaders(response.headers, set.headers),
|
|
@@ -351,7 +386,7 @@ function createResponseHandler(handler) {
|
|
|
351
386
|
status: response.status,
|
|
352
387
|
statusText: response.statusText
|
|
353
388
|
});
|
|
354
|
-
if (!newResponse.headers.has("content-length") && newResponse.headers.get("transfer-encoding") === "chunked") return handleStream(streamResponse(newResponse), responseToSetHeaders(newResponse, set), request, true);
|
|
389
|
+
if (borrowed && !newResponse.headers.has("content-length") && newResponse.headers.get("transfer-encoding") === "chunked") return handleStream(streamResponse(newResponse), responseToSetHeaders(newResponse, set), request, true);
|
|
355
390
|
return newResponse;
|
|
356
391
|
};
|
|
357
392
|
}
|
package/dist/adapter/utils.mjs
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { hasHeaderShorthand, isBun } from "../universal/constants.mjs";
|
|
2
2
|
import { StatusMap } from "../constants.mjs";
|
|
3
|
-
import { isNotEmpty, nullObject } from "../utils.mjs";
|
|
3
|
+
import { isByteStream, isNotEmpty, nullObject } from "../utils.mjs";
|
|
4
4
|
import { skipClone } from "./skip-clone.mjs";
|
|
5
5
|
import { serializeCookie } from "../cookie/serialize.mjs";
|
|
6
|
+
import { isBorrowedResponse } from "./response-ownership.mjs";
|
|
6
7
|
import { defaultHeaders } from "./default-headers.mjs";
|
|
7
8
|
|
|
8
9
|
//#region src/adapter/utils.ts
|
|
@@ -94,10 +95,7 @@ function normalizeHeaders(set) {
|
|
|
94
95
|
function parseSetCookies(headers, setCookie) {
|
|
95
96
|
if (!headers) return headers;
|
|
96
97
|
headers.delete("set-cookie");
|
|
97
|
-
for (let i = 0; i < setCookie.length; i++)
|
|
98
|
-
const index = setCookie[i].indexOf("=");
|
|
99
|
-
headers.append("set-cookie", `${setCookie[i].slice(0, index)}=${setCookie[i].slice(index + 1) || ""}`);
|
|
100
|
-
}
|
|
98
|
+
for (let i = 0; i < setCookie.length; i++) headers.append("set-cookie", setCookie[i]);
|
|
101
99
|
return headers;
|
|
102
100
|
}
|
|
103
101
|
function responseToSetHeaders(response, set) {
|
|
@@ -122,9 +120,7 @@ function responseToSetHeaders(response, set) {
|
|
|
122
120
|
};
|
|
123
121
|
for (const [key, value] of response.headers.entries()) set.headers[key] = value;
|
|
124
122
|
}
|
|
125
|
-
if (set.headers
|
|
126
|
-
if (set.headers.has("content-encoding")) set.headers.delete("content-encoding");
|
|
127
|
-
} else if (set.headers["content-encoding"]) delete set.headers["content-encoding"];
|
|
123
|
+
if (set.headers["content-encoding"]) delete set.headers["content-encoding"];
|
|
128
124
|
return set;
|
|
129
125
|
}
|
|
130
126
|
function enqueueBinaryChunk(controller, chunk) {
|
|
@@ -147,29 +143,49 @@ function enqueueBinaryChunk(controller, chunk) {
|
|
|
147
143
|
return false;
|
|
148
144
|
}
|
|
149
145
|
function createStreamHandler({ mapResponse, mapCompactResponse }) {
|
|
150
|
-
return async (generator, set, request, skipFormat) => {
|
|
151
|
-
|
|
146
|
+
return async (generator, set, request, skipFormat, owned = false) => {
|
|
147
|
+
if (isByteStream(generator)) {
|
|
148
|
+
if (generator.locked) throw new TypeError("Cannot transfer a locked or consumed byte stream");
|
|
149
|
+
if (set) {
|
|
150
|
+
handleSet(set);
|
|
151
|
+
const headers = materializeSetHeaders(set);
|
|
152
|
+
if (headers instanceof Headers) {
|
|
153
|
+
if (!headers.has("content-type")) headers.set("content-type", "application/octet-stream");
|
|
154
|
+
} else if (!headers["content-type"]) headers["content-type"] = "application/octet-stream";
|
|
155
|
+
return new Response(generator, set);
|
|
156
|
+
}
|
|
157
|
+
return new Response(generator, { headers: { "content-type": "application/octet-stream" } });
|
|
158
|
+
}
|
|
159
|
+
const typedSSE = !skipFormat && "sse" in generator && generator.sse === true;
|
|
160
|
+
let init = typedSSE ? void 0 : generator.next?.();
|
|
152
161
|
if (set) handleSet(set);
|
|
153
162
|
if (init instanceof Promise) init = await init;
|
|
154
163
|
if (init?.value instanceof ReadableStream) generator = init.value;
|
|
155
164
|
else if (init && (typeof init?.done === "undefined" || init?.done)) {
|
|
156
|
-
if (set) return mapResponse(init.value, set, request);
|
|
157
|
-
return mapCompactResponse(init.value, request);
|
|
165
|
+
if (set) return mapResponse(init.value, set, request, owned);
|
|
166
|
+
return mapCompactResponse(init.value, request, owned);
|
|
158
167
|
}
|
|
159
|
-
const isSSE = !skipFormat && (init?.value?.sse ?? generator?.sse ?? (set?.headers instanceof Headers ? set.headers.get("content-type")?.startsWith("text/event-stream") : set?.headers["content-type"]?.startsWith("text/event-stream")));
|
|
168
|
+
const isSSE = typedSSE || !skipFormat && (init?.value?.sse ?? generator?.sse ?? (set?.headers instanceof Headers ? set.headers.get("content-type")?.startsWith("text/event-stream") : set?.headers["content-type"]?.startsWith("text/event-stream")));
|
|
160
169
|
const format = isSSE ? sseFormat : identityFormat;
|
|
161
170
|
const contentType = isSSE ? "text/event-stream" : init?.value && typeof init?.value === "object" ? ArrayBuffer.isView(init.value) ? "application/octet-stream" : "application/json" : "text/plain";
|
|
162
171
|
if (set) materializeSetHeaders(set);
|
|
163
172
|
const headers = set?.headers;
|
|
164
173
|
if (headers instanceof Headers) {
|
|
165
|
-
if (!headers.has("transfer-encoding")) headers.set("transfer-encoding", "chunked");
|
|
174
|
+
if (!typedSSE && !headers.has("transfer-encoding")) headers.set("transfer-encoding", "chunked");
|
|
166
175
|
if (!headers.has("content-type")) headers.set("content-type", contentType);
|
|
167
176
|
if (!headers.has("cache-control")) headers.set("cache-control", "no-cache");
|
|
168
177
|
} else if (headers) {
|
|
169
|
-
if (!headers["transfer-encoding"]) headers["transfer-encoding"] = "chunked";
|
|
178
|
+
if (!typedSSE && !headers["transfer-encoding"]) headers["transfer-encoding"] = "chunked";
|
|
170
179
|
if (!headers["content-type"]) headers["content-type"] = contentType;
|
|
171
180
|
if (!headers["cache-control"]) headers["cache-control"] = "no-cache";
|
|
172
|
-
} else set = {
|
|
181
|
+
} else if (typedSSE) set = {
|
|
182
|
+
status: 200,
|
|
183
|
+
headers: {
|
|
184
|
+
"content-type": contentType,
|
|
185
|
+
"cache-control": "no-cache"
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
else set = {
|
|
173
189
|
status: 200,
|
|
174
190
|
headers: {
|
|
175
191
|
"content-type": contentType,
|
|
@@ -254,7 +270,7 @@ function createStreamHandler({ mapResponse, mapCompactResponse }) {
|
|
|
254
270
|
cleanupAbort();
|
|
255
271
|
safeReturn();
|
|
256
272
|
}
|
|
257
|
-
}), set);
|
|
273
|
+
}, typedSSE ? { highWaterMark: 0 } : void 0), set);
|
|
258
274
|
};
|
|
259
275
|
}
|
|
260
276
|
async function* streamResponse(response) {
|
|
@@ -314,7 +330,7 @@ function mergeStatus(responseStatus, setStatus) {
|
|
|
314
330
|
if (responseStatus === 200) return setStatus;
|
|
315
331
|
return responseStatus;
|
|
316
332
|
}
|
|
317
|
-
function cancelPropagatingBody(clonedBody, orphanedBranch) {
|
|
333
|
+
function cancelPropagatingBody(clonedBody, orphanedBranch, preserveOrphan = false) {
|
|
318
334
|
const reader = clonedBody.getReader();
|
|
319
335
|
return new ReadableStream({
|
|
320
336
|
async pull(controller) {
|
|
@@ -323,23 +339,42 @@ function cancelPropagatingBody(clonedBody, orphanedBranch) {
|
|
|
323
339
|
else controller.enqueue(value);
|
|
324
340
|
},
|
|
325
341
|
cancel(reason) {
|
|
342
|
+
if (preserveOrphan) {
|
|
343
|
+
reader.cancel(reason).catch(() => {});
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
326
346
|
orphanedBranch.cancel(reason);
|
|
327
347
|
return reader.cancel(reason);
|
|
328
348
|
}
|
|
329
349
|
});
|
|
330
350
|
}
|
|
351
|
+
const warnedStreamBorrows = /* @__PURE__ */ new WeakSet();
|
|
331
352
|
function createResponseHandler(handler) {
|
|
332
353
|
const handleStream = createStreamHandler(handler);
|
|
333
|
-
return (response, set, request) => {
|
|
354
|
+
return (response, set, request, owned = false) => {
|
|
355
|
+
if (skipClone.has(response) && !response.bodyUsed) {
|
|
356
|
+
skipClone.delete(response);
|
|
357
|
+
owned = true;
|
|
358
|
+
}
|
|
359
|
+
const explicitlyBorrowed = isBorrowedResponse(response);
|
|
360
|
+
const borrowed = !owned || explicitlyBorrowed;
|
|
361
|
+
const mustClone = owned && explicitlyBorrowed;
|
|
362
|
+
if (!borrowed && response.bodyUsed) throw new TypeError("Cannot reuse a consumed Response across requests — a returned Response is request-owned; call borrow(response) to mark it reusable");
|
|
334
363
|
if (set) {
|
|
335
364
|
const status = mergeStatus(response.status, set.status);
|
|
336
|
-
|
|
337
|
-
|
|
365
|
+
const statusUnchanged = status === void 0 || status === response.status;
|
|
366
|
+
if (!mustClone && statusUnchanged && !set.cookie && !isNotEmpty(set.headers)) return response;
|
|
367
|
+
} else if (!mustClone) return response;
|
|
368
|
+
if (!borrowed && response.body?.locked) throw new TypeError("Cannot patch a Response whose body is locked — release the reader, or call borrow(response) if it must be reused");
|
|
338
369
|
let body = response.body;
|
|
339
|
-
if (
|
|
340
|
-
|
|
370
|
+
if (borrowed) {
|
|
371
|
+
const bodyBefore = body;
|
|
341
372
|
const cloned = response.clone();
|
|
342
|
-
|
|
373
|
+
if (explicitlyBorrowed && bodyBefore && response.body !== bodyBefore && !warnedStreamBorrows.has(response)) {
|
|
374
|
+
warnedStreamBorrows.add(response);
|
|
375
|
+
console.warn("[elysia] borrow() was called on a stream-backed Response — its entire body will stay buffered in memory for as long as the borrowed object lives, and every reuse adds a tee layer. Borrow only buffered Responses (string / ArrayBuffer / Blob bodies), or construct a fresh Response per request.");
|
|
376
|
+
}
|
|
377
|
+
body = cloned.body && response.body ? cancelPropagatingBody(cloned.body, response.body, explicitlyBorrowed) : cloned.body;
|
|
343
378
|
}
|
|
344
379
|
const newResponse = new Response(body, set ? {
|
|
345
380
|
headers: mergeHeaders(response.headers, set.headers),
|
|
@@ -350,7 +385,7 @@ function createResponseHandler(handler) {
|
|
|
350
385
|
status: response.status,
|
|
351
386
|
statusText: response.statusText
|
|
352
387
|
});
|
|
353
|
-
if (!newResponse.headers.has("content-length") && newResponse.headers.get("transfer-encoding") === "chunked") return handleStream(streamResponse(newResponse), responseToSetHeaders(newResponse, set), request, true);
|
|
388
|
+
if (borrowed && !newResponse.headers.has("content-length") && newResponse.headers.get("transfer-encoding") === "chunked") return handleStream(streamResponse(newResponse), responseToSetHeaders(newResponse, set), request, true);
|
|
354
389
|
return newResponse;
|
|
355
390
|
};
|
|
356
391
|
}
|
|
@@ -2,10 +2,10 @@ import { MaybePromise } from "../../types.js";
|
|
|
2
2
|
import { Context } from "../../context.js";
|
|
3
3
|
|
|
4
4
|
//#region src/adapter/web-standard/handler.d.ts
|
|
5
|
-
declare function mapResponse(response: unknown, set: Context['set'], request?: Request): Response;
|
|
6
|
-
declare function mapCompactResponse(response: unknown, request?: Request): Response;
|
|
5
|
+
declare function mapResponse(response: unknown, set: Context['set'], request?: Request, owned?: boolean): Response;
|
|
6
|
+
declare function mapCompactResponse(response: unknown, request?: Request, owned?: boolean): Response;
|
|
7
7
|
declare function errorToResponse(error: Error & {
|
|
8
8
|
toResponse?(): MaybePromise<Response>;
|
|
9
|
-
}, set?: Context['set']): any;
|
|
9
|
+
}, set?: Context['set'], request?: Request, owned?: boolean): any;
|
|
10
10
|
//#endregion
|
|
11
11
|
export { errorToResponse, mapCompactResponse, mapResponse };
|
|
@@ -7,6 +7,7 @@ const require_adapter_default_headers = require('../default-headers.js');
|
|
|
7
7
|
const require_adapter_utils = require('../utils.js');
|
|
8
8
|
|
|
9
9
|
//#region src/adapter/web-standard/handler.ts
|
|
10
|
+
const textPlainInit = { headers: { "content-type": "text/plain" } };
|
|
10
11
|
function handleElysiaFile(file, set = { headers: require_utils.nullObject() }, request) {
|
|
11
12
|
const path = file.path;
|
|
12
13
|
const contentType = require_universal_file.mime[path.slice(path.lastIndexOf(".") + 1).toLowerCase()];
|
|
@@ -15,31 +16,22 @@ function handleElysiaFile(file, set = { headers: require_utils.nullObject() }, r
|
|
|
15
16
|
const stats = file.stats;
|
|
16
17
|
if (stats) return stats.then((stat) => {
|
|
17
18
|
const size = stat.size;
|
|
18
|
-
if (size !== void 0 && set.status !== 206 && set.status !== 304 && set.status !== 412 && set.status !== 416)
|
|
19
|
-
headers["content-range"] = `bytes 0-${size - 1}/${size}`;
|
|
20
|
-
headers["content-length"] = size;
|
|
21
|
-
}
|
|
19
|
+
if (size !== void 0 && set.status !== 206 && set.status !== 304 && set.status !== 412 && set.status !== 416) headers["content-length"] = size;
|
|
22
20
|
return require_adapter_utils.handleFile(file, set, request, size);
|
|
23
21
|
});
|
|
24
22
|
return require_adapter_utils.handleFile(file.value, set, request);
|
|
25
23
|
}
|
|
26
|
-
function
|
|
27
|
-
if (response === null || response === void 0) return void 0;
|
|
28
|
-
const proto = Object.getPrototypeOf(response);
|
|
29
|
-
if (proto === null) return "Object";
|
|
30
|
-
return proto.constructor?.name;
|
|
31
|
-
}
|
|
32
|
-
function mapResponseWithSet(response, set, request) {
|
|
24
|
+
function mapResponseWithSet(response, set, request, owned) {
|
|
33
25
|
require_adapter_utils.handleSet(set);
|
|
34
26
|
const headers = set.headers;
|
|
35
|
-
switch (
|
|
27
|
+
switch (response?.constructor?.name) {
|
|
36
28
|
case "String":
|
|
37
29
|
if (!require_universal_constants.isBun && !headers["content-type"]) require_adapter_utils.materializeSetHeaders(set)["content-type"] = "text/plain";
|
|
38
30
|
return new Response(response, set);
|
|
39
31
|
case "Array": return Response.json(response, set);
|
|
40
32
|
case "Object":
|
|
41
33
|
if (response["~ely-form"]) return new Response(require_utils.formToFormData(response), set);
|
|
42
|
-
if (typeof response?.next === "function") return handleStream(response, set, request);
|
|
34
|
+
if (typeof response?.next === "function") return handleStream(response, set, request, void 0, owned);
|
|
43
35
|
return Response.json(response, set);
|
|
44
36
|
case "Number":
|
|
45
37
|
case "Boolean": return new Response(response.toString(), set);
|
|
@@ -49,32 +41,33 @@ function mapResponseWithSet(response, set, request) {
|
|
|
49
41
|
case "ElysiaStatus":
|
|
50
42
|
set.status = response.code;
|
|
51
43
|
if (response.headers) Object.assign(require_adapter_utils.materializeSetHeaders(set), response.headers);
|
|
52
|
-
return mapResponseWithSet(response.response, set, request);
|
|
44
|
+
return mapResponseWithSet(response.response, set, request, owned);
|
|
53
45
|
case void 0: return response ? Response.json(response, set) : new Response(null, set);
|
|
54
|
-
case "Response": return handleResponse(response, set, request);
|
|
55
|
-
case "Error": return errorToResponse(response, set);
|
|
56
|
-
case "Promise": return response.then((x) => mapResponseWithSet(x, set, request));
|
|
57
|
-
case "Function": return mapResponseWithSet(response(), set, request);
|
|
46
|
+
case "Response": return handleResponse(response, set, request, owned);
|
|
47
|
+
case "Error": return errorToResponse(response, set, request, owned);
|
|
48
|
+
case "Promise": return response.then((x) => mapResponseWithSet(x, set, request, owned));
|
|
49
|
+
case "Function": return mapResponseWithSet(response(), set, request, owned);
|
|
58
50
|
case "FormData": return new Response(response, set);
|
|
59
|
-
default: return mapResponseFallback(response, set, request);
|
|
51
|
+
default: return mapResponseFallback(response, set, request, owned);
|
|
60
52
|
}
|
|
61
53
|
}
|
|
62
|
-
function mapResponse(response, set, request) {
|
|
54
|
+
function mapResponse(response, set, request, owned) {
|
|
63
55
|
const headers = set.headers;
|
|
64
|
-
if (set.status !== void 0 || set.cookie || headers["\0"] === headers || require_utils.isNotEmpty(headers)) return mapResponseWithSet(response, set, request);
|
|
56
|
+
if (set.status !== void 0 || set.cookie || headers["\0"] === headers || require_utils.isNotEmpty(headers)) return mapResponseWithSet(response, set, request, owned);
|
|
65
57
|
if (response instanceof require_error.ElysiaStatus) {
|
|
66
58
|
set.status = response.code;
|
|
67
59
|
if (response.headers) Object.assign(set.headers, response.headers);
|
|
68
|
-
return mapResponse(response.response, set, request);
|
|
60
|
+
return mapResponse(response.response, set, request, owned);
|
|
69
61
|
}
|
|
70
|
-
if (response instanceof Response) return response;
|
|
71
|
-
if (response instanceof Promise) return response.then((x) => mapResponse(x, set, request));
|
|
72
|
-
if (typeof response?.next === "function" || response instanceof ReadableStream) return handleStream(response, set, request);
|
|
73
|
-
return mapCompactResponse(response, request);
|
|
62
|
+
if (response instanceof Response) return owned ? handleResponse(response, void 0, request, true) : response;
|
|
63
|
+
if (response instanceof Promise) return response.then((x) => mapResponse(x, set, request, owned));
|
|
64
|
+
if (typeof response?.next === "function" || response instanceof ReadableStream) return handleStream(response, set, request, void 0, owned);
|
|
65
|
+
return mapCompactResponse(response, request, owned);
|
|
74
66
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
67
|
+
const textHeaders = require_universal_constants.isBun ? void 0 : textPlainInit;
|
|
68
|
+
function mapCompactResponse(response, request, owned) {
|
|
69
|
+
switch (response?.constructor?.name) {
|
|
70
|
+
case "String": return new Response(response, textHeaders);
|
|
78
71
|
case "Array": return Response.json(response);
|
|
79
72
|
case "Object":
|
|
80
73
|
if (response["~ely-form"]) return new Response(require_utils.formToFormData(response));
|
|
@@ -87,22 +80,22 @@ function mapCompactResponse(response, request) {
|
|
|
87
80
|
case "ElysiaStatus": return mapResponse(response.response, {
|
|
88
81
|
status: response.code,
|
|
89
82
|
headers: response.headers ? Object.assign(require_utils.nullObject(), response.headers) : require_utils.nullObject()
|
|
90
|
-
});
|
|
83
|
+
}, request, owned);
|
|
91
84
|
case void 0: return response ? Response.json(response) : new Response("");
|
|
92
|
-
case "Response": return response;
|
|
93
|
-
case "Error": return errorToResponse(response);
|
|
94
|
-
case "Promise": return response.then((x) => mapCompactResponse(x, request));
|
|
95
|
-
case "Function": return mapCompactResponse(response(), request);
|
|
85
|
+
case "Response": return owned ? handleResponse(response, void 0, request, true) : response;
|
|
86
|
+
case "Error": return errorToResponse(response, void 0, request, owned);
|
|
87
|
+
case "Promise": return response.then((x) => mapCompactResponse(x, request, owned));
|
|
88
|
+
case "Function": return mapCompactResponse(response(), request, owned);
|
|
96
89
|
case "FormData": return new Response(response);
|
|
97
|
-
default: return mapCompactResponseFallback(response, void 0, request);
|
|
90
|
+
default: return mapCompactResponseFallback(response, void 0, request, owned);
|
|
98
91
|
}
|
|
99
92
|
}
|
|
100
|
-
function errorToResponse(error, set) {
|
|
93
|
+
function errorToResponse(error, set, request, owned = false) {
|
|
101
94
|
if (error?.toResponse) {
|
|
102
95
|
const targetSet = set ?? { headers: require_utils.nullObject() };
|
|
103
96
|
const apply = (resolved) => {
|
|
104
97
|
if (resolved instanceof Response) targetSet.status = resolved.status;
|
|
105
|
-
return mapResponse(resolved, targetSet);
|
|
98
|
+
return mapResponse(resolved, targetSet, request, owned);
|
|
106
99
|
};
|
|
107
100
|
const raw = error.toResponse();
|
|
108
101
|
return typeof raw?.then === "function" ? raw.then(apply) : apply(raw);
|
|
@@ -117,32 +110,32 @@ function errorToResponse(error, set) {
|
|
|
117
110
|
headers
|
|
118
111
|
});
|
|
119
112
|
}
|
|
120
|
-
function mapFallback(map
|
|
121
|
-
return (response, set, request) => {
|
|
122
|
-
if (response instanceof Response) return handleResponse(response, set, request);
|
|
123
|
-
if (response instanceof Promise) return response.then((x) => map(x, set, request));
|
|
124
|
-
if (response instanceof Error) return errorToResponse(response, set);
|
|
113
|
+
function mapFallback(map) {
|
|
114
|
+
return (response, set, request, owned = false) => {
|
|
115
|
+
if (response instanceof Response) return handleResponse(response, set, request, owned);
|
|
116
|
+
if (response instanceof Promise) return response.then((x) => map(x, set, request, owned));
|
|
117
|
+
if (response instanceof Error) return errorToResponse(response, set, request, owned);
|
|
125
118
|
if (response instanceof require_error.ElysiaStatus) if (set) {
|
|
126
119
|
set.status = response.code;
|
|
127
120
|
if (response.headers) set.headers = {
|
|
128
121
|
...set.headers,
|
|
129
122
|
...response.headers
|
|
130
123
|
};
|
|
131
|
-
return map(response.response, set, request);
|
|
124
|
+
return map(response.response, set, request, owned);
|
|
132
125
|
} else return mapResponse(response.response, {
|
|
133
126
|
status: response.code,
|
|
134
127
|
headers: response.headers ? { ...response.headers } : {}
|
|
135
|
-
});
|
|
136
|
-
if (typeof response?.next === "function" || response instanceof ReadableStream) return handleStream(response, set, request);
|
|
137
|
-
if (typeof response?.then === "function") return response.then((x) => map(x, set, request));
|
|
128
|
+
}, request, owned);
|
|
129
|
+
if (typeof response?.next === "function" || response instanceof ReadableStream) return handleStream(response, set, request, void 0, owned);
|
|
130
|
+
if (typeof response?.then === "function") return response.then((x) => map(x, set, request, owned));
|
|
138
131
|
if (Array.isArray(response)) return Response.json(response);
|
|
139
|
-
if (typeof response?.toResponse === "function") return map(response.toResponse(), set, request);
|
|
132
|
+
if (typeof response?.toResponse === "function") return map(response.toResponse(), set, request, owned);
|
|
140
133
|
if (response?.constructor?.name === "Cookie" && response.jar) return new Response(response.value, set);
|
|
141
|
-
|
|
134
|
+
return new Response(response, set);
|
|
142
135
|
};
|
|
143
136
|
}
|
|
144
137
|
const mapResponseFallback = mapFallback(mapResponse);
|
|
145
|
-
const mapCompactResponseFallback = mapFallback((response, _, request) => mapCompactResponse(response, request));
|
|
138
|
+
const mapCompactResponseFallback = mapFallback((response, _, request, owned) => mapCompactResponse(response, request, owned));
|
|
146
139
|
const handleResponse = require_adapter_utils.createResponseHandler({
|
|
147
140
|
mapResponse,
|
|
148
141
|
mapCompactResponse
|