🎉 初始化项目
This commit is contained in:
40
web-app/src/fetch-patch.js
Normal file
40
web-app/src/fetch-patch.js
Normal file
@@ -0,0 +1,40 @@
|
||||
import fs from 'node:fs';
|
||||
import path from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import mime from 'mime-types';
|
||||
import { serverDirectory } from './server-directory.js';
|
||||
import { getRequestURL, isFileURL, isPathUnderParent } from './util.js';
|
||||
|
||||
const originalFetch = globalThis.fetch;
|
||||
|
||||
const ALLOWED_EXTENSIONS = [
|
||||
'.wasm',
|
||||
];
|
||||
|
||||
// Patched fetch function that handles file URLs
|
||||
globalThis.fetch = async (/** @type {string | URL | Request} */ request, /** @type {RequestInit | undefined} */ options) => {
|
||||
if (!isFileURL(request)) {
|
||||
return originalFetch(request, options);
|
||||
}
|
||||
const url = getRequestURL(request);
|
||||
const filePath = path.resolve(fileURLToPath(url));
|
||||
const isUnderServerDirectory = isPathUnderParent(serverDirectory, filePath);
|
||||
if (!isUnderServerDirectory) {
|
||||
throw new Error('Requested file path is outside of the server directory.');
|
||||
}
|
||||
const parsedPath = path.parse(filePath);
|
||||
if (!ALLOWED_EXTENSIONS.includes(parsedPath.ext)) {
|
||||
throw new Error('Unsupported file extension.');
|
||||
}
|
||||
const fileName = parsedPath.base;
|
||||
const buffer = await fs.promises.readFile(filePath);
|
||||
const response = new Response(buffer, {
|
||||
status: 200,
|
||||
statusText: 'OK',
|
||||
headers: {
|
||||
'Content-Type': mime.lookup(fileName) || 'application/octet-stream',
|
||||
'Content-Length': buffer.length.toString(),
|
||||
},
|
||||
});
|
||||
return response;
|
||||
};
|
||||
Reference in New Issue
Block a user