@dooboostore/simple-boot-http-server 1.0.20 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.MD +24 -248
- package/dist/cjs/SimpleBootHttpServer.js +2 -2
- package/dist/cjs/SimpleBootHttpServer.js.map +2 -2
- package/dist/cjs/filters/ResourceFilter.js +59 -19
- package/dist/cjs/filters/ResourceFilter.js.map +2 -2
- package/dist/cjs/models/RequestResponse.js +23 -1
- package/dist/cjs/models/RequestResponse.js.map +2 -2
- package/dist/cjs/package.json +5 -0
- package/dist/esm/SimpleBootHttpServer.js +2 -2
- package/dist/esm/SimpleBootHttpServer.js.map +2 -2
- package/dist/esm/filters/ResourceFilter.js +56 -18
- package/dist/esm/filters/ResourceFilter.js.map +2 -2
- package/dist/esm/models/RequestResponse.js +23 -1
- package/dist/esm/models/RequestResponse.js.map +2 -2
- package/dist/esm-bundle/dooboostore-simple-boot-http-server.esm.js +166 -149
- package/dist/esm-bundle/dooboostore-simple-boot-http-server.esm.js.map +4 -4
- package/dist/types/SimpleBootHttpServer.d.ts +1 -2
- package/dist/types/SimpleBootHttpServer.d.ts.map +1 -1
- package/dist/types/filters/ResourceFilter.d.ts +16 -6
- package/dist/types/filters/ResourceFilter.d.ts.map +1 -1
- package/dist/types/index.d.ts +0 -38
- package/dist/types/models/RequestResponse.d.ts +2 -1
- package/dist/types/models/RequestResponse.d.ts.map +1 -1
- package/dist/umd-bundle/dooboostore-simple-boot-http-server.umd.js +173 -156
- package/dist/umd-bundle/dooboostore-simple-boot-http-server.umd.js.map +4 -4
- package/package.json +16 -15
- package/src/SimpleBootHttpServer.ts +2 -3
- package/src/filters/ResourceFilter.ts +67 -20
- package/src/models/RequestResponse.ts +26 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/models/RequestResponse.ts"],
|
|
4
|
-
"sourcesContent": ["import { IncomingMessage, OutgoingHttpHeader, OutgoingHttpHeaders, ServerResponse } from 'http';\nimport { HttpHeaders, HttpHeadersType } from '../codes/HttpHeaders';\nimport { Mimes } from '../codes/Mimes';\nimport { Intent } from '@dooboostore/simple-boot/intent/Intent';\nimport { URL, URLSearchParams } from 'url';\nimport { Buffer } from 'buffer';\nimport { MultipartData } from './datas/MultipartData';\nimport { ReqFormUrlBody } from './datas/body/ReqFormUrlBody';\nimport { ReqJsonBody } from './datas/body/ReqJsonBody';\nimport { ReqHeader } from './datas/ReqHeader';\nimport { ReqMultipartFormBody } from './datas/body/ReqMultipartFormBody';\nimport { HttpStatus } from '../codes/HttpStatus';\nimport { gzip } from 'node-gzip';\nimport { SessionManager } from '../session/SessionManager';\nimport { HttpServerOption } from '../option/HttpServerOption';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport { RandomUtils } from '@dooboostore/core/random/RandomUtils';\nimport { FileUtils } from '@dooboostore/core-node/file/FileUtils';\nimport { ConvertUtils as CoreConvertUtils} from '@dooboostore/core/convert/ConvertUtils';\nimport { ConvertUtils } from '@dooboostore/core-node/convert/ConvertUtils';\n// https://masteringjs.io/tutorials/node/http-request\ntype Config = { sessionManager?: SessionManager, option: HttpServerOption };\n\n// https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/\nexport class RequestResponse {\n protected resWriteChunk: string | Buffer | undefined;\n protected reqBodyChunk?: Buffer;\n protected req: IncomingMessage;\n protected res: ServerResponse;\n protected config: Config;\n // protected sessionManager?: SessionManager;\n\n // constructor(req: IncomingMessage, res: ServerResponse);\n // constructor(req: RequestResponse);\n // constructor(req: IncomingMessage, res: ServerResponse, sessionManager?: SessionManager);\n // constructor(req: IncomingMessage | RequestResponse, res?: ServerResponse, sessionManager?: SessionManager) {\n // // this.req = req;\n // // this.res = res;\n // if (req instanceof RequestResponse) {\n // this.req = req.req;\n // this.res = req.res;\n // this.sessionManager = req.sessionManager;\n // } else {\n // this.req = req;\n // this.res = res!;\n // this.sessionManager = sessionManager;\n // }\n // }\n constructor(req: IncomingMessage | RequestResponse, res: ServerResponse, config: Config) {\n // this.req = req;\n // this.res = res;\n if (req instanceof RequestResponse) {\n this.req = req.req;\n this.res = req.res;\n this.config = config;\n } else {\n this.req = req;\n this.res = res!;\n this.config = config;\n }\n }\n\n get reqSocket() {\n return this.req.socket;\n }\n\n get reqCookieMap() {\n let cookies = this.reqHeader(HttpHeaders.Cookie) ?? '';\n if (Array.isArray(cookies)) {\n cookies = cookies.join(';')\n }\n\n const map = new Map<string, string>();\n cookies.split(';').map(it => it.trim().split('=')).forEach(it => {\n map.set(it[0], it[1]);\n });\n return map;\n }\n\n reqCookieGet(key: string) {\n return this.reqCookieMap.get(key);\n }\n\n get reqRemoteAddress(): string | undefined {\n const ipHeader = this.req.headers['x-forwarded-for'];\n let ip = this.req.socket.remoteAddress;\n if (Array.isArray(ipHeader)) {\n ip = ipHeader.join(',').split(',').shift();\n } else if (typeof ipHeader === 'string') {\n ip = ipHeader.split(',').shift();\n }\n return ip;\n }\n\n get reqUrlObject(): URL {\n return new URL(this.reqUrl, `${this.reqSocket ? 'https://' : 'http'}${this.reqHost ?? 'localhost'}`);\n }\n\n get reqUrlPathName(): string {\n // parse(rr.reqUrl ?? '', true)\n return this.reqUrlObj().pathname ?? '';\n }\n\n get reqUrl(): string {\n return this.req.url ?? '';\n }\n\n reqUrlObj(config?:{scheme?: string, host?: string}): URL {\n return new URL(`${config?.scheme??'http' }://${config?.host ? config?.host : (this.reqHeaderFirst(HttpHeaders.Host) ?? 'localhost')}${this.req.url ?? ''}`);\n }\n\n get reqUrlSearchParamTuples(): [string, string][] {\n return Array.from(this.reqUrlObj().searchParams as any);\n }\n\n get reqUrlSearchParams(): URLSearchParams {\n return this.reqUrlObj().searchParams;\n }\n\n get reqUrlSearchParamsObj(): {[p: string]: string | string[]} {\n const entries = this.reqUrlObj().searchParams;\n return CoreConvertUtils.toObject(entries);\n // return obj;\n // return Object.fromEntries(entries as any)\n }\n\n get reqPathSearchParamUrl(): string {\n const reqUrlObj = this.reqUrlObj();\n return reqUrlObj.pathname + (reqUrlObj.searchParams.toString() ? '?' + reqUrlObj.searchParams.toString() : '')\n }\n\n get reqReadable() {\n return this.req.readable;\n }\n\n get reqIntent() {\n return new Intent(this.reqPathSearchParamUrl);\n }\n\n reqHasContentTypeHeader(mime: Mimes | string): boolean {\n return (this.reqHeaderFirst(HttpHeaders.ContentType) ?? '').toLowerCase().indexOf(mime.toLocaleLowerCase()) > -1;\n }\n\n reqHasAcceptHeader(mime: Mimes | string): boolean {\n return (this.reqHeaderFirst(HttpHeaders.Accept) ?? '').toLowerCase().indexOf(mime.toLocaleLowerCase()) > -1;\n }\n\n reqBodyData(): Promise<Buffer> {\n return new Promise<Buffer>((resolve, reject) => {\n if (this.reqReadable) {\n const data: Uint8Array[] = [];\n this.req.on('data', (chunk) => data.push(chunk));\n this.req.on('error', err => reject(err));\n this.req.on('end', () => {\n this.reqBodyChunk = Buffer.concat(data);\n resolve(this.reqBodyChunk);\n });\n } else {\n resolve(this.reqBodyChunk ?? Buffer.alloc(0));\n }\n });\n }\n \n resBodyData(): string | Buffer | undefined{\n return this.resWriteChunk;\n }\n\n\n\n async reqBodyMultipartFormDataObject<T>(): Promise<T> {\n const m = await this.reqBodyMultipartFormData();\n const formData = {} as any;\n\n for (const it of m) {\n if (it.isFile) {\n formData[it.name] = await FileUtils.writeFile(it.value, {originalName: it.filename });\n } else {\n const target = formData[it.name];\n if (Array.isArray(target)) {\n target.push(it.value);\n } else if (typeof target === 'string') {\n formData[it.name] = [target, it.value]\n } else {\n formData[it.name] = it.value;\n }\n }\n };\n return formData;\n }\n\n reqBodyMultipartFormData(): Promise<MultipartData[]> {\n return new Promise((resolve, reject) => {\n const contentTypeHeader = this.req.headers['content-type'];\n if (!contentTypeHeader || !contentTypeHeader.startsWith('multipart/form-data')) {\n return reject(new Error('Invalid Content-Type. Expected multipart/form-data.'));\n }\n\n const boundaryMatch = contentTypeHeader.match(/boundary=(?:\"([^\"]+)\"|([^;]+))/i);\n if (!boundaryMatch) {\n return reject(new Error('Boundary not found in Content-Type header.'));\n }\n const boundary = boundaryMatch[1] || boundaryMatch[2]; // \uB530\uC634\uD45C \uC720\uBB34 \uCC98\uB9AC\n if (!boundary) {\n return reject(new Error('Failed to extract boundary.'));\n }\n\n const boundaryBuffer = Buffer.from(`--${boundary}`);\n const crlfBuffer = Buffer.from('\\r\\n');\n const doubleCrlfBuffer = Buffer.from('\\r\\n\\r\\n'); // \uD5E4\uB354\uC640 \uBC14\uB514 \uAD6C\uBD84\uC790\n\n const chunks: Buffer[] = [];\n let totalLength = 0;\n\n this.req.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n totalLength += chunk.length;\n });\n\n this.req.on('error', (err) => {\n reject(err);\n });\n\n this.req.on('end', () => {\n if (totalLength === 0) {\n return resolve([]); // \uBE48 \uC694\uCCAD \uCC98\uB9AC\n }\n\n const fullBuffer = Buffer.concat(chunks, totalLength);\n const parsedParts: MultipartData[] = [];\n let currentPosition = 0;\n\n // \uCCAB \uBC88\uC9F8 boundary \uCC3E\uAE30 (\uBCF4\uD1B5 \uC2DC\uC791 \uBD80\uBD84\uC5D0 \uC788\uC74C)\n let boundaryStartIndex = fullBuffer.indexOf(boundaryBuffer, currentPosition);\n if (boundaryStartIndex === -1) {\n return reject(new Error('Initial boundary not found.'));\n }\n // boundary \uBC14\uB85C \uB2E4\uC74C \\r\\n \uAC74\uB108\uB6F0\uAE30\n currentPosition = boundaryStartIndex + boundaryBuffer.length;\n if (fullBuffer.slice(currentPosition, currentPosition + crlfBuffer.length).equals(crlfBuffer)) {\n currentPosition += crlfBuffer.length;\n }\n\n\n while (currentPosition < fullBuffer.length) {\n // \uB2E4\uC74C boundary \uCC3E\uAE30 (\uD30C\uD2B8\uC758 \uB05D)\n const nextBoundaryIndex = fullBuffer.indexOf(boundaryBuffer, currentPosition);\n if (nextBoundaryIndex === -1) {\n // \uB9C8\uC9C0\uB9C9 boundary (--)\uC778\uC9C0 \uD655\uC778 \uD544\uC694\uD558\uB098, \uC5EC\uAE30\uC11C\uB294 \uB2E8\uC21C\uD558\uAC8C \uCC98\uB9AC\n // console.warn('Next boundary not found, assuming end of data or malformed.');\n break;\n }\n\n // \uD604\uC7AC \uD30C\uD2B8 \uB370\uC774\uD130 \uCD94\uCD9C (boundary \uC774\uC804\uAE4C\uC9C0)\n // \uC2E4\uC81C \uD30C\uD2B8 \uB370\uC774\uD130\uB294 \uB2E4\uC74C boundary \uBC14\uB85C \uC55E\uC758 \\r\\n\uC744 \uC81C\uC678\uD574\uC57C \uD568\n let partEndIndex = nextBoundaryIndex;\n if (partEndIndex > crlfBuffer.length && fullBuffer.slice(partEndIndex - crlfBuffer.length, partEndIndex).equals(crlfBuffer)) {\n partEndIndex -= crlfBuffer.length;\n }\n const partBuffer = fullBuffer.slice(currentPosition, partEndIndex);\n\n // \uD5E4\uB354\uC640 \uBC14\uB514 \uBD84\uB9AC\n const headerBodySeparatorIndex = partBuffer.indexOf(doubleCrlfBuffer);\n if (headerBodySeparatorIndex === -1) {\n console.warn('Skipping malformed part: no header/body separator found.');\n currentPosition = nextBoundaryIndex + boundaryBuffer.length;\n if (fullBuffer.slice(currentPosition, currentPosition + crlfBuffer.length).equals(crlfBuffer)) {\n currentPosition += crlfBuffer.length;\n }\n if (fullBuffer.slice(currentPosition, currentPosition + 2).toString() === '--') break; // \uB9C8\uC9C0\uB9C9 boundary\n continue;\n }\n\n const headerBuffer = partBuffer.slice(0, headerBodySeparatorIndex);\n const bodyBuffer = partBuffer.slice(headerBodySeparatorIndex + doubleCrlfBuffer.length);\n const headersStr = headerBuffer.toString('utf-8'); // \uD5E4\uB354\uB294 \uBCF4\uD1B5 ASCII/UTF-8\n\n // \uD5E4\uB354 \uD30C\uC2F1\n const headers: { [key: string]: string } = {};\n headersStr.split('\\r\\n').forEach(line => {\n const colonIndex = line.indexOf(':');\n if (colonIndex > 0) {\n const key = line.substring(0, colonIndex).trim().toLowerCase();\n const value = line.substring(colonIndex + 1).trim();\n headers[key] = value;\n }\n });\n\n const contentDisposition = headers['content-disposition'];\n if (!contentDisposition) {\n console.warn('Skipping part: no Content-Disposition header.');\n currentPosition = nextBoundaryIndex + boundaryBuffer.length;\n if (fullBuffer.slice(currentPosition, currentPosition + crlfBuffer.length).equals(crlfBuffer)) {\n currentPosition += crlfBuffer.length;\n }\n if (fullBuffer.slice(currentPosition, currentPosition + 2).toString() === '--') break;\n continue;\n }\n\n const nameMatch = contentDisposition.match(/name=\"([^\"]+)\"/i);\n const filenameMatch = contentDisposition.match(/filename=\"([^\"]+)\"/i);\n\n const name = nameMatch ? nameMatch[1] : null;\n const filename = filenameMatch ? filenameMatch[1] : null;\n const contentType = headers['content-type'] || null;\n\n if (name) {\n\n const isFile = !!filename;\n // @ts-ignore\n const multipartData:MultipartData = {\n name:name,\n isFile: isFile, // filename\uC774 \uC788\uC73C\uBA74 \uD30C\uC77C\uB85C \uAC04\uC8FC\n filename: filename,\n contentType: contentType,\n value: isFile ? bodyBuffer: bodyBuffer.toString('utf-8'),\n }\n parsedParts.push(multipartData);\n } else {\n console.warn(\"Skipping part: 'name' not found in Content-Disposition.\");\n }\n\n // \uB2E4\uC74C \uD30C\uD2B8 \uC2DC\uC791 \uC704\uCE58\uB85C \uC774\uB3D9\n currentPosition = nextBoundaryIndex + boundaryBuffer.length;\n // boundary \uBC14\uB85C \uB2E4\uC74C \\r\\n \uAC74\uB108\uB6F0\uAE30\n if (fullBuffer.slice(currentPosition, currentPosition + crlfBuffer.length).equals(crlfBuffer)) {\n currentPosition += crlfBuffer.length;\n }\n\n // \uB9C8\uC9C0\uB9C9 boundary (--)\uC778\uC9C0 \uD655\uC778\uD558\uACE0 \uB8E8\uD504 \uC885\uB8CC\n if (fullBuffer.slice(currentPosition, currentPosition + 2).toString() === '--') {\n break;\n }\n }\n resolve(parsedParts);\n });\n })\n // const form = formidable({});\n // return new Promise((resolve, reject) => {\n // form.parse(this.req, (err, fields, files) => {\n // if (err) {\n // reject(err);\n // return;\n // }\n //\n // console.log('----', files)\n // // this.res.set('Content-Type', 'application/json');\n // // ctx.status = 200;\n // // ctx.state = { fields, files };\n // // ctx.body = JSON.stringify(ctx.state, null, 2);\n // resolve(' ' as any);\n // });\n // });\n\n // return new Promise<MultipartData<any>[]>((resolve, reject) => {\n //\n //\n // const contentType = this.req.headers['content-type'];\n // const boundary = contentType.split('boundary=')[1];\n //\n // let body: Uint8Array[] = [];\n // this.req.on('data', chunk => body.push(chunk));\n // this.req.on('end', async () => {\n // const buffer = Buffer.concat(body);\n // // Boundary\uB85C \uD30C\uD2B8 \uBD84\uB9AC\n // const parts = buffer.toString().split(`--${boundary}`).slice(1, -1);\n // let jsonData = {};\n // let fileData = null;\n //\n // for (let part of parts) {\n // const [headerPart, ...bodyParts] = part.split('\\r\\n\\r\\n');\n // const headers = headerPart.split('\\r\\n').reduce((acc, line) => {\n // const [key, value] = line.split(': ').map(s => s.trim().toLowerCase());\n // if (key) acc[key] = value;\n // return acc;\n // }, {});\n //\n // const content = bodyParts.join('\\r\\n\\r\\n').trim();\n // const disposition = headers['content-disposition'];\n // const name = disposition?.match(/name=\"([^\"]+)\"/)?.[1];\n // const filename = disposition?.match(/filename=\"([^\"]+)\"/)?.[1];\n //\n // if (filename) {\n // // \uD30C\uC77C \uB370\uC774\uD130 (Blob)\n // fileData = { filename, contentType: headers['content-type'], data: Buffer.from(content, 'binary') };\n // } else if (name) {\n // // \uD14D\uC2A4\uD2B8 \uB370\uC774\uD130\n // if (name === 'metadata') jsonData = JSON.parse(content);\n // }\n // }\n //\n // // \uD30C\uC77C \uC800\uC7A5\n // if (fileData) {\n //\n //\n //\n //\n // const uploadPath = this.config.option.fileUploadTempPath || os.tmpdir();\n // fs.mkdirSync(uploadPath, { recursive: true }); // \uD3F4\uB354\uAC00 \uC5C6\uC73C\uBA74 \uC0DD\uC131\n // const saveTempPath = `${uploadPath}/${RandomUtils.uuid4()}${fileData.filename}`;\n // console.log('saveTempPathsaveTempPath', saveTempPath)\n // await fs.promises.writeFile(saveTempPath, fileData.data);\n // this.res.writeHead(200, { 'Content-Type': 'application/json' });\n // this.res.end(JSON.stringify({ message: '\uC5C5\uB85C\uB4DC \uC131\uACF5', jsonData, filename: fileData?.filename }));\n // // const uploadPath = this.config.option.fileUploadTempPath ;\n // // fs.mkdirSync(uploadPath, { recursive: true }); // \uD3F4\uB354\uAC00 \uC5C6\uC73C\uBA74 \uC0DD\uC131\n // // await fs.writeFile(`${uploadPath}/${fileData.filename}`, fileData.data);\n // }\n // });\n // });\n }\n\n async reqBodyStringData(): Promise<string> {\n const data = (await this.reqBodyData()).toString()\n return data;\n }\n\n async reqBodyJsonData<T>(): Promise<T> {\n return JSON.parse(await this.reqBodyStringData());\n }\n\n async reqBodyFormUrlData<T>(): Promise<T> {\n const data = (await this.reqBodyStringData())\n const formData = {} as any;\n Array.from(new URLSearchParams(data).entries()).forEach(([k, v]) => {\n const target = formData[k];\n if (Array.isArray(target)) {\n target.push(v);\n } else if (typeof target === 'string') {\n formData[k] = [target, v]\n } else {\n formData[k] = v;\n }\n });\n return formData;\n }\n\n async reqBodyReqFormUrlBody() {\n const data = await this.reqBodyFormUrlData()\n return Object.assign(new ReqFormUrlBody(), data);\n }\n\n async reqBodyReqJsonBody(): Promise<ReqJsonBody> {\n const data = (await this.reqBodyStringData());\n return Object.assign(new ReqJsonBody(), data ? JSON.parse(data) : {})\n }\n\n // reqBodyReqMultipartFormBody(): Promise<ReqMultipartFormBody> {\n // return this.reqBodyMultipartFormData().then(it => new ReqMultipartFormBody(it))\n // }\n\n resBodyJsonData<T>(): (T | null) {\n const data = ConvertUtils.toString(this.resBodyData());\n return data ? JSON.parse(data) : null;\n }\n\n resBodyStringData() {\n return ConvertUtils.toString(this.resBodyData());\n }\n\n reqMethod() {\n return this.req.method?.toUpperCase();\n }\n\n reqHeader(key: keyof typeof HttpHeaders | string) {\n return this.req.headers[key.toLowerCase()];\n }\n\n get reqHost() {\n return this.reqHeaderFirst(HttpHeaders.Host)\n }\n\n get reqHeaderObj(): ReqHeader {\n const h = new ReqHeader();\n Object.entries(this.req.headers).forEach(([k, v]) => {\n h[k] = v;\n });\n return h;\n }\n\n reqHeaderFirst(key: HttpHeadersType | string, defaultValue?: string) {\n const header = this.req.headers[key.toLowerCase()];\n if (header && Array.isArray(header)) {\n return header[0] ?? defaultValue;\n } else {\n return (header as string) ?? defaultValue;\n }\n }\n\n public reqAuthorizationHeader() {\n return this.reqHeaderFirst(HttpHeaders.Authorization);\n }\n\n reqRefreshTokenHeader() {\n return this.reqHeaderFirst(HttpHeaders.Authorization);\n }\n\n resStatusCode(code?: undefined): number;\n // eslint-disable-next-line no-dupe-class-members\n resStatusCode(code: number | HttpStatus): RequestResponseChain<number>;\n // eslint-disable-next-line no-dupe-class-members\n resStatusCode(code: number | undefined | HttpStatus): number | RequestResponseChain<number> {\n if (code) {\n this.res.statusCode = code;\n return new RequestResponseChain<number>(this.req, this.res, this.config, this.res.statusCode);\n } else {\n return this.res.statusCode;\n }\n }\n\n resHeader(key: HttpHeadersType | string) {\n return this.res.getHeader(key.toLowerCase());\n }\n\n resHeaderFirst(key: HttpHeadersType | string, defaultValue?: string) {\n const header = this.res.getHeader(key.toLowerCase());\n if (header && Array.isArray(header)) {\n return header[0] ?? defaultValue;\n } else {\n return (header as string) ?? defaultValue;\n }\n }\n\n async reqSession(): Promise<{ [key: string]: any }> {\n if (this.config.sessionManager) {\n return (await this.config.sessionManager.session(this)).dataSet.data;\n } else {\n return Promise.reject(new Error('Not SessionManager'));\n }\n }\n\n reqSessionSet(key: string, value: any): void {\n (this.reqSession as any)[key] = value;\n }\n\n reqSessionGet<T = any>(key: string): T | undefined {\n const session = this.reqSession as any;\n if (session) {\n return session[key] as T;\n }\n }\n\n resSetStatusCode(statusCode: number) {\n this.res.statusCode = statusCode;\n return this.createRequestResponseChain(this.res.statusCode);\n }\n\n // resEnd() {\n // this.res.end();\n // }\n\n // eslint-disable-next-line no-undef\n resWrite(chunk: string | Buffer | any, encoding: BufferEncoding = 'utf8') {\n this.resWriteChunk = chunk;\n return this.createRequestResponseChain(this.resWriteChunk);\n }\n\n // eslint-disable-next-line no-undef\n resWriteJson(chunk: any, encoding: BufferEncoding = 'utf8') {\n return this.resWrite(JSON.stringify(chunk), encoding);\n }\n\n resSetHeader(key: HttpHeadersType | string, value: string | string[]) {\n return this.createRequestResponseChain(this.res.setHeader(key.toLowerCase(), value));\n }\n\n resAddHeader(key: HttpHeadersType | string, value: string | string[]) {\n const existingValue = this.res.getHeader(key.toLowerCase());\n const newValue = Array.isArray(existingValue)\n ? existingValue.concat(value)\n : existingValue\n ? [existingValue.toString(), ...[].concat(value)]\n : value;\n return this.createRequestResponseChain(this.res.setHeader(key.toLowerCase(), newValue));\n }\n\n resSetHeaders(headers: { [key: string]: string | string[] }) {\n Object.entries(headers).forEach(([key, value]) => this.resSetHeader(key, value));\n return this.createRequestResponseChain();\n }\n\n resAddHeaders(headers: { [key: string]: string | string[] }) {\n Object.entries(headers).forEach(([key, value]) => this.resAddHeader(key, value));\n return this.createRequestResponseChain();\n }\n\n // \uB9C8\uC9C0\uB9C9 \uC885\uB8CC\uB420\uB54C \uD0C0\uB294\uAC70.\n private async resEndChunk() {\n const encoding = this.reqHeaderFirst(HttpHeaders.AcceptEncoding);\n let data = this.resWriteChunk;\n if (encoding?.includes('gzip')) {\n data = await gzip(data);\n this.resSetHeader(HttpHeaders.ContentEncoding, 'gzip');\n }\n this.res.end(data);\n }\n\n async resEnd(chunk?: string | Buffer) {\n this.resWriteChunk = chunk ?? this.resWriteChunk;\n if (this.req.readable) {\n await this.reqBodyData();\n await this.resEndChunk();\n } else {\n await this.resEndChunk();\n }\n }\n\n // writeContinue(callback?: () => void) {\n // this.res.writeContinue(callback);\n // return new RequestResponseChain(this.req, this.res);\n // }\n\n // reqWrite(chunk?: any) {\n // this.resWriteChunk = chunk;\n // // this.res.write(chunk);\n // return this.createRequestResponseChain();\n // }\n\n resWriteHead(statusCode: number, headers?: OutgoingHttpHeaders | OutgoingHttpHeader[] | { [key: string]: string | string[] }) {\n return this.createRequestResponseChain(this.res.writeHead(statusCode, headers));\n }\n resWriteHeadEnd(statusCode: number, headers?: OutgoingHttpHeaders | OutgoingHttpHeader[] | { [key: string]: string | string[] }) {\n this.createRequestResponseChain(this.res.writeHead(statusCode, headers));\n this.res.end();\n }\n\n resIsDone() {\n return this.res.finished || this.res.writableEnded || this.res.headersSent;\n // return new RequestResponseChain(this.req, this.res, this.res.finished || this.res.writableEnded);\n }\n\n createRequestResponseChain<T = any>(data?: T) {\n const requestResponseChain = new RequestResponseChain(this.req, this.res, this.config, data);\n requestResponseChain.resWriteChunk = this.resWriteChunk;\n requestResponseChain.reqBodyChunk = this.reqBodyChunk;\n return requestResponseChain;\n }\n\n // res.on(\"readable\", () => {\n // console.log('readable???')\n // });\n // res.on('complete', function (details) {\n // var size = details.req.bytes;\n // console.log('complete-->', size)\n // });\n // res.on('finish', function() {\n // console.log('finish??');\n // });\n // res.on('end', () => {\n // console.log('end--?')\n // });\n}\n\nexport class RequestResponseChain<T> extends RequestResponse {\n constructor(req: IncomingMessage, res: ServerResponse, config: Config, public result?: T) {\n super(req, res, config);\n }\n}"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { IncomingMessage, OutgoingHttpHeader, OutgoingHttpHeaders, ServerResponse } from 'http';\nimport { HttpHeaders, HttpHeadersType } from '../codes/HttpHeaders';\nimport { Mimes } from '../codes/Mimes';\nimport { Intent } from '@dooboostore/simple-boot/intent/Intent';\nimport { URL, URLSearchParams } from 'url';\nimport { Buffer } from 'buffer';\nimport { MultipartData } from './datas/MultipartData';\nimport { ReqFormUrlBody } from './datas/body/ReqFormUrlBody';\nimport { ReqJsonBody } from './datas/body/ReqJsonBody';\nimport { ReqHeader } from './datas/ReqHeader';\nimport { ReqMultipartFormBody } from './datas/body/ReqMultipartFormBody';\nimport { HttpStatus } from '../codes/HttpStatus';\nimport { gzip } from 'node-gzip';\nimport { SessionManager } from '../session/SessionManager';\nimport { HttpServerOption } from '../option/HttpServerOption';\nimport { Blob } from 'node:buffer';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport { RandomUtils } from '@dooboostore/core/random/RandomUtils';\nimport { FileUtils } from '@dooboostore/core-node/file/FileUtils';\nimport { ConvertUtils as CoreConvertUtils} from '@dooboostore/core/convert/ConvertUtils';\nimport { ConvertUtils } from '@dooboostore/core-node/convert/ConvertUtils';\n// https://masteringjs.io/tutorials/node/http-request\ntype Config = { sessionManager?: SessionManager, option: HttpServerOption };\n\n// https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/\nexport class RequestResponse {\n protected resWriteChunk: string | Buffer | undefined;\n protected reqBodyChunk?: Buffer;\n protected req: IncomingMessage;\n protected res: ServerResponse;\n protected config: Config;\n // protected sessionManager?: SessionManager;\n\n // constructor(req: IncomingMessage, res: ServerResponse);\n // constructor(req: RequestResponse);\n // constructor(req: IncomingMessage, res: ServerResponse, sessionManager?: SessionManager);\n // constructor(req: IncomingMessage | RequestResponse, res?: ServerResponse, sessionManager?: SessionManager) {\n // // this.req = req;\n // // this.res = res;\n // if (req instanceof RequestResponse) {\n // this.req = req.req;\n // this.res = req.res;\n // this.sessionManager = req.sessionManager;\n // } else {\n // this.req = req;\n // this.res = res!;\n // this.sessionManager = sessionManager;\n // }\n // }\n constructor(req: IncomingMessage | RequestResponse, res: ServerResponse, config: Config) {\n // this.req = req;\n // this.res = res;\n if (req instanceof RequestResponse) {\n this.req = req.req;\n this.res = req.res;\n this.config = config;\n } else {\n this.req = req;\n this.res = res!;\n this.config = config;\n }\n }\n\n get reqSocket() {\n return this.req.socket;\n }\n\n get reqCookieMap() {\n let cookies = this.reqHeader(HttpHeaders.Cookie) ?? '';\n if (Array.isArray(cookies)) {\n cookies = cookies.join(';')\n }\n\n const map = new Map<string, string>();\n cookies.split(';').map(it => it.trim().split('=')).forEach(it => {\n map.set(it[0], it[1]);\n });\n return map;\n }\n\n reqCookieGet(key: string) {\n return this.reqCookieMap.get(key);\n }\n\n get reqRemoteAddress(): string | undefined {\n const ipHeader = this.req.headers['x-forwarded-for'];\n let ip = this.req.socket.remoteAddress;\n if (Array.isArray(ipHeader)) {\n ip = ipHeader.join(',').split(',').shift();\n } else if (typeof ipHeader === 'string') {\n ip = ipHeader.split(',').shift();\n }\n return ip;\n }\n\n get reqUrlObject(): URL {\n return new URL(this.reqUrl, `${this.reqSocket ? 'https://' : 'http'}${this.reqHost ?? 'localhost'}`);\n }\n\n get reqUrlPathName(): string {\n // parse(rr.reqUrl ?? '', true)\n return this.reqUrlObj().pathname ?? '';\n }\n\n get reqUrl(): string {\n return this.req.url ?? '';\n }\n\n reqUrlObj(config?:{scheme?: string, host?: string}): URL {\n return new URL(`${config?.scheme??'http' }://${config?.host ? config?.host : (this.reqHeaderFirst(HttpHeaders.Host) ?? 'localhost')}${this.req.url ?? ''}`);\n }\n\n get reqUrlSearchParamTuples(): [string, string][] {\n return Array.from(this.reqUrlObj().searchParams as any);\n }\n\n get reqUrlSearchParams(): URLSearchParams {\n return this.reqUrlObj().searchParams;\n }\n\n get reqUrlSearchParamsObj(): {[p: string]: string | string[]} {\n const entries = this.reqUrlObj().searchParams;\n return CoreConvertUtils.toObject(entries);\n // return obj;\n // return Object.fromEntries(entries as any)\n }\n\n get reqPathSearchParamUrl(): string {\n const reqUrlObj = this.reqUrlObj();\n return reqUrlObj.pathname + (reqUrlObj.searchParams.toString() ? '?' + reqUrlObj.searchParams.toString() : '')\n }\n\n get reqReadable() {\n return this.req.readable;\n }\n\n get reqIntent() {\n return new Intent(this.reqPathSearchParamUrl);\n }\n\n reqHasContentTypeHeader(mime: Mimes | string): boolean {\n return (this.reqHeaderFirst(HttpHeaders.ContentType) ?? '').toLowerCase().indexOf(mime.toLocaleLowerCase()) > -1;\n }\n\n reqHasAcceptHeader(mime: Mimes | string): boolean {\n return (this.reqHeaderFirst(HttpHeaders.Accept) ?? '').toLowerCase().indexOf(mime.toLocaleLowerCase()) > -1;\n }\n\n reqBodyData(): Promise<Buffer> {\n return new Promise<Buffer>((resolve, reject) => {\n if (this.reqReadable) {\n const data: Uint8Array[] = [];\n this.req.on('data', (chunk) => data.push(chunk));\n this.req.on('error', err => reject(err));\n this.req.on('end', () => {\n this.reqBodyChunk = Buffer.concat(data);\n resolve(this.reqBodyChunk);\n });\n } else {\n resolve(this.reqBodyChunk ?? Buffer.alloc(0));\n }\n });\n }\n \n resBodyData(): string | Buffer | undefined{\n return this.resWriteChunk;\n }\n\n\n\n async reqBodyMultipartFormDataObject<T>(): Promise<T> {\n const m = await this.reqBodyMultipartFormData();\n const formData = {} as any;\n\n for (const it of m) {\n if (it.isFile) {\n formData[it.name] = await FileUtils.writeFile(it.value, {originalName: it.filename });\n } else {\n const target = formData[it.name];\n if (Array.isArray(target)) {\n target.push(it.value);\n } else if (typeof target === 'string') {\n formData[it.name] = [target, it.value]\n } else {\n formData[it.name] = it.value;\n }\n }\n };\n return formData;\n }\n\n reqBodyMultipartFormData(): Promise<MultipartData[]> {\n return new Promise((resolve, reject) => {\n const contentTypeHeader = this.req.headers['content-type'];\n if (!contentTypeHeader || !contentTypeHeader.startsWith('multipart/form-data')) {\n return reject(new Error('Invalid Content-Type. Expected multipart/form-data.'));\n }\n\n const boundaryMatch = contentTypeHeader.match(/boundary=(?:\"([^\"]+)\"|([^;]+))/i);\n if (!boundaryMatch) {\n return reject(new Error('Boundary not found in Content-Type header.'));\n }\n const boundary = boundaryMatch[1] || boundaryMatch[2]; // \uB530\uC634\uD45C \uC720\uBB34 \uCC98\uB9AC\n if (!boundary) {\n return reject(new Error('Failed to extract boundary.'));\n }\n\n const boundaryBuffer = Buffer.from(`--${boundary}`);\n const crlfBuffer = Buffer.from('\\r\\n');\n const doubleCrlfBuffer = Buffer.from('\\r\\n\\r\\n'); // \uD5E4\uB354\uC640 \uBC14\uB514 \uAD6C\uBD84\uC790\n\n const chunks: Buffer[] = [];\n let totalLength = 0;\n\n this.req.on('data', (chunk: Buffer) => {\n chunks.push(chunk);\n totalLength += chunk.length;\n });\n\n this.req.on('error', (err) => {\n reject(err);\n });\n\n this.req.on('end', () => {\n if (totalLength === 0) {\n return resolve([]); // \uBE48 \uC694\uCCAD \uCC98\uB9AC\n }\n\n const fullBuffer = Buffer.concat(chunks, totalLength);\n const parsedParts: MultipartData[] = [];\n let currentPosition = 0;\n\n // \uCCAB \uBC88\uC9F8 boundary \uCC3E\uAE30 (\uBCF4\uD1B5 \uC2DC\uC791 \uBD80\uBD84\uC5D0 \uC788\uC74C)\n let boundaryStartIndex = fullBuffer.indexOf(boundaryBuffer, currentPosition);\n if (boundaryStartIndex === -1) {\n return reject(new Error('Initial boundary not found.'));\n }\n // boundary \uBC14\uB85C \uB2E4\uC74C \\r\\n \uAC74\uB108\uB6F0\uAE30\n currentPosition = boundaryStartIndex + boundaryBuffer.length;\n if (fullBuffer.slice(currentPosition, currentPosition + crlfBuffer.length).equals(crlfBuffer)) {\n currentPosition += crlfBuffer.length;\n }\n\n\n while (currentPosition < fullBuffer.length) {\n // \uB2E4\uC74C boundary \uCC3E\uAE30 (\uD30C\uD2B8\uC758 \uB05D)\n const nextBoundaryIndex = fullBuffer.indexOf(boundaryBuffer, currentPosition);\n if (nextBoundaryIndex === -1) {\n // \uB9C8\uC9C0\uB9C9 boundary (--)\uC778\uC9C0 \uD655\uC778 \uD544\uC694\uD558\uB098, \uC5EC\uAE30\uC11C\uB294 \uB2E8\uC21C\uD558\uAC8C \uCC98\uB9AC\n // console.warn('Next boundary not found, assuming end of data or malformed.');\n break;\n }\n\n // \uD604\uC7AC \uD30C\uD2B8 \uB370\uC774\uD130 \uCD94\uCD9C (boundary \uC774\uC804\uAE4C\uC9C0)\n // \uC2E4\uC81C \uD30C\uD2B8 \uB370\uC774\uD130\uB294 \uB2E4\uC74C boundary \uBC14\uB85C \uC55E\uC758 \\r\\n\uC744 \uC81C\uC678\uD574\uC57C \uD568\n let partEndIndex = nextBoundaryIndex;\n if (partEndIndex > crlfBuffer.length && fullBuffer.slice(partEndIndex - crlfBuffer.length, partEndIndex).equals(crlfBuffer)) {\n partEndIndex -= crlfBuffer.length;\n }\n const partBuffer = fullBuffer.slice(currentPosition, partEndIndex);\n\n // \uD5E4\uB354\uC640 \uBC14\uB514 \uBD84\uB9AC\n const headerBodySeparatorIndex = partBuffer.indexOf(doubleCrlfBuffer);\n if (headerBodySeparatorIndex === -1) {\n console.warn('Skipping malformed part: no header/body separator found.');\n currentPosition = nextBoundaryIndex + boundaryBuffer.length;\n if (fullBuffer.slice(currentPosition, currentPosition + crlfBuffer.length).equals(crlfBuffer)) {\n currentPosition += crlfBuffer.length;\n }\n if (fullBuffer.slice(currentPosition, currentPosition + 2).toString() === '--') break; // \uB9C8\uC9C0\uB9C9 boundary\n continue;\n }\n\n const headerBuffer = partBuffer.slice(0, headerBodySeparatorIndex);\n const bodyBuffer = partBuffer.slice(headerBodySeparatorIndex + doubleCrlfBuffer.length);\n const headersStr = headerBuffer.toString('utf-8'); // \uD5E4\uB354\uB294 \uBCF4\uD1B5 ASCII/UTF-8\n\n // \uD5E4\uB354 \uD30C\uC2F1\n const headers: { [key: string]: string } = {};\n headersStr.split('\\r\\n').forEach(line => {\n const colonIndex = line.indexOf(':');\n if (colonIndex > 0) {\n const key = line.substring(0, colonIndex).trim().toLowerCase();\n const value = line.substring(colonIndex + 1).trim();\n headers[key] = value;\n }\n });\n\n const contentDisposition = headers['content-disposition'];\n if (!contentDisposition) {\n console.warn('Skipping part: no Content-Disposition header.');\n currentPosition = nextBoundaryIndex + boundaryBuffer.length;\n if (fullBuffer.slice(currentPosition, currentPosition + crlfBuffer.length).equals(crlfBuffer)) {\n currentPosition += crlfBuffer.length;\n }\n if (fullBuffer.slice(currentPosition, currentPosition + 2).toString() === '--') break;\n continue;\n }\n\n const nameMatch = contentDisposition.match(/name=\"([^\"]+)\"/i);\n const filenameMatch = contentDisposition.match(/filename=\"([^\"]+)\"/i);\n\n const name = nameMatch ? nameMatch[1] : null;\n const filename = filenameMatch ? filenameMatch[1] : null;\n const contentType = headers['content-type'] || null;\n\n if (name) {\n\n const isFile = !!filename;\n // @ts-ignore\n const multipartData:MultipartData = {\n name:name,\n isFile: isFile, // filename\uC774 \uC788\uC73C\uBA74 \uD30C\uC77C\uB85C \uAC04\uC8FC\n filename: filename,\n contentType: contentType,\n value: isFile ? bodyBuffer: bodyBuffer.toString('utf-8'),\n }\n parsedParts.push(multipartData);\n } else {\n console.warn(\"Skipping part: 'name' not found in Content-Disposition.\");\n }\n\n // \uB2E4\uC74C \uD30C\uD2B8 \uC2DC\uC791 \uC704\uCE58\uB85C \uC774\uB3D9\n currentPosition = nextBoundaryIndex + boundaryBuffer.length;\n // boundary \uBC14\uB85C \uB2E4\uC74C \\r\\n \uAC74\uB108\uB6F0\uAE30\n if (fullBuffer.slice(currentPosition, currentPosition + crlfBuffer.length).equals(crlfBuffer)) {\n currentPosition += crlfBuffer.length;\n }\n\n // \uB9C8\uC9C0\uB9C9 boundary (--)\uC778\uC9C0 \uD655\uC778\uD558\uACE0 \uB8E8\uD504 \uC885\uB8CC\n if (fullBuffer.slice(currentPosition, currentPosition + 2).toString() === '--') {\n break;\n }\n }\n resolve(parsedParts);\n });\n })\n // const form = formidable({});\n // return new Promise((resolve, reject) => {\n // form.parse(this.req, (err, fields, files) => {\n // if (err) {\n // reject(err);\n // return;\n // }\n //\n // console.log('----', files)\n // // this.res.set('Content-Type', 'application/json');\n // // ctx.status = 200;\n // // ctx.state = { fields, files };\n // // ctx.body = JSON.stringify(ctx.state, null, 2);\n // resolve(' ' as any);\n // });\n // });\n\n // return new Promise<MultipartData<any>[]>((resolve, reject) => {\n //\n //\n // const contentType = this.req.headers['content-type'];\n // const boundary = contentType.split('boundary=')[1];\n //\n // let body: Uint8Array[] = [];\n // this.req.on('data', chunk => body.push(chunk));\n // this.req.on('end', async () => {\n // const buffer = Buffer.concat(body);\n // // Boundary\uB85C \uD30C\uD2B8 \uBD84\uB9AC\n // const parts = buffer.toString().split(`--${boundary}`).slice(1, -1);\n // let jsonData = {};\n // let fileData = null;\n //\n // for (let part of parts) {\n // const [headerPart, ...bodyParts] = part.split('\\r\\n\\r\\n');\n // const headers = headerPart.split('\\r\\n').reduce((acc, line) => {\n // const [key, value] = line.split(': ').map(s => s.trim().toLowerCase());\n // if (key) acc[key] = value;\n // return acc;\n // }, {});\n //\n // const content = bodyParts.join('\\r\\n\\r\\n').trim();\n // const disposition = headers['content-disposition'];\n // const name = disposition?.match(/name=\"([^\"]+)\"/)?.[1];\n // const filename = disposition?.match(/filename=\"([^\"]+)\"/)?.[1];\n //\n // if (filename) {\n // // \uD30C\uC77C \uB370\uC774\uD130 (Blob)\n // fileData = { filename, contentType: headers['content-type'], data: Buffer.from(content, 'binary') };\n // } else if (name) {\n // // \uD14D\uC2A4\uD2B8 \uB370\uC774\uD130\n // if (name === 'metadata') jsonData = JSON.parse(content);\n // }\n // }\n //\n // // \uD30C\uC77C \uC800\uC7A5\n // if (fileData) {\n //\n //\n //\n //\n // const uploadPath = this.config.option.fileUploadTempPath || os.tmpdir();\n // fs.mkdirSync(uploadPath, { recursive: true }); // \uD3F4\uB354\uAC00 \uC5C6\uC73C\uBA74 \uC0DD\uC131\n // const saveTempPath = `${uploadPath}/${RandomUtils.uuid4()}${fileData.filename}`;\n // console.log('saveTempPathsaveTempPath', saveTempPath)\n // await fs.promises.writeFile(saveTempPath, fileData.data);\n // this.res.writeHead(200, { 'Content-Type': 'application/json' });\n // this.res.end(JSON.stringify({ message: '\uC5C5\uB85C\uB4DC \uC131\uACF5', jsonData, filename: fileData?.filename }));\n // // const uploadPath = this.config.option.fileUploadTempPath ;\n // // fs.mkdirSync(uploadPath, { recursive: true }); // \uD3F4\uB354\uAC00 \uC5C6\uC73C\uBA74 \uC0DD\uC131\n // // await fs.writeFile(`${uploadPath}/${fileData.filename}`, fileData.data);\n // }\n // });\n // });\n }\n\n async reqBodyStringData(): Promise<string> {\n const data = (await this.reqBodyData()).toString()\n return data;\n }\n\n async reqBodyJsonData<T>(): Promise<T> {\n return JSON.parse(await this.reqBodyStringData());\n }\n\n async reqBodyFormUrlData<T>(): Promise<T> {\n const data = (await this.reqBodyStringData())\n const formData = {} as any;\n Array.from(new URLSearchParams(data).entries()).forEach(([k, v]) => {\n const target = formData[k];\n if (Array.isArray(target)) {\n target.push(v);\n } else if (typeof target === 'string') {\n formData[k] = [target, v]\n } else {\n formData[k] = v;\n }\n });\n return formData;\n }\n\n async reqBodyReqFormUrlBody() {\n const data = await this.reqBodyFormUrlData()\n return Object.assign(new ReqFormUrlBody(), data);\n }\n\n async reqBodyReqJsonBody(): Promise<ReqJsonBody> {\n const data = (await this.reqBodyStringData());\n return Object.assign(new ReqJsonBody(), data ? JSON.parse(data) : {})\n }\n\n // reqBodyReqMultipartFormBody(): Promise<ReqMultipartFormBody> {\n // return this.reqBodyMultipartFormData().then(it => new ReqMultipartFormBody(it))\n // }\n\n resBodyJsonData<T>(): (T | null) {\n const data = ConvertUtils.toString(this.resBodyData());\n return data ? JSON.parse(data) : null;\n }\n\n resBodyStringData() {\n return ConvertUtils.toString(this.resBodyData());\n }\n\n reqMethod() {\n return this.req.method?.toUpperCase();\n }\n\n reqHeader(key: keyof typeof HttpHeaders | string) {\n return this.req.headers[key.toLowerCase()];\n }\n\n get reqHost() {\n return this.reqHeaderFirst(HttpHeaders.Host)\n }\n\n get reqHeaderObj(): ReqHeader {\n const h = new ReqHeader();\n Object.entries(this.req.headers).forEach(([k, v]) => {\n h[k] = v;\n });\n return h;\n }\n\n reqHeaderFirst(key: HttpHeadersType | string, defaultValue?: string) {\n const header = this.req.headers[key.toLowerCase()];\n if (header && Array.isArray(header)) {\n return header[0] ?? defaultValue;\n } else {\n return (header as string) ?? defaultValue;\n }\n }\n\n public reqAuthorizationHeader() {\n return this.reqHeaderFirst(HttpHeaders.Authorization);\n }\n\n reqRefreshTokenHeader() {\n return this.reqHeaderFirst(HttpHeaders.Authorization);\n }\n\n resStatusCode(code?: undefined): number;\n // eslint-disable-next-line no-dupe-class-members\n resStatusCode(code: number | HttpStatus): RequestResponseChain<number>;\n // eslint-disable-next-line no-dupe-class-members\n resStatusCode(code: number | undefined | HttpStatus): number | RequestResponseChain<number> {\n if (code) {\n this.res.statusCode = code;\n return new RequestResponseChain<number>(this.req, this.res, this.config, this.res.statusCode);\n } else {\n return this.res.statusCode;\n }\n }\n\n resHeader(key: HttpHeadersType | string) {\n return this.res.getHeader(key.toLowerCase());\n }\n\n resHeaderFirst(key: HttpHeadersType | string, defaultValue?: string) {\n const header = this.res.getHeader(key.toLowerCase());\n if (header && Array.isArray(header)) {\n return header[0] ?? defaultValue;\n } else {\n return (header as string) ?? defaultValue;\n }\n }\n\n async reqSession(): Promise<{ [key: string]: any }> {\n if (this.config.sessionManager) {\n return (await this.config.sessionManager.session(this)).dataSet.data;\n } else {\n return Promise.reject(new Error('Not SessionManager'));\n }\n }\n\n reqSessionSet(key: string, value: any): void {\n (this.reqSession as any)[key] = value;\n }\n\n reqSessionGet<T = any>(key: string): T | undefined {\n const session = this.reqSession as any;\n if (session) {\n return session[key] as T;\n }\n }\n\n resSetStatusCode(statusCode: number) {\n this.res.statusCode = statusCode;\n return this.createRequestResponseChain(this.res.statusCode);\n }\n\n // resEnd() {\n // this.res.end();\n // }\n\n // eslint-disable-next-line no-undef\n resWrite(chunk: string | Buffer | any, encoding: BufferEncoding = 'utf8') {\n this.resWriteChunk = chunk;\n return this.createRequestResponseChain(this.resWriteChunk);\n }\n\n // eslint-disable-next-line no-undef\n resWriteJson(chunk: any, encoding: BufferEncoding = 'utf8') {\n return this.resWrite(JSON.stringify(chunk), encoding);\n }\n\n resSetHeader(key: HttpHeadersType | string, value: string | string[]) {\n return this.createRequestResponseChain(this.res.setHeader(key.toLowerCase(), value));\n }\n\n resAddHeader(key: HttpHeadersType | string, value: string | string[]) {\n const existingValue = this.res.getHeader(key.toLowerCase());\n const newValue = Array.isArray(existingValue)\n ? existingValue.concat(value)\n : existingValue\n ? [existingValue.toString(), ...[].concat(value)]\n : value;\n return this.createRequestResponseChain(this.res.setHeader(key.toLowerCase(), newValue));\n }\n\n resSetHeaders(headers: { [key: string]: string | string[] }) {\n Object.entries(headers).forEach(([key, value]) => this.resSetHeader(key, value));\n return this.createRequestResponseChain();\n }\n\n resAddHeaders(headers: { [key: string]: string | string[] }) {\n Object.entries(headers).forEach(([key, value]) => this.resAddHeader(key, value));\n return this.createRequestResponseChain();\n }\n\n // \uB9C8\uC9C0\uB9C9 \uC885\uB8CC\uB420\uB54C \uD0C0\uB294\uAC70.\n private async resEndChunk() {\n const encoding = this.reqHeaderFirst(HttpHeaders.AcceptEncoding);\n let data = this.resWriteChunk;\n if (encoding?.includes('gzip')) {\n data = await gzip(data);\n this.resSetHeader(HttpHeaders.ContentEncoding, 'gzip');\n }\n this.res.end(data);\n }\n\n async resEnd(chunk?: string | Buffer | Blob | ArrayBuffer | Response) {\n if (chunk instanceof Response) {\n // \uD5E4\uB354\uB97C \uC9C1\uC811 \uC124\uC815\uD558\uC5EC \uCCB4\uC774\uB2DD \uC624\uBC84\uD5E4\uB4DC \uC81C\uAC70\n chunk.headers.forEach((value, key) => {\n this.res.setHeader(`ORIGIN-${key}`, value);\n });\n if (!this.resHeader(HttpHeaders.ContentType)) {\n const contentType = chunk.headers.get(HttpHeaders.ContentType);\n if (contentType) {\n this.res.setHeader(HttpHeaders.ContentType, contentType);\n }\n }\n this.res.statusCode = chunk.status;\n this.resWriteChunk = Buffer.from(await chunk.arrayBuffer());\n } else if (chunk instanceof Blob) {\n this.resWriteChunk = Buffer.from(await chunk.arrayBuffer());\n if (!this.resHeader(HttpHeaders.ContentType)) {\n this.res.setHeader(HttpHeaders.ContentType, chunk.type);\n }\n } else if (chunk instanceof ArrayBuffer) {\n this.resWriteChunk = Buffer.from(chunk);\n } else {\n this.resWriteChunk = chunk ?? this.resWriteChunk;\n }\n\n if (this.req.readable) {\n await this.reqBodyData();\n await this.resEndChunk();\n } else {\n await this.resEndChunk();\n }\n }\n\n // writeContinue(callback?: () => void) {\n // this.res.writeContinue(callback);\n // return new RequestResponseChain(this.req, this.res);\n // }\n\n // reqWrite(chunk?: any) {\n // this.resWriteChunk = chunk;\n // // this.res.write(chunk);\n // return this.createRequestResponseChain();\n // }\n\n resWriteHead(statusCode: number, headers?: OutgoingHttpHeaders | OutgoingHttpHeader[] | { [key: string]: string | string[] }) {\n return this.createRequestResponseChain(this.res.writeHead(statusCode, headers));\n }\n resWriteHeadEnd(statusCode: number, headers?: OutgoingHttpHeaders | OutgoingHttpHeader[] | { [key: string]: string | string[] }) {\n this.createRequestResponseChain(this.res.writeHead(statusCode, headers));\n this.res.end();\n }\n\n resIsDone() {\n return this.res.finished || this.res.writableEnded || this.res.headersSent;\n // return new RequestResponseChain(this.req, this.res, this.res.finished || this.res.writableEnded);\n }\n\n createRequestResponseChain<T = any>(data?: T) {\n const requestResponseChain = new RequestResponseChain(this.req, this.res, this.config, data);\n requestResponseChain.resWriteChunk = this.resWriteChunk;\n requestResponseChain.reqBodyChunk = this.reqBodyChunk;\n return requestResponseChain;\n }\n\n // res.on(\"readable\", () => {\n // console.log('readable???')\n // });\n // res.on('complete', function (details) {\n // var size = details.req.bytes;\n // console.log('complete-->', size)\n // });\n // res.on('finish', function() {\n // console.log('finish??');\n // });\n // res.on('end', () => {\n // console.log('end--?')\n // });\n}\n\nexport class RequestResponseChain<T> extends RequestResponse {\n constructor(req: IncomingMessage, res: ServerResponse, config: Config, public result?: T) {\n super(req, res, config);\n }\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_ConvertUtils", "CoreConvertUtils"]
|
|
7
7
|
}
|
|
@@ -30,12 +30,12 @@ class SimpleBootHttpServer extends SimpleApplication {
|
|
|
30
30
|
this.sessionManager = new SessionManager(this.option);
|
|
31
31
|
}
|
|
32
32
|
run(otherInstanceSim) {
|
|
33
|
-
|
|
33
|
+
super.run(otherInstanceSim);
|
|
34
34
|
const targets = [...this.option.closeEndPoints ?? [], ...this.option.errorEndPoints ?? [], ...this.option.requestEndPoints ?? [], ...this.option.filters ?? []];
|
|
35
35
|
Promise.all(targets.map((it) => typeof it === "function" ? this.simstanceManager.getOrNewSim({ target: it }) : it).map((it) => it.onInit(this))).then((it) => {
|
|
36
36
|
this.startServer();
|
|
37
37
|
});
|
|
38
|
-
return
|
|
38
|
+
return this;
|
|
39
39
|
}
|
|
40
40
|
startServer() {
|
|
41
41
|
if (this.option.serverOption && "key" in this.option.serverOption && "cert" in this.option.serverOption) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/SimpleBootHttpServer.ts"],
|
|
4
|
-
"sourcesContent": ["import { SimpleApplication } from '@dooboostore/simple-boot/SimpleApplication';\nimport { HttpServerOption } from './option/HttpServerOption';\nimport { ConstructorType } from '@dooboostore/core/types';\nimport { IncomingMessage, Server as HttpServer, ServerResponse } from 'http'\nimport { Server as HttpsServer } from 'https'; // Add HTTPS support\nimport { RequestResponse } from './models/RequestResponse';\nimport { getUrlMapping, getUrlMappings, SaveMappingConfig, UrlMappingSituationType } from './decorators/MethodMapping';\nimport { HttpStatus } from './codes/HttpStatus';\nimport { HttpHeaders } from './codes/HttpHeaders';\nimport { Mimes } from './codes/Mimes';\nimport { Filter } from './filters/Filter';\nimport { SimstanceManager } from '@dooboostore/simple-boot/simstance/SimstanceManager';\nimport { ExceptionHandlerSituationType, targetExceptionHandler } from '@dooboostore/simple-boot/decorators/exception/ExceptionDecorator';\nimport { getInject, SituationTypeContainer, SituationTypeContainers } from '@dooboostore/simple-boot/decorators/inject/Inject';\nimport { EndPoint } from './endpoints/EndPoint';\nimport { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';\nimport { ReqFormUrlBody } from './models/datas/body/ReqFormUrlBody';\nimport { ReqJsonBody } from './models/datas/body/ReqJsonBody';\nimport { ReqHeader } from './models/datas/ReqHeader';\nimport { RouterModule } from '@dooboostore/simple-boot/route/RouterModule';\nimport { ReqMultipartFormBody } from './models/datas/body/ReqMultipartFormBody';\nimport { execValidationInValid, getValidIndex } from '@dooboostore/simple-boot/decorators/validate/Validation';\nimport { ValidException } from '@dooboostore/simple-boot/errors/ValidException';\nimport { HttpError } from './errors/HttpError';\nimport { getRoute } from '@dooboostore/simple-boot/decorators/route/Router';\nimport { OnInit } from './lifecycle/OnInit';\nimport { URLSearchParams } from 'url';\nimport { HttpMethod } from './codes/HttpMethod';\nimport { SessionManager } from './session/SessionManager';\nimport { InjectSituationType } from './inject/InjectSituationType';\n\nexport class SimpleBootHttpServer extends SimpleApplication {\n public server?: HttpServer | HttpsServer;\n private sessionManager: SessionManager;\n constructor(public option: HttpServerOption = new HttpServerOption()) {\n super(option);\n this.sessionManager = new SessionManager(this.option);\n }\n\n\n public run(otherInstanceSim?: Map<ConstructorType<any>, any>) {\n const simstanceManager = super.run(otherInstanceSim);\n const targets = [...this.option.closeEndPoints ?? [], ...this.option.errorEndPoints ?? [], ...this.option.requestEndPoints ?? [], ...this.option.filters ?? []];\n Promise.all(targets.map(it => (typeof it === 'function' ? this.simstanceManager.getOrNewSim({target:it as ConstructorType<any>}) : it) as OnInit).map(it => it.onInit(this))).then(it => {\n this.startServer();\n });\n return simstanceManager;\n }\n\n private startServer() {\n\n // const a = this.option.serverOption as HttpsServerOption;\n // this.option.serverOption?.\n\n if (this.option.serverOption && 'key' in this.option.serverOption && 'cert' in this.option.serverOption) {\n this.server = new HttpsServer(this.option.serverOption);\n const httpServer = new HttpServer();\n httpServer.on('request', (req: IncomingMessage, res: ServerResponse) => {\n res.writeHead(301, { Location: `https://${req.headers.host}${req.url}` });\n res.end();\n });\n httpServer.listen(80, this.option.listen.hostname, () => {\n console.log('HTTP redirect server running on port 80');\n });\n } else if (this.option.serverOption) {\n this.server = new HttpServer(this.option.serverOption);\n } else {\n this.server = new HttpServer();\n }\n // const thisRef = this;\n this.server.on('request', async (req: IncomingMessage, res: ServerResponse) => {\n // console.log('request', req.url);\n const transactionManager = this.option.transactionManagerFactory ? await this.option.transactionManagerFactory() : undefined;\n res.on('close', async () => {\n if (this.option.closeEndPoints) {\n for (const it of this.option.closeEndPoints) {\n try {\n const execute = (typeof it === 'function' ? this.simstanceManager.getOrNewSim({target:it}) : it) as EndPoint;\n const endPoint = execute?.endPoint(rr, this);\n if (endPoint instanceof Promise) {\n await endPoint;\n }\n } catch (e) {\n }\n }\n }\n\n if (!rr.resIsDone()) {\n rr.resEnd();\n }\n });\n res.on('error', async () => {\n if (this.option.errorEndPoints) {\n for (const it of this.option.errorEndPoints) {\n try {\n const execute = (typeof it === 'function' ? this.simstanceManager.getOrNewSim({target:it}) : it) as EndPoint;\n const endPoint = execute?.endPoint(rr, this);\n if (endPoint instanceof Promise) {\n await endPoint;\n }\n } catch (e) {\n }\n }\n }\n\n if (!rr.resIsDone()) {\n rr.resEnd();\n }\n });\n\n const rr = new RequestResponse(req, res,{sessionManager: this.sessionManager, option: this.option});\n /*\n default setting first\n */\n rr.resSetHeader(HttpHeaders.Server, 'simple-boot-http-server');\n const cookie = rr.reqCookieGet(this.option.sessionOption.key);\n if (!cookie) {\n const session = await this.sessionManager.session();\n rr.resSetHeader(HttpHeaders.SetCookie, `${this.option.sessionOption.key}=${session.uuid}; Path=/; HttpOnly`);\n }\n\n const otherStorage = new Map<ConstructorType<any>, any>();\n otherStorage.set(RequestResponse, rr);\n otherStorage.set(IncomingMessage, req);\n otherStorage.set(ServerResponse, res);\n try {\n transactionManager?.try();\n if (this.option.requestEndPoints) {\n for (const it of this.option.requestEndPoints) {\n try {\n const execute = (typeof it === 'function' ? this.simstanceManager.getOrNewSim<EndPoint>({target:it}) : it) as EndPoint;\n execute?.endPoint(rr, this);\n } catch (e) {\n }\n }\n }\n\n const filter = {\n carrier: new Map<string, any>(),\n filters: [] as { filter: Filter, sw: boolean }[]\n };\n for (let i = 0; this.option.filters && i < this.option.filters.length; i++) {\n const it = this.option.filters[i];\n const execute = (typeof it === 'function' ? this.simstanceManager.getOrNewSim({target:it}) : it) as Filter;\n let sw = true;\n if (execute?.proceedBefore) {\n sw = await execute.proceedBefore({rr, app: this, carrier: filter.carrier});\n filter.filters.push({filter: execute, sw});\n }\n if (!sw) {\n break;\n }\n }\n\n // body.. something..\n if (!rr.resIsDone()) {\n const routerModule = await super.routing(rr.reqIntent);\n otherStorage.set(RouterModule, routerModule);\n const moduleInstance = routerModule?.getModuleInstance?.();\n let methods: SaveMappingConfig[] = [];\n if (routerModule && moduleInstance) {\n // router \uD074\uB798\uC2A4 \uB0B4\uBD80\uC5D0\uC11C \uC120\uC5B8\uB41C Route\uC77C\uB54C\n if (routerModule.propertyKeys) {\n const map = routerModule.propertyKeys?.map((it: string | symbol) => {\n return {propertyKey: it, config: getUrlMapping(moduleInstance, it)} as SaveMappingConfig\n });\n methods.push(...(map ?? []));\n } else {\n methods.push(...(getUrlMappings(moduleInstance).filter(it => !getRoute(moduleInstance, it.propertyKey)) ?? []));\n }\n\n // options\uB85C \uC694\uCCAD\uC624\uBA74\uC740 allow\uB85C \uB123\uACE0 \uADF8\uB0E5 200\uCC98\uB9AC\uD574\uC57C\uB428.\n if (rr.reqMethod()?.toUpperCase() === HttpMethod.OPTIONS.toUpperCase()) {\n rr.resSetHeader(HttpHeaders.Allow, methods.map(it => it.config.method).join(', '));\n rr.resStatusCode(HttpStatus.Ok);\n }\n\n // method \uCC3E\uAE30\n methods = methods.filter(it => it && it.propertyKey && it.config && rr.reqMethod()?.toUpperCase() === it.config.method.toUpperCase());\n methods.sort((a, b) => {\n return ((b.config?.req?.contentType?.length ?? 0) + (b.config?.req?.accept?.length ?? 0)) - ((a.config?.req?.contentType?.length ?? 0) + (a.config?.req?.accept?.length ?? 0));\n });\n methods = methods\n .filter(it => it.config?.req?.contentType ? (!!it.config?.req?.contentType?.find(sit => rr.reqHasContentTypeHeader(sit))) : true)\n .filter(it => it.config?.req?.accept ? (!!it.config?.req?.accept?.find(sit => rr.reqHasAcceptHeader(sit))) : true);\n\n if (methods[0]) {\n const it = methods[0];\n const paramTypes = ReflectUtils.getParameterTypes(moduleInstance, it.propertyKey)\n const injects = getInject(moduleInstance, it.propertyKey);\n const validIndexs = getValidIndex(moduleInstance, it.propertyKey);\n if (injects) {\n const isJson = injects.find(it => it.config?.situationType === UrlMappingSituationType.REQ_JSON_BODY);\n const isFormUrl = injects.find(it => it.config?.situationType === UrlMappingSituationType.REQ_FORM_URL_BODY);\n const isTransactionManager = injects.find(it => it.config?.situationType === InjectSituationType.TransactionManager);\n const siturationContainers = new SituationTypeContainers();\n if (isJson) {\n let data = await rr.reqBodyJsonData()\n if (isJson.type) {\n data = Object.assign(new isJson.type(), data);\n }\n if (validIndexs.includes(isJson.index)) {\n const inValid = execValidationInValid(data);\n if ((inValid?.length ?? 0) > 0) {\n throw new ValidException(inValid);\n }\n }\n siturationContainers.push(new SituationTypeContainer({\n situationType: UrlMappingSituationType.REQ_JSON_BODY,\n data\n }));\n }\n if (isFormUrl) {\n let data = await rr.reqBodyFormUrlData()\n if (isFormUrl.type) {\n data = Object.assign(new isFormUrl.type(), data);\n }\n if (validIndexs.includes(isFormUrl.index)) {\n const inValid = execValidationInValid(data);\n if ((inValid?.length ?? 0) > 0) {\n throw new ValidException(inValid);\n }\n }\n siturationContainers.push(new SituationTypeContainer({situationType: UrlMappingSituationType.REQ_FORM_URL_BODY, data}));\n }\n\n if (isTransactionManager && isTransactionManager.type && transactionManager && transactionManager.hasTransaction(isTransactionManager.type)) {\n let data = await transactionManager.getTransaction(isTransactionManager.type);\n if (data) {\n data = await data.try(isTransactionManager.config.argument);\n siturationContainers.push(new SituationTypeContainer({situationType: InjectSituationType.TransactionManager, data, index: isTransactionManager.index}));\n }\n }\n if (siturationContainers.length) {\n otherStorage.set(SituationTypeContainers, siturationContainers);\n }\n }\n\n for (const paramType of paramTypes) {\n if (paramType === ReqFormUrlBody) {\n otherStorage.set(ReqFormUrlBody, await rr.reqBodyReqFormUrlBody())\n } else if (paramType === ReqJsonBody) {\n otherStorage.set(ReqJsonBody, await rr.reqBodyReqJsonBody())\n } else if (paramType === URLSearchParams) {\n otherStorage.set(URLSearchParams, rr.reqUrlSearchParams)\n } else if (paramType === ReqMultipartFormBody) {\n otherStorage.set(ReqMultipartFormBody, rr.reqBodyMultipartFormData())\n } else if (paramType === ReqHeader) {\n otherStorage.set(ReqHeader, rr.reqHeaderObj)\n }\n }\n\n // execute !!!\n let data = await this.simstanceManager.executeBindParameterSimPromise({\n target: moduleInstance,\n targetKey: it.propertyKey\n }, otherStorage);\n /*\n \uC5EC\uAE30\uC5D0\uC11C \uC815\uD574\uC9C4 \uD0C0\uC785 \uB9AC\uD134\uC5D0 \uB530\uB978 \uC870\uCE58\n ...\n */\n if (it.config?.resolver) {\n const execute = typeof it.config.resolver === 'function' ? this.simstanceManager.getOrNewSim({target:it.config.resolver}) : it.config.resolver;\n data = await execute?.resolve?.(data, rr);\n }\n const status = it.config?.res?.status ?? HttpStatus.Ok;\n const headers = it.config?.res?.header ?? {};\n if (it.config?.res?.contentType) {\n headers[HttpHeaders.ContentType] = it.config?.res?.contentType;\n }\n if ((it.config?.res?.contentType?.toLowerCase().indexOf(Mimes.ApplicationJson.toLowerCase()) ?? -1) > -1) {\n data = JSON.stringify(data);\n } else if (data && typeof data === 'object') {\n data = JSON.stringify(data);\n }\n rr.resSetHeaders(headers)\n rr.resSetStatusCode(status); \n rr.resWrite(data);\n }\n }\n\n if (this.option.noSuchRouteEndPointMappingThrow && methods.length <= 0 && rr.reqMethod()?.toUpperCase() !== HttpMethod.OPTIONS) {\n throw this.option.noSuchRouteEndPointMappingThrow(rr);\n }\n }\n\n // after\n for (const it of filter.filters.reverse()) {\n if (it.filter?.proceedAfter && !await it.filter.proceedAfter({rr, app:this, before: it.sw, carrier: filter.carrier})) {\n break;\n }\n }\n } catch (e) {\n transactionManager?.catch(e);\n rr.resStatusCode(e instanceof HttpError ? e.status : HttpStatus.InternalServerError)\n const execute = typeof this.option.globalAdvice === 'function' ? this.simstanceManager.getOrNewSim(this.option.globalAdvice) : this.option.globalAdvice;\n if (!execute) {\n rr.resEnd();\n // rr.resEnd().catch(e => {\n // });\n return;\n }\n if (e && typeof e === 'object') {\n otherStorage.set(e.constructor as ConstructorType<any>, e);\n otherStorage.set(SituationTypeContainer, new SituationTypeContainer({\n situationType: ExceptionHandlerSituationType.ERROR_OBJECT,\n data: e\n }));\n }\n const target = targetExceptionHandler(execute, e);\n if (target) {\n await this.simstanceManager.executeBindParameterSimPromise({\n target: execute,\n targetKey: target.propertyKey\n }, otherStorage);\n }\n } finally {\n transactionManager?.finally();\n }\n\n if (!rr.resIsDone()) {\n rr.resEnd();\n }\n });\n\n this.server.listen(this.option.listen.port, this.option.listen.hostname, this.option.listen.backlog, () => {\n this.option.listen.listeningListener?.(this, this.server);\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,yBAAyB;AAClC,SAAS,wBAAwB;AAEjC,SAAS,iBAAiB,UAAU,YAAY,sBAAsB;AACtE,SAAS,UAAU,mBAAmB;AACtC,SAAS,uBAAuB;AAChC,SAAS,eAAe,gBAAmC,+BAA+B;AAC1F,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAC5B,SAAS,aAAa;
|
|
4
|
+
"sourcesContent": ["import { SimpleApplication } from '@dooboostore/simple-boot/SimpleApplication';\nimport { HttpServerOption } from './option/HttpServerOption';\nimport { ConstructorType } from '@dooboostore/core/types';\nimport { IncomingMessage, Server as HttpServer, ServerResponse } from 'http'\nimport { Server as HttpsServer } from 'https'; // Add HTTPS support\nimport { RequestResponse } from './models/RequestResponse';\nimport { getUrlMapping, getUrlMappings, SaveMappingConfig, UrlMappingSituationType } from './decorators/MethodMapping';\nimport { HttpStatus } from './codes/HttpStatus';\nimport { HttpHeaders } from './codes/HttpHeaders';\nimport { Mimes } from './codes/Mimes';\nimport { Filter } from './filters/Filter';\nimport { ExceptionHandlerSituationType, targetExceptionHandler } from '@dooboostore/simple-boot/decorators/exception/ExceptionDecorator';\nimport { getInject, SituationTypeContainer, SituationTypeContainers } from '@dooboostore/simple-boot/decorators/inject/Inject';\nimport { EndPoint } from './endpoints/EndPoint';\nimport { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';\nimport { ReqFormUrlBody } from './models/datas/body/ReqFormUrlBody';\nimport { ReqJsonBody } from './models/datas/body/ReqJsonBody';\nimport { ReqHeader } from './models/datas/ReqHeader';\nimport { RouterModule } from '@dooboostore/simple-boot/route/RouterModule';\nimport { ReqMultipartFormBody } from './models/datas/body/ReqMultipartFormBody';\nimport { execValidationInValid, getValidIndex } from '@dooboostore/simple-boot/decorators/validate/Validation';\nimport { ValidException } from '@dooboostore/simple-boot/errors/ValidException';\nimport { HttpError } from './errors/HttpError';\nimport { getRoute } from '@dooboostore/simple-boot/decorators/route/Router';\nimport { OnInit } from './lifecycle/OnInit';\nimport { URLSearchParams } from 'url';\nimport { HttpMethod } from './codes/HttpMethod';\nimport { SessionManager } from './session/SessionManager';\nimport { InjectSituationType } from './inject/InjectSituationType';\n\nexport class SimpleBootHttpServer extends SimpleApplication {\n public server?: HttpServer | HttpsServer;\n private sessionManager: SessionManager;\n constructor(public option: HttpServerOption = new HttpServerOption()) {\n super(option);\n this.sessionManager = new SessionManager(this.option);\n }\n\n\n public run(otherInstanceSim?: Map<ConstructorType<any>, any>) {\n super.run(otherInstanceSim);\n const targets = [...this.option.closeEndPoints ?? [], ...this.option.errorEndPoints ?? [], ...this.option.requestEndPoints ?? [], ...this.option.filters ?? []];\n Promise.all(targets.map(it => (typeof it === 'function' ? this.simstanceManager.getOrNewSim({target:it as ConstructorType<any>}) : it) as OnInit).map(it => it.onInit(this))).then(it => {\n this.startServer();\n });\n return this;\n }\n\n private startServer() {\n\n // const a = this.option.serverOption as HttpsServerOption;\n // this.option.serverOption?.\n\n if (this.option.serverOption && 'key' in this.option.serverOption && 'cert' in this.option.serverOption) {\n this.server = new HttpsServer(this.option.serverOption);\n const httpServer = new HttpServer();\n httpServer.on('request', (req: IncomingMessage, res: ServerResponse) => {\n res.writeHead(301, { Location: `https://${req.headers.host}${req.url}` });\n res.end();\n });\n httpServer.listen(80, this.option.listen.hostname, () => {\n console.log('HTTP redirect server running on port 80');\n });\n } else if (this.option.serverOption) {\n this.server = new HttpServer(this.option.serverOption);\n } else {\n this.server = new HttpServer();\n }\n // const thisRef = this;\n this.server.on('request', async (req: IncomingMessage, res: ServerResponse) => {\n // console.log('request', req.url);\n const transactionManager = this.option.transactionManagerFactory ? await this.option.transactionManagerFactory() : undefined;\n res.on('close', async () => {\n if (this.option.closeEndPoints) {\n for (const it of this.option.closeEndPoints) {\n try {\n const execute = (typeof it === 'function' ? this.simstanceManager.getOrNewSim({target:it}) : it) as EndPoint;\n const endPoint = execute?.endPoint(rr, this);\n if (endPoint instanceof Promise) {\n await endPoint;\n }\n } catch (e) {\n }\n }\n }\n\n if (!rr.resIsDone()) {\n rr.resEnd();\n }\n });\n res.on('error', async () => {\n if (this.option.errorEndPoints) {\n for (const it of this.option.errorEndPoints) {\n try {\n const execute = (typeof it === 'function' ? this.simstanceManager.getOrNewSim({target:it}) : it) as EndPoint;\n const endPoint = execute?.endPoint(rr, this);\n if (endPoint instanceof Promise) {\n await endPoint;\n }\n } catch (e) {\n }\n }\n }\n\n if (!rr.resIsDone()) {\n rr.resEnd();\n }\n });\n\n const rr = new RequestResponse(req, res,{sessionManager: this.sessionManager, option: this.option});\n /*\n default setting first\n */\n rr.resSetHeader(HttpHeaders.Server, 'simple-boot-http-server');\n const cookie = rr.reqCookieGet(this.option.sessionOption.key);\n if (!cookie) {\n const session = await this.sessionManager.session();\n rr.resSetHeader(HttpHeaders.SetCookie, `${this.option.sessionOption.key}=${session.uuid}; Path=/; HttpOnly`);\n }\n\n const otherStorage = new Map<ConstructorType<any>, any>();\n otherStorage.set(RequestResponse, rr);\n otherStorage.set(IncomingMessage, req);\n otherStorage.set(ServerResponse, res);\n try {\n transactionManager?.try();\n if (this.option.requestEndPoints) {\n for (const it of this.option.requestEndPoints) {\n try {\n const execute = (typeof it === 'function' ? this.simstanceManager.getOrNewSim<EndPoint>({target:it}) : it) as EndPoint;\n execute?.endPoint(rr, this);\n } catch (e) {\n }\n }\n }\n\n const filter = {\n carrier: new Map<string, any>(),\n filters: [] as { filter: Filter, sw: boolean }[]\n };\n for (let i = 0; this.option.filters && i < this.option.filters.length; i++) {\n const it = this.option.filters[i];\n const execute = (typeof it === 'function' ? this.simstanceManager.getOrNewSim({target:it}) : it) as Filter;\n let sw = true;\n if (execute?.proceedBefore) {\n sw = await execute.proceedBefore({rr, app: this, carrier: filter.carrier});\n filter.filters.push({filter: execute, sw});\n }\n if (!sw) {\n break;\n }\n }\n\n // body.. something..\n if (!rr.resIsDone()) {\n const routerModule = await super.routing(rr.reqIntent);\n otherStorage.set(RouterModule, routerModule);\n const moduleInstance = routerModule?.getModuleInstance?.();\n let methods: SaveMappingConfig[] = [];\n if (routerModule && moduleInstance) {\n // router \uD074\uB798\uC2A4 \uB0B4\uBD80\uC5D0\uC11C \uC120\uC5B8\uB41C Route\uC77C\uB54C\n if (routerModule.propertyKeys) {\n const map = routerModule.propertyKeys?.map((it: string | symbol) => {\n return {propertyKey: it, config: getUrlMapping(moduleInstance, it)} as SaveMappingConfig\n });\n methods.push(...(map ?? []));\n } else {\n methods.push(...(getUrlMappings(moduleInstance).filter(it => !getRoute(moduleInstance, it.propertyKey)) ?? []));\n }\n\n // options\uB85C \uC694\uCCAD\uC624\uBA74\uC740 allow\uB85C \uB123\uACE0 \uADF8\uB0E5 200\uCC98\uB9AC\uD574\uC57C\uB428.\n if (rr.reqMethod()?.toUpperCase() === HttpMethod.OPTIONS.toUpperCase()) {\n rr.resSetHeader(HttpHeaders.Allow, methods.map(it => it.config.method).join(', '));\n rr.resStatusCode(HttpStatus.Ok);\n }\n\n // method \uCC3E\uAE30\n methods = methods.filter(it => it && it.propertyKey && it.config && rr.reqMethod()?.toUpperCase() === it.config.method.toUpperCase());\n methods.sort((a, b) => {\n return ((b.config?.req?.contentType?.length ?? 0) + (b.config?.req?.accept?.length ?? 0)) - ((a.config?.req?.contentType?.length ?? 0) + (a.config?.req?.accept?.length ?? 0));\n });\n methods = methods\n .filter(it => it.config?.req?.contentType ? (!!it.config?.req?.contentType?.find(sit => rr.reqHasContentTypeHeader(sit))) : true)\n .filter(it => it.config?.req?.accept ? (!!it.config?.req?.accept?.find(sit => rr.reqHasAcceptHeader(sit))) : true);\n\n if (methods[0]) {\n const it = methods[0];\n const paramTypes = ReflectUtils.getParameterTypes(moduleInstance, it.propertyKey)\n const injects = getInject(moduleInstance, it.propertyKey);\n const validIndexs = getValidIndex(moduleInstance, it.propertyKey);\n if (injects) {\n const isJson = injects.find(it => it.config?.situationType === UrlMappingSituationType.REQ_JSON_BODY);\n const isFormUrl = injects.find(it => it.config?.situationType === UrlMappingSituationType.REQ_FORM_URL_BODY);\n const isTransactionManager = injects.find(it => it.config?.situationType === InjectSituationType.TransactionManager);\n const siturationContainers = new SituationTypeContainers();\n if (isJson) {\n let data = await rr.reqBodyJsonData()\n if (isJson.type) {\n data = Object.assign(new isJson.type(), data);\n }\n if (validIndexs.includes(isJson.index)) {\n const inValid = execValidationInValid(data);\n if ((inValid?.length ?? 0) > 0) {\n throw new ValidException(inValid);\n }\n }\n siturationContainers.push(new SituationTypeContainer({\n situationType: UrlMappingSituationType.REQ_JSON_BODY,\n data\n }));\n }\n if (isFormUrl) {\n let data = await rr.reqBodyFormUrlData()\n if (isFormUrl.type) {\n data = Object.assign(new isFormUrl.type(), data);\n }\n if (validIndexs.includes(isFormUrl.index)) {\n const inValid = execValidationInValid(data);\n if ((inValid?.length ?? 0) > 0) {\n throw new ValidException(inValid);\n }\n }\n siturationContainers.push(new SituationTypeContainer({situationType: UrlMappingSituationType.REQ_FORM_URL_BODY, data}));\n }\n\n if (isTransactionManager && isTransactionManager.type && transactionManager && transactionManager.hasTransaction(isTransactionManager.type)) {\n let data = await transactionManager.getTransaction(isTransactionManager.type);\n if (data) {\n data = await data.try(isTransactionManager.config.argument);\n siturationContainers.push(new SituationTypeContainer({situationType: InjectSituationType.TransactionManager, data, index: isTransactionManager.index}));\n }\n }\n if (siturationContainers.length) {\n otherStorage.set(SituationTypeContainers, siturationContainers);\n }\n }\n\n for (const paramType of paramTypes) {\n if (paramType === ReqFormUrlBody) {\n otherStorage.set(ReqFormUrlBody, await rr.reqBodyReqFormUrlBody())\n } else if (paramType === ReqJsonBody) {\n otherStorage.set(ReqJsonBody, await rr.reqBodyReqJsonBody())\n } else if (paramType === URLSearchParams) {\n otherStorage.set(URLSearchParams, rr.reqUrlSearchParams)\n } else if (paramType === ReqMultipartFormBody) {\n otherStorage.set(ReqMultipartFormBody, rr.reqBodyMultipartFormData())\n } else if (paramType === ReqHeader) {\n otherStorage.set(ReqHeader, rr.reqHeaderObj)\n }\n }\n\n // execute !!!\n let data = await this.simstanceManager.executeBindParameterSimPromise({\n target: moduleInstance,\n targetKey: it.propertyKey\n }, otherStorage);\n /*\n \uC5EC\uAE30\uC5D0\uC11C \uC815\uD574\uC9C4 \uD0C0\uC785 \uB9AC\uD134\uC5D0 \uB530\uB978 \uC870\uCE58\n ...\n */\n if (it.config?.resolver) {\n const execute = typeof it.config.resolver === 'function' ? this.simstanceManager.getOrNewSim({target:it.config.resolver}) : it.config.resolver;\n data = await execute?.resolve?.(data, rr);\n }\n const status = it.config?.res?.status ?? HttpStatus.Ok;\n const headers = it.config?.res?.header ?? {};\n if (it.config?.res?.contentType) {\n headers[HttpHeaders.ContentType] = it.config?.res?.contentType;\n }\n if ((it.config?.res?.contentType?.toLowerCase().indexOf(Mimes.ApplicationJson.toLowerCase()) ?? -1) > -1) {\n data = JSON.stringify(data);\n } else if (data && typeof data === 'object') {\n data = JSON.stringify(data);\n }\n rr.resSetHeaders(headers)\n rr.resSetStatusCode(status); \n rr.resWrite(data);\n }\n }\n\n if (this.option.noSuchRouteEndPointMappingThrow && methods.length <= 0 && rr.reqMethod()?.toUpperCase() !== HttpMethod.OPTIONS) {\n throw this.option.noSuchRouteEndPointMappingThrow(rr);\n }\n }\n\n // after\n for (const it of filter.filters.reverse()) {\n if (it.filter?.proceedAfter && !await it.filter.proceedAfter({rr, app:this, before: it.sw, carrier: filter.carrier})) {\n break;\n }\n }\n } catch (e) {\n transactionManager?.catch(e);\n rr.resStatusCode(e instanceof HttpError ? e.status : HttpStatus.InternalServerError)\n const execute = typeof this.option.globalAdvice === 'function' ? this.simstanceManager.getOrNewSim(this.option.globalAdvice) : this.option.globalAdvice;\n if (!execute) {\n rr.resEnd();\n // rr.resEnd().catch(e => {\n // });\n return;\n }\n if (e && typeof e === 'object') {\n otherStorage.set(e.constructor as ConstructorType<any>, e);\n otherStorage.set(SituationTypeContainer, new SituationTypeContainer({\n situationType: ExceptionHandlerSituationType.ERROR_OBJECT,\n data: e\n }));\n }\n const target = targetExceptionHandler(execute, e);\n if (target) {\n await this.simstanceManager.executeBindParameterSimPromise({\n target: execute,\n targetKey: target.propertyKey\n }, otherStorage);\n }\n } finally {\n transactionManager?.finally();\n }\n\n if (!rr.resIsDone()) {\n rr.resEnd();\n }\n });\n\n this.server.listen(this.option.listen.port, this.option.listen.hostname, this.option.listen.backlog, () => {\n this.option.listen.listeningListener?.(this, this.server);\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["it", "data"]
|
|
7
7
|
}
|
|
@@ -1,20 +1,33 @@
|
|
|
1
|
-
import fs from "fs";
|
|
2
|
-
import path from "path";
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
3
|
import mime from "mime-types";
|
|
4
4
|
import { HttpHeaders } from "../codes/HttpHeaders.js";
|
|
5
5
|
import { HttpStatus } from "../codes/HttpStatus.js";
|
|
6
|
+
import { Blob } from "node:buffer";
|
|
7
|
+
const isPathDist = (item) => {
|
|
8
|
+
return typeof item === "object" && "request" in item && "dist" in item;
|
|
9
|
+
};
|
|
10
|
+
const isDataDist = (item) => {
|
|
11
|
+
return typeof item === "object" && "request" in item && "response" in item;
|
|
12
|
+
};
|
|
6
13
|
class ResourceFilter {
|
|
7
|
-
constructor(
|
|
8
|
-
|
|
9
|
-
|
|
14
|
+
constructor(resourceDistPathOrResourceRegex, resourceRegex) {
|
|
15
|
+
if (typeof resourceDistPathOrResourceRegex === "string") {
|
|
16
|
+
this.resourceDistPath = resourceDistPathOrResourceRegex;
|
|
17
|
+
this.resources = resourceRegex;
|
|
18
|
+
} else {
|
|
19
|
+
this.resources = resourceDistPathOrResourceRegex;
|
|
20
|
+
}
|
|
10
21
|
}
|
|
22
|
+
// constructor(private resourceDistPath: string, private resourceRegex: (RequestFilterType | { request: RequestFilterType, dist: string | ((rr: RequestResponse, app: SimpleBootHttpServer) => (string|Promise<Blob |ArrayBuffer| Response>)) })[] = []) {
|
|
23
|
+
// }
|
|
11
24
|
async onInit(app) {
|
|
12
25
|
}
|
|
13
26
|
async proceedBefore({ rr, app }) {
|
|
14
27
|
const url = (rr.reqUrlPathName ?? "").replace(/\.\./g, "");
|
|
15
28
|
const urlObj = rr.reqUrlObject;
|
|
16
29
|
let sw = true;
|
|
17
|
-
const regExps = this.
|
|
30
|
+
const regExps = this.resources?.filter((it) => {
|
|
18
31
|
if (it instanceof RegExp) {
|
|
19
32
|
return it.test(url);
|
|
20
33
|
}
|
|
@@ -30,21 +43,44 @@ class ResourceFilter {
|
|
|
30
43
|
}
|
|
31
44
|
return RegExp(it.request).test(url);
|
|
32
45
|
}
|
|
33
|
-
});
|
|
46
|
+
}) ?? [];
|
|
34
47
|
for (const it of regExps) {
|
|
35
|
-
const resourcePath = path.join(this.resourceDistPath, typeof it === "object" && "dist" in it ? it.dist : urlObj.pathname);
|
|
36
48
|
sw = false;
|
|
37
|
-
if (
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
49
|
+
if (isDataDist(it)) {
|
|
50
|
+
let distValue = typeof it.response === "function" ? it.response(rr, app) : it.response;
|
|
51
|
+
if (distValue instanceof Promise) {
|
|
52
|
+
const result = await distValue;
|
|
53
|
+
if (result instanceof Response) {
|
|
54
|
+
await rr.resEnd(result);
|
|
55
|
+
break;
|
|
56
|
+
} else if (result instanceof Blob) {
|
|
57
|
+
rr.resStatusCode(HttpStatus.Ok);
|
|
58
|
+
await rr.resEnd(result);
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
42
62
|
} else {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
63
|
+
const dist = typeof it === "object" && "dist" in it ? it.dist : urlObj.pathname;
|
|
64
|
+
let distValue = typeof dist === "function" ? dist(rr, app) : dist;
|
|
65
|
+
if (this.resourceDistPath) {
|
|
66
|
+
const resourcePath = path.join(this.resourceDistPath, distValue);
|
|
67
|
+
if (fs.existsSync(resourcePath)) {
|
|
68
|
+
rr.resStatusCode(HttpStatus.Ok);
|
|
69
|
+
rr.resSetHeader(HttpHeaders.ContentType, mime.lookup(resourcePath).toString());
|
|
70
|
+
await rr.resEnd(fs.readFileSync(resourcePath));
|
|
71
|
+
break;
|
|
72
|
+
} else {
|
|
73
|
+
rr.resStatusCode(HttpStatus.NotFound);
|
|
74
|
+
await rr.resEnd();
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
} else {
|
|
78
|
+
rr.resStatusCode(HttpStatus.InternalServerError);
|
|
79
|
+
await rr.resEnd();
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
46
82
|
}
|
|
47
|
-
sw =
|
|
83
|
+
sw = true;
|
|
48
84
|
}
|
|
49
85
|
return sw;
|
|
50
86
|
}
|
|
@@ -53,6 +89,8 @@ class ResourceFilter {
|
|
|
53
89
|
}
|
|
54
90
|
}
|
|
55
91
|
export {
|
|
56
|
-
ResourceFilter
|
|
92
|
+
ResourceFilter,
|
|
93
|
+
isDataDist,
|
|
94
|
+
isPathDist
|
|
57
95
|
};
|
|
58
96
|
//# sourceMappingURL=ResourceFilter.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/filters/ResourceFilter.ts"],
|
|
4
|
-
"sourcesContent": ["import { Filter } from '../filters/Filter';\nimport fs from 'fs';\nimport path from 'path';\nimport mime from 'mime-types';\nimport { HttpHeaders } from '../codes/HttpHeaders';\nimport { HttpStatus } from '../codes/HttpStatus';\nimport { SimpleBootHttpServer } from '../SimpleBootHttpServer';\nimport { RequestResponse } from '../models/RequestResponse';\n\nexport type RequestFilterType = string | RegExp | ((rr: RequestResponse, app: SimpleBootHttpServer) => boolean) | ((rr: RequestResponse, app: SimpleBootHttpServer) => Promise<boolean>);\n\nexport class ResourceFilter implements Filter {\n constructor(private resourceDistPath: string, private resourceRegex: (RequestFilterType | { request: RequestFilterType, dist: string })[] = []) {\n
|
|
5
|
-
"mappings": "AACA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,UAAU;AACjB,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;
|
|
4
|
+
"sourcesContent": ["import { Filter } from '../filters/Filter';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport mime from 'mime-types';\nimport { HttpHeaders } from '../codes/HttpHeaders';\nimport { HttpStatus } from '../codes/HttpStatus';\nimport { SimpleBootHttpServer } from '../SimpleBootHttpServer';\nimport { RequestResponse } from '../models/RequestResponse';\nimport { Blob } from 'node:buffer';\n\nexport type RequestFilterType = string | RegExp | ((rr: RequestResponse, app: SimpleBootHttpServer) => boolean) | ((rr: RequestResponse, app: SimpleBootHttpServer) => Promise<boolean>);\n\ntype PathDist = RequestFilterType|{request: RequestFilterType, dist: string | ((rr: RequestResponse, app: SimpleBootHttpServer) => string)};\n\ntype DataDist = {request: RequestFilterType, response: (rr: RequestResponse, app: SimpleBootHttpServer) => (string | Promise<Blob | ArrayBuffer | Response>)};\nexport const isPathDist = (item: any): item is PathDist => {\n return typeof item === 'object' && ('request' in item) && ('dist' in item);\n};\nexport const isDataDist = (item: any): item is DataDist => {\n return typeof item === 'object' && ('request' in item) && ('response' in item);\n};\nexport class ResourceFilter implements Filter {\n // private requestFilter: RequestFilterType;\n private resourceDistPath?: string;\n private resources?: (DataDist|PathDist)[];\n constructor(resourceDistPath: string, resourceRegex: PathDist[]);\n constructor(resourceRegex: DataDist[]);\n constructor(resourceDistPathOrResourceRegex: string | DataDist[], resourceRegex?: PathDist[]) {\n if (typeof resourceDistPathOrResourceRegex === 'string') {\n this.resourceDistPath = resourceDistPathOrResourceRegex;\n this.resources = resourceRegex;\n } else {\n this.resources = resourceDistPathOrResourceRegex;\n // this.requestFilter = resourceDistPathOrResourceRegex\n }\n }\n // constructor(private resourceDistPath: string, private resourceRegex: (RequestFilterType | { request: RequestFilterType, dist: string | ((rr: RequestResponse, app: SimpleBootHttpServer) => (string|Promise<Blob |ArrayBuffer| Response>)) })[] = []) {\n // }\n\n async onInit(app: SimpleBootHttpServer) {\n }\n\n async proceedBefore({rr, app}: {rr: RequestResponse, app: SimpleBootHttpServer, carrier: Map<string, any>}) {\n const url = (rr.reqUrlPathName ?? '').replace(/\\.\\./g, '');\n const urlObj = rr.reqUrlObject;\n // const requestUrl = parse(rr.reqUrl ?? '', true);\n // console.log('resource filter!!**-------', url);\n let sw = true;\n const regExps = this.resources?.filter(it => {\n if (it instanceof RegExp) {\n return it.test(url);\n }\n\n if (typeof it === 'string') {\n return RegExp(it).test(url);\n }\n\n if (typeof it === 'function') {\n return it(rr, app);\n }\n\n if (typeof it === 'object' && 'request' in it) {\n if (typeof it.request === 'function') {\n return it.request(rr, app);\n }\n return RegExp(it.request).test(url);\n }\n })??[]\n // console.log('regExps', regExps, url);\n // eslint-disable-next-line no-unused-vars\n for (const it of regExps) {\n sw = false;\n //DataDist\n if (isDataDist(it)) {\n let distValue = typeof it.response === 'function' ? it.response(rr,app) : it.response;\n if (distValue instanceof Promise) {\n const result = await distValue;\n if (result instanceof Response) {\n await rr.resEnd(result);\n break;\n } else if (result instanceof Blob) {\n rr.resStatusCode(HttpStatus.Ok);\n await rr.resEnd(result);\n break;\n }\n }\n } else {\n //PathDist or undefined\n const dist = typeof it === 'object' && 'dist' in it ? it.dist : urlObj.pathname;\n let distValue = typeof dist === 'function' ? dist(rr, app) : dist;\n if (this.resourceDistPath) {\n // It's a string path\n const resourcePath = path.join(this.resourceDistPath, distValue);\n if (fs.existsSync(resourcePath)) {\n rr.resStatusCode(HttpStatus.Ok);\n rr.resSetHeader(HttpHeaders.ContentType, mime.lookup(resourcePath).toString());\n await rr.resEnd(fs.readFileSync(resourcePath));\n break;\n } else {\n rr.resStatusCode(HttpStatus.NotFound);\n await rr.resEnd();\n break;\n }\n } else {\n rr.resStatusCode(HttpStatus.InternalServerError);\n await rr.resEnd();\n break;\n }\n }\n sw = true;\n }\n return sw;\n }\n\n async proceedAfter({rr, app}: {rr: RequestResponse, app: SimpleBootHttpServer, carrier: Map<string, any>}) {\n // console.log('resource filter!!end@@**-------');\n return true;\n }\n}"],
|
|
5
|
+
"mappings": "AACA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,UAAU;AACjB,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAG3B,SAAS,YAAY;AAOd,MAAM,aAAa,CAAC,SAAgC;AACvD,SAAO,OAAO,SAAS,YAAa,aAAa,QAAU,UAAU;AACzE;AACO,MAAM,aAAa,CAAC,SAAgC;AACvD,SAAO,OAAO,SAAS,YAAa,aAAa,QAAU,cAAc;AAC7E;AACO,MAAM,eAAiC;AAAA,EAM5C,YAAY,iCAAuD,eAA4B;AAC7F,QAAI,OAAO,oCAAoC,UAAU;AACvD,WAAK,mBAAmB;AACxB,WAAK,YAAY;AAAA,IACnB,OAAO;AACL,WAAK,YAAY;AAAA,IAEnB;AAAA,EACF;AAAA;AAAA;AAAA,EAIE,MAAM,OAAO,KAA2B;AAAA,EACxC;AAAA,EAEA,MAAM,cAAc,EAAC,IAAI,IAAG,GAAgF;AACxG,UAAM,OAAO,GAAG,kBAAkB,IAAI,QAAQ,SAAS,EAAE;AACzD,UAAM,SAAS,GAAG;AAGlB,QAAI,KAAK;AACT,UAAM,UAAU,KAAK,WAAW,OAAO,QAAM;AACzC,UAAI,cAAc,QAAQ;AACtB,eAAO,GAAG,KAAK,GAAG;AAAA,MACtB;AAEA,UAAI,OAAO,OAAO,UAAU;AACxB,eAAO,OAAO,EAAE,EAAE,KAAK,GAAG;AAAA,MAC9B;AAEA,UAAI,OAAO,OAAO,YAAY;AAC1B,eAAO,GAAG,IAAI,GAAG;AAAA,MACrB;AAEA,UAAI,OAAO,OAAO,YAAY,aAAa,IAAI;AAC3C,YAAI,OAAO,GAAG,YAAY,YAAY;AAClC,iBAAO,GAAG,QAAQ,IAAI,GAAG;AAAA,QAC7B;AACA,eAAO,OAAO,GAAG,OAAO,EAAE,KAAK,GAAG;AAAA,MACtC;AAAA,IACJ,CAAC,KAAG,CAAC;AAGL,eAAW,MAAM,SAAS;AACtB,WAAK;AAEL,UAAI,WAAW,EAAE,GAAG;AAClB,YAAI,YAAY,OAAO,GAAG,aAAa,aAAa,GAAG,SAAS,IAAG,GAAG,IAAI,GAAG;AAC7E,YAAI,qBAAqB,SAAS;AAChC,gBAAM,SAAS,MAAM;AACrB,cAAI,kBAAkB,UAAU;AAC9B,kBAAM,GAAG,OAAO,MAAM;AACtB;AAAA,UACF,WAAW,kBAAkB,MAAM;AACjC,eAAG,cAAc,WAAW,EAAE;AAC9B,kBAAM,GAAG,OAAO,MAAM;AACtB;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AAEL,cAAM,OAAO,OAAO,OAAO,YAAY,UAAU,KAAK,GAAG,OAAO,OAAO;AACvE,YAAI,YAAY,OAAO,SAAS,aAAa,KAAK,IAAI,GAAG,IAAI;AAC7D,YAAI,KAAK,kBAAkB;AAEzB,gBAAM,eAAe,KAAK,KAAK,KAAK,kBAAkB,SAAS;AAC/D,cAAI,GAAG,WAAW,YAAY,GAAG;AAC/B,eAAG,cAAc,WAAW,EAAE;AAC9B,eAAG,aAAa,YAAY,aAAa,KAAK,OAAO,YAAY,EAAE,SAAS,CAAC;AAC7E,kBAAM,GAAG,OAAO,GAAG,aAAa,YAAY,CAAC;AAC7C;AAAA,UACF,OAAO;AACL,eAAG,cAAc,WAAW,QAAQ;AACpC,kBAAM,GAAG,OAAO;AAChB;AAAA,UACF;AAAA,QACF,OAAO;AACL,aAAG,cAAc,WAAW,mBAAmB;AAC/C,gBAAM,GAAG,OAAO;AAChB;AAAA,QACF;AAAA,MACF;AACF,WAAK;AAAA,IACP;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,aAAa,EAAC,IAAI,IAAG,GAAgF;AAEvG,WAAO;AAAA,EACX;AACJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -6,6 +6,7 @@ import { ReqFormUrlBody } from "./datas/body/ReqFormUrlBody.js";
|
|
|
6
6
|
import { ReqJsonBody } from "./datas/body/ReqJsonBody.js";
|
|
7
7
|
import { ReqHeader } from "./datas/ReqHeader.js";
|
|
8
8
|
import { gzip } from "node-gzip";
|
|
9
|
+
import { Blob } from "node:buffer";
|
|
9
10
|
import { FileUtils } from "@dooboostore/core-node/file/FileUtils";
|
|
10
11
|
import { ConvertUtils as CoreConvertUtils } from "@dooboostore/core/convert/ConvertUtils";
|
|
11
12
|
import { ConvertUtils } from "@dooboostore/core-node/convert/ConvertUtils";
|
|
@@ -404,7 +405,28 @@ class RequestResponse {
|
|
|
404
405
|
this.res.end(data);
|
|
405
406
|
}
|
|
406
407
|
async resEnd(chunk) {
|
|
407
|
-
|
|
408
|
+
if (chunk instanceof Response) {
|
|
409
|
+
chunk.headers.forEach((value, key) => {
|
|
410
|
+
this.res.setHeader(`ORIGIN-${key}`, value);
|
|
411
|
+
});
|
|
412
|
+
if (!this.resHeader(HttpHeaders.ContentType)) {
|
|
413
|
+
const contentType = chunk.headers.get(HttpHeaders.ContentType);
|
|
414
|
+
if (contentType) {
|
|
415
|
+
this.res.setHeader(HttpHeaders.ContentType, contentType);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
this.res.statusCode = chunk.status;
|
|
419
|
+
this.resWriteChunk = Buffer.from(await chunk.arrayBuffer());
|
|
420
|
+
} else if (chunk instanceof Blob) {
|
|
421
|
+
this.resWriteChunk = Buffer.from(await chunk.arrayBuffer());
|
|
422
|
+
if (!this.resHeader(HttpHeaders.ContentType)) {
|
|
423
|
+
this.res.setHeader(HttpHeaders.ContentType, chunk.type);
|
|
424
|
+
}
|
|
425
|
+
} else if (chunk instanceof ArrayBuffer) {
|
|
426
|
+
this.resWriteChunk = Buffer.from(chunk);
|
|
427
|
+
} else {
|
|
428
|
+
this.resWriteChunk = chunk ?? this.resWriteChunk;
|
|
429
|
+
}
|
|
408
430
|
if (this.req.readable) {
|
|
409
431
|
await this.reqBodyData();
|
|
410
432
|
await this.resEndChunk();
|