@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 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 writeFromReadableStream(stream, writable) {
295
- if (stream.locked) {
296
- throw new TypeError("ReadableStream is locked.");
297
- } else if (writable.destroyed) {
298
- stream.cancel();
299
- return;
300
- }
301
- const reader = stream.getReader();
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("close", cancel);
307
- writable.off("error", cancel);
303
+ writable.off("error", handleError);
308
304
  });
309
- function cancel(error) {
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, cancel);
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, cancel);
320
+ return reader.read().then(flow, handleStreamError);
327
321
  }
328
322
  } catch (e) {
329
- cancel(e);
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
- "transfer-encoding": transferEncoding,
449
- "content-encoding": contentEncoding,
450
- "content-length": contentLength,
451
- "x-accel-buffering": accelBuffering,
452
- "content-type": contentType
453
- } = resHeaderRecord;
454
- if (transferEncoding || contentEncoding || contentLength || // nginx buffering variant
455
- accelBuffering && regBuffer.test(accelBuffering) || !regContentType.test(contentType)) {
456
- outgoing.writeHead(res.status, resHeaderRecord);
457
- flushHeaders(outgoing);
458
- await writeFromReadableStream(res.body, outgoing);
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
- const buffer = await res.arrayBuffer();
461
- resHeaderRecord["content-length"] = buffer.byteLength;
462
- outgoing.writeHead(res.status, resHeaderRecord);
463
- outgoing.end(new Uint8Array(buffer));
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 writeFromReadableStream(stream, writable) {
256
- if (stream.locked) {
257
- throw new TypeError("ReadableStream is locked.");
258
- } else if (writable.destroyed) {
259
- stream.cancel();
260
- return;
261
- }
262
- const reader = stream.getReader();
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("close", cancel);
268
- writable.off("error", cancel);
264
+ writable.off("error", handleError);
269
265
  });
270
- function cancel(error) {
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, cancel);
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, cancel);
281
+ return reader.read().then(flow, handleStreamError);
288
282
  }
289
283
  } catch (e) {
290
- cancel(e);
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
- "transfer-encoding": transferEncoding,
410
- "content-encoding": contentEncoding,
411
- "content-length": contentLength,
412
- "x-accel-buffering": accelBuffering,
413
- "content-type": contentType
414
- } = resHeaderRecord;
415
- if (transferEncoding || contentEncoding || contentLength || // nginx buffering variant
416
- accelBuffering && regBuffer.test(accelBuffering) || !regContentType.test(contentType)) {
417
- outgoing.writeHead(res.status, resHeaderRecord);
418
- flushHeaders(outgoing);
419
- await writeFromReadableStream(res.body, outgoing);
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
- const buffer = await res.arrayBuffer();
422
- resHeaderRecord["content-length"] = buffer.byteLength;
423
- outgoing.writeHead(res.status, resHeaderRecord);
424
- outgoing.end(new Uint8Array(buffer));
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 writeFromReadableStream(stream, writable) {
287
- if (stream.locked) {
288
- throw new TypeError("ReadableStream is locked.");
289
- } else if (writable.destroyed) {
290
- stream.cancel();
291
- return;
292
- }
293
- const reader = stream.getReader();
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("close", cancel);
299
- writable.off("error", cancel);
295
+ writable.off("error", handleError);
300
296
  });
301
- function cancel(error) {
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, cancel);
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, cancel);
312
+ return reader.read().then(flow, handleStreamError);
319
313
  }
320
314
  } catch (e) {
321
- cancel(e);
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
- "transfer-encoding": transferEncoding,
441
- "content-encoding": contentEncoding,
442
- "content-length": contentLength,
443
- "x-accel-buffering": accelBuffering,
444
- "content-type": contentType
445
- } = resHeaderRecord;
446
- if (transferEncoding || contentEncoding || contentLength || // nginx buffering variant
447
- accelBuffering && regBuffer.test(accelBuffering) || !regContentType.test(contentType)) {
448
- outgoing.writeHead(res.status, resHeaderRecord);
449
- flushHeaders(outgoing);
450
- await writeFromReadableStream(res.body, outgoing);
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
- const buffer = await res.arrayBuffer();
453
- resHeaderRecord["content-length"] = buffer.byteLength;
454
- outgoing.writeHead(res.status, resHeaderRecord);
455
- outgoing.end(new Uint8Array(buffer));
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 writeFromReadableStream(stream, writable) {
253
- if (stream.locked) {
254
- throw new TypeError("ReadableStream is locked.");
255
- } else if (writable.destroyed) {
256
- stream.cancel();
257
- return;
258
- }
259
- const reader = stream.getReader();
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("close", cancel);
265
- writable.off("error", cancel);
261
+ writable.off("error", handleError);
266
262
  });
267
- function cancel(error) {
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, cancel);
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, cancel);
278
+ return reader.read().then(flow, handleStreamError);
285
279
  }
286
280
  } catch (e) {
287
- cancel(e);
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
- "transfer-encoding": transferEncoding,
407
- "content-encoding": contentEncoding,
408
- "content-length": contentLength,
409
- "x-accel-buffering": accelBuffering,
410
- "content-type": contentType
411
- } = resHeaderRecord;
412
- if (transferEncoding || contentEncoding || contentLength || // nginx buffering variant
413
- accelBuffering && regBuffer.test(accelBuffering) || !regContentType.test(contentType)) {
414
- outgoing.writeHead(res.status, resHeaderRecord);
415
- flushHeaders(outgoing);
416
- await writeFromReadableStream(res.body, outgoing);
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
- const buffer = await res.arrayBuffer();
419
- resHeaderRecord["content-length"] = buffer.byteLength;
420
- outgoing.writeHead(res.status, resHeaderRecord);
421
- outgoing.end(new Uint8Array(buffer));
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 {
@@ -58,37 +58,34 @@ var getStats = (path) => {
58
58
  return stats;
59
59
  };
60
60
  var serveStatic = (options = { root: "" }) => {
61
- const root = (0, import_node_path.resolve)(options.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
- try {
69
- const rawPath = optionPath ?? c.req.path;
70
- if (!optionPath) {
71
- const decodedPath = decodeURIComponent(rawPath);
72
- if (decodedPath.includes("..")) {
73
- await options.onNotFound?.(rawPath, c);
74
- return next();
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
- const requestPath = options.rewriteRequestPath ? options.rewriteRequestPath(filename, c) : filename;
83
- let path = optionPath ? options.root ? (0, import_node_path.resolve)((0, import_node_path.join)(root, optionPath)) : optionPath : (0, import_node_path.resolve)((0, import_node_path.join)(root, requestPath));
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.resolve)((0, import_node_path.join)(path, indexFile));
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) {