UNPKG

@api.global/typedserver

Version:

A TypeScript-based project for easy serving of static files with support for live reloading, compression, and typed requests.

123 lines 10.9 kB
import * as plugins from '../plugins.js'; import * as interfaces from '../../dist_ts_interfaces/index.js'; import { Handler } from './classes.handler.js'; import { Compressor } from './classes.compressor.js'; export class HandlerStatic extends Handler { constructor(pathArg, optionsArg) { super('GET', async (req, res) => { let requestPath = req.path; let requestHeaders = req.headers; let requestBody = req.body; let travelData; if (optionsArg && optionsArg.requestModifier) { const modifiedRequest = await optionsArg.requestModifier({ headers: requestHeaders, path: requestPath, body: requestBody, }); requestHeaders = modifiedRequest.headers; requestPath = modifiedRequest.path; requestBody = modifiedRequest.body; travelData = modifiedRequest.travelData; } // lets compute some paths let filePath = requestPath.slice(req.route.path.length - 1); // lets slice of the root if (requestPath === '') { console.log('replaced root with index.html'); filePath = 'index.html'; } console.log(filePath); const joinedPath = plugins.path.join(pathArg, filePath); const defaultPath = plugins.path.join(pathArg, 'index.html'); let parsedPath = plugins.path.parse(joinedPath); let usedPath; // important security checks if (requestPath.includes('..') || // don't allow going up the filePath requestPath.includes('~') || // don't allow referencing of home directory !joinedPath.startsWith(pathArg) // make sure the joined path is within the directory ) { res.writeHead(500); res.end(); return; } // set additional headers if (optionsArg && optionsArg.headers) { for (const key of Object.keys(optionsArg.headers)) { res.set(key, optionsArg.headers[key]); } } // lets actually care about serving, if security checks pass let fileBuffer; try { fileBuffer = plugins.smartfile.fs.toBufferSync(joinedPath); usedPath = joinedPath; } catch (err) { // try serving index.html instead console.log(`could not resolve ${joinedPath}`); if (optionsArg && optionsArg.serveIndexHtmlDefault) { console.log(`serving default path ${defaultPath} instead of ${joinedPath}`); try { parsedPath = plugins.path.parse(defaultPath); fileBuffer = plugins.smartfile.fs.toBufferSync(defaultPath); usedPath = defaultPath; } catch (err) { res.writeHead(500); res.end('File not found!'); return; } } else { res.writeHead(500); res.end('File not found!'); return; } } res.type(parsedPath.ext); const headers = res.getHeaders(); // lets modify the response at last if (optionsArg && optionsArg.responseModifier) { const modifiedResponse = await optionsArg.responseModifier({ headers: res.getHeaders(), path: usedPath, responseContent: fileBuffer, travelData, }); // headers for (const key of Object.keys(res.getHeaders())) { if (!modifiedResponse.headers[key]) { res.removeHeader(key); } } for (const key of Object.keys(modifiedResponse.headers)) { res.setHeader(key, modifiedResponse.headers[key]); } // responseContent fileBuffer = modifiedResponse.responseContent; } // lets finally deal with compression let compressionResult; if (optionsArg && optionsArg.enableCompression) { compressionResult = await this.compressor.maybeCompress(requestHeaders, fileBuffer, [optionsArg.preferredCompressionMethod]); } else { compressionResult = { compressionMethod: 'none', result: fileBuffer, }; } res.status(200); if (compressionResult?.compressionMethod) { res.header('Content-Encoding', compressionResult.compressionMethod); res.write(compressionResult.result); } else { res.write(fileBuffer); } res.end(); }); this.compressor = new Compressor(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5oYW5kbGVyc3RhdGljLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvc2VydmVydG9vbHMvY2xhc3Nlcy5oYW5kbGVyc3RhdGljLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxVQUFVLE1BQU0sbUNBQW1DLENBQUM7QUFFaEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQW9ELE1BQU0seUJBQXlCLENBQUM7QUFFdkcsTUFBTSxPQUFPLGFBQWMsU0FBUSxPQUFPO0lBRXhDLFlBQ0UsT0FBZSxFQUNmLFVBT0M7UUFFRCxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDOUIsSUFBSSxXQUFXLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztZQUMzQixJQUFJLGNBQWMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1lBQ2pDLElBQUksV0FBVyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDM0IsSUFBSSxVQUFtQixDQUFDO1lBQ3hCLElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDN0MsTUFBTSxlQUFlLEdBQUcsTUFBTSxVQUFVLENBQUMsZUFBZSxDQUFDO29CQUN2RCxPQUFPLEVBQUUsY0FBYztvQkFDdkIsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLElBQUksRUFBRSxXQUFXO2lCQUNsQixDQUFDLENBQUM7Z0JBRUgsY0FBYyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUM7Z0JBQ3pDLFdBQVcsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDO2dCQUNuQyxXQUFXLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQztnQkFDbkMsVUFBVSxHQUFHLGVBQWUsQ0FBQyxVQUFVLENBQUM7WUFDMUMsQ0FB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