| 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', |
| ]; |
|
|
| |
| globalThis.fetch = async ( request, 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; |
| }; |
|
|