Spaces:
Paused
Paused
| 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; | |
| }; | |