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