@dooboostore/simple-boot-http-server 1.0.23 → 1.0.24
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 +27 -1
- package/dist/cjs/SimpleBootHttpServer.js +79 -39
- package/dist/cjs/SimpleBootHttpServer.js.map +3 -3
- package/dist/cjs/codes/HttpHeaders.js +14 -3
- package/dist/cjs/codes/HttpHeaders.js.map +2 -2
- package/dist/cjs/codes/Mimes.js +2 -0
- package/dist/cjs/codes/Mimes.js.map +2 -2
- package/dist/cjs/decorators/MethodMapping.js +7 -6
- package/dist/cjs/decorators/MethodMapping.js.map +3 -3
- package/dist/cjs/endpoints/WebSocketEndPoint.js +16 -0
- package/dist/cjs/endpoints/WebSocketEndPoint.js.map +7 -0
- package/dist/cjs/filters/CacheFilter.js +75 -35
- package/dist/cjs/filters/CacheFilter.js.map +3 -3
- package/dist/cjs/filters/IntentSchemeFilter.js +98 -0
- package/dist/cjs/filters/IntentSchemeFilter.js.map +7 -0
- package/dist/cjs/filters/ResourceFilter.js +4 -1
- package/dist/cjs/filters/ResourceFilter.js.map +2 -2
- package/dist/cjs/filters/TopicProtocolFilter.js +343 -0
- package/dist/cjs/filters/TopicProtocolFilter.js.map +7 -0
- package/dist/cjs/filters/index.js +2 -0
- package/dist/cjs/filters/index.js.map +2 -2
- package/dist/cjs/index.js +28 -0
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/models/RequestResponse.js +51 -89
- package/dist/cjs/models/RequestResponse.js.map +3 -3
- package/dist/cjs/models/datas/body/ReqPathData.js +29 -0
- package/dist/cjs/models/datas/body/ReqPathData.js.map +7 -0
- package/dist/cjs/option/HttpServerOption.js +25 -5
- package/dist/cjs/option/HttpServerOption.js.map +2 -2
- package/dist/cjs/proxy/SymbolIntentApiServiceProxy.js +141 -0
- package/dist/cjs/proxy/SymbolIntentApiServiceProxy.js.map +7 -0
- package/dist/cjs/proxy/SymbolIntentApiServiceProxyBase.js +35 -0
- package/dist/cjs/proxy/SymbolIntentApiServiceProxyBase.js.map +7 -0
- package/dist/cjs/proxy/TopicProtocolApiServiceProxy.js +324 -0
- package/dist/cjs/proxy/TopicProtocolApiServiceProxy.js.map +7 -0
- package/dist/cjs/proxy/index.js +26 -0
- package/dist/cjs/proxy/index.js.map +7 -0
- package/dist/cjs/resolvers/ResourceResolver.js +2 -2
- package/dist/cjs/resolvers/ResourceResolver.js.map +2 -2
- package/dist/cjs/session/SessionManager.js +2 -2
- package/dist/cjs/session/SessionManager.js.map +2 -2
- package/dist/cjs/websocket/WebSocketClient.js +554 -0
- package/dist/cjs/websocket/WebSocketClient.js.map +7 -0
- package/dist/cjs/websocket/WebSocketManager.js +652 -0
- package/dist/cjs/websocket/WebSocketManager.js.map +7 -0
- package/dist/cjs/websocket/index.js +24 -0
- package/dist/cjs/websocket/index.js.map +7 -0
- package/dist/esm/SimpleBootHttpServer.js +59 -19
- package/dist/esm/SimpleBootHttpServer.js.map +2 -2
- package/dist/esm/codes/HttpHeaders.js +12 -2
- package/dist/esm/codes/HttpHeaders.js.map +2 -2
- package/dist/esm/codes/Mimes.js +2 -0
- package/dist/esm/codes/Mimes.js.map +2 -2
- package/dist/esm/decorators/MethodMapping.js +2 -1
- package/dist/esm/decorators/MethodMapping.js.map +2 -2
- package/dist/esm/endpoints/WebSocketEndPoint.js +1 -0
- package/dist/esm/endpoints/WebSocketEndPoint.js.map +7 -0
- package/dist/esm/filters/CacheFilter.js +67 -27
- package/dist/esm/filters/CacheFilter.js.map +2 -2
- package/dist/esm/filters/IntentSchemeFilter.js +75 -0
- package/dist/esm/filters/IntentSchemeFilter.js.map +7 -0
- package/dist/esm/filters/ResourceFilter.js +4 -1
- package/dist/esm/filters/ResourceFilter.js.map +2 -2
- package/dist/esm/filters/TopicProtocolFilter.js +310 -0
- package/dist/esm/filters/TopicProtocolFilter.js.map +7 -0
- package/dist/esm/filters/index.js +1 -0
- package/dist/esm/filters/index.js.map +2 -2
- package/dist/esm/index.js +12 -0
- package/dist/esm/index.js.map +2 -2
- package/dist/esm/models/RequestResponse.js +46 -84
- package/dist/esm/models/RequestResponse.js.map +2 -2
- package/dist/esm/models/datas/body/ReqPathData.js +6 -0
- package/dist/esm/models/datas/body/ReqPathData.js.map +7 -0
- package/dist/esm/option/HttpServerOption.js +24 -4
- package/dist/esm/option/HttpServerOption.js.map +2 -2
- package/dist/esm/proxy/SymbolIntentApiServiceProxy.js +118 -0
- package/dist/esm/proxy/SymbolIntentApiServiceProxy.js.map +7 -0
- package/dist/esm/proxy/SymbolIntentApiServiceProxyBase.js +12 -0
- package/dist/esm/proxy/SymbolIntentApiServiceProxyBase.js.map +7 -0
- package/dist/esm/proxy/TopicProtocolApiServiceProxy.js +301 -0
- package/dist/esm/proxy/TopicProtocolApiServiceProxy.js.map +7 -0
- package/dist/esm/proxy/index.js +4 -0
- package/dist/esm/proxy/index.js.map +7 -0
- package/dist/esm/resolvers/ResourceResolver.js +1 -1
- package/dist/esm/resolvers/ResourceResolver.js.map +1 -1
- package/dist/esm/session/SessionManager.js +1 -1
- package/dist/esm/session/SessionManager.js.map +1 -1
- package/dist/esm/websocket/WebSocketClient.js +529 -0
- package/dist/esm/websocket/WebSocketClient.js.map +7 -0
- package/dist/esm/websocket/WebSocketManager.js +622 -0
- package/dist/esm/websocket/WebSocketManager.js.map +7 -0
- package/dist/esm/websocket/index.js +3 -0
- package/dist/esm/websocket/index.js.map +7 -0
- package/dist/esm-bundle/dooboostore-simple-boot-http-server.esm.js +13190 -4886
- package/dist/esm-bundle/dooboostore-simple-boot-http-server.esm.js.map +4 -4
- package/dist/types/SimpleBootHttpServer.d.ts +5 -3
- package/dist/types/SimpleBootHttpServer.d.ts.map +1 -1
- package/dist/types/codes/HttpHeaders.d.ts +3 -0
- package/dist/types/codes/HttpHeaders.d.ts.map +1 -1
- package/dist/types/codes/Mimes.d.ts +3 -1
- package/dist/types/codes/Mimes.d.ts.map +1 -1
- package/dist/types/decorators/MethodMapping.d.ts +3 -2
- package/dist/types/decorators/MethodMapping.d.ts.map +1 -1
- package/dist/types/endpoints/WebSocketEndPoint.d.ts +17 -0
- package/dist/types/endpoints/WebSocketEndPoint.d.ts.map +1 -0
- package/dist/types/filters/CacheFilter.d.ts +6 -0
- package/dist/types/filters/CacheFilter.d.ts.map +1 -1
- package/dist/types/filters/IntentSchemeFilter.d.ts +20 -0
- package/dist/types/filters/IntentSchemeFilter.d.ts.map +1 -0
- package/dist/types/filters/ResourceFilter.d.ts.map +1 -1
- package/dist/types/filters/TopicProtocolFilter.d.ts +34 -0
- package/dist/types/filters/TopicProtocolFilter.d.ts.map +1 -0
- package/dist/types/filters/index.d.ts +1 -0
- package/dist/types/filters/index.d.ts.map +1 -1
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/models/RequestResponse.d.ts +9 -6
- package/dist/types/models/RequestResponse.d.ts.map +1 -1
- package/dist/types/models/datas/body/ReqPathData.d.ts +4 -0
- package/dist/types/models/datas/body/ReqPathData.d.ts.map +1 -0
- package/dist/types/option/HttpServerOption.d.ts +30 -20
- package/dist/types/option/HttpServerOption.d.ts.map +1 -1
- package/dist/types/proxy/SymbolIntentApiServiceProxy.d.ts +18 -0
- package/dist/types/proxy/SymbolIntentApiServiceProxy.d.ts.map +1 -0
- package/dist/types/proxy/SymbolIntentApiServiceProxyBase.d.ts +5 -0
- package/dist/types/proxy/SymbolIntentApiServiceProxyBase.d.ts.map +1 -0
- package/dist/types/proxy/TopicProtocolApiServiceProxy.d.ts +28 -0
- package/dist/types/proxy/TopicProtocolApiServiceProxy.d.ts.map +1 -0
- package/dist/types/proxy/index.d.ts +4 -0
- package/dist/types/proxy/index.d.ts.map +1 -0
- package/dist/types/session/SessionManager.d.ts +2 -17
- package/dist/types/session/SessionManager.d.ts.map +1 -1
- package/dist/types/websocket/WebSocketClient.d.ts +88 -0
- package/dist/types/websocket/WebSocketClient.d.ts.map +1 -0
- package/dist/types/websocket/WebSocketManager.d.ts +163 -0
- package/dist/types/websocket/WebSocketManager.d.ts.map +1 -0
- package/dist/types/websocket/index.d.ts +3 -0
- package/dist/types/websocket/index.d.ts.map +1 -0
- package/dist/umd-bundle/dooboostore-simple-boot-http-server.umd.js +13262 -4958
- package/dist/umd-bundle/dooboostore-simple-boot-http-server.umd.js.map +4 -4
- package/dist/umd-bundle/websocket-client.umd.js +11194 -0
- package/dist/umd-bundle/websocket-client.umd.js.map +7 -0
- package/package.json +24 -15
- package/src/SimpleBootHttpServer.ts +366 -312
- package/src/codes/HttpHeaders.ts +13 -2
- package/src/codes/Mimes.ts +27 -25
- package/src/decorators/MethodMapping.ts +4 -3
- package/src/endpoints/WebSocketEndPoint.ts +12 -0
- package/src/filters/CacheFilter.ts +112 -67
- package/src/filters/IntentSchemeFilter.ts +69 -0
- package/src/filters/ResourceFilter.ts +6 -1
- package/src/filters/TopicProtocolFilter.ts +349 -0
- package/src/filters/index.ts +1 -0
- package/src/index.ts +12 -12
- package/src/models/RequestResponse.ts +108 -240
- package/src/models/datas/body/ReqPathData.ts +3 -0
- package/src/option/HttpServerOption.ts +73 -23
- package/src/proxy/SymbolIntentApiServiceProxy.ts +120 -0
- package/src/proxy/SymbolIntentApiServiceProxyBase.ts +16 -0
- package/src/proxy/TopicProtocolApiServiceProxy.ts +328 -0
- package/src/proxy/index.ts +3 -0
- package/src/resolvers/ResourceResolver.ts +1 -1
- package/src/session/SessionManager.ts +3 -3
- package/src/websocket/WebSocketClient.ts +637 -0
- package/src/websocket/WebSocketManager.ts +713 -0
- package/src/websocket/index.ts +2 -0
- package/tsconfig.json +3 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { HttpHeaders } from "../codes/HttpHeaders.js";
|
|
2
|
-
import { Intent } from "@dooboostore/simple-boot
|
|
2
|
+
import { Intent } from "@dooboostore/simple-boot";
|
|
3
3
|
import { URL, URLSearchParams } from "url";
|
|
4
4
|
import { Buffer } from "buffer";
|
|
5
5
|
import { ReqFormUrlBody } from "./datas/body/ReqFormUrlBody.js";
|
|
@@ -7,38 +7,31 @@ import { ReqJsonBody } from "./datas/body/ReqJsonBody.js";
|
|
|
7
7
|
import { ReqHeader } from "./datas/ReqHeader.js";
|
|
8
8
|
import { gzip } from "node-gzip";
|
|
9
9
|
import { Blob } from "node:buffer";
|
|
10
|
-
import { FileUtils } from "@dooboostore/core-node
|
|
11
|
-
import { ConvertUtils as CoreConvertUtils } from "@dooboostore/core
|
|
12
|
-
import { ConvertUtils } from "@dooboostore/core-node
|
|
10
|
+
import { FileUtils } from "@dooboostore/core-node";
|
|
11
|
+
import { ConvertUtils as CoreConvertUtils } from "@dooboostore/core";
|
|
12
|
+
import { ConvertUtils } from "@dooboostore/core-node";
|
|
13
13
|
class RequestResponse {
|
|
14
|
-
// protected sessionManager?: SessionManager;
|
|
15
|
-
// constructor(req: IncomingMessage, res: ServerResponse);
|
|
16
|
-
// constructor(req: RequestResponse);
|
|
17
|
-
// constructor(req: IncomingMessage, res: ServerResponse, sessionManager?: SessionManager);
|
|
18
|
-
// constructor(req: IncomingMessage | RequestResponse, res?: ServerResponse, sessionManager?: SessionManager) {
|
|
19
|
-
// // this.req = req;
|
|
20
|
-
// // this.res = res;
|
|
21
|
-
// if (req instanceof RequestResponse) {
|
|
22
|
-
// this.req = req.req;
|
|
23
|
-
// this.res = req.res;
|
|
24
|
-
// this.sessionManager = req.sessionManager;
|
|
25
|
-
// } else {
|
|
26
|
-
// this.req = req;
|
|
27
|
-
// this.res = res!;
|
|
28
|
-
// this.sessionManager = sessionManager;
|
|
29
|
-
// }
|
|
30
|
-
// }
|
|
31
14
|
constructor(req, res, config) {
|
|
15
|
+
// [아키텍트님의 정석] RequestResponse 객체 고유의 속성 저장소 (트랜잭션 생명주기)
|
|
16
|
+
this.attributes = /* @__PURE__ */ new Map();
|
|
32
17
|
if (req instanceof RequestResponse) {
|
|
33
18
|
this.req = req.req;
|
|
34
19
|
this.res = req.res;
|
|
35
20
|
this.config = config;
|
|
21
|
+
this.attributes = req.attributes;
|
|
36
22
|
} else {
|
|
37
23
|
this.req = req;
|
|
38
24
|
this.res = res;
|
|
39
25
|
this.config = config;
|
|
40
26
|
}
|
|
41
27
|
}
|
|
28
|
+
// --- RequestResponse Attributes (Transaction Life-cycle) ---
|
|
29
|
+
setAttribute(key, value) {
|
|
30
|
+
this.attributes.set(key, value);
|
|
31
|
+
}
|
|
32
|
+
getAttribute(key) {
|
|
33
|
+
return this.attributes.get(key);
|
|
34
|
+
}
|
|
42
35
|
get reqSocket() {
|
|
43
36
|
return this.req.socket;
|
|
44
37
|
}
|
|
@@ -49,7 +42,7 @@ class RequestResponse {
|
|
|
49
42
|
}
|
|
50
43
|
const map = /* @__PURE__ */ new Map();
|
|
51
44
|
cookies.split(";").map((it) => it.trim().split("=")).forEach((it) => {
|
|
52
|
-
map.set(it[0], it[1]);
|
|
45
|
+
if (it[0]) map.set(it[0], it[1]);
|
|
53
46
|
});
|
|
54
47
|
return map;
|
|
55
48
|
}
|
|
@@ -67,7 +60,7 @@ class RequestResponse {
|
|
|
67
60
|
return ip;
|
|
68
61
|
}
|
|
69
62
|
get reqUrlObject() {
|
|
70
|
-
return new URL(this.reqUrl, `${this.reqSocket ? "https://" : "http"}${this.reqHost ?? "localhost"}`);
|
|
63
|
+
return new URL(this.reqUrl, `${this.reqSocket ? "https://" : "http://"}${this.reqHost ?? "localhost"}`);
|
|
71
64
|
}
|
|
72
65
|
get reqUrlPathName() {
|
|
73
66
|
return this.reqUrlObj().pathname ?? "";
|
|
@@ -139,7 +132,6 @@ class RequestResponse {
|
|
|
139
132
|
}
|
|
140
133
|
}
|
|
141
134
|
}
|
|
142
|
-
;
|
|
143
135
|
return formData;
|
|
144
136
|
}
|
|
145
137
|
reqBodyMultipartFormData() {
|
|
@@ -195,7 +187,6 @@ class RequestResponse {
|
|
|
195
187
|
const partBuffer = fullBuffer.slice(currentPosition, partEndIndex);
|
|
196
188
|
const headerBodySeparatorIndex = partBuffer.indexOf(doubleCrlfBuffer);
|
|
197
189
|
if (headerBodySeparatorIndex === -1) {
|
|
198
|
-
console.warn("Skipping malformed part: no header/body separator found.");
|
|
199
190
|
currentPosition = nextBoundaryIndex + boundaryBuffer.length;
|
|
200
191
|
if (fullBuffer.slice(currentPosition, currentPosition + crlfBuffer.length).equals(crlfBuffer)) {
|
|
201
192
|
currentPosition += crlfBuffer.length;
|
|
@@ -217,7 +208,6 @@ class RequestResponse {
|
|
|
217
208
|
});
|
|
218
209
|
const contentDisposition = headers["content-disposition"];
|
|
219
210
|
if (!contentDisposition) {
|
|
220
|
-
console.warn("Skipping part: no Content-Disposition header.");
|
|
221
211
|
currentPosition = nextBoundaryIndex + boundaryBuffer.length;
|
|
222
212
|
if (fullBuffer.slice(currentPosition, currentPosition + crlfBuffer.length).equals(crlfBuffer)) {
|
|
223
213
|
currentPosition += crlfBuffer.length;
|
|
@@ -231,18 +221,21 @@ class RequestResponse {
|
|
|
231
221
|
const filename = filenameMatch ? filenameMatch[1] : null;
|
|
232
222
|
const contentType = headers["content-type"] || null;
|
|
233
223
|
if (name) {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
224
|
+
if (filename) {
|
|
225
|
+
parsedParts.push({
|
|
226
|
+
isFile: true,
|
|
227
|
+
name,
|
|
228
|
+
filename,
|
|
229
|
+
contentType: contentType ?? "application/octet-stream",
|
|
230
|
+
value: bodyBuffer
|
|
231
|
+
});
|
|
232
|
+
} else {
|
|
233
|
+
parsedParts.push({
|
|
234
|
+
isFile: false,
|
|
235
|
+
name,
|
|
236
|
+
value: bodyBuffer.toString("utf-8")
|
|
237
|
+
});
|
|
238
|
+
}
|
|
246
239
|
}
|
|
247
240
|
currentPosition = nextBoundaryIndex + boundaryBuffer.length;
|
|
248
241
|
if (fullBuffer.slice(currentPosition, currentPosition + crlfBuffer.length).equals(crlfBuffer)) {
|
|
@@ -286,9 +279,6 @@ class RequestResponse {
|
|
|
286
279
|
const data = await this.reqBodyStringData();
|
|
287
280
|
return Object.assign(new ReqJsonBody(), data ? JSON.parse(data) : {});
|
|
288
281
|
}
|
|
289
|
-
// reqBodyReqMultipartFormBody(): Promise<ReqMultipartFormBody> {
|
|
290
|
-
// return this.reqBodyMultipartFormData().then(it => new ReqMultipartFormBody(it))
|
|
291
|
-
// }
|
|
292
282
|
resBodyJsonData() {
|
|
293
283
|
const data = ConvertUtils.toString(this.resBodyData());
|
|
294
284
|
return data ? JSON.parse(data) : null;
|
|
@@ -326,7 +316,6 @@ class RequestResponse {
|
|
|
326
316
|
reqRefreshTokenHeader() {
|
|
327
317
|
return this.reqHeaderFirst(HttpHeaders.Authorization);
|
|
328
318
|
}
|
|
329
|
-
// eslint-disable-next-line no-dupe-class-members
|
|
330
319
|
resStatusCode(code) {
|
|
331
320
|
if (code) {
|
|
332
321
|
this.res.statusCode = code;
|
|
@@ -348,43 +337,41 @@ class RequestResponse {
|
|
|
348
337
|
}
|
|
349
338
|
async reqSession() {
|
|
350
339
|
if (this.config.sessionManager) {
|
|
351
|
-
|
|
340
|
+
const session = await this.config.sessionManager.session(this);
|
|
341
|
+
session.dataSet.data ??= {};
|
|
342
|
+
return session.dataSet.data;
|
|
352
343
|
} else {
|
|
353
344
|
return Promise.reject(new Error("Not SessionManager"));
|
|
354
345
|
}
|
|
355
346
|
}
|
|
356
|
-
reqSessionSet(key, value) {
|
|
357
|
-
this.reqSession
|
|
347
|
+
async reqSessionSet(key, value) {
|
|
348
|
+
const sessionData = await this.reqSession();
|
|
349
|
+
sessionData[key] = value;
|
|
358
350
|
}
|
|
359
|
-
reqSessionGet(key) {
|
|
360
|
-
const
|
|
361
|
-
|
|
362
|
-
return session[key];
|
|
363
|
-
}
|
|
351
|
+
async reqSessionGet(key) {
|
|
352
|
+
const sessionData = await this.reqSession();
|
|
353
|
+
return sessionData[key];
|
|
364
354
|
}
|
|
365
355
|
resSetStatusCode(statusCode) {
|
|
366
356
|
this.res.statusCode = statusCode;
|
|
367
357
|
return this.createRequestResponseChain(this.res.statusCode);
|
|
368
358
|
}
|
|
369
|
-
// resEnd() {
|
|
370
|
-
// this.res.end();
|
|
371
|
-
// }
|
|
372
|
-
// eslint-disable-next-line no-undef
|
|
373
359
|
resWrite(chunk, encoding = "utf8") {
|
|
374
360
|
this.resWriteChunk = chunk;
|
|
375
361
|
return this.createRequestResponseChain(this.resWriteChunk);
|
|
376
362
|
}
|
|
377
|
-
// eslint-disable-next-line no-undef
|
|
378
363
|
resWriteJson(chunk, encoding = "utf8") {
|
|
379
364
|
return this.resWrite(JSON.stringify(chunk), encoding);
|
|
380
365
|
}
|
|
381
366
|
resSetHeader(key, value) {
|
|
382
|
-
|
|
367
|
+
this.res.setHeader(key.toLowerCase(), value);
|
|
368
|
+
return this.createRequestResponseChain();
|
|
383
369
|
}
|
|
384
370
|
resAddHeader(key, value) {
|
|
385
371
|
const existingValue = this.res.getHeader(key.toLowerCase());
|
|
386
372
|
const newValue = Array.isArray(existingValue) ? existingValue.concat(value) : existingValue ? [existingValue.toString(), ...[].concat(value)] : value;
|
|
387
|
-
|
|
373
|
+
this.res.setHeader(key.toLowerCase(), newValue);
|
|
374
|
+
return this.createRequestResponseChain();
|
|
388
375
|
}
|
|
389
376
|
resSetHeaders(headers) {
|
|
390
377
|
Object.entries(headers).forEach(([key, value]) => this.resSetHeader(key, value));
|
|
@@ -394,11 +381,10 @@ class RequestResponse {
|
|
|
394
381
|
Object.entries(headers).forEach(([key, value]) => this.resAddHeader(key, value));
|
|
395
382
|
return this.createRequestResponseChain();
|
|
396
383
|
}
|
|
397
|
-
// 마지막 종료될때 타는거.
|
|
398
384
|
async resEndChunk() {
|
|
399
385
|
const encoding = this.reqHeaderFirst(HttpHeaders.AcceptEncoding);
|
|
400
386
|
let data = this.resWriteChunk;
|
|
401
|
-
if (encoding?.includes("gzip")) {
|
|
387
|
+
if (encoding?.includes("gzip") && data) {
|
|
402
388
|
data = await gzip(data);
|
|
403
389
|
this.resSetHeader(HttpHeaders.ContentEncoding, "gzip");
|
|
404
390
|
}
|
|
@@ -411,9 +397,7 @@ class RequestResponse {
|
|
|
411
397
|
});
|
|
412
398
|
if (!this.resHeader(HttpHeaders.ContentType)) {
|
|
413
399
|
const contentType = chunk.headers.get(HttpHeaders.ContentType);
|
|
414
|
-
if (contentType)
|
|
415
|
-
this.res.setHeader(HttpHeaders.ContentType, contentType);
|
|
416
|
-
}
|
|
400
|
+
if (contentType) this.res.setHeader(HttpHeaders.ContentType, contentType);
|
|
417
401
|
}
|
|
418
402
|
this.res.statusCode = chunk.status;
|
|
419
403
|
this.resWriteChunk = Buffer.from(await chunk.arrayBuffer());
|
|
@@ -434,15 +418,6 @@ class RequestResponse {
|
|
|
434
418
|
await this.resEndChunk();
|
|
435
419
|
}
|
|
436
420
|
}
|
|
437
|
-
// writeContinue(callback?: () => void) {
|
|
438
|
-
// this.res.writeContinue(callback);
|
|
439
|
-
// return new RequestResponseChain(this.req, this.res);
|
|
440
|
-
// }
|
|
441
|
-
// reqWrite(chunk?: any) {
|
|
442
|
-
// this.resWriteChunk = chunk;
|
|
443
|
-
// // this.res.write(chunk);
|
|
444
|
-
// return this.createRequestResponseChain();
|
|
445
|
-
// }
|
|
446
421
|
resRedirect(statusCode, location) {
|
|
447
422
|
this.res.statusCode = statusCode;
|
|
448
423
|
this.res.setHeader(HttpHeaders.Location, location);
|
|
@@ -464,19 +439,6 @@ class RequestResponse {
|
|
|
464
439
|
requestResponseChain.reqBodyChunk = this.reqBodyChunk;
|
|
465
440
|
return requestResponseChain;
|
|
466
441
|
}
|
|
467
|
-
// res.on("readable", () => {
|
|
468
|
-
// console.log('readable???')
|
|
469
|
-
// });
|
|
470
|
-
// res.on('complete', function (details) {
|
|
471
|
-
// var size = details.req.bytes;
|
|
472
|
-
// console.log('complete-->', size)
|
|
473
|
-
// });
|
|
474
|
-
// res.on('finish', function() {
|
|
475
|
-
// console.log('finish??');
|
|
476
|
-
// });
|
|
477
|
-
// res.on('end', () => {
|
|
478
|
-
// console.log('end--?')
|
|
479
|
-
// });
|
|
480
442
|
}
|
|
481
443
|
class RequestResponseChain extends RequestResponse {
|
|
482
444
|
constructor(req, res, config, result) {
|
|
@@ -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 { 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, etcData: it });\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 resRedirect(statusCode: number, location: string) {\n this.res.statusCode = statusCode;\n this.res.setHeader(HttpHeaders.Location, location);\n this.res.end();\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';\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';\nimport { FileUtils } from '@dooboostore/core-node';\nimport { ConvertUtils as CoreConvertUtils } from '@dooboostore/core';\nimport { ConvertUtils } from '@dooboostore/core-node';\n\ntype Config = { sessionManager?: SessionManager; option: HttpServerOption };\n\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\n // [\uC544\uD0A4\uD14D\uD2B8\uB2D8\uC758 \uC815\uC11D] RequestResponse \uAC1D\uCCB4 \uACE0\uC720\uC758 \uC18D\uC131 \uC800\uC7A5\uC18C (\uD2B8\uB79C\uC7AD\uC158 \uC0DD\uBA85\uC8FC\uAE30)\n protected attributes = new Map<string, any>();\n\n constructor(req: IncomingMessage | RequestResponse, res: ServerResponse, config: Config) {\n if (req instanceof RequestResponse) {\n this.req = req.req;\n this.res = req.res;\n this.config = config;\n this.attributes = req.attributes;\n } else {\n this.req = req;\n this.res = res!;\n this.config = config;\n }\n }\n\n // --- RequestResponse Attributes (Transaction Life-cycle) ---\n\n setAttribute(key: string, value: any): void {\n this.attributes.set(key, value);\n }\n\n getAttribute<T = any>(key: string): T | undefined {\n return this.attributes.get(key) as T;\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\n .split(';')\n .map(it => it.trim().split('='))\n .forEach(it => {\n if (it[0]) 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 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 }\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 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, etcData: it });\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];\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');\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([]);\n }\n\n const fullBuffer = Buffer.concat(chunks, totalLength);\n const parsedParts: MultipartData[] = [];\n let currentPosition = 0;\n\n let boundaryStartIndex = fullBuffer.indexOf(boundaryBuffer, currentPosition);\n if (boundaryStartIndex === -1) {\n return reject(new Error('Initial boundary not found.'));\n }\n currentPosition = boundaryStartIndex + boundaryBuffer.length;\n if (fullBuffer.slice(currentPosition, currentPosition + crlfBuffer.length).equals(crlfBuffer)) {\n currentPosition += crlfBuffer.length;\n }\n\n while (currentPosition < fullBuffer.length) {\n const nextBoundaryIndex = fullBuffer.indexOf(boundaryBuffer, currentPosition);\n if (nextBoundaryIndex === -1) {\n break;\n }\n\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 const headerBodySeparatorIndex = partBuffer.indexOf(doubleCrlfBuffer);\n if (headerBodySeparatorIndex === -1) {\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 headerBuffer = partBuffer.slice(0, headerBodySeparatorIndex);\n const bodyBuffer = partBuffer.slice(headerBodySeparatorIndex + doubleCrlfBuffer.length);\n const headersStr = headerBuffer.toString('utf-8');\n\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 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 if (filename) {\n parsedParts.push({\n isFile: true,\n name: name,\n filename: filename,\n contentType: contentType ?? 'application/octet-stream',\n value: bodyBuffer\n });\n } else {\n parsedParts.push({\n isFile: false,\n name: name,\n value: bodyBuffer.toString('utf-8')\n });\n }\n }\n\n currentPosition = nextBoundaryIndex + boundaryBuffer.length;\n if (fullBuffer.slice(currentPosition, currentPosition + crlfBuffer.length).equals(crlfBuffer)) {\n currentPosition += crlfBuffer.length;\n }\n\n if (fullBuffer.slice(currentPosition, currentPosition + 2).toString() === '--') {\n break;\n }\n }\n resolve(parsedParts);\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 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 as string).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 as string).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 resStatusCode(code: number | HttpStatus): RequestResponseChain<number>;\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 as string).toLowerCase());\n }\n\n resHeaderFirst(key: HttpHeadersType | string, defaultValue?: string) {\n const header = this.res.getHeader((key as string).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 const session = await this.config.sessionManager.session(this);\n session.dataSet.data ??= {};\n return session.dataSet.data;\n } else {\n return Promise.reject(new Error('Not SessionManager'));\n }\n }\n\n async reqSessionSet(key: string, value: any): Promise<void> {\n const sessionData = await this.reqSession();\n sessionData[key] = value;\n }\n\n async reqSessionGet<T = any>(key: string): Promise<T | undefined> {\n const sessionData = await this.reqSession();\n return sessionData[key] as T;\n }\n\n resSetStatusCode(statusCode: number) {\n this.res.statusCode = statusCode;\n return this.createRequestResponseChain(this.res.statusCode);\n }\n\n resWrite(chunk: string | Buffer | any, encoding: BufferEncoding = 'utf8') {\n this.resWriteChunk = chunk;\n return this.createRequestResponseChain(this.resWriteChunk);\n }\n\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 this.res.setHeader((key as string).toLowerCase(), value);\n return this.createRequestResponseChain();\n }\n\n resAddHeader(key: HttpHeadersType | string, value: string | string[]) {\n const existingValue = this.res.getHeader((key as string).toLowerCase());\n const newValue = Array.isArray(existingValue) ? existingValue.concat(value) : existingValue ? [existingValue.toString(), ...[].concat(value as any)] : value;\n this.res.setHeader((key as string).toLowerCase(), newValue as any);\n return this.createRequestResponseChain();\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 private async resEndChunk() {\n const encoding = this.reqHeaderFirst(HttpHeaders.AcceptEncoding);\n let data = this.resWriteChunk;\n if (encoding?.includes('gzip') && data) {\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 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) this.res.setHeader(HttpHeaders.ContentType, contentType);\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 resRedirect(statusCode: number, location: string) {\n this.res.statusCode = statusCode;\n this.res.setHeader(HttpHeaders.Location, location);\n this.res.end();\n }\n resWriteHead(statusCode: number, headers?: OutgoingHttpHeaders | OutgoingHttpHeader[] | { [key: string]: string | string[] }) {\n return this.createRequestResponseChain(this.res.writeHead(statusCode, headers as any));\n }\n resWriteHeadEnd(statusCode: number, headers?: OutgoingHttpHeaders | OutgoingHttpHeader[] | { [key: string]: string | string[] }) {\n this.createRequestResponseChain(this.res.writeHead(statusCode, headers as any));\n this.res.end();\n }\n\n resIsDone() {\n return this.res.finished || this.res.writableEnded || this.res.headersSent;\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\nexport class RequestResponseChain<T> extends RequestResponse {\n constructor(\n req: IncomingMessage,\n res: ServerResponse,\n config: Config,\n public result?: T\n ) {\n super(req, res, config);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SimOption } from "@dooboostore/simple-boot
|
|
1
|
+
import { SimOption } from "@dooboostore/simple-boot";
|
|
2
2
|
class HttpServerOption extends SimOption {
|
|
3
3
|
static {
|
|
4
4
|
this.DEFAULT_PORT = 8081;
|
|
@@ -6,15 +6,35 @@ class HttpServerOption extends SimOption {
|
|
|
6
6
|
static {
|
|
7
7
|
this.DEFAULT_HOSTNAME = "127.0.0.1";
|
|
8
8
|
}
|
|
9
|
-
constructor({
|
|
9
|
+
constructor({
|
|
10
|
+
serverOption,
|
|
11
|
+
listen,
|
|
12
|
+
filters,
|
|
13
|
+
requestEndPoints,
|
|
14
|
+
closeEndPoints,
|
|
15
|
+
errorEndPoints,
|
|
16
|
+
webSocketEndPoints,
|
|
17
|
+
sessionOption,
|
|
18
|
+
globalAdvice,
|
|
19
|
+
fileUploadTempPath,
|
|
20
|
+
noSuchRouteEndPointMappingThrow,
|
|
21
|
+
transactionManagerFactory
|
|
22
|
+
} = {}, initSimOption) {
|
|
10
23
|
super(initSimOption);
|
|
11
24
|
this.serverOption = serverOption;
|
|
12
|
-
this.listen = Object.assign(
|
|
25
|
+
this.listen = Object.assign(
|
|
26
|
+
{ port: HttpServerOption.DEFAULT_PORT, hostname: HttpServerOption.DEFAULT_HOSTNAME },
|
|
27
|
+
listen
|
|
28
|
+
);
|
|
13
29
|
this.filters = filters;
|
|
14
30
|
this.requestEndPoints = requestEndPoints;
|
|
15
31
|
this.closeEndPoints = closeEndPoints;
|
|
16
32
|
this.errorEndPoints = errorEndPoints;
|
|
17
|
-
this.
|
|
33
|
+
this.webSocketEndPoints = webSocketEndPoints;
|
|
34
|
+
this.sessionOption = Object.assign(
|
|
35
|
+
{ key: "SBSESSIONID", path: "/", httpOnly: true, expiredTime: 1e3 * 60 * 30 },
|
|
36
|
+
sessionOption
|
|
37
|
+
);
|
|
18
38
|
this.globalAdvice = globalAdvice;
|
|
19
39
|
this.fileUploadTempPath = fileUploadTempPath;
|
|
20
40
|
this.noSuchRouteEndPointMappingThrow = noSuchRouteEndPointMappingThrow;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/option/HttpServerOption.ts"],
|
|
4
|
-
"sourcesContent": ["import { InitOptionType, SimOption } from '@dooboostore/simple-boot
|
|
5
|
-
"mappings": "AAAA,SAAyB,iBAAiB;
|
|
4
|
+
"sourcesContent": ["import { InitOptionType, SimOption } from '@dooboostore/simple-boot';\nimport { ConstructorType } from '@dooboostore/core';\nimport { Server as HttpServer, ServerOptions } from 'http';\nimport { Server as HttpsServer, ServerOptions as HttpsServerOption } from 'https';\nimport { Filter } from '../filters/Filter';\nimport { EndPoint } from '../endpoints/EndPoint';\nimport { RequestResponse } from '../models/RequestResponse';\nimport { SimpleBootHttpServer } from '../SimpleBootHttpServer';\nimport { TransactionManager } from '@dooboostore/core';\nimport { WebSocketEndPoint } from '../endpoints/WebSocketEndPoint';\n\nexport type Listen = { port?: number, hostname?: string, backlog?: number, listeningListener?: (server: SimpleBootHttpServer, httpServer: HttpServer | HttpsServer) => void };\n\nexport interface ListenData extends Listen {\n port: number;\n hostname: string;\n}\n\nexport type SessionOption = {\n key: string;\n expiredTime: number;\n httpOnly?: boolean;\n secure?: boolean;\n maxAge?: number;\n sameSite?: boolean | 'lax' | 'strict' | 'none';\n domain?: string;\n path?: string;\n provider?: {\n uuids: () => Promise<string[]>;\n delete: (uuid: string) => Promise<void>;\n get: (uuid: string) => Promise<{ access: number; data?: any }>;\n set: (uuid: string, data: { access: number; data?: any }) => Promise<void>;\n };\n};\n\nexport class HttpServerOption extends SimOption {\n public static readonly DEFAULT_PORT = 8081;\n public static readonly DEFAULT_HOSTNAME = '127.0.0.1';\n public serverOption?: ServerOptions | HttpsServerOption;\n public listen: ListenData;\n public filters?: (Filter | ConstructorType<Filter>)[];\n public fileUploadTempPath?: string;\n public requestEndPoints?: (EndPoint | ConstructorType<EndPoint>)[];\n public webSocketEndPoints?: (WebSocketEndPoint | ConstructorType<WebSocketEndPoint>)[];\n public closeEndPoints?: (EndPoint | ConstructorType<EndPoint>)[];\n public errorEndPoints?: (EndPoint | ConstructorType<EndPoint>)[];\n public sessionOption: SessionOption;\n public globalAdvice?: any | ConstructorType<any>;\n public noSuchRouteEndPointMappingThrow?: (rr: RequestResponse) => any;\n public transactionManagerFactory?: () => TransactionManager;\n\n constructor(\n {\n serverOption,\n listen,\n filters,\n requestEndPoints,\n closeEndPoints,\n errorEndPoints,\n webSocketEndPoints,\n sessionOption,\n globalAdvice,\n fileUploadTempPath,\n noSuchRouteEndPointMappingThrow,\n transactionManagerFactory\n }: {\n serverOption?: ServerOptions | HttpsServerOption;\n listen?: Listen;\n filters?: (Filter | ConstructorType<Filter>)[];\n requestEndPoints?: (EndPoint | ConstructorType<EndPoint>)[];\n closeEndPoints?: (EndPoint | ConstructorType<EndPoint>)[];\n errorEndPoints?: (EndPoint | ConstructorType<EndPoint>)[];\n webSocketEndPoints?: (WebSocketEndPoint | ConstructorType<WebSocketEndPoint>)[];\n sessionOption?: {\n key?: string;\n expiredTime?: number;\n provider?: {\n uuids: () => Promise<string[]>;\n delete: (uuid: string) => Promise<void>;\n get: (uuid: string) => Promise<{ access: number; data?: any }>;\n set: (uuid: string, data: { access: number; data?: any }) => Promise<void>;\n };\n };\n globalAdvice?: any | ConstructorType<any>;\n fileUploadTempPath?: string;\n noSuchRouteEndPointMappingThrow?: (rr: RequestResponse) => any;\n transactionManagerFactory?: () => TransactionManager;\n } = {},\n initSimOption?: InitOptionType\n ) {\n super(initSimOption);\n this.serverOption = serverOption;\n this.listen = Object.assign(\n { port: HttpServerOption.DEFAULT_PORT, hostname: HttpServerOption.DEFAULT_HOSTNAME },\n listen\n );\n this.filters = filters;\n this.requestEndPoints = requestEndPoints;\n this.closeEndPoints = closeEndPoints;\n this.errorEndPoints = errorEndPoints;\n this.webSocketEndPoints = webSocketEndPoints;\n this.sessionOption = Object.assign(\n { key: 'SBSESSIONID', path: '/', httpOnly: true, expiredTime: 1000 * 60 * 30 },\n sessionOption\n );\n this.globalAdvice = globalAdvice;\n this.fileUploadTempPath = fileUploadTempPath;\n this.noSuchRouteEndPointMappingThrow = noSuchRouteEndPointMappingThrow;\n this.transactionManagerFactory = transactionManagerFactory;\n }\n\n get hostname() {\n return this.listen.hostname;\n }\n\n get port() {\n return this.listen.port;\n }\n\n get protocol() {\n return this.isSecure ? 'https' : 'http';\n }\n\n get address() {\n return `${this.protocol}://${this.hostname}:${this.port}`;\n }\n\n get isSecure() {\n return this.serverOption && 'key' in this.serverOption && 'cert' in this.serverOption;\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAyB,iBAAiB;AAmCnC,MAAM,yBAAyB,UAAU;AAAA,EAC9C;AAAA,SAAuB,eAAe;AAAA;AAAA,EACtC;AAAA,SAAuB,mBAAmB;AAAA;AAAA,EAc1C,YACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAsBI,CAAC,GACL,eACA;AACA,UAAM,aAAa;AACnB,SAAK,eAAe;AACpB,SAAK,SAAS,OAAO;AAAA,MACnB,EAAE,MAAM,iBAAiB,cAAc,UAAU,iBAAiB,iBAAiB;AAAA,MACnF;AAAA,IACF;AACA,SAAK,UAAU;AACf,SAAK,mBAAmB;AACxB,SAAK,iBAAiB;AACtB,SAAK,iBAAiB;AACtB,SAAK,qBAAqB;AAC1B,SAAK,gBAAgB,OAAO;AAAA,MAC1B,EAAE,KAAK,eAAe,MAAM,KAAK,UAAU,MAAM,aAAa,MAAO,KAAK,GAAG;AAAA,MAC7E;AAAA,IACF;AACA,SAAK,eAAe;AACpB,SAAK,qBAAqB;AAC1B,SAAK,kCAAkC;AACvC,SAAK,4BAA4B;AAAA,EACnC;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,OAAO;AACT,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,WAAW,UAAU;AAAA,EACnC;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,GAAG,KAAK,QAAQ,MAAM,KAAK,QAAQ,IAAI,KAAK,IAAI;AAAA,EACzD;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,gBAAgB,SAAS,KAAK,gBAAgB,UAAU,KAAK;AAAA,EAC3E;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|