elysia 1.4.27 → 1.4.28
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/bun/handler-native.js +5 -3
- package/dist/adapter/bun/handler-native.mjs +5 -3
- package/dist/adapter/bun/handler.js +12 -12
- package/dist/adapter/bun/handler.mjs +12 -12
- package/dist/adapter/bun/index.js +1 -1
- package/dist/adapter/bun/index.mjs +1 -1
- package/dist/adapter/utils.d.ts +2 -2
- package/dist/adapter/utils.js +94 -41
- package/dist/adapter/utils.mjs +93 -41
- package/dist/adapter/web-standard/handler.js +21 -21
- package/dist/adapter/web-standard/handler.mjs +21 -21
- package/dist/compose.js +7 -7
- package/dist/compose.mjs +7 -7
- package/dist/context.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +54 -2
- package/dist/index.mjs +54 -2
- package/dist/type-system/types.d.ts +30 -3
- package/package.json +1 -2
- package/dist/bun/index.js +0 -411
- package/dist/bun/index.js.map +0 -38
|
@@ -23,7 +23,9 @@ const createNativeStaticHandler = (handle, hooks, set) => {
|
|
|
23
23
|
if (typeof handle == "function" || handle instanceof Blob) return;
|
|
24
24
|
if ((0, import_index.isHTMLBundle)(handle)) return () => handle;
|
|
25
25
|
const response = (0, import_handler.mapResponse)(
|
|
26
|
-
handle instanceof Response ? handle.clone() : handle instanceof Promise ? handle.then(
|
|
26
|
+
handle instanceof Response ? handle.clone() : handle instanceof Promise ? handle.then(
|
|
27
|
+
(x) => x instanceof Response ? x.clone() : (0, import_index.isHTMLBundle)(x) ? () => x : x
|
|
28
|
+
) : handle,
|
|
27
29
|
set ?? {
|
|
28
30
|
headers: {}
|
|
29
31
|
}
|
|
@@ -31,8 +33,8 @@ const createNativeStaticHandler = (handle, hooks, set) => {
|
|
|
31
33
|
if (!hooks.parse?.length && !hooks.transform?.length && !hooks.beforeHandle?.length && !hooks.afterHandle?.length)
|
|
32
34
|
return response instanceof Promise ? response.then((response2) => {
|
|
33
35
|
if (response2)
|
|
34
|
-
return response2.
|
|
35
|
-
}) : (
|
|
36
|
+
return response2.clone();
|
|
37
|
+
}) : () => response.clone();
|
|
36
38
|
};
|
|
37
39
|
// Annotate the CommonJS export names for ESM import in node:
|
|
38
40
|
0 && (module.exports = {
|
|
@@ -4,7 +4,9 @@ const createNativeStaticHandler = (handle, hooks, set) => {
|
|
|
4
4
|
if (typeof handle == "function" || handle instanceof Blob) return;
|
|
5
5
|
if (isHTMLBundle(handle)) return () => handle;
|
|
6
6
|
const response = mapResponse(
|
|
7
|
-
handle instanceof Response ? handle.clone() : handle instanceof Promise ? handle.then(
|
|
7
|
+
handle instanceof Response ? handle.clone() : handle instanceof Promise ? handle.then(
|
|
8
|
+
(x) => x instanceof Response ? x.clone() : isHTMLBundle(x) ? () => x : x
|
|
9
|
+
) : handle,
|
|
8
10
|
set ?? {
|
|
9
11
|
headers: {}
|
|
10
12
|
}
|
|
@@ -12,8 +14,8 @@ const createNativeStaticHandler = (handle, hooks, set) => {
|
|
|
12
14
|
if (!hooks.parse?.length && !hooks.transform?.length && !hooks.beforeHandle?.length && !hooks.afterHandle?.length)
|
|
13
15
|
return response instanceof Promise ? response.then((response2) => {
|
|
14
16
|
if (response2)
|
|
15
|
-
return response2.
|
|
16
|
-
}) : (
|
|
17
|
+
return response2.clone();
|
|
18
|
+
}) : () => response.clone();
|
|
17
19
|
};
|
|
18
20
|
export {
|
|
19
21
|
createNativeStaticHandler
|
|
@@ -32,11 +32,11 @@ const mapResponse = (response, set, request) => {
|
|
|
32
32
|
case "Object":
|
|
33
33
|
return Response.json(response, set);
|
|
34
34
|
case "ElysiaFile":
|
|
35
|
-
return (0, import_utils.handleFile)(response.value, set);
|
|
35
|
+
return (0, import_utils.handleFile)(response.value, set, request);
|
|
36
36
|
case "File":
|
|
37
|
-
return (0, import_utils.handleFile)(response, set);
|
|
37
|
+
return (0, import_utils.handleFile)(response, set, request);
|
|
38
38
|
case "Blob":
|
|
39
|
-
return (0, import_utils.handleFile)(response, set);
|
|
39
|
+
return (0, import_utils.handleFile)(response, set, request);
|
|
40
40
|
case "ElysiaCustomStatusResponse":
|
|
41
41
|
return set.status = response.code, mapResponse(
|
|
42
42
|
response.response,
|
|
@@ -112,11 +112,11 @@ const mapResponse = (response, set, request) => {
|
|
|
112
112
|
case "Object":
|
|
113
113
|
return Response.json(response, set);
|
|
114
114
|
case "ElysiaFile":
|
|
115
|
-
return (0, import_utils.handleFile)(response.value, set);
|
|
115
|
+
return (0, import_utils.handleFile)(response.value, set, request);
|
|
116
116
|
case "File":
|
|
117
|
-
return (0, import_utils.handleFile)(response, set);
|
|
117
|
+
return (0, import_utils.handleFile)(response, set, request);
|
|
118
118
|
case "Blob":
|
|
119
|
-
return (0, import_utils.handleFile)(response, set);
|
|
119
|
+
return (0, import_utils.handleFile)(response, set, request);
|
|
120
120
|
case "ElysiaCustomStatusResponse":
|
|
121
121
|
return set.status = response.code, mapEarlyResponse(
|
|
122
122
|
response.response,
|
|
@@ -186,11 +186,11 @@ const mapResponse = (response, set, request) => {
|
|
|
186
186
|
case "Object":
|
|
187
187
|
return Response.json(response, set);
|
|
188
188
|
case "ElysiaFile":
|
|
189
|
-
return (0, import_utils.handleFile)(response.value, set);
|
|
189
|
+
return (0, import_utils.handleFile)(response.value, set, request);
|
|
190
190
|
case "File":
|
|
191
|
-
return (0, import_utils.handleFile)(response, set);
|
|
191
|
+
return (0, import_utils.handleFile)(response, set, request);
|
|
192
192
|
case "Blob":
|
|
193
|
-
return (0, import_utils.handleFile)(response, set);
|
|
193
|
+
return (0, import_utils.handleFile)(response, set, request);
|
|
194
194
|
case "ElysiaCustomStatusResponse":
|
|
195
195
|
return set.status = response.code, mapEarlyResponse(
|
|
196
196
|
response.response,
|
|
@@ -257,11 +257,11 @@ const mapResponse = (response, set, request) => {
|
|
|
257
257
|
case "Array":
|
|
258
258
|
return Response.json(response);
|
|
259
259
|
case "ElysiaFile":
|
|
260
|
-
return (0, import_utils.handleFile)(response.value);
|
|
260
|
+
return (0, import_utils.handleFile)(response.value, void 0, request);
|
|
261
261
|
case "File":
|
|
262
|
-
return (0, import_utils.handleFile)(response);
|
|
262
|
+
return (0, import_utils.handleFile)(response, void 0, request);
|
|
263
263
|
case "Blob":
|
|
264
|
-
return (0, import_utils.handleFile)(response);
|
|
264
|
+
return (0, import_utils.handleFile)(response, void 0, request);
|
|
265
265
|
case "ElysiaCustomStatusResponse":
|
|
266
266
|
return mapResponse(
|
|
267
267
|
response.response,
|
|
@@ -16,11 +16,11 @@ const mapResponse = (response, set, request) => {
|
|
|
16
16
|
case "Object":
|
|
17
17
|
return Response.json(response, set);
|
|
18
18
|
case "ElysiaFile":
|
|
19
|
-
return handleFile(response.value, set);
|
|
19
|
+
return handleFile(response.value, set, request);
|
|
20
20
|
case "File":
|
|
21
|
-
return handleFile(response, set);
|
|
21
|
+
return handleFile(response, set, request);
|
|
22
22
|
case "Blob":
|
|
23
|
-
return handleFile(response, set);
|
|
23
|
+
return handleFile(response, set, request);
|
|
24
24
|
case "ElysiaCustomStatusResponse":
|
|
25
25
|
return set.status = response.code, mapResponse(
|
|
26
26
|
response.response,
|
|
@@ -96,11 +96,11 @@ const mapResponse = (response, set, request) => {
|
|
|
96
96
|
case "Object":
|
|
97
97
|
return Response.json(response, set);
|
|
98
98
|
case "ElysiaFile":
|
|
99
|
-
return handleFile(response.value, set);
|
|
99
|
+
return handleFile(response.value, set, request);
|
|
100
100
|
case "File":
|
|
101
|
-
return handleFile(response, set);
|
|
101
|
+
return handleFile(response, set, request);
|
|
102
102
|
case "Blob":
|
|
103
|
-
return handleFile(response, set);
|
|
103
|
+
return handleFile(response, set, request);
|
|
104
104
|
case "ElysiaCustomStatusResponse":
|
|
105
105
|
return set.status = response.code, mapEarlyResponse(
|
|
106
106
|
response.response,
|
|
@@ -170,11 +170,11 @@ const mapResponse = (response, set, request) => {
|
|
|
170
170
|
case "Object":
|
|
171
171
|
return Response.json(response, set);
|
|
172
172
|
case "ElysiaFile":
|
|
173
|
-
return handleFile(response.value, set);
|
|
173
|
+
return handleFile(response.value, set, request);
|
|
174
174
|
case "File":
|
|
175
|
-
return handleFile(response, set);
|
|
175
|
+
return handleFile(response, set, request);
|
|
176
176
|
case "Blob":
|
|
177
|
-
return handleFile(response, set);
|
|
177
|
+
return handleFile(response, set, request);
|
|
178
178
|
case "ElysiaCustomStatusResponse":
|
|
179
179
|
return set.status = response.code, mapEarlyResponse(
|
|
180
180
|
response.response,
|
|
@@ -241,11 +241,11 @@ const mapResponse = (response, set, request) => {
|
|
|
241
241
|
case "Array":
|
|
242
242
|
return Response.json(response);
|
|
243
243
|
case "ElysiaFile":
|
|
244
|
-
return handleFile(response.value);
|
|
244
|
+
return handleFile(response.value, void 0, request);
|
|
245
245
|
case "File":
|
|
246
|
-
return handleFile(response);
|
|
246
|
+
return handleFile(response, void 0, request);
|
|
247
247
|
case "Blob":
|
|
248
|
-
return handleFile(response);
|
|
248
|
+
return handleFile(response, void 0, request);
|
|
249
249
|
case "ElysiaCustomStatusResponse":
|
|
250
250
|
return mapResponse(
|
|
251
251
|
response.response,
|
|
@@ -91,7 +91,7 @@ const optionalParam = /:.+?\?(?=\/|$)/, getPossibleParams = (path) => {
|
|
|
91
91
|
return r1;
|
|
92
92
|
}, removeTrailingPath = (routes) => {
|
|
93
93
|
for (const key of Object.keys(routes))
|
|
94
|
-
key.charCodeAt(key.length - 1) === 47 && (routes[key.slice(0, -1)] = routes[key], delete routes[key]);
|
|
94
|
+
key.length > 1 && key.charCodeAt(key.length - 1) === 47 && (routes[key.slice(0, -1)] = routes[key], delete routes[key]);
|
|
95
95
|
return routes;
|
|
96
96
|
}, BunAdapter = {
|
|
97
97
|
...import_web_standard.WebStandardAdapter,
|
|
@@ -94,7 +94,7 @@ const optionalParam = /:.+?\?(?=\/|$)/, getPossibleParams = (path) => {
|
|
|
94
94
|
return r1;
|
|
95
95
|
}, removeTrailingPath = (routes) => {
|
|
96
96
|
for (const key of Object.keys(routes))
|
|
97
|
-
key.charCodeAt(key.length - 1) === 47 && (routes[key.slice(0, -1)] = routes[key], delete routes[key]);
|
|
97
|
+
key.length > 1 && key.charCodeAt(key.length - 1) === 47 && (routes[key.slice(0, -1)] = routes[key], delete routes[key]);
|
|
98
98
|
return routes;
|
|
99
99
|
}, BunAdapter = {
|
|
100
100
|
...WebStandardAdapter,
|
package/dist/adapter/utils.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { StatusMap } from '../utils';
|
|
2
2
|
import type { Context } from '../context';
|
|
3
|
-
export declare const handleFile: (response: File | Blob, set?: Context["set"]) => Response;
|
|
3
|
+
export declare const handleFile: (response: File | Blob, set?: Context["set"], request?: Request) => Response;
|
|
4
4
|
export declare const parseSetCookies: (headers: Headers, setCookie: string[]) => Headers;
|
|
5
5
|
export declare const responseToSetHeaders: (response: Response, set?: Context["set"]) => {
|
|
6
|
-
headers: import("
|
|
6
|
+
headers: import("../types").HTTPHeaders;
|
|
7
7
|
status?: number | keyof StatusMap;
|
|
8
8
|
redirect?: string;
|
|
9
9
|
cookie?: Record<string, import("../cookies").ElysiaCookie>;
|
package/dist/adapter/utils.js
CHANGED
|
@@ -27,11 +27,51 @@ __export(utils_exports, {
|
|
|
27
27
|
tee: () => tee
|
|
28
28
|
});
|
|
29
29
|
module.exports = __toCommonJS(utils_exports);
|
|
30
|
-
var import_cookies = require('../cookies.js'), import_utils = require('../utils.js'),
|
|
31
|
-
const handleFile = (response, set) => {
|
|
30
|
+
var import_cookies = require('../cookies.js'), import_utils = require('../utils.js'), import_utils2 = require('../universal/utils.js');
|
|
31
|
+
const handleFile = (response, set, request) => {
|
|
32
32
|
if (!import_utils2.isBun && response instanceof Promise)
|
|
33
|
-
return response.then((res) => handleFile(res, set));
|
|
34
|
-
const size = response.size,
|
|
33
|
+
return response.then((res) => handleFile(res, set, request));
|
|
34
|
+
const size = response.size, rangeHeader = request?.headers.get("range");
|
|
35
|
+
if (rangeHeader) {
|
|
36
|
+
const match = /bytes=(\d*)-(\d*)/.exec(rangeHeader);
|
|
37
|
+
if (match) {
|
|
38
|
+
if (!match[1] && !match[2])
|
|
39
|
+
return new Response(null, {
|
|
40
|
+
status: 416,
|
|
41
|
+
headers: mergeHeaders(
|
|
42
|
+
new Headers({ "content-range": `bytes */${size}` }),
|
|
43
|
+
set?.headers ?? {}
|
|
44
|
+
)
|
|
45
|
+
});
|
|
46
|
+
let start, end;
|
|
47
|
+
if (!match[1] && match[2]) {
|
|
48
|
+
const suffix = parseInt(match[2]);
|
|
49
|
+
start = Math.max(0, size - suffix), end = size - 1;
|
|
50
|
+
} else
|
|
51
|
+
start = match[1] ? parseInt(match[1]) : 0, end = match[2] ? Math.min(parseInt(match[2]), size - 1) : size - 1;
|
|
52
|
+
if (start >= size || start > end)
|
|
53
|
+
return new Response(null, {
|
|
54
|
+
status: 416,
|
|
55
|
+
headers: mergeHeaders(
|
|
56
|
+
new Headers({ "content-range": `bytes */${size}` }),
|
|
57
|
+
set?.headers ?? {}
|
|
58
|
+
)
|
|
59
|
+
});
|
|
60
|
+
const contentLength = end - start + 1, rangeHeaders = new Headers({
|
|
61
|
+
"accept-ranges": "bytes",
|
|
62
|
+
"content-range": `bytes ${start}-${end}/${size}`,
|
|
63
|
+
"content-length": String(contentLength)
|
|
64
|
+
});
|
|
65
|
+
return new Response(
|
|
66
|
+
response.slice(start, end + 1, response.type),
|
|
67
|
+
{
|
|
68
|
+
status: 206,
|
|
69
|
+
headers: mergeHeaders(rangeHeaders, set?.headers ?? {})
|
|
70
|
+
}
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const immutable = set && (set.status === 206 || set.status === 304 || set.status === 412 || set.status === 416), defaultHeader = immutable ? {} : {
|
|
35
75
|
"accept-ranges": "bytes",
|
|
36
76
|
"content-range": size ? `bytes 0-${size - 1}/${size}` : void 0
|
|
37
77
|
};
|
|
@@ -90,7 +130,9 @@ const handleFile = (response, set) => {
|
|
|
90
130
|
for (const [key, value] of response.headers.entries())
|
|
91
131
|
key !== "content-encoding" && key in set.headers && (set.headers[key] = value);
|
|
92
132
|
return set;
|
|
93
|
-
},
|
|
133
|
+
}, enqueueBinaryChunk = (controller, chunk) => chunk instanceof Blob ? chunk.arrayBuffer().then((buffer) => (controller.enqueue(new Uint8Array(buffer)), !0)) : chunk instanceof Uint8Array ? (controller.enqueue(chunk), !0) : chunk instanceof ArrayBuffer ? (controller.enqueue(new Uint8Array(chunk)), !0) : ArrayBuffer.isView(chunk) ? (controller.enqueue(
|
|
134
|
+
new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength)
|
|
135
|
+
), !0) : !1, createStreamHandler = ({ mapResponse, mapCompactResponse }) => async (generator, set, request, skipFormat) => {
|
|
94
136
|
let init = generator.next?.();
|
|
95
137
|
if (set && handleSet(set), init instanceof Promise && (init = await init), init?.value instanceof ReadableStream)
|
|
96
138
|
generator = init.value;
|
|
@@ -111,64 +153,75 @@ const handleFile = (response, set) => {
|
|
|
111
153
|
connection: "keep-alive"
|
|
112
154
|
}
|
|
113
155
|
};
|
|
114
|
-
const
|
|
156
|
+
const iterator = typeof generator.next == "function" ? generator : generator[Symbol.asyncIterator]();
|
|
157
|
+
let end = !1;
|
|
115
158
|
return new Response(
|
|
116
159
|
new ReadableStream({
|
|
117
|
-
|
|
118
|
-
let end = !1;
|
|
160
|
+
start(controller) {
|
|
119
161
|
if (request?.signal?.addEventListener("abort", () => {
|
|
120
|
-
end = !0;
|
|
162
|
+
end = !0, iterator.return?.();
|
|
121
163
|
try {
|
|
122
164
|
controller.close();
|
|
123
165
|
} catch {
|
|
124
166
|
}
|
|
125
|
-
}), !(!init || init.value instanceof ReadableStream))
|
|
126
|
-
if (init.value
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
167
|
+
}), !(!init || init.value instanceof ReadableStream || init.value === void 0 || init.value === null))
|
|
168
|
+
if (init.value.toSSE)
|
|
169
|
+
controller.enqueue(init.value.toSSE());
|
|
170
|
+
else {
|
|
171
|
+
if (enqueueBinaryChunk(controller, init.value)) return;
|
|
172
|
+
if (typeof init.value == "object")
|
|
130
173
|
try {
|
|
131
174
|
controller.enqueue(
|
|
132
175
|
format(JSON.stringify(init.value))
|
|
133
176
|
);
|
|
134
177
|
} catch {
|
|
135
|
-
controller.enqueue(
|
|
136
|
-
format(init.value.toString())
|
|
137
|
-
);
|
|
178
|
+
controller.enqueue(format(init.value.toString()));
|
|
138
179
|
}
|
|
139
180
|
else controller.enqueue(format(init.value.toString()));
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
async pull(controller) {
|
|
184
|
+
if (end) {
|
|
185
|
+
try {
|
|
186
|
+
controller.close();
|
|
187
|
+
} catch {
|
|
188
|
+
}
|
|
189
|
+
return;
|
|
140
190
|
}
|
|
141
191
|
try {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
controller.enqueue(format(chunk.toString()));
|
|
160
|
-
!allowRapidStream && isBrowser && !isSSE && await new Promise(
|
|
161
|
-
(resolve) => setTimeout(() => resolve(), 0)
|
|
192
|
+
const { value: chunk, done } = await iterator.next();
|
|
193
|
+
if (done || end) {
|
|
194
|
+
try {
|
|
195
|
+
controller.close();
|
|
196
|
+
} catch {
|
|
197
|
+
}
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (chunk == null) return;
|
|
201
|
+
if (chunk.toSSE)
|
|
202
|
+
controller.enqueue(chunk.toSSE());
|
|
203
|
+
else {
|
|
204
|
+
if (enqueueBinaryChunk(controller, chunk)) return;
|
|
205
|
+
if (typeof chunk == "object")
|
|
206
|
+
try {
|
|
207
|
+
controller.enqueue(
|
|
208
|
+
format(JSON.stringify(chunk))
|
|
162
209
|
);
|
|
210
|
+
} catch {
|
|
211
|
+
controller.enqueue(format(chunk.toString()));
|
|
163
212
|
}
|
|
213
|
+
else controller.enqueue(format(chunk.toString()));
|
|
164
214
|
}
|
|
165
215
|
} catch (error) {
|
|
166
216
|
console.warn(error);
|
|
217
|
+
try {
|
|
218
|
+
controller.close();
|
|
219
|
+
} catch {
|
|
220
|
+
}
|
|
167
221
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
}
|
|
222
|
+
},
|
|
223
|
+
cancel() {
|
|
224
|
+
end = !0, iterator.return?.();
|
|
172
225
|
}
|
|
173
226
|
}),
|
|
174
227
|
set
|
package/dist/adapter/utils.mjs
CHANGED
|
@@ -1,11 +1,50 @@
|
|
|
1
1
|
import { serializeCookie } from "../cookies.mjs";
|
|
2
2
|
import { hasHeaderShorthand, isNotEmpty, StatusMap } from "../utils.mjs";
|
|
3
|
-
import { env } from "../universal/index.mjs";
|
|
4
3
|
import { isBun } from "../universal/utils.mjs";
|
|
5
|
-
const handleFile = (response, set) => {
|
|
4
|
+
const handleFile = (response, set, request) => {
|
|
6
5
|
if (!isBun && response instanceof Promise)
|
|
7
|
-
return response.then((res) => handleFile(res, set));
|
|
8
|
-
const size = response.size,
|
|
6
|
+
return response.then((res) => handleFile(res, set, request));
|
|
7
|
+
const size = response.size, rangeHeader = request?.headers.get("range");
|
|
8
|
+
if (rangeHeader) {
|
|
9
|
+
const match = /bytes=(\d*)-(\d*)/.exec(rangeHeader);
|
|
10
|
+
if (match) {
|
|
11
|
+
if (!match[1] && !match[2])
|
|
12
|
+
return new Response(null, {
|
|
13
|
+
status: 416,
|
|
14
|
+
headers: mergeHeaders(
|
|
15
|
+
new Headers({ "content-range": `bytes */${size}` }),
|
|
16
|
+
set?.headers ?? {}
|
|
17
|
+
)
|
|
18
|
+
});
|
|
19
|
+
let start, end;
|
|
20
|
+
if (!match[1] && match[2]) {
|
|
21
|
+
const suffix = parseInt(match[2]);
|
|
22
|
+
start = Math.max(0, size - suffix), end = size - 1;
|
|
23
|
+
} else
|
|
24
|
+
start = match[1] ? parseInt(match[1]) : 0, end = match[2] ? Math.min(parseInt(match[2]), size - 1) : size - 1;
|
|
25
|
+
if (start >= size || start > end)
|
|
26
|
+
return new Response(null, {
|
|
27
|
+
status: 416,
|
|
28
|
+
headers: mergeHeaders(
|
|
29
|
+
new Headers({ "content-range": `bytes */${size}` }),
|
|
30
|
+
set?.headers ?? {}
|
|
31
|
+
)
|
|
32
|
+
});
|
|
33
|
+
const contentLength = end - start + 1, rangeHeaders = new Headers({
|
|
34
|
+
"accept-ranges": "bytes",
|
|
35
|
+
"content-range": `bytes ${start}-${end}/${size}`,
|
|
36
|
+
"content-length": String(contentLength)
|
|
37
|
+
});
|
|
38
|
+
return new Response(
|
|
39
|
+
response.slice(start, end + 1, response.type),
|
|
40
|
+
{
|
|
41
|
+
status: 206,
|
|
42
|
+
headers: mergeHeaders(rangeHeaders, set?.headers ?? {})
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const immutable = set && (set.status === 206 || set.status === 304 || set.status === 412 || set.status === 416), defaultHeader = immutable ? {} : {
|
|
9
48
|
"accept-ranges": "bytes",
|
|
10
49
|
"content-range": size ? `bytes 0-${size - 1}/${size}` : void 0
|
|
11
50
|
};
|
|
@@ -64,7 +103,9 @@ const handleFile = (response, set) => {
|
|
|
64
103
|
for (const [key, value] of response.headers.entries())
|
|
65
104
|
key !== "content-encoding" && key in set.headers && (set.headers[key] = value);
|
|
66
105
|
return set;
|
|
67
|
-
},
|
|
106
|
+
}, enqueueBinaryChunk = (controller, chunk) => chunk instanceof Blob ? chunk.arrayBuffer().then((buffer) => (controller.enqueue(new Uint8Array(buffer)), !0)) : chunk instanceof Uint8Array ? (controller.enqueue(chunk), !0) : chunk instanceof ArrayBuffer ? (controller.enqueue(new Uint8Array(chunk)), !0) : ArrayBuffer.isView(chunk) ? (controller.enqueue(
|
|
107
|
+
new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength)
|
|
108
|
+
), !0) : !1, createStreamHandler = ({ mapResponse, mapCompactResponse }) => async (generator, set, request, skipFormat) => {
|
|
68
109
|
let init = generator.next?.();
|
|
69
110
|
if (set && handleSet(set), init instanceof Promise && (init = await init), init?.value instanceof ReadableStream)
|
|
70
111
|
generator = init.value;
|
|
@@ -85,64 +126,75 @@ const handleFile = (response, set) => {
|
|
|
85
126
|
connection: "keep-alive"
|
|
86
127
|
}
|
|
87
128
|
};
|
|
88
|
-
const
|
|
129
|
+
const iterator = typeof generator.next == "function" ? generator : generator[Symbol.asyncIterator]();
|
|
130
|
+
let end = !1;
|
|
89
131
|
return new Response(
|
|
90
132
|
new ReadableStream({
|
|
91
|
-
|
|
92
|
-
let end = !1;
|
|
133
|
+
start(controller) {
|
|
93
134
|
if (request?.signal?.addEventListener("abort", () => {
|
|
94
|
-
end = !0;
|
|
135
|
+
end = !0, iterator.return?.();
|
|
95
136
|
try {
|
|
96
137
|
controller.close();
|
|
97
138
|
} catch {
|
|
98
139
|
}
|
|
99
|
-
}), !(!init || init.value instanceof ReadableStream))
|
|
100
|
-
if (init.value
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
140
|
+
}), !(!init || init.value instanceof ReadableStream || init.value === void 0 || init.value === null))
|
|
141
|
+
if (init.value.toSSE)
|
|
142
|
+
controller.enqueue(init.value.toSSE());
|
|
143
|
+
else {
|
|
144
|
+
if (enqueueBinaryChunk(controller, init.value)) return;
|
|
145
|
+
if (typeof init.value == "object")
|
|
104
146
|
try {
|
|
105
147
|
controller.enqueue(
|
|
106
148
|
format(JSON.stringify(init.value))
|
|
107
149
|
);
|
|
108
150
|
} catch {
|
|
109
|
-
controller.enqueue(
|
|
110
|
-
format(init.value.toString())
|
|
111
|
-
);
|
|
151
|
+
controller.enqueue(format(init.value.toString()));
|
|
112
152
|
}
|
|
113
153
|
else controller.enqueue(format(init.value.toString()));
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
async pull(controller) {
|
|
157
|
+
if (end) {
|
|
158
|
+
try {
|
|
159
|
+
controller.close();
|
|
160
|
+
} catch {
|
|
161
|
+
}
|
|
162
|
+
return;
|
|
114
163
|
}
|
|
115
164
|
try {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
controller.enqueue(format(chunk.toString()));
|
|
134
|
-
!allowRapidStream && isBrowser && !isSSE && await new Promise(
|
|
135
|
-
(resolve) => setTimeout(() => resolve(), 0)
|
|
165
|
+
const { value: chunk, done } = await iterator.next();
|
|
166
|
+
if (done || end) {
|
|
167
|
+
try {
|
|
168
|
+
controller.close();
|
|
169
|
+
} catch {
|
|
170
|
+
}
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (chunk == null) return;
|
|
174
|
+
if (chunk.toSSE)
|
|
175
|
+
controller.enqueue(chunk.toSSE());
|
|
176
|
+
else {
|
|
177
|
+
if (enqueueBinaryChunk(controller, chunk)) return;
|
|
178
|
+
if (typeof chunk == "object")
|
|
179
|
+
try {
|
|
180
|
+
controller.enqueue(
|
|
181
|
+
format(JSON.stringify(chunk))
|
|
136
182
|
);
|
|
183
|
+
} catch {
|
|
184
|
+
controller.enqueue(format(chunk.toString()));
|
|
137
185
|
}
|
|
186
|
+
else controller.enqueue(format(chunk.toString()));
|
|
138
187
|
}
|
|
139
188
|
} catch (error) {
|
|
140
189
|
console.warn(error);
|
|
190
|
+
try {
|
|
191
|
+
controller.close();
|
|
192
|
+
} catch {
|
|
193
|
+
}
|
|
141
194
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
}
|
|
195
|
+
},
|
|
196
|
+
cancel() {
|
|
197
|
+
end = !0, iterator.return?.();
|
|
146
198
|
}
|
|
147
199
|
}),
|
|
148
200
|
set
|
|
@@ -25,26 +25,26 @@ module.exports = __toCommonJS(handler_exports);
|
|
|
25
25
|
var import_utils = require('../utils.js'), import_file = require('../../universal/file.js'), import_utils2 = require('../../utils.js'), import_cookies = require('../../cookies.js'), import_error = require('../../error.js');
|
|
26
26
|
const handleElysiaFile = (file, set = {
|
|
27
27
|
headers: {}
|
|
28
|
-
}) => {
|
|
28
|
+
}, request) => {
|
|
29
29
|
const path = file.path, contentType = import_file.mime[path.slice(path.lastIndexOf(".") + 1)];
|
|
30
30
|
return contentType && (set.headers["content-type"] = contentType), file.stats && set.status !== 206 && set.status !== 304 && set.status !== 412 && set.status !== 416 ? file.stats.then((stat) => {
|
|
31
31
|
const size = stat.size;
|
|
32
|
-
return size !== void 0 && (set.headers["content-range"] = `bytes 0-${size - 1}/${size}`, set.headers["content-length"] = size), (0, import_utils.handleFile)(file.value, set);
|
|
33
|
-
}) : (0, import_utils.handleFile)(file.value, set);
|
|
32
|
+
return size !== void 0 && (set.headers["content-range"] = `bytes 0-${size - 1}/${size}`, set.headers["content-length"] = size), (0, import_utils.handleFile)(file.value, set, request);
|
|
33
|
+
}) : (0, import_utils.handleFile)(file.value, set, request);
|
|
34
34
|
}, mapResponse = (response, set, request) => {
|
|
35
35
|
if ((0, import_utils2.isNotEmpty)(set.headers) || set.status !== 200 || set.cookie)
|
|
36
36
|
switch ((0, import_utils.handleSet)(set), response?.constructor?.name) {
|
|
37
37
|
case "String":
|
|
38
|
-
return set.headers["content-type"] = "text/plain", new Response(response, set);
|
|
38
|
+
return set.headers["content-type"] || (set.headers["content-type"] = "text/plain"), new Response(response, set);
|
|
39
39
|
case "Array":
|
|
40
40
|
case "Object":
|
|
41
|
-
return set.headers["content-type"] = "application/json", new Response(JSON.stringify(response), set);
|
|
41
|
+
return set.headers["content-type"] || (set.headers["content-type"] = "application/json"), new Response(JSON.stringify(response), set);
|
|
42
42
|
case "ElysiaFile":
|
|
43
|
-
return handleElysiaFile(response, set);
|
|
43
|
+
return handleElysiaFile(response, set, request);
|
|
44
44
|
case "File":
|
|
45
|
-
return (0, import_utils.handleFile)(response, set);
|
|
45
|
+
return (0, import_utils.handleFile)(response, set, request);
|
|
46
46
|
case "Blob":
|
|
47
|
-
return (0, import_utils.handleFile)(response, set);
|
|
47
|
+
return (0, import_utils.handleFile)(response, set, request);
|
|
48
48
|
case "ElysiaCustomStatusResponse":
|
|
49
49
|
return set.status = response.code, mapResponse(
|
|
50
50
|
response.response,
|
|
@@ -122,16 +122,16 @@ const handleElysiaFile = (file, set = {
|
|
|
122
122
|
if ((0, import_utils2.isNotEmpty)(set.headers) || set.status !== 200 || set.cookie)
|
|
123
123
|
switch ((0, import_utils.handleSet)(set), response?.constructor?.name) {
|
|
124
124
|
case "String":
|
|
125
|
-
return set.headers["content-type"] = "text/plain", new Response(response, set);
|
|
125
|
+
return set.headers["content-type"] || (set.headers["content-type"] = "text/plain"), new Response(response, set);
|
|
126
126
|
case "Array":
|
|
127
127
|
case "Object":
|
|
128
|
-
return set.headers["content-type"] = "application/json", new Response(JSON.stringify(response), set);
|
|
128
|
+
return set.headers["content-type"] || (set.headers["content-type"] = "application/json"), new Response(JSON.stringify(response), set);
|
|
129
129
|
case "ElysiaFile":
|
|
130
|
-
return handleElysiaFile(response, set);
|
|
130
|
+
return handleElysiaFile(response, set, request);
|
|
131
131
|
case "File":
|
|
132
|
-
return (0, import_utils.handleFile)(response, set);
|
|
132
|
+
return (0, import_utils.handleFile)(response, set, request);
|
|
133
133
|
case "Blob":
|
|
134
|
-
return (0, import_utils.handleFile)(response, set);
|
|
134
|
+
return (0, import_utils.handleFile)(response, set, request);
|
|
135
135
|
case "ElysiaCustomStatusResponse":
|
|
136
136
|
return set.status = response.code, mapEarlyResponse(
|
|
137
137
|
response.response,
|
|
@@ -203,16 +203,16 @@ const handleElysiaFile = (file, set = {
|
|
|
203
203
|
else
|
|
204
204
|
switch (response?.constructor?.name) {
|
|
205
205
|
case "String":
|
|
206
|
-
return set.headers["content-type"] = "text/plain", new Response(response);
|
|
206
|
+
return set.headers["content-type"] || (set.headers["content-type"] = "text/plain"), new Response(response);
|
|
207
207
|
case "Array":
|
|
208
208
|
case "Object":
|
|
209
|
-
return set.headers["content-type"] = "application/json", new Response(JSON.stringify(response), set);
|
|
209
|
+
return set.headers["content-type"] || (set.headers["content-type"] = "application/json"), new Response(JSON.stringify(response), set);
|
|
210
210
|
case "ElysiaFile":
|
|
211
|
-
return handleElysiaFile(response, set);
|
|
211
|
+
return handleElysiaFile(response, set, request);
|
|
212
212
|
case "File":
|
|
213
|
-
return (0, import_utils.handleFile)(response, set);
|
|
213
|
+
return (0, import_utils.handleFile)(response, set, request);
|
|
214
214
|
case "Blob":
|
|
215
|
-
return (0, import_utils.handleFile)(response, set);
|
|
215
|
+
return (0, import_utils.handleFile)(response, set, request);
|
|
216
216
|
case "ElysiaCustomStatusResponse":
|
|
217
217
|
return set.status = response.code, mapEarlyResponse(
|
|
218
218
|
response.response,
|
|
@@ -298,11 +298,11 @@ const handleElysiaFile = (file, set = {
|
|
|
298
298
|
}
|
|
299
299
|
});
|
|
300
300
|
case "ElysiaFile":
|
|
301
|
-
return handleElysiaFile(response);
|
|
301
|
+
return handleElysiaFile(response, void 0, request);
|
|
302
302
|
case "File":
|
|
303
|
-
return (0, import_utils.handleFile)(response);
|
|
303
|
+
return (0, import_utils.handleFile)(response, void 0, request);
|
|
304
304
|
case "Blob":
|
|
305
|
-
return (0, import_utils.handleFile)(response);
|
|
305
|
+
return (0, import_utils.handleFile)(response, void 0, request);
|
|
306
306
|
case "ElysiaCustomStatusResponse":
|
|
307
307
|
return mapResponse(
|
|
308
308
|
response.response,
|