@vulppi/intrest
Version:
Backend kit make by Vulppi
8 lines (7 loc) • 41.8 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../src/workers/v2-multi.ts", "../../src/controllers/constants.ts", "../../src/controllers/multi-tools.ts", "../../src/controllers/path.ts", "../../src/controllers/request-handler-v2.ts", "../../src/controllers/parser.ts"],
"sourcesContent": ["import ck from 'chalk'\r\nimport selfSigned from 'selfsigned'\r\nimport { existsSync, mkdirSync, rmSync } from 'fs'\r\nimport { createSecureServer, createServer } from 'http2'\r\nimport { join } from 'path'\r\nimport { defaultPaths, globPatterns, isDev } from '../controllers/constants'\r\nimport { startWorker, workerTunnel } from '../controllers/multi-tools'\r\nimport { getModule, globFind, normalizePath } from '../controllers/path'\r\nimport { buildRequestHandlerV2 } from '../controllers/request-handler-v2'\r\n\r\nconst basePath = process.cwd()\r\nconst configPath = await globFind(basePath, globPatterns.configFile)\r\nconst config = ((await getModule(configPath)).default || {}) as IntREST.Config\r\n\r\nconst bootstrapPath = await globFind(\r\n basePath,\r\n defaultPaths.compiledFolder,\r\n defaultPaths.compiledRoutes,\r\n globPatterns.bootstrapCompiled,\r\n)\r\nconst bootstrap = await getModule(bootstrapPath)\r\nconst bootstrapHandler = bootstrap.bootstrap || bootstrap.default\r\nif (bootstrapHandler && typeof bootstrapHandler === 'function') {\r\n console.log('\\n Bootstrapping...\\n')\r\n await bootstrapHandler(config)\r\n}\r\n\r\nconst appPort = config.port || +(process.env.PORT || 4000)\r\nconst appTempPath = normalizePath(\r\n join(basePath, config.paths?.uploadTemp || '.tmp'),\r\n)\r\n\r\nif (existsSync(appTempPath)) {\r\n rmSync(appTempPath, { recursive: true })\r\n}\r\nmkdirSync(appTempPath, { recursive: true })\r\nstartWorker(config.limits?.minWorkerPoolSize || 5)\r\n\r\nconst ssl = selfSigned.generate()\r\nconst server = isDev()\r\n ? createSecureServer(\r\n {\r\n cert: ssl.cert,\r\n key: ssl.private,\r\n keepAlive: true,\r\n keepAliveInitialDelay: 5000,\r\n },\r\n buildRequestHandlerV2(workerTunnel),\r\n )\r\n : createServer(buildRequestHandlerV2(workerTunnel))\r\n\r\nserver.listen(appPort, () => {\r\n console.log(`\\n Server running on port %s`, ck.yellow(appPort))\r\n console.log(\r\n ` You can access the server at %s or %s\\n`,\r\n ck.yellow(`https://localhost:${appPort}`),\r\n ck.yellow(`https://127.0.0.1:${appPort}`),\r\n )\r\n})\r\n", "export const isDev = () => process.env.NODE_ENV === 'development'\r\n\r\nexport const globPatterns = {\r\n env: ['.env', '.env{.local,.development,.production}'],\r\n entryFolder: ['routes', 'src/routes'],\r\n assetsFolder: ['assets', 'src/assets'],\r\n staticFolder: ['static', 'src/static', 'public', 'src/public'],\r\n configFile: 'intrest.config.{mjs,cjs,js}',\r\n envFile: '.env{.local,.development,.production}',\r\n bootstrapEntry: 'bootstrap.ts',\r\n bootstrapCompiled: 'bootstrap.mjs',\r\n entryPoints: '**/{route,middleware,validation}.ts',\r\n identityPoints: '**/__identity.mjs',\r\n middlewarePoints: '**/middleware.mjs',\r\n routeFile: 'route.{mjs,cjs,js,ts}',\r\n middlewareFile: 'middleware.{mjs,cjs,js,ts}',\r\n} as const\r\n\r\nexport const regexpPatterns = {\r\n env: /^\\.env(?:\\.[a-z-_]*)?$/,\r\n config: /^intrest\\.config\\.[mc]?js$/,\r\n bootstrap: /^bootstrap\\.ts$/,\r\n entry: /(?:^|\\/)(?:route|middleware|validation)\\.ts$/,\r\n observable: /(?:route)\\.ts$/,\r\n reservedChars: /(?:[.*+?^=!:${}()|\\[\\]\\/\\\\])/g,\r\n startSlashesOrNot: /^[\\\\\\/]*/,\r\n endSlashesOrNot: /[\\\\\\/]*$/,\r\n multiSlashes: /[\\\\\\/]+/g,\r\n isBusboyContentType: /^(?:x-www-form-urlencoded|multipart\\/form-data.*)$/i,\r\n isJSONContentType: /^application\\/json$/i,\r\n isXMLContentType: /^application\\/xml$/i,\r\n isAcceptableContentType:\r\n /^(?:x-www-form-urlencoded|multipart\\/form-data.*|application\\/(?:json|xml))$/i,\r\n} as const\r\n\r\nexport const defaultPaths = {\r\n compiledFolder: '.intrest',\r\n compiledRoutes: 'routes',\r\n workerMultiWorker: 'multi.mjs',\r\n workerSingleWorker: 'single.mjs',\r\n workerRouter: 'router.mjs',\r\n routeIdentity: '__identity.mjs',\r\n} as const\r\n\r\nexport const defaultOutputPaths = {\r\n vercel: '.vercel/output',\r\n}\r\n", "import { randomUUID } from 'crypto'\r\nimport { Worker } from 'worker_threads'\r\nimport { defaultPaths } from './constants'\r\nimport { join } from 'path'\r\nimport { normalizePath } from './path'\r\n\r\nfunction workerURL(path: string) {\r\n return new URL(normalizePath(join('.', path)), import.meta.url)\r\n}\r\n\r\ninterface WorkerPool {\r\n weight: number\r\n worker: Worker\r\n workerId: number\r\n}\r\n\r\nconst workerPool = new Map<number, WorkerPool>()\r\n\r\n/**\r\n * Initialize the worker pool\r\n */\r\nexport async function startWorker(size: number) {\r\n for (let i = 0; i < size; i++) {\r\n const worker = new Worker(workerURL(defaultPaths.workerRouter), {\r\n env: process.env,\r\n })\r\n worker.setMaxListeners(Infinity)\r\n workerPool.set(worker.threadId, {\r\n weight: 0,\r\n worker,\r\n workerId: worker.threadId,\r\n })\r\n }\r\n}\r\n\r\nexport async function stopWorkers() {\r\n for (const worker of workerPool.values()) {\r\n worker.worker.terminate()\r\n }\r\n workerPool.clear()\r\n}\r\n\r\nexport async function workerTunnel(\r\n { basePath, data, config }: Omit<WorkerProps, 'requestId'>,\r\n cb: (state: ResponseState, data: ResponseData) => void,\r\n) {\r\n return new Promise<void>((resolve, reject) => {\r\n // Generate a random request id\r\n const requestId = randomUUID()\r\n // Get the list of workers\r\n const workerList = Array.from(workerPool.values())\r\n // Try to find a worker with weight 0\r\n let workerItem = workerList.find((w) => w.weight === 0)\r\n let worker: Worker\r\n let workerId: number\r\n\r\n // If no worker with weight 0 is found\r\n // and the worker pool size is less than the max size,\r\n // find a worker with the lowest weight\r\n if (\r\n !workerItem &&\r\n workerList.length < (config.limits?.maxWorkerPoolSize || 20)\r\n ) {\r\n // Create a new worker\r\n const worker = new Worker(workerURL(defaultPaths.workerRouter), {\r\n env: process.env,\r\n })\r\n worker.setMaxListeners(Infinity)\r\n workerItem = {\r\n weight: 0,\r\n worker,\r\n workerId: worker.threadId,\r\n }\r\n // Add the worker to the worker pool\r\n workerPool.set(worker.threadId, workerItem)\r\n } else if (!workerItem) {\r\n workerItem = workerList.reduce((a, b) => (a.weight < b.weight ? a : b))\r\n }\r\n\r\n // Increase the worker weight, because it is busy with a request\r\n workerItem.weight++\r\n worker = workerItem.worker\r\n workerId = workerItem.workerId\r\n\r\n // Handle worker exit, if a catastrophic error occurs\r\n const handleExit = (code: number) => {\r\n workerPool.delete(workerId)\r\n worker.off('exit', handleExit)\r\n reject(new Error(`Worker stopped with exit code ${code}`))\r\n }\r\n worker.once('exit', handleExit)\r\n\r\n // Handle worker error, if a catastrophic error occurs\r\n const handleError = (err: Error) => {\r\n reject(err)\r\n workerItem && workerItem.weight--\r\n worker.off('error', handleError)\r\n worker.off('exit', handleExit)\r\n }\r\n worker.once('error', handleError)\r\n\r\n // Handle worker message, and call the callback function if the request id matches\r\n const handleMessage = (r: TransferResponse) => {\r\n if (r.requestId !== requestId) return\r\n\r\n cb(r.state, r.data)\r\n if (r.state === 'end') {\r\n workerItem && workerItem.weight--\r\n worker.off('message', handleMessage)\r\n worker.off('error', handleError)\r\n worker.off('exit', handleExit)\r\n resolve()\r\n }\r\n }\r\n worker.on('message', handleMessage)\r\n // Send the data to the worker router\r\n worker.postMessage({\r\n data,\r\n basePath,\r\n config,\r\n requestId,\r\n })\r\n })\r\n}\r\n", "import { glob } from 'glob'\r\nimport { join, normalize } from 'path'\r\nimport { pathToFileURL } from 'url'\r\nimport { globPatterns, isDev } from './constants'\r\n\r\n/**\r\n * Normalize the path and replace all backslash with slash\r\n *\r\n * @param pathname\r\n * @returns\r\n */\r\nexport function normalizePath(pathname: string) {\r\n return normalize(pathname).replace(/[\\/\\\\]+/g, '/')\r\n}\r\n\r\n/**\r\n * Get the module from the given path\r\n * If the path is not given or the module is not found, return empty object\r\n */\r\nexport async function getModule(configPath?: string) {\r\n if (!configPath) return {} as Record<string, any>\r\n const configURL = pathToFileURL(configPath)\r\n configURL.searchParams.set('update', Date.now().toString())\r\n try {\r\n return (\r\n (await import(configURL.toString()).then(\r\n (m) => m as Record<string, any>,\r\n )) || {}\r\n )\r\n } catch (err) {\r\n return {} as Record<string, any>\r\n }\r\n}\r\n\r\n/**\r\n * Find the first file that match the glob pattern\r\n */\r\nexport async function globFind(\r\n ...pattern: string[]\r\n): Promise<string | undefined> {\r\n const res = await glob(normalizePath(join(...pattern)), {\r\n ignore: ['**/node_modules/**'],\r\n windowsPathsNoEscape: true,\r\n })\r\n return res[0] && normalizePath(res[0])\r\n}\r\n\r\n/**\r\n * Find the first file that match the glob pattern list\r\n */\r\nexport async function globFindList(\r\n ...pattern: string[][]\r\n): Promise<string | undefined> {\r\n const list = pattern.map((p) => normalizePath(join(...p)))\r\n const res = await glob(list, {\r\n ignore: ['**/node_modules/**'],\r\n windowsPathsNoEscape: true,\r\n })\r\n return res[0] && normalizePath(res[0])\r\n}\r\n\r\n/**\r\n * Find all files that match the glob pattern\r\n */\r\nexport async function globFindAll(...pattern: string[]): Promise<string[]> {\r\n const res = await glob(normalizePath(join(...pattern)), {\r\n ignore: ['**/node_modules/**'],\r\n windowsPathsNoEscape: true,\r\n })\r\n return res.map(normalizePath)\r\n}\r\n\r\n/**\r\n * Find all files that match the glob pattern list\r\n */\r\nexport async function globFindAllList(\r\n ...pattern: string[][]\r\n): Promise<string[]> {\r\n const list = pattern.map((p) => normalizePath(join(...p)))\r\n const res = await glob(list.reverse(), {\r\n ignore: ['**/node_modules/**'],\r\n windowsPathsNoEscape: true,\r\n })\r\n return res.map(normalizePath)\r\n}\r\n\r\n/**\r\n * Escape the path with the given escape string\r\n */\r\nexport function escapePath(pathname: string, ...escape: string[]) {\r\n return normalizePath(pathname)\r\n .replace(normalizePath(join(...escape)), '')\r\n .replace(/^\\//, '')\r\n}\r\n\r\n/**\r\n * Clear the extension of the path\r\n */\r\nexport function clearExtension(path: string) {\r\n return normalizePath(path).replace(/\\.[a-z0-9]+$/i, '')\r\n}\r\n\r\n/**\r\n * Find the list of env files that match the glob pattern\r\n * inside the given base path\r\n */\r\nexport async function findEnvPaths(basePath: string) {\r\n return globFindAllList(...globPatterns.env.map((p) => [basePath, p]))\r\n}\r\n\r\n/**\r\n * Get the first env file that match the glob pattern\r\n * inside the given base path\r\n */\r\nexport async function getEnvPath(basePath: string) {\r\n return (await findEnvPaths(basePath))[0] as string | undefined\r\n}\r\n\r\n/**\r\n * Find the app folder that match the glob pattern\r\n * inside the given base path\r\n */\r\nexport async function getFolderPath(\r\n basePath: string,\r\n possibleFolders: readonly string[],\r\n) {\r\n return (\r\n (await globFindAllList(...possibleFolders.map((p) => [basePath, p])))[0] ||\r\n possibleFolders[1]\r\n )\r\n}\r\n\r\n/**\r\n * Add the update query to the module path for development\r\n * to prevent the module from being cached\r\n */\r\nexport function encapsulateModule(v: string) {\r\n if (!isDev()) return v\r\n return `${v}?update=${Date.now()}`\r\n}\r\n", "import busboy from 'busboy'\r\nimport ck from 'chalk'\r\nimport concat from 'concat-stream'\r\nimport cookie from 'cookie'\r\nimport { randomUUID } from 'crypto'\r\nimport { XMLParser, XMLValidator } from 'fast-xml-parser'\r\nimport { createWriteStream, rmSync } from 'fs'\r\nimport { StatusCodes, getReasonPhrase } from 'http-status-codes'\r\nimport type { Http2ServerRequest, Http2ServerResponse } from 'http2'\r\nimport _ from 'lodash'\r\nimport ms from 'ms'\r\nimport { join } from 'path'\r\nimport { performance } from 'perf_hooks'\r\nimport { globPatterns, isDev, regexpPatterns } from './constants'\r\nimport {\r\n parseDecompressBuffer,\r\n parseStringBytesToNumber,\r\n parseStringToAutoDetectValue,\r\n} from './parser'\r\nimport { getModule, globFind, normalizePath } from './path'\r\n\r\ninterface TunnelFunction {\r\n (\r\n params: Omit<WorkerProps, 'requestId'>,\r\n endCallback: (state: ResponseState, data: ResponseData) => void,\r\n ): Promise<void>\r\n}\r\n\r\nfunction debugRequest(\r\n startRequestTime: number,\r\n method: string,\r\n path: string,\r\n status: number = 200,\r\n) {\r\n console.debug(\r\n '%s(%s - %s) - %s %s',\r\n ck.yellow(method),\r\n ck.green(status),\r\n getReasonPhrase(status),\r\n ck.bold(path),\r\n ck.cyan(`${(performance.now() - startRequestTime).toPrecision(5)}ms`),\r\n )\r\n}\r\n\r\nexport function buildRequestHandlerV2(tunnel: TunnelFunction) {\r\n return async function requestHandler(\r\n req: Http2ServerRequest,\r\n res: Http2ServerResponse,\r\n ) {\r\n // Get the root path of the project\r\n const basePath = process.cwd()\r\n // Try find the config module\r\n const configPath = await globFind(basePath, globPatterns.configFile)\r\n const config = ((await getModule(configPath)).default ||\r\n {}) as IntREST.Config\r\n // Get the temp path for upload files\r\n const appTempPath = normalizePath(\r\n join(basePath, config.paths?.uploadTemp || '.tmp'),\r\n )\r\n // Get the request method, path, query and content type\r\n const method = (req.method?.toUpperCase() ||\r\n 'GET') as IntREST.RequestMethods\r\n const [prePath, preQuery] = (req.url || '/').split('?')\r\n const path = decodeURIComponent(prePath)\r\n const query = preQuery || ''\r\n const contentType = req.headers['content-type'] || 'application/json'\r\n // Prepare origin for CORS\r\n const pureOrigin = req.headers.origin || req.headers.host || ''\r\n const ipOrigin = req.socket.remoteAddress\r\n const origin = pureOrigin.replace(/^[a-z]+:\\/\\//, '')\r\n const originWithProtocol = /^[a-z]+:\\/\\//.test(pureOrigin)\r\n ? pureOrigin\r\n : pureOrigin.includes('localhost') || isDev()\r\n ? `http://${pureOrigin || 'localhost'}`\r\n : pureOrigin\r\n ? `https://${pureOrigin}`\r\n : '*'\r\n // Validate allowOrigin\r\n if (config.limits?.allowOrigin && !isDev()) {\r\n const allowOrigin = (\r\n Array.isArray(config.limits.allowOrigin)\r\n ? config.limits.allowOrigin\r\n : [config.limits.allowOrigin]\r\n ).map((d) => d.replace(/^[a-z]+:\\/\\//, ''))\r\n const allowOriginItem = allowOrigin.find((o) => origin.endsWith(o))\r\n if (allowOriginItem) {\r\n res.setHeader('Access-Control-Allow-Origin', allowOriginItem)\r\n } else {\r\n res.setHeader('Access-Control-Allow-Origin', '*')\r\n }\r\n } else {\r\n res.setHeader('Access-Control-Allow-Origin', originWithProtocol)\r\n }\r\n // Set default headers\r\n res.setHeader('Server', 'IntREST')\r\n res.setHeader('Accept', [\r\n 'application/json',\r\n 'application/xml',\r\n 'x-www-form-urlencoded',\r\n 'multipart/form-data',\r\n ])\r\n res.setHeader('Accept-Encoding', ['gzip', 'x-gzip', 'deflate', 'identity'])\r\n res.setHeader('Access-Control-Allow-Methods', [\r\n 'GET',\r\n 'POST',\r\n 'PUT',\r\n 'PATCH',\r\n 'DELETE',\r\n 'OPTIONS',\r\n ])\r\n res.setHeader('Access-Control-Allow-Headers', [\r\n 'Content-Length',\r\n 'Content-Type',\r\n 'Authorization',\r\n 'Range',\r\n '*',\r\n ...(config.limits?.allowHeaders || []),\r\n ])\r\n res.setHeader('Access-Control-Allow-Credentials', 'true')\r\n res.setHeader('Access-Control-Max-Age', '86400')\r\n res.setHeader('Accept-Ranges', 'bytes')\r\n res.setHeader('Connection', 'keep-alive')\r\n res.setHeader('Keep-Alive', ['timeout=5', 'max=30'])\r\n // Start the request time\r\n const startRequestTime = performance.now()\r\n if (/^options$/i.test(method)) {\r\n res.statusCode = StatusCodes.NO_CONTENT\r\n res.end()\r\n return\r\n }\r\n // Check if the content type is acceptable\r\n if (!regexpPatterns.isAcceptableContentType.test(contentType)) {\r\n res.writeHead(StatusCodes.UNSUPPORTED_MEDIA_TYPE, {\r\n 'Content-Type': 'application/json',\r\n })\r\n debugRequest(\r\n startRequestTime,\r\n method,\r\n path,\r\n StatusCodes.UNSUPPORTED_MEDIA_TYPE,\r\n )\r\n return res.end(\r\n JSON.stringify({\r\n message:\r\n config.messages?.UNSUPPORTED_MEDIA_TYPE || 'Unsupported media type',\r\n }),\r\n )\r\n }\r\n let body = {} as Record<string, any>\r\n // Check if the body size is acceptable\r\n const bodySize =\r\n (req.headers['content-length'] &&\r\n parseInt(req.headers['content-length'])) ||\r\n 0\r\n const maxBodySize = parseStringBytesToNumber(\r\n config.limits?.bodyMaxSize || '10mb',\r\n )\r\n if (bodySize > maxBodySize) {\r\n res.writeHead(StatusCodes.REQUEST_TOO_LONG, {\r\n 'Content-Type': 'application/json',\r\n })\r\n debugRequest(startRequestTime, method, path, StatusCodes.REQUEST_TOO_LONG)\r\n return res.end(\r\n JSON.stringify({\r\n message:\r\n config.messages?.REQUEST_TOO_LONG || 'Request entity too large',\r\n }),\r\n )\r\n }\r\n const filesToBeRemoved: string[] = []\r\n // Parse the body if the method is not GET\r\n if (!/^get$/i.test(method)) {\r\n // x-www-form-urlencoded and multipart/form-data\r\n try {\r\n if (regexpPatterns.isBusboyContentType.test(contentType)) {\r\n await new Promise<void>((resolve, reject) => {\r\n const bb = busboy({ headers: req.headers })\r\n bb.on('file', (name, file, info) => {\r\n const { filename, encoding, mimeType: mimetype } = info\r\n const fileHash = randomUUID()\r\n const filePath = normalizePath(join(appTempPath, fileHash))\r\n const fileMetadata = {\r\n absolutePath: filePath,\r\n filename,\r\n encoding,\r\n mimetype,\r\n } as IntREST.FileMetadata\r\n _.set(body, name, fileMetadata)\r\n filesToBeRemoved.push(filePath)\r\n const fileWriter = createWriteStream(filePath, {\r\n flags: 'w',\r\n })\r\n file.pipe(fileWriter, {\r\n end: true,\r\n })\r\n })\r\n bb.on('field', (name, val) => {\r\n _.set(body, name, parseStringToAutoDetectValue(val))\r\n })\r\n bb.on('close', resolve)\r\n bb.on('error', reject)\r\n req.pipe(bb, {\r\n end: true,\r\n })\r\n })\r\n } else {\r\n // application/json and application/xml\r\n const buffer = await new Promise<Buffer>((resolve) => {\r\n const writer = concat(resolve)\r\n req.pipe(writer)\r\n })\r\n const encoding = req.headers['content-encoding'] || 'identity'\r\n const bodyString =\r\n (\r\n await parseDecompressBuffer(\r\n buffer,\r\n encoding.split(/, */) as IntREST.RequestEncoding[],\r\n )\r\n ).toString() || '{}' // default to empty object\r\n if (regexpPatterns.isJSONContentType.test(contentType)) {\r\n body = JSON.parse(bodyString)\r\n } else {\r\n // is XML Content-Type\r\n const parser = new XMLParser({\r\n ignoreAttributes: false,\r\n allowBooleanAttributes: true,\r\n attributeNamePrefix: '',\r\n attributesGroupName: '$attributes',\r\n commentPropName: '$comment',\r\n cdataPropName: '$cdata',\r\n textNodeName: '$text',\r\n alwaysCreateTextNode: true,\r\n parseTagValue: true,\r\n unpairedTags: ['meta', 'link', 'img', 'br', 'hr', 'input'],\r\n })\r\n if (!XMLValidator.validate(bodyString)) {\r\n throw new Error('Invalid XML')\r\n }\r\n body = parser.parse(bodyString)\r\n }\r\n }\r\n } catch (err: any) {\r\n res.writeHead(StatusCodes.BAD_REQUEST, {\r\n 'Content-Type': 'application/json',\r\n })\r\n debugRequest(startRequestTime, method, path, StatusCodes.BAD_REQUEST)\r\n return res.end(\r\n JSON.stringify({\r\n message: 'Invalid body',\r\n error: err.message || err.toString(),\r\n }),\r\n )\r\n }\r\n }\r\n const cookies = cookie.parse(req.headers.cookie || '')\r\n try {\r\n await tunnel(\r\n {\r\n basePath,\r\n config,\r\n data: {\r\n method,\r\n path,\r\n custom: {},\r\n headers: req.headers,\r\n cookies,\r\n body,\r\n query,\r\n origin: {\r\n url:\r\n originWithProtocol === '*'\r\n ? undefined\r\n : new URL(originWithProtocol),\r\n ip: ipOrigin,\r\n },\r\n },\r\n },\r\n (state, data) => {\r\n if (state === 'cookie') {\r\n const { name, value, options } = data as ResponseDataMap['cookie']\r\n if (options?.maxAge && typeof options?.maxAge === 'string') {\r\n options.maxAge = ms(options.maxAge)\r\n }\r\n res.setHeader(\r\n 'Set-Cookie',\r\n cookie.serialize(name, value, options as any),\r\n )\r\n } else if (state === 'clear-cookie') {\r\n const { name, options } = data as ResponseDataMap['clear-cookie']\r\n if (options?.maxAge && typeof options?.maxAge === 'string') {\r\n options.maxAge = ms(options.maxAge)\r\n }\r\n res.setHeader(\r\n 'Set-Cookie',\r\n cookie.serialize(name, '', options as any),\r\n )\r\n } else if (state === 'set') {\r\n const [name, value] = data as ResponseDataMap['set']\r\n res.setHeader(name, value || '')\r\n } else if (state === 'write') {\r\n const buffer = data as ResponseDataMap['write']\r\n res.write(buffer)\r\n } else if (state === 'status') {\r\n res.statusCode = data as ResponseDataMap['status']\r\n } else if (state === 'end') {\r\n if (\r\n filesToBeRemoved.length &&\r\n config.removeUploadFilesAfterResponse\r\n ) {\r\n for (const file of filesToBeRemoved) {\r\n try {\r\n rmSync(file)\r\n } catch (err: any) {\r\n console.error(`Error removing file ${file}`, err.message)\r\n }\r\n }\r\n }\r\n debugRequest(startRequestTime, method, path, res.statusCode)\r\n res.end()\r\n }\r\n },\r\n )\r\n } catch (err) {\r\n console.error(err)\r\n res.writeHead(StatusCodes.INTERNAL_SERVER_ERROR, {\r\n 'Content-Type': 'application/json',\r\n })\r\n debugRequest(\r\n startRequestTime,\r\n method,\r\n path,\r\n StatusCodes.INTERNAL_SERVER_ERROR,\r\n )\r\n return res.end(\r\n JSON.stringify({\r\n message:\r\n config.messages?.INTERNAL_SERVER_ERROR || 'Internal server error',\r\n }),\r\n )\r\n }\r\n }\r\n}\r\n", "import type { Readable } from 'stream'\nimport {\n createDeflate,\n createGunzip,\n createGzip,\n createInflate,\n deflate,\n gunzip,\n gzip,\n inflate,\n} from 'zlib'\n\n/**\n * Parse string bytes to number\n * 1kb = 1024 bytes\n * 1mb = 1048576 bytes\n * 1gb = 1073741824 bytes\n * 1tb = 1099511627776 bytes\n *\n * @param bytes\n * @returns\n */\nexport function parseStringBytesToNumber(bytes: string | number): number {\n if (typeof bytes !== 'string') return bytes\n\n const [, size, unit] = bytes.match(/^(\\d+)([kmgt]b?)$/i) || []\n if (!size || !unit) return 0\n const sizeNumber = parseInt(size)\n if (isNaN(sizeNumber)) return 0\n switch (unit.toLowerCase()) {\n case 'tb':\n return sizeNumber * 1024 * 1024 * 1024 * 1024\n case 'gb':\n return sizeNumber * 1024 * 1024 * 1024\n case 'mb':\n return sizeNumber * 1024 * 1024\n case 'kb':\n return sizeNumber * 1024\n default:\n return sizeNumber\n }\n}\n\n/**\n * If detect string is number or boolean, parse it to number or boolean\n */\nexport function parseStringToAutoDetectValue(val?: string | null) {\n switch (true) {\n case val == null:\n return undefined\n case /^(no|n|false|f|off)$/i.test(val!):\n return false\n case /^(yes|y|true|t|on)$/i.test(val!):\n return true\n case !isNaN(parseFloat(val!)):\n return parseFloat(val!)\n default:\n return val\n }\n}\n\n/**\n * Decompress buffer with gzip and/or deflate encoding\n *\n * @param data\n * @param encoding\n * @returns\n */\nexport async function parseDecompressBuffer(\n data: Buffer,\n encoding: IntREST.RequestEncoding[] = ['identity'],\n) {\n let buffer = data\n for (const enc of encoding) {\n if (/^gzip$/i.test(enc)) {\n buffer = await new Promise<Buffer>((resolve, reject) => {\n gunzip(buffer, (err, res) => {\n if (err) return reject(err)\n resolve(res)\n })\n })\n } else if (/^deflate$/i.test(enc)) {\n buffer = await new Promise<Buffer>((resolve, reject) => {\n inflate(buffer, (err, res) => {\n if (err) return reject(err)\n resolve(res)\n })\n })\n }\n }\n return buffer\n}\n\n/**\n * Compress buffer with gzip and/or deflate encoding\n *\n * @param data\n * @param encoding\n * @returns\n */\nexport async function parseCompressBuffer(\n data: Buffer,\n encoding: IntREST.RequestEncoding[] = ['identity'],\n) {\n let buffer = data\n for (const enc of encoding) {\n if (/^gzip$/i.test(enc)) {\n buffer = await new Promise<Buffer>((resolve, reject) => {\n gzip(buffer, (err, res) => {\n if (err) return reject(err)\n resolve(res)\n })\n })\n } else if (/^deflate$/i.test(enc)) {\n buffer = await new Promise<Buffer>((resolve, reject) => {\n deflate(buffer, (err, res) => {\n if (err) return reject(err)\n resolve(res)\n })\n })\n }\n }\n return buffer\n}\n\n/**\n * Decompress stream piping with gzip and/or deflate encoding\n *\n * @param data\n * @param encoding\n * @returns\n */\nexport async function parseDecompressStream(\n data: Readable,\n encoding: IntREST.RequestEncoding[] = ['identity'],\n) {\n let stream = data\n for (const enc of encoding) {\n if (/^gzip$/i.test(enc)) {\n stream = stream.pipe(createGunzip())\n } else if (/^deflate$/i.test(enc)) {\n stream = stream.pipe(createInflate())\n }\n }\n return stream\n}\n\n/**\n * Compress stream piping with gzip and/or deflate encoding\n *\n * @param data\n * @param encoding\n * @returns\n */\nexport async function parseCompressStream(\n data: Readable,\n encoding: IntREST.RequestEncoding[] = ['identity'],\n) {\n let stream = data\n for (const enc of encoding) {\n if (/^gzip$/i.test(enc)) {\n stream = stream.pipe(createGzip())\n } else if (/^deflate$/i.test(enc)) {\n stream = stream.pipe(createDeflate())\n }\n }\n return stream\n}\n"],
"mappings": "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",
"names": ["ck", "selfSigned", "existsSync", "mkdirSync", "rmSync", "createSecureServer", "createServer", "join", "isDev", "globPatterns", "regexpPatterns", "defaultPaths", "randomUUID", "Worker", "join", "glob", "join", "normalize", "pathToFileURL", "normalizePath", "pathname", "normalize", "getModule", "configPath", "configURL", "pathToFileURL", "m", "globFind", "pattern", "res", "glob", "join", "workerURL", "path", "normalizePath", "join", "workerPool", "startWorker", "size", "i", "worker", "Worker", "defaultPaths", "workerTunnel", "basePath", "data", "config", "cb", "resolve", "reject", "requestId", "randomUUID", "workerList", "workerPool", "workerItem", "w", "worker", "workerId", "Worker", "workerURL", "defaultPaths", "a", "b", "handleExit", "code", "handleError", "err", "handleMessage", "r", "busboy", "ck", "concat", "cookie", "randomUUID", "XMLParser", "XMLValidator", "createWriteStream", "rmSync", "StatusCodes", "getReasonPhrase", "_", "ms", "join", "performance", "createDeflate", "createGunzip", "createGzip", "createInflate", "deflate", "gunzip", "gzip", "inflate", "parseStringBytesToNumber", "bytes", "size", "unit", "sizeNumber", "parseStringToAutoDetectValue", "val", "parseDecompressBuffer", "data", "encoding", "buffer", "enc", "resolve", "reject", "err", "res", "debugRequest", "startRequestTime", "method", "path", "status", "ck", "getReasonPhrase", "performance", "buildRequestHandlerV2", "tunnel", "req", "res", "basePath", "configPath", "globFind", "globPatterns", "config", "getModule", "appTempPath", "normalizePath", "join", "prePath", "preQuery", "query", "contentType", "pureOrigin", "ipOrigin", "origin", "originWithProtocol", "isDev", "allowOriginItem", "d", "o", "StatusCodes", "regexpPatterns", "body", "bodySize", "maxBodySize", "parseStringBytesToNumber", "filesToBeRemoved", "resolve", "reject", "bb", "busboy", "name", "file", "info", "filename", "encoding", "mimetype", "fileHash", "randomUUID", "filePath", "fileMetadata", "_", "fileWriter", "createWriteStream", "val", "parseStringToAutoDetectValue", "buffer", "writer", "concat", "bodyString", "parseDecompressBuffer", "parser", "XMLParser", "XMLValidator", "err", "cookies", "cookie", "state", "data", "value", "options", "ms", "rmSync", "basePath", "configPath", "globFind", "globPatterns", "config", "getModule", "bootstrapPath", "defaultPaths", "bootstrap", "bootstrapHandler", "appPort", "appTempPath", "normalizePath", "join", "existsSync", "rmSync", "mkdirSync", "startWorker", "ssl", "selfSigned", "server", "isDev", "createSecureServer", "buildRequestHandlerV2", "workerTunnel", "createServer", "ck"]
}