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.
@@ -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((x) => x instanceof Response ? x.clone() : x) : handle,
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.headers.has("content-type") || response2.headers.append("content-type", "text/plain"), response2.clone();
35
- }) : (response.headers.has("content-type") || response.headers.append("content-type", "text/plain"), () => response.clone());
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((x) => x instanceof Response ? x.clone() : x) : handle,
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.headers.has("content-type") || response2.headers.append("content-type", "text/plain"), response2.clone();
16
- }) : (response.headers.has("content-type") || response.headers.append("content-type", "text/plain"), () => response.clone());
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,
@@ -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("..").HTTPHeaders;
6
+ headers: import("../types").HTTPHeaders;
7
7
  status?: number | keyof StatusMap;
8
8
  redirect?: string;
9
9
  cookie?: Record<string, import("../cookies").ElysiaCookie>;
@@ -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'), import_universal = require('../universal/index.js'), import_utils2 = require('../universal/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, immutable = set && (set.status === 206 || set.status === 304 || set.status === 412 || set.status === 416), defaultHeader = immutable ? {} : {
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
- }, allowRapidStream = import_universal.env.ELYSIA_RAPID_STREAM === "true", createStreamHandler = ({ mapResponse, mapCompactResponse }) => async (generator, set, request, skipFormat) => {
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 isBrowser = request?.headers.has("Origin");
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
- async start(controller) {
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 !== void 0 && init.value !== null)
127
- if (init.value.toSSE)
128
- controller.enqueue(init.value.toSSE());
129
- else if (typeof init.value == "object")
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
- for await (const chunk of generator) {
143
- if (end) break;
144
- if (chunk != null)
145
- if (chunk.toSSE)
146
- controller.enqueue(chunk.toSSE());
147
- else {
148
- if (typeof chunk == "object")
149
- try {
150
- controller.enqueue(
151
- format(JSON.stringify(chunk))
152
- );
153
- } catch {
154
- controller.enqueue(
155
- format(chunk.toString())
156
- );
157
- }
158
- else
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
- try {
169
- controller.close();
170
- } catch {
171
- }
222
+ },
223
+ cancel() {
224
+ end = !0, iterator.return?.();
172
225
  }
173
226
  }),
174
227
  set
@@ -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, immutable = set && (set.status === 206 || set.status === 304 || set.status === 412 || set.status === 416), defaultHeader = immutable ? {} : {
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
- }, allowRapidStream = env.ELYSIA_RAPID_STREAM === "true", createStreamHandler = ({ mapResponse, mapCompactResponse }) => async (generator, set, request, skipFormat) => {
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 isBrowser = request?.headers.has("Origin");
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
- async start(controller) {
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 !== void 0 && init.value !== null)
101
- if (init.value.toSSE)
102
- controller.enqueue(init.value.toSSE());
103
- else if (typeof init.value == "object")
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
- for await (const chunk of generator) {
117
- if (end) break;
118
- if (chunk != null)
119
- if (chunk.toSSE)
120
- controller.enqueue(chunk.toSSE());
121
- else {
122
- if (typeof chunk == "object")
123
- try {
124
- controller.enqueue(
125
- format(JSON.stringify(chunk))
126
- );
127
- } catch {
128
- controller.enqueue(
129
- format(chunk.toString())
130
- );
131
- }
132
- else
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
- try {
143
- controller.close();
144
- } catch {
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,