@@ -37,6 +37,7 @@ const {
3737/** @typedef {import("./index.js").IncomingMessage } IncomingMessage */
3838/** @typedef {import("./index.js").ServerResponse } ServerResponse */
3939/** @typedef {import("./index.js").NormalizedHeaders } NormalizedHeaders */
40+ /** @typedef {import("./index.js").OutputFileSystem } OutputFileSystem */
4041
4142const BYTES_RANGE_REGEXP = / ^ * b y t e s / i;
4243
@@ -61,6 +62,7 @@ const UP_PATH_REGEXP = /(?:^|[\\/])\.\.(?:[\\/]|$)/;
6162 * @typedef {object } Extra
6263 * @property {import("fs").Stats } stats stats
6364 * @property {boolean= } immutable true when immutable, otherwise false
65+ * @property {OutputFileSystem } outputFileSystem outputFileSystem
6466 */
6567
6668/**
@@ -83,13 +85,15 @@ class FilenameError extends Error {
8385 }
8486}
8587
88+ /** @typedef {{ filename: string, extra: Extra } } FilenameWithExtra */
89+
8690// TODO fix redirect logic when `/` at the end, like https://github.com/pillarjs/send/blob/master/index.js#L586
8791/**
8892 * @template {IncomingMessage} Request
8993 * @template {ServerResponse} Response
9094 * @param {import("./index.js").FilledContext<Request, Response> } context context
9195 * @param {string } url url
92- * @returns {{ filename: string, extra: Extra } | undefined } result of get filename from url
96+ * @returns {FilenameWithExtra | undefined } result of get filename from url
9397 */
9498function getFilenameFromUrl ( context , url ) {
9599 /** @type {URL } */
@@ -168,8 +172,12 @@ function getFilenameFromUrl(context, url) {
168172 pathname . slice ( publicPathPathname . length ) ,
169173 ) ;
170174
175+ const { outputFileSystem } =
176+ /** @type {Compiler & { outputFileSystem: OutputFileSystem } } */
177+ ( compilation . compiler ) ;
178+
171179 try {
172- extra . stats = context . outputFileSystem . statSync ( filename ) ;
180+ extra . stats = outputFileSystem . statSync ( filename ) ;
173181 } catch {
174182 continue ;
175183 }
@@ -188,6 +196,8 @@ function getFilenameFromUrl(context, url) {
188196 extra . immutable = assetInfo ? assetInfo . immutable : false ;
189197 }
190198
199+ extra . outputFileSystem = outputFileSystem ;
200+
191201 break ;
192202 } else if (
193203 extra . stats . isDirectory ( ) &&
@@ -202,13 +212,14 @@ function getFilenameFromUrl(context, url) {
202212 filename = path . join ( filename , indexValue ) ;
203213
204214 try {
205- extra . stats = context . outputFileSystem . statSync ( filename ) ;
215+ extra . stats = outputFileSystem . statSync ( filename ) ;
206216 } catch {
207217 continue ;
208218 }
209219
210220 if ( extra . stats . isFile ( ) ) {
211221 foundFilename = filename ;
222+ extra . outputFileSystem = outputFileSystem ;
212223
213224 break ;
214225 }
@@ -710,7 +721,7 @@ function wrapper(context) {
710721 */
711722 async function processRequest ( ) {
712723 // Pipe and SendFile
713- /** @type {{ filename: string, extra: Extra } | undefined } */
724+ /** @type {FilenameWithExtra | undefined } */
714725 let resolved ;
715726
716727 const requestUrl = /** @type {string } */ ( getRequestURL ( req ) ) ;
@@ -870,7 +881,7 @@ function wrapper(context) {
870881 try {
871882 const result = createReadStreamOrReadFileSync (
872883 filename ,
873- context . outputFileSystem ,
884+ extra . outputFileSystem ,
874885 start ,
875886 end ,
876887 ) ;
@@ -1015,7 +1026,7 @@ function wrapper(context) {
10151026 try {
10161027 ( { bufferOrStream, byteLength } = createReadStreamOrReadFileSync (
10171028 filename ,
1018- context . outputFileSystem ,
1029+ extra . outputFileSystem ,
10191030 start ,
10201031 end ,
10211032 ) ) ;
0 commit comments