@hono/node-server 1.17.0 → 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +62 -37
- package/dist/index.mjs +62 -37
- package/dist/listener.js +62 -37
- package/dist/listener.mjs +62 -37
- package/dist/serve-static.js +16 -19
- package/dist/serve-static.mjs +17 -20
- package/dist/server.js +62 -37
- package/dist/server.mjs +62 -37
- package/dist/utils.d.mts +3 -1
- package/dist/utils.d.ts +3 -1
- package/dist/utils.js +27 -21
- package/dist/utils.mjs +24 -20
- package/dist/vercel.js +62 -37
- package/dist/vercel.mjs +62 -37
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -291,30 +291,24 @@ Object.setPrototypeOf(Response2, GlobalResponse);
|
|
|
291
291
|
Object.setPrototypeOf(Response2.prototype, GlobalResponse.prototype);
|
|
292
292
|
|
|
293
293
|
// src/utils.ts
|
|
294
|
-
function
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
writable.on("close", cancel);
|
|
303
|
-
writable.on("error", cancel);
|
|
304
|
-
reader.read().then(flow, cancel);
|
|
294
|
+
async function readWithoutBlocking(readPromise) {
|
|
295
|
+
return Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]);
|
|
296
|
+
}
|
|
297
|
+
function writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) {
|
|
298
|
+
const handleError = () => {
|
|
299
|
+
};
|
|
300
|
+
writable.on("error", handleError);
|
|
301
|
+
(currentReadPromise ?? reader.read()).then(flow, handleStreamError);
|
|
305
302
|
return reader.closed.finally(() => {
|
|
306
|
-
writable.off("
|
|
307
|
-
writable.off("error", cancel);
|
|
303
|
+
writable.off("error", handleError);
|
|
308
304
|
});
|
|
309
|
-
function
|
|
310
|
-
reader.cancel(error).catch(() => {
|
|
311
|
-
});
|
|
305
|
+
function handleStreamError(error) {
|
|
312
306
|
if (error) {
|
|
313
307
|
writable.destroy(error);
|
|
314
308
|
}
|
|
315
309
|
}
|
|
316
310
|
function onDrain() {
|
|
317
|
-
reader.read().then(flow,
|
|
311
|
+
reader.read().then(flow, handleStreamError);
|
|
318
312
|
}
|
|
319
313
|
function flow({ done, value }) {
|
|
320
314
|
try {
|
|
@@ -323,13 +317,21 @@ function writeFromReadableStream(stream, writable) {
|
|
|
323
317
|
} else if (!writable.write(value)) {
|
|
324
318
|
writable.once("drain", onDrain);
|
|
325
319
|
} else {
|
|
326
|
-
return reader.read().then(flow,
|
|
320
|
+
return reader.read().then(flow, handleStreamError);
|
|
327
321
|
}
|
|
328
322
|
} catch (e) {
|
|
329
|
-
|
|
323
|
+
handleStreamError(e);
|
|
330
324
|
}
|
|
331
325
|
}
|
|
332
326
|
}
|
|
327
|
+
function writeFromReadableStream(stream, writable) {
|
|
328
|
+
if (stream.locked) {
|
|
329
|
+
throw new TypeError("ReadableStream is locked.");
|
|
330
|
+
} else if (writable.destroyed) {
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
return writeFromReadableStreamDefaultReader(stream.getReader(), writable);
|
|
334
|
+
}
|
|
333
335
|
var buildOutgoingHttpHeaders = (headers) => {
|
|
334
336
|
const res = {};
|
|
335
337
|
if (!(headers instanceof Headers)) {
|
|
@@ -371,8 +373,6 @@ global.fetch = (info, init) => {
|
|
|
371
373
|
|
|
372
374
|
// src/listener.ts
|
|
373
375
|
var outgoingEnded = Symbol("outgoingEnded");
|
|
374
|
-
var regBuffer = /^no$/i;
|
|
375
|
-
var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
|
|
376
376
|
var handleRequestError = () => new Response(null, {
|
|
377
377
|
status: 400
|
|
378
378
|
});
|
|
@@ -444,23 +444,48 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
|
|
|
444
444
|
}
|
|
445
445
|
const resHeaderRecord = buildOutgoingHttpHeaders(res.headers);
|
|
446
446
|
if (res.body) {
|
|
447
|
-
const
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
447
|
+
const reader = res.body.getReader();
|
|
448
|
+
const values = [];
|
|
449
|
+
let done = false;
|
|
450
|
+
let currentReadPromise = void 0;
|
|
451
|
+
for (let i = 0; i < 2; i++) {
|
|
452
|
+
currentReadPromise = reader.read();
|
|
453
|
+
const chunk = await readWithoutBlocking(currentReadPromise).catch((e) => {
|
|
454
|
+
console.error(e);
|
|
455
|
+
done = true;
|
|
456
|
+
});
|
|
457
|
+
if (!chunk) {
|
|
458
|
+
if (i === 1 && resHeaderRecord["transfer-encoding"] !== "chunked") {
|
|
459
|
+
await new Promise((resolve) => setTimeout(resolve));
|
|
460
|
+
i--;
|
|
461
|
+
continue;
|
|
462
|
+
}
|
|
463
|
+
break;
|
|
464
|
+
}
|
|
465
|
+
currentReadPromise = void 0;
|
|
466
|
+
if (chunk.value) {
|
|
467
|
+
values.push(chunk.value);
|
|
468
|
+
}
|
|
469
|
+
if (chunk.done) {
|
|
470
|
+
done = true;
|
|
471
|
+
break;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
if (done && !("content-length" in resHeaderRecord)) {
|
|
475
|
+
resHeaderRecord["content-length"] = values.reduce((acc, value) => acc + value.length, 0);
|
|
476
|
+
}
|
|
477
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
478
|
+
values.forEach((value) => {
|
|
479
|
+
;
|
|
480
|
+
outgoing.write(value);
|
|
481
|
+
});
|
|
482
|
+
if (done) {
|
|
483
|
+
outgoing.end();
|
|
459
484
|
} else {
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
485
|
+
if (values.length === 0) {
|
|
486
|
+
flushHeaders(outgoing);
|
|
487
|
+
}
|
|
488
|
+
await writeFromReadableStreamDefaultReader(reader, outgoing, currentReadPromise);
|
|
464
489
|
}
|
|
465
490
|
} else if (resHeaderRecord[X_ALREADY_SENT]) {
|
|
466
491
|
} else {
|
package/dist/index.mjs
CHANGED
|
@@ -252,30 +252,24 @@ Object.setPrototypeOf(Response2, GlobalResponse);
|
|
|
252
252
|
Object.setPrototypeOf(Response2.prototype, GlobalResponse.prototype);
|
|
253
253
|
|
|
254
254
|
// src/utils.ts
|
|
255
|
-
function
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
writable.on("close", cancel);
|
|
264
|
-
writable.on("error", cancel);
|
|
265
|
-
reader.read().then(flow, cancel);
|
|
255
|
+
async function readWithoutBlocking(readPromise) {
|
|
256
|
+
return Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]);
|
|
257
|
+
}
|
|
258
|
+
function writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) {
|
|
259
|
+
const handleError = () => {
|
|
260
|
+
};
|
|
261
|
+
writable.on("error", handleError);
|
|
262
|
+
(currentReadPromise ?? reader.read()).then(flow, handleStreamError);
|
|
266
263
|
return reader.closed.finally(() => {
|
|
267
|
-
writable.off("
|
|
268
|
-
writable.off("error", cancel);
|
|
264
|
+
writable.off("error", handleError);
|
|
269
265
|
});
|
|
270
|
-
function
|
|
271
|
-
reader.cancel(error).catch(() => {
|
|
272
|
-
});
|
|
266
|
+
function handleStreamError(error) {
|
|
273
267
|
if (error) {
|
|
274
268
|
writable.destroy(error);
|
|
275
269
|
}
|
|
276
270
|
}
|
|
277
271
|
function onDrain() {
|
|
278
|
-
reader.read().then(flow,
|
|
272
|
+
reader.read().then(flow, handleStreamError);
|
|
279
273
|
}
|
|
280
274
|
function flow({ done, value }) {
|
|
281
275
|
try {
|
|
@@ -284,13 +278,21 @@ function writeFromReadableStream(stream, writable) {
|
|
|
284
278
|
} else if (!writable.write(value)) {
|
|
285
279
|
writable.once("drain", onDrain);
|
|
286
280
|
} else {
|
|
287
|
-
return reader.read().then(flow,
|
|
281
|
+
return reader.read().then(flow, handleStreamError);
|
|
288
282
|
}
|
|
289
283
|
} catch (e) {
|
|
290
|
-
|
|
284
|
+
handleStreamError(e);
|
|
291
285
|
}
|
|
292
286
|
}
|
|
293
287
|
}
|
|
288
|
+
function writeFromReadableStream(stream, writable) {
|
|
289
|
+
if (stream.locked) {
|
|
290
|
+
throw new TypeError("ReadableStream is locked.");
|
|
291
|
+
} else if (writable.destroyed) {
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
return writeFromReadableStreamDefaultReader(stream.getReader(), writable);
|
|
295
|
+
}
|
|
294
296
|
var buildOutgoingHttpHeaders = (headers) => {
|
|
295
297
|
const res = {};
|
|
296
298
|
if (!(headers instanceof Headers)) {
|
|
@@ -332,8 +334,6 @@ global.fetch = (info, init) => {
|
|
|
332
334
|
|
|
333
335
|
// src/listener.ts
|
|
334
336
|
var outgoingEnded = Symbol("outgoingEnded");
|
|
335
|
-
var regBuffer = /^no$/i;
|
|
336
|
-
var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
|
|
337
337
|
var handleRequestError = () => new Response(null, {
|
|
338
338
|
status: 400
|
|
339
339
|
});
|
|
@@ -405,23 +405,48 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
|
|
|
405
405
|
}
|
|
406
406
|
const resHeaderRecord = buildOutgoingHttpHeaders(res.headers);
|
|
407
407
|
if (res.body) {
|
|
408
|
-
const
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
408
|
+
const reader = res.body.getReader();
|
|
409
|
+
const values = [];
|
|
410
|
+
let done = false;
|
|
411
|
+
let currentReadPromise = void 0;
|
|
412
|
+
for (let i = 0; i < 2; i++) {
|
|
413
|
+
currentReadPromise = reader.read();
|
|
414
|
+
const chunk = await readWithoutBlocking(currentReadPromise).catch((e) => {
|
|
415
|
+
console.error(e);
|
|
416
|
+
done = true;
|
|
417
|
+
});
|
|
418
|
+
if (!chunk) {
|
|
419
|
+
if (i === 1 && resHeaderRecord["transfer-encoding"] !== "chunked") {
|
|
420
|
+
await new Promise((resolve) => setTimeout(resolve));
|
|
421
|
+
i--;
|
|
422
|
+
continue;
|
|
423
|
+
}
|
|
424
|
+
break;
|
|
425
|
+
}
|
|
426
|
+
currentReadPromise = void 0;
|
|
427
|
+
if (chunk.value) {
|
|
428
|
+
values.push(chunk.value);
|
|
429
|
+
}
|
|
430
|
+
if (chunk.done) {
|
|
431
|
+
done = true;
|
|
432
|
+
break;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
if (done && !("content-length" in resHeaderRecord)) {
|
|
436
|
+
resHeaderRecord["content-length"] = values.reduce((acc, value) => acc + value.length, 0);
|
|
437
|
+
}
|
|
438
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
439
|
+
values.forEach((value) => {
|
|
440
|
+
;
|
|
441
|
+
outgoing.write(value);
|
|
442
|
+
});
|
|
443
|
+
if (done) {
|
|
444
|
+
outgoing.end();
|
|
420
445
|
} else {
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
446
|
+
if (values.length === 0) {
|
|
447
|
+
flushHeaders(outgoing);
|
|
448
|
+
}
|
|
449
|
+
await writeFromReadableStreamDefaultReader(reader, outgoing, currentReadPromise);
|
|
425
450
|
}
|
|
426
451
|
} else if (resHeaderRecord[X_ALREADY_SENT]) {
|
|
427
452
|
} else {
|
package/dist/listener.js
CHANGED
|
@@ -283,30 +283,24 @@ Object.setPrototypeOf(Response2, GlobalResponse);
|
|
|
283
283
|
Object.setPrototypeOf(Response2.prototype, GlobalResponse.prototype);
|
|
284
284
|
|
|
285
285
|
// src/utils.ts
|
|
286
|
-
function
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
writable.on("close", cancel);
|
|
295
|
-
writable.on("error", cancel);
|
|
296
|
-
reader.read().then(flow, cancel);
|
|
286
|
+
async function readWithoutBlocking(readPromise) {
|
|
287
|
+
return Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]);
|
|
288
|
+
}
|
|
289
|
+
function writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) {
|
|
290
|
+
const handleError = () => {
|
|
291
|
+
};
|
|
292
|
+
writable.on("error", handleError);
|
|
293
|
+
(currentReadPromise ?? reader.read()).then(flow, handleStreamError);
|
|
297
294
|
return reader.closed.finally(() => {
|
|
298
|
-
writable.off("
|
|
299
|
-
writable.off("error", cancel);
|
|
295
|
+
writable.off("error", handleError);
|
|
300
296
|
});
|
|
301
|
-
function
|
|
302
|
-
reader.cancel(error).catch(() => {
|
|
303
|
-
});
|
|
297
|
+
function handleStreamError(error) {
|
|
304
298
|
if (error) {
|
|
305
299
|
writable.destroy(error);
|
|
306
300
|
}
|
|
307
301
|
}
|
|
308
302
|
function onDrain() {
|
|
309
|
-
reader.read().then(flow,
|
|
303
|
+
reader.read().then(flow, handleStreamError);
|
|
310
304
|
}
|
|
311
305
|
function flow({ done, value }) {
|
|
312
306
|
try {
|
|
@@ -315,13 +309,21 @@ function writeFromReadableStream(stream, writable) {
|
|
|
315
309
|
} else if (!writable.write(value)) {
|
|
316
310
|
writable.once("drain", onDrain);
|
|
317
311
|
} else {
|
|
318
|
-
return reader.read().then(flow,
|
|
312
|
+
return reader.read().then(flow, handleStreamError);
|
|
319
313
|
}
|
|
320
314
|
} catch (e) {
|
|
321
|
-
|
|
315
|
+
handleStreamError(e);
|
|
322
316
|
}
|
|
323
317
|
}
|
|
324
318
|
}
|
|
319
|
+
function writeFromReadableStream(stream, writable) {
|
|
320
|
+
if (stream.locked) {
|
|
321
|
+
throw new TypeError("ReadableStream is locked.");
|
|
322
|
+
} else if (writable.destroyed) {
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
return writeFromReadableStreamDefaultReader(stream.getReader(), writable);
|
|
326
|
+
}
|
|
325
327
|
var buildOutgoingHttpHeaders = (headers) => {
|
|
326
328
|
const res = {};
|
|
327
329
|
if (!(headers instanceof Headers)) {
|
|
@@ -363,8 +365,6 @@ global.fetch = (info, init) => {
|
|
|
363
365
|
|
|
364
366
|
// src/listener.ts
|
|
365
367
|
var outgoingEnded = Symbol("outgoingEnded");
|
|
366
|
-
var regBuffer = /^no$/i;
|
|
367
|
-
var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
|
|
368
368
|
var handleRequestError = () => new Response(null, {
|
|
369
369
|
status: 400
|
|
370
370
|
});
|
|
@@ -436,23 +436,48 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
|
|
|
436
436
|
}
|
|
437
437
|
const resHeaderRecord = buildOutgoingHttpHeaders(res.headers);
|
|
438
438
|
if (res.body) {
|
|
439
|
-
const
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
439
|
+
const reader = res.body.getReader();
|
|
440
|
+
const values = [];
|
|
441
|
+
let done = false;
|
|
442
|
+
let currentReadPromise = void 0;
|
|
443
|
+
for (let i = 0; i < 2; i++) {
|
|
444
|
+
currentReadPromise = reader.read();
|
|
445
|
+
const chunk = await readWithoutBlocking(currentReadPromise).catch((e) => {
|
|
446
|
+
console.error(e);
|
|
447
|
+
done = true;
|
|
448
|
+
});
|
|
449
|
+
if (!chunk) {
|
|
450
|
+
if (i === 1 && resHeaderRecord["transfer-encoding"] !== "chunked") {
|
|
451
|
+
await new Promise((resolve) => setTimeout(resolve));
|
|
452
|
+
i--;
|
|
453
|
+
continue;
|
|
454
|
+
}
|
|
455
|
+
break;
|
|
456
|
+
}
|
|
457
|
+
currentReadPromise = void 0;
|
|
458
|
+
if (chunk.value) {
|
|
459
|
+
values.push(chunk.value);
|
|
460
|
+
}
|
|
461
|
+
if (chunk.done) {
|
|
462
|
+
done = true;
|
|
463
|
+
break;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
if (done && !("content-length" in resHeaderRecord)) {
|
|
467
|
+
resHeaderRecord["content-length"] = values.reduce((acc, value) => acc + value.length, 0);
|
|
468
|
+
}
|
|
469
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
470
|
+
values.forEach((value) => {
|
|
471
|
+
;
|
|
472
|
+
outgoing.write(value);
|
|
473
|
+
});
|
|
474
|
+
if (done) {
|
|
475
|
+
outgoing.end();
|
|
451
476
|
} else {
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
477
|
+
if (values.length === 0) {
|
|
478
|
+
flushHeaders(outgoing);
|
|
479
|
+
}
|
|
480
|
+
await writeFromReadableStreamDefaultReader(reader, outgoing, currentReadPromise);
|
|
456
481
|
}
|
|
457
482
|
} else if (resHeaderRecord[X_ALREADY_SENT]) {
|
|
458
483
|
} else {
|
package/dist/listener.mjs
CHANGED
|
@@ -249,30 +249,24 @@ Object.setPrototypeOf(Response2, GlobalResponse);
|
|
|
249
249
|
Object.setPrototypeOf(Response2.prototype, GlobalResponse.prototype);
|
|
250
250
|
|
|
251
251
|
// src/utils.ts
|
|
252
|
-
function
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
writable.on("close", cancel);
|
|
261
|
-
writable.on("error", cancel);
|
|
262
|
-
reader.read().then(flow, cancel);
|
|
252
|
+
async function readWithoutBlocking(readPromise) {
|
|
253
|
+
return Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]);
|
|
254
|
+
}
|
|
255
|
+
function writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) {
|
|
256
|
+
const handleError = () => {
|
|
257
|
+
};
|
|
258
|
+
writable.on("error", handleError);
|
|
259
|
+
(currentReadPromise ?? reader.read()).then(flow, handleStreamError);
|
|
263
260
|
return reader.closed.finally(() => {
|
|
264
|
-
writable.off("
|
|
265
|
-
writable.off("error", cancel);
|
|
261
|
+
writable.off("error", handleError);
|
|
266
262
|
});
|
|
267
|
-
function
|
|
268
|
-
reader.cancel(error).catch(() => {
|
|
269
|
-
});
|
|
263
|
+
function handleStreamError(error) {
|
|
270
264
|
if (error) {
|
|
271
265
|
writable.destroy(error);
|
|
272
266
|
}
|
|
273
267
|
}
|
|
274
268
|
function onDrain() {
|
|
275
|
-
reader.read().then(flow,
|
|
269
|
+
reader.read().then(flow, handleStreamError);
|
|
276
270
|
}
|
|
277
271
|
function flow({ done, value }) {
|
|
278
272
|
try {
|
|
@@ -281,13 +275,21 @@ function writeFromReadableStream(stream, writable) {
|
|
|
281
275
|
} else if (!writable.write(value)) {
|
|
282
276
|
writable.once("drain", onDrain);
|
|
283
277
|
} else {
|
|
284
|
-
return reader.read().then(flow,
|
|
278
|
+
return reader.read().then(flow, handleStreamError);
|
|
285
279
|
}
|
|
286
280
|
} catch (e) {
|
|
287
|
-
|
|
281
|
+
handleStreamError(e);
|
|
288
282
|
}
|
|
289
283
|
}
|
|
290
284
|
}
|
|
285
|
+
function writeFromReadableStream(stream, writable) {
|
|
286
|
+
if (stream.locked) {
|
|
287
|
+
throw new TypeError("ReadableStream is locked.");
|
|
288
|
+
} else if (writable.destroyed) {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
return writeFromReadableStreamDefaultReader(stream.getReader(), writable);
|
|
292
|
+
}
|
|
291
293
|
var buildOutgoingHttpHeaders = (headers) => {
|
|
292
294
|
const res = {};
|
|
293
295
|
if (!(headers instanceof Headers)) {
|
|
@@ -329,8 +331,6 @@ global.fetch = (info, init) => {
|
|
|
329
331
|
|
|
330
332
|
// src/listener.ts
|
|
331
333
|
var outgoingEnded = Symbol("outgoingEnded");
|
|
332
|
-
var regBuffer = /^no$/i;
|
|
333
|
-
var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
|
|
334
334
|
var handleRequestError = () => new Response(null, {
|
|
335
335
|
status: 400
|
|
336
336
|
});
|
|
@@ -402,23 +402,48 @@ var responseViaResponseObject = async (res, outgoing, options = {}) => {
|
|
|
402
402
|
}
|
|
403
403
|
const resHeaderRecord = buildOutgoingHttpHeaders(res.headers);
|
|
404
404
|
if (res.body) {
|
|
405
|
-
const
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
405
|
+
const reader = res.body.getReader();
|
|
406
|
+
const values = [];
|
|
407
|
+
let done = false;
|
|
408
|
+
let currentReadPromise = void 0;
|
|
409
|
+
for (let i = 0; i < 2; i++) {
|
|
410
|
+
currentReadPromise = reader.read();
|
|
411
|
+
const chunk = await readWithoutBlocking(currentReadPromise).catch((e) => {
|
|
412
|
+
console.error(e);
|
|
413
|
+
done = true;
|
|
414
|
+
});
|
|
415
|
+
if (!chunk) {
|
|
416
|
+
if (i === 1 && resHeaderRecord["transfer-encoding"] !== "chunked") {
|
|
417
|
+
await new Promise((resolve) => setTimeout(resolve));
|
|
418
|
+
i--;
|
|
419
|
+
continue;
|
|
420
|
+
}
|
|
421
|
+
break;
|
|
422
|
+
}
|
|
423
|
+
currentReadPromise = void 0;
|
|
424
|
+
if (chunk.value) {
|
|
425
|
+
values.push(chunk.value);
|
|
426
|
+
}
|
|
427
|
+
if (chunk.done) {
|
|
428
|
+
done = true;
|
|
429
|
+
break;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
if (done && !("content-length" in resHeaderRecord)) {
|
|
433
|
+
resHeaderRecord["content-length"] = values.reduce((acc, value) => acc + value.length, 0);
|
|
434
|
+
}
|
|
435
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
436
|
+
values.forEach((value) => {
|
|
437
|
+
;
|
|
438
|
+
outgoing.write(value);
|
|
439
|
+
});
|
|
440
|
+
if (done) {
|
|
441
|
+
outgoing.end();
|
|
417
442
|
} else {
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
443
|
+
if (values.length === 0) {
|
|
444
|
+
flushHeaders(outgoing);
|
|
445
|
+
}
|
|
446
|
+
await writeFromReadableStreamDefaultReader(reader, outgoing, currentReadPromise);
|
|
422
447
|
}
|
|
423
448
|
} else if (resHeaderRecord[X_ALREADY_SENT]) {
|
|
424
449
|
} else {
|
package/dist/serve-static.js
CHANGED
|
@@ -58,37 +58,34 @@ var getStats = (path) => {
|
|
|
58
58
|
return stats;
|
|
59
59
|
};
|
|
60
60
|
var serveStatic = (options = { root: "" }) => {
|
|
61
|
-
const root =
|
|
61
|
+
const root = options.root || "";
|
|
62
62
|
const optionPath = options.path;
|
|
63
63
|
return async (c, next) => {
|
|
64
64
|
if (c.finalized) {
|
|
65
65
|
return next();
|
|
66
66
|
}
|
|
67
67
|
let filename;
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
68
|
+
if (optionPath) {
|
|
69
|
+
filename = optionPath;
|
|
70
|
+
} else {
|
|
71
|
+
try {
|
|
72
|
+
filename = decodeURIComponent(c.req.path);
|
|
73
|
+
if (/(?:^|[\/\\])\.\.(?:$|[\/\\])/.test(filename)) {
|
|
74
|
+
throw new Error();
|
|
75
75
|
}
|
|
76
|
+
} catch {
|
|
77
|
+
await options.onNotFound?.(c.req.path, c);
|
|
78
|
+
return next();
|
|
76
79
|
}
|
|
77
|
-
filename = optionPath ?? decodeURIComponent(c.req.path);
|
|
78
|
-
} catch {
|
|
79
|
-
await options.onNotFound?.(c.req.path, c);
|
|
80
|
-
return next();
|
|
81
80
|
}
|
|
82
|
-
|
|
83
|
-
|
|
81
|
+
let path = (0, import_node_path.join)(
|
|
82
|
+
root,
|
|
83
|
+
!optionPath && options.rewriteRequestPath ? options.rewriteRequestPath(filename, c) : filename
|
|
84
|
+
);
|
|
84
85
|
let stats = getStats(path);
|
|
85
86
|
if (stats && stats.isDirectory()) {
|
|
86
87
|
const indexFile = options.index ?? "index.html";
|
|
87
|
-
path = (0, import_node_path.
|
|
88
|
-
if (!optionPath && !path.startsWith(root)) {
|
|
89
|
-
await options.onNotFound?.(path, c);
|
|
90
|
-
return next();
|
|
91
|
-
}
|
|
88
|
+
path = (0, import_node_path.join)(path, indexFile);
|
|
92
89
|
stats = getStats(path);
|
|
93
90
|
}
|
|
94
91
|
if (!stats) {
|