@dooboostore/simple-boot-http-server 1.0.24 → 1.0.25
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 +113 -0
- package/dist/cjs/SimpleBootHttpServer.js +2 -2
- package/dist/cjs/SimpleBootHttpServer.js.map +1 -1
- package/dist/cjs/decorators/MethodMapping.js +33 -3
- package/dist/cjs/decorators/MethodMapping.js.map +2 -2
- package/dist/cjs/errors/BadRequestError.js +2 -1
- package/dist/cjs/errors/BadRequestError.js.map +2 -2
- package/dist/cjs/errors/ForbiddenError.js +2 -1
- package/dist/cjs/errors/ForbiddenError.js.map +2 -2
- package/dist/cjs/errors/InternalServerError.js +2 -1
- package/dist/cjs/errors/InternalServerError.js.map +2 -2
- package/dist/cjs/errors/NotFoundError.js +2 -1
- package/dist/cjs/errors/NotFoundError.js.map +2 -2
- package/dist/cjs/errors/UnauthorizedError.js +2 -1
- package/dist/cjs/errors/UnauthorizedError.js.map +2 -2
- package/dist/cjs/filters/IntentSchemeFilter.js +1 -2
- package/dist/cjs/filters/IntentSchemeFilter.js.map +2 -2
- package/dist/cjs/filters/ResourceFilter.js +3 -2
- package/dist/cjs/filters/ResourceFilter.js.map +2 -2
- package/dist/cjs/filters/index.js +3 -1
- package/dist/cjs/filters/index.js.map +2 -2
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/inject/InjectSituationType.js +1 -1
- package/dist/cjs/inject/InjectSituationType.js.map +2 -2
- package/dist/cjs/models/RequestResponse.js +19 -2
- package/dist/cjs/models/RequestResponse.js.map +2 -2
- package/dist/cjs/models/datas/body/index.js +28 -0
- package/dist/cjs/models/datas/body/index.js.map +7 -0
- package/dist/cjs/models/datas/index.js +32 -0
- package/dist/cjs/models/datas/index.js.map +7 -0
- package/dist/cjs/models/datas/{body → path}/ReqPathData.js.map +1 -1
- package/dist/cjs/models/datas/{search → path}/ReqSearchParamsObj.js.map +1 -1
- package/dist/cjs/models/datas/path/index.js +24 -0
- package/dist/cjs/models/datas/path/index.js.map +7 -0
- package/dist/cjs/models/index.js +4 -16
- package/dist/cjs/models/index.js.map +2 -2
- package/dist/cjs/models/method/index.js +22 -0
- package/dist/cjs/models/method/index.js.map +7 -0
- package/dist/cjs/models/method/patch/index.js +22 -0
- package/dist/cjs/models/method/patch/index.js.map +7 -0
- package/dist/cjs/proxy/SymbolIntentApiServiceProxy.js +98 -95
- package/dist/cjs/proxy/SymbolIntentApiServiceProxy.js.map +3 -3
- package/dist/cjs/proxy/SymbolIntentApiServiceProxyBase.js +1 -1
- package/dist/cjs/proxy/SymbolIntentApiServiceProxyBase.js.map +2 -2
- package/dist/esm/SimpleBootHttpServer.js +2 -2
- package/dist/esm/SimpleBootHttpServer.js.map +1 -1
- package/dist/esm/decorators/MethodMapping.js +22 -2
- package/dist/esm/decorators/MethodMapping.js.map +2 -2
- package/dist/esm/errors/BadRequestError.js +2 -1
- package/dist/esm/errors/BadRequestError.js.map +2 -2
- package/dist/esm/errors/ForbiddenError.js +2 -1
- package/dist/esm/errors/ForbiddenError.js.map +2 -2
- package/dist/esm/errors/InternalServerError.js +2 -1
- package/dist/esm/errors/InternalServerError.js.map +2 -2
- package/dist/esm/errors/NotFoundError.js +2 -1
- package/dist/esm/errors/NotFoundError.js.map +2 -2
- package/dist/esm/errors/UnauthorizedError.js +2 -1
- package/dist/esm/errors/UnauthorizedError.js.map +2 -2
- package/dist/esm/filters/IntentSchemeFilter.js +2 -3
- package/dist/esm/filters/IntentSchemeFilter.js.map +2 -2
- package/dist/esm/filters/ResourceFilter.js +3 -2
- package/dist/esm/filters/ResourceFilter.js.map +2 -2
- package/dist/esm/filters/index.js +1 -0
- package/dist/esm/filters/index.js.map +2 -2
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +2 -2
- package/dist/esm/inject/InjectSituationType.js +1 -1
- package/dist/esm/inject/InjectSituationType.js.map +2 -2
- package/dist/esm/models/RequestResponse.js +19 -2
- package/dist/esm/models/RequestResponse.js.map +2 -2
- package/dist/esm/models/datas/body/index.js +5 -0
- package/dist/esm/models/datas/body/index.js.map +7 -0
- package/dist/esm/models/datas/index.js +7 -0
- package/dist/esm/models/datas/index.js.map +7 -0
- package/dist/esm/models/datas/{body → path}/ReqPathData.js.map +1 -1
- package/dist/esm/models/datas/{search → path}/ReqSearchParamsObj.js.map +1 -1
- package/dist/esm/models/datas/path/index.js +3 -0
- package/dist/esm/models/datas/path/index.js.map +7 -0
- package/dist/esm/models/index.js +2 -8
- package/dist/esm/models/index.js.map +2 -2
- package/dist/esm/models/method/index.js +2 -0
- package/dist/esm/models/method/index.js.map +7 -0
- package/dist/esm/models/method/patch/index.js +2 -0
- package/dist/esm/models/method/patch/index.js.map +7 -0
- package/dist/esm/proxy/SymbolIntentApiServiceProxy.js +98 -95
- package/dist/esm/proxy/SymbolIntentApiServiceProxy.js.map +3 -3
- package/dist/esm/proxy/SymbolIntentApiServiceProxyBase.js +2 -2
- package/dist/esm/proxy/SymbolIntentApiServiceProxyBase.js.map +2 -2
- package/dist/esm-bundle/dooboostore-simple-boot-http-server.esm.js +5580 -974
- package/dist/esm-bundle/dooboostore-simple-boot-http-server.esm.js.map +4 -4
- package/dist/types/SimpleBootHttpServer.d.ts +1 -1
- package/dist/types/decorators/MethodMapping.d.ts +10 -0
- package/dist/types/decorators/MethodMapping.d.ts.map +1 -1
- package/dist/types/errors/BadRequestError.d.ts +2 -2
- package/dist/types/errors/BadRequestError.d.ts.map +1 -1
- package/dist/types/errors/ForbiddenError.d.ts +2 -2
- package/dist/types/errors/ForbiddenError.d.ts.map +1 -1
- package/dist/types/errors/InternalServerError.d.ts +2 -2
- package/dist/types/errors/InternalServerError.d.ts.map +1 -1
- package/dist/types/errors/NotFoundError.d.ts +2 -2
- package/dist/types/errors/NotFoundError.d.ts.map +1 -1
- package/dist/types/errors/UnauthorizedError.d.ts +2 -2
- package/dist/types/errors/UnauthorizedError.d.ts.map +1 -1
- package/dist/types/filters/ResourceFilter.d.ts.map +1 -1
- 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 +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/inject/InjectSituationType.d.ts.map +1 -1
- package/dist/types/models/RequestResponse.d.ts +3 -1
- package/dist/types/models/RequestResponse.d.ts.map +1 -1
- package/dist/types/models/datas/body/index.d.ts +5 -0
- package/dist/types/models/datas/body/index.d.ts.map +1 -0
- package/dist/types/models/datas/index.d.ts +7 -0
- package/dist/types/models/datas/index.d.ts.map +1 -0
- package/dist/types/models/datas/{body → path}/ReqPathData.d.ts.map +1 -1
- package/dist/types/models/datas/path/ReqSearchParamsObj.d.ts.map +1 -0
- package/dist/types/models/datas/path/index.d.ts +3 -0
- package/dist/types/models/datas/path/index.d.ts.map +1 -0
- package/dist/types/models/index.d.ts +2 -8
- package/dist/types/models/index.d.ts.map +1 -1
- package/dist/types/models/method/index.d.ts +2 -0
- package/dist/types/models/method/index.d.ts.map +1 -0
- package/dist/types/models/method/patch/index.d.ts +2 -0
- package/dist/types/models/method/patch/index.d.ts.map +1 -0
- package/dist/types/proxy/SymbolIntentApiServiceProxy.d.ts +6 -8
- package/dist/types/proxy/SymbolIntentApiServiceProxy.d.ts.map +1 -1
- package/dist/umd-bundle/dooboostore-simple-boot-http-server.umd.js +5583 -977
- package/dist/umd-bundle/dooboostore-simple-boot-http-server.umd.js.map +4 -4
- package/dist/umd-bundle/websocket-client.umd.js +182 -2
- package/dist/umd-bundle/websocket-client.umd.js.map +4 -4
- package/package.json +6 -6
- package/src/SimpleBootHttpServer.ts +4 -4
- package/src/decorators/MethodMapping.ts +13 -1
- package/src/errors/BadRequestError.ts +7 -3
- package/src/errors/ForbiddenError.ts +7 -3
- package/src/errors/InternalServerError.ts +7 -3
- package/src/errors/NotFoundError.ts +7 -3
- package/src/errors/UnauthorizedError.ts +7 -3
- package/src/filters/IntentSchemeFilter.ts +2 -2
- package/src/filters/ResourceFilter.ts +5 -2
- package/src/filters/index.ts +1 -0
- package/src/index.ts +1 -0
- package/src/inject/InjectSituationType.ts +1 -1
- package/src/models/RequestResponse.ts +28 -2
- package/src/models/datas/body/index.ts +4 -0
- package/src/models/datas/index.ts +6 -0
- package/src/models/datas/path/index.ts +2 -0
- package/src/models/index.ts +2 -8
- package/src/models/method/index.ts +1 -0
- package/src/models/method/patch/index.ts +1 -0
- package/src/proxy/SymbolIntentApiServiceProxy.ts +103 -97
- package/src/proxy/SymbolIntentApiServiceProxyBase.ts +2 -2
- package/README.MD +0 -62
- package/dist/types/models/datas/search/ReqSearchParamsObj.d.ts.map +0 -1
- /package/dist/cjs/models/datas/{body → path}/ReqPathData.js +0 -0
- /package/dist/cjs/models/datas/{search → path}/ReqSearchParamsObj.js +0 -0
- /package/dist/esm/models/datas/{body → path}/ReqPathData.js +0 -0
- /package/dist/esm/models/datas/{search → path}/ReqSearchParamsObj.js +0 -0
- /package/dist/types/models/datas/{body → path}/ReqPathData.d.ts +0 -0
- /package/dist/types/models/datas/{search → path}/ReqSearchParamsObj.d.ts +0 -0
- /package/src/models/datas/{body → path}/ReqPathData.ts +0 -0
- /package/src/models/datas/{search → path}/ReqSearchParamsObj.ts +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dooboostore/simple-boot-http-server",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.25",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/cjs/index.js",
|
|
@@ -92,11 +92,11 @@
|
|
|
92
92
|
"webpack": "^5.93.0",
|
|
93
93
|
"webpack-cli": "^5.1.4",
|
|
94
94
|
"webpack-dev-server": "^5.2.0",
|
|
95
|
-
"@dooboostore/core": "1.0.
|
|
96
|
-
"@dooboostore/
|
|
97
|
-
"@dooboostore/core-web": "1.0.
|
|
98
|
-
"@dooboostore/
|
|
99
|
-
"@dooboostore/
|
|
95
|
+
"@dooboostore/core-node": "1.0.12",
|
|
96
|
+
"@dooboostore/core": "1.0.32",
|
|
97
|
+
"@dooboostore/core-web": "1.0.12",
|
|
98
|
+
"@dooboostore/simple-boot": "1.0.56",
|
|
99
|
+
"@dooboostore/dom-render": "1.0.113"
|
|
100
100
|
},
|
|
101
101
|
"dependencies": {
|
|
102
102
|
"fast-json-patch": "^3.1.0",
|
|
@@ -28,9 +28,9 @@ import {URLSearchParams} from 'url';
|
|
|
28
28
|
import {HttpMethod} from './codes/HttpMethod';
|
|
29
29
|
import {SessionManager} from './session/SessionManager';
|
|
30
30
|
import {InjectSituationType} from './inject/InjectSituationType';
|
|
31
|
-
import {ReqSearchParamsObj} from "./models/datas/
|
|
31
|
+
import {ReqSearchParamsObj} from "./models/datas/path/ReqSearchParamsObj";
|
|
32
32
|
import {SimConfig} from '@dooboostore/simple-boot';
|
|
33
|
-
import {ReqPathData} from './models/datas/
|
|
33
|
+
import {ReqPathData} from './models/datas/path/ReqPathData';
|
|
34
34
|
import {WebSocketEndPoint} from './endpoints/WebSocketEndPoint';
|
|
35
35
|
|
|
36
36
|
export class SimpleBootHttpServer extends SimpleApplication {
|
|
@@ -44,8 +44,8 @@ export class SimpleBootHttpServer extends SimpleApplication {
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
|
|
47
|
-
public run(otherInstanceSim?: Map<ConstructorType<any> | Function | SimConfig |
|
|
48
|
-
otherInstanceSim ??= new Map<ConstructorType<any> | Function | SimConfig |
|
|
47
|
+
public run(otherInstanceSim?: Map<ConstructorType<any> | Function | SimConfig | symbol, any>) {
|
|
48
|
+
otherInstanceSim ??= new Map<ConstructorType<any> | Function | SimConfig | symbol, any>();
|
|
49
49
|
otherInstanceSim.set(SimpleBootHttpServer, this);
|
|
50
50
|
super.run(otherInstanceSim);
|
|
51
51
|
const targets = [...this.option.closeEndPoints ?? [], ...this.option.errorEndPoints ?? [], ...this.option.requestEndPoints ?? [], ...this.option.filters ?? []];
|
|
@@ -32,7 +32,7 @@ export type MappingConfig = {
|
|
|
32
32
|
resolver?: Resolver|ConstructorType<Resolver>;
|
|
33
33
|
}
|
|
34
34
|
export type SaveMappingConfig = {propertyKey: string | symbol; config: MappingConfig}
|
|
35
|
-
const MappingMetadataKey = Symbol('
|
|
35
|
+
const MappingMetadataKey = Symbol.for('simple-boot-http-server:mapping-metadata');
|
|
36
36
|
// const GETSMappingMetadataKey = Symbol('GET_METHODS');
|
|
37
37
|
// const GETMappingMetadataKey = Symbol('GET_METHOD');
|
|
38
38
|
|
|
@@ -234,3 +234,15 @@ export const getCONNECT = (target: any, propertyKey: string | symbol): MappingCo
|
|
|
234
234
|
export const getCONNECTS = (target: any): SaveMappingConfig[] => {
|
|
235
235
|
return getUrlMappings(target)?.filter(it => it.config?.method.toUpperCase() === HttpMethod.CONNECT);
|
|
236
236
|
}
|
|
237
|
+
|
|
238
|
+
// Aliases for lowercase
|
|
239
|
+
export const urlMapping = UrlMapping;
|
|
240
|
+
export const getMethod = GET;
|
|
241
|
+
export const postMethod = POST;
|
|
242
|
+
export const patchMethod = PATCH;
|
|
243
|
+
export const putMethod = PUT;
|
|
244
|
+
export const deleteMethod = DELETE;
|
|
245
|
+
export const optionsMethod = OPTIONS;
|
|
246
|
+
export const headMethod = HEAD;
|
|
247
|
+
export const traceMethod = TRACE;
|
|
248
|
+
export const connectMethod = CONNECT;
|
|
@@ -2,7 +2,11 @@ import {HttpError} from './HttpError';
|
|
|
2
2
|
import {HttpStatus} from '../codes/HttpStatus';
|
|
3
3
|
|
|
4
4
|
export class BadRequestError extends HttpError {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
constructor(
|
|
6
|
+
input: { status?: number; message?: string } | string = {},
|
|
7
|
+
) {
|
|
8
|
+
const {status = HttpStatus.BadRequest, message = 'Bad Request'} =
|
|
9
|
+
typeof input === 'string' ? {message: input} : input;
|
|
10
|
+
super({status, message});
|
|
11
|
+
}
|
|
8
12
|
}
|
|
@@ -2,7 +2,11 @@ import {HttpError} from './HttpError';
|
|
|
2
2
|
import {HttpStatus} from '../codes/HttpStatus';
|
|
3
3
|
|
|
4
4
|
export class ForbiddenError extends HttpError {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
constructor(
|
|
6
|
+
input: { status?: number; message?: string } | string = {},
|
|
7
|
+
) {
|
|
8
|
+
const {status = HttpStatus.Forbidden, message = 'Forbidden'} =
|
|
9
|
+
typeof input === 'string' ? {message: input} : input;
|
|
10
|
+
super({status, message});
|
|
11
|
+
}
|
|
8
12
|
}
|
|
@@ -2,7 +2,11 @@ import {HttpError} from './HttpError';
|
|
|
2
2
|
import {HttpStatus} from '../codes/HttpStatus';
|
|
3
3
|
|
|
4
4
|
export class InternalServerError extends HttpError {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
constructor(
|
|
6
|
+
input: { status?: number; message?: string } | string = {},
|
|
7
|
+
) {
|
|
8
|
+
const {status = HttpStatus.InternalServerError, message = 'Internal Server Error'} =
|
|
9
|
+
typeof input === 'string' ? {message: input} : input;
|
|
10
|
+
super({status, message});
|
|
11
|
+
}
|
|
8
12
|
}
|
|
@@ -2,7 +2,11 @@ import {HttpError} from './HttpError';
|
|
|
2
2
|
import {HttpStatus} from '../codes/HttpStatus';
|
|
3
3
|
|
|
4
4
|
export class NotFoundError extends HttpError {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
constructor(
|
|
6
|
+
input: { status?: number; message?: string } | string = {},
|
|
7
|
+
) {
|
|
8
|
+
const {status = HttpStatus.NotFound, message = 'Not Found'} =
|
|
9
|
+
typeof input === 'string' ? {message: input} : input;
|
|
10
|
+
super({status, message});
|
|
11
|
+
}
|
|
8
12
|
}
|
|
@@ -2,7 +2,11 @@ import {HttpError} from './HttpError';
|
|
|
2
2
|
import {HttpStatus} from '../codes/HttpStatus';
|
|
3
3
|
|
|
4
4
|
export class UnauthorizedError extends HttpError {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
constructor(
|
|
6
|
+
input: { status?: number; message?: string } | string = {},
|
|
7
|
+
) {
|
|
8
|
+
const {status = HttpStatus.Unauthorized, message = 'Unauthorized'} =
|
|
9
|
+
typeof input === 'string' ? {message: input} : input;
|
|
10
|
+
super({status, message});
|
|
11
|
+
}
|
|
8
12
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Filter } from './Filter';
|
|
2
2
|
import { HttpHeaders } from '../codes/HttpHeaders';
|
|
3
|
-
import {
|
|
3
|
+
import {Intent, sim} from '@dooboostore/simple-boot';
|
|
4
4
|
import { IntentManager } from '@dooboostore/simple-boot';
|
|
5
5
|
import { Sim } from '@dooboostore/simple-boot';
|
|
6
6
|
import { HttpStatus } from '../codes/HttpStatus';
|
|
@@ -9,7 +9,7 @@ import { SimpleBootHttpServer } from '../SimpleBootHttpServer';
|
|
|
9
9
|
import { Mimes } from '../codes/Mimes';
|
|
10
10
|
import { NotFoundError } from '../errors/NotFoundError';
|
|
11
11
|
|
|
12
|
-
@
|
|
12
|
+
@sim
|
|
13
13
|
export class IntentSchemeFilter implements Filter {
|
|
14
14
|
constructor(private intentManager: IntentManager) {}
|
|
15
15
|
|
|
@@ -54,7 +54,9 @@ export class ResourceFilter implements Filter {
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
if (typeof it === 'string') {
|
|
57
|
-
|
|
57
|
+
console.log('url!!!!!!!', url)
|
|
58
|
+
return it === url;
|
|
59
|
+
// return RegExp(it).test(url);
|
|
58
60
|
}
|
|
59
61
|
|
|
60
62
|
if (typeof it === 'function') {
|
|
@@ -67,7 +69,8 @@ export class ResourceFilter implements Filter {
|
|
|
67
69
|
} else if (it .request instanceof RegExp) {
|
|
68
70
|
return it.request.test(url);
|
|
69
71
|
} else {
|
|
70
|
-
return RegExp(it.request).test(url);
|
|
72
|
+
// return RegExp(it.request).test(url);
|
|
73
|
+
return it.request === url
|
|
71
74
|
}
|
|
72
75
|
}
|
|
73
76
|
})??[]
|
package/src/filters/index.ts
CHANGED
package/src/index.ts
CHANGED
|
@@ -20,6 +20,7 @@ import { RandomUtils } from '@dooboostore/core';
|
|
|
20
20
|
import { FileUtils } from '@dooboostore/core-node';
|
|
21
21
|
import { ConvertUtils as CoreConvertUtils } from '@dooboostore/core';
|
|
22
22
|
import { ConvertUtils } from '@dooboostore/core-node';
|
|
23
|
+
import {HttpMethod} from "../codes";
|
|
23
24
|
|
|
24
25
|
type Config = { sessionManager?: SessionManager; option: HttpServerOption };
|
|
25
26
|
|
|
@@ -134,11 +135,32 @@ export class RequestResponse {
|
|
|
134
135
|
}
|
|
135
136
|
|
|
136
137
|
reqHasContentTypeHeader(mime: Mimes | string): boolean {
|
|
137
|
-
|
|
138
|
+
const contentType = this.reqHeader(HttpHeaders.ContentType);
|
|
139
|
+
if (!contentType) return false;
|
|
140
|
+
|
|
141
|
+
const targetMime = mime.toString().toLowerCase();
|
|
142
|
+
const contentTypes = Array.isArray(contentType) ? contentType : [contentType];
|
|
143
|
+
|
|
144
|
+
// 모든 Content-Type 헤더를 확인
|
|
145
|
+
return contentTypes.some(ct => {
|
|
146
|
+
// Content-Type은 보통 단일 값이지만, 파라미터가 붙을 수 있음 (charset=utf-8 등)
|
|
147
|
+
// 세미콜론으로 split해서 앞 부분(MIME 타입)만 비교
|
|
148
|
+
const [mimeType] = ct.split(';').map(m => m.trim());
|
|
149
|
+
return mimeType.toLowerCase() === targetMime || mimeType.toLowerCase().includes(targetMime);
|
|
150
|
+
});
|
|
138
151
|
}
|
|
139
152
|
|
|
140
153
|
reqHasAcceptHeader(mime: Mimes | string): boolean {
|
|
141
|
-
|
|
154
|
+
const accept = this.reqHeader(HttpHeaders.Accept);
|
|
155
|
+
if (!accept) return false;
|
|
156
|
+
|
|
157
|
+
const targetMime = mime.toString().toLowerCase();
|
|
158
|
+
const acceptHeaders = Array.isArray(accept) ? accept : [accept];
|
|
159
|
+
|
|
160
|
+
return acceptHeaders.some(acceptHeader => {
|
|
161
|
+
const acceptMimes = acceptHeader.split(',').map(m => m.split(';')[0].trim().toLowerCase());
|
|
162
|
+
return acceptMimes.some(acceptMime => acceptMime.includes(targetMime));
|
|
163
|
+
});
|
|
142
164
|
}
|
|
143
165
|
|
|
144
166
|
reqBodyData(): Promise<Buffer> {
|
|
@@ -365,6 +387,10 @@ export class RequestResponse {
|
|
|
365
387
|
return this.req.method?.toUpperCase();
|
|
366
388
|
}
|
|
367
389
|
|
|
390
|
+
reqIsMethod(method: HttpMethod | string) {
|
|
391
|
+
return this.reqMethod().toUpperCase() === (method as string).toUpperCase();
|
|
392
|
+
}
|
|
393
|
+
|
|
368
394
|
reqHeader(key: keyof typeof HttpHeaders | string) {
|
|
369
395
|
return this.req.headers[(key as string).toLowerCase()];
|
|
370
396
|
}
|
package/src/models/index.ts
CHANGED
|
@@ -1,9 +1,3 @@
|
|
|
1
1
|
export * from './RequestResponse';
|
|
2
|
-
export * from './datas
|
|
3
|
-
export * from './
|
|
4
|
-
export * from './datas/ReqHeader';
|
|
5
|
-
export * from './datas/Resource';
|
|
6
|
-
export * from './datas/body/ReqFormUrlBody';
|
|
7
|
-
export * from './datas/body/ReqJsonBody';
|
|
8
|
-
export * from './datas/body/ReqMultipartFormBody';
|
|
9
|
-
export * from './method/patch/PatchJson';
|
|
2
|
+
export * from './datas'
|
|
3
|
+
export * from './method'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './patch'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './PatchJson'
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {getSim, sim, Sim, SimConfig} from '@dooboostore/simple-boot';
|
|
2
2
|
import { makeIntentHeaderBySymbolFor } from '../codes/HttpHeaders';
|
|
3
|
-
import { ConvertUtils
|
|
3
|
+
import {ConstructorType, ConvertUtils} from '@dooboostore/core';
|
|
4
4
|
import { ApiService } from '@dooboostore/simple-boot';
|
|
5
5
|
|
|
6
|
-
export type
|
|
6
|
+
export type SymbolIntentApiServiceConfig<T = any> = {
|
|
7
7
|
method?: 'get' | 'post' | 'petch' | 'delete' | 'head';
|
|
8
8
|
multipartFormData?: boolean;
|
|
9
9
|
bypassTransform?: boolean;
|
|
@@ -14,107 +14,113 @@ export type Config<T = any> = {
|
|
|
14
14
|
};
|
|
15
15
|
const _ = ApiService;
|
|
16
16
|
|
|
17
|
-
@Sim
|
|
18
|
-
export class SymbolIntentApiServiceProxy<T extends object> implements ProxyHandler<T> {
|
|
19
|
-
constructor(private apiService: ApiService) {
|
|
20
|
-
// console.log('-------apiService', apiService);
|
|
21
|
-
}
|
|
22
17
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
18
|
+
export const createHandler = <T extends object>(apiService: ApiService): ProxyHandler<T> => {
|
|
19
|
+
return {
|
|
20
|
+
get(target: T, prop: string | symbol, receiver: any): any {
|
|
21
|
+
if (prop === '_SimpleBoot_origin') {
|
|
22
|
+
return target;
|
|
23
|
+
}
|
|
24
|
+
const simConfig = getSim(target);
|
|
25
|
+
const value = Reflect.get(target, prop, receiver);
|
|
26
|
+
if (typeof value === 'function' && simConfig?.symbol) {
|
|
27
|
+
return function (...args: any[]) {
|
|
28
|
+
const f = value as Function;
|
|
29
|
+
const p = (userConfig: SymbolIntentApiServiceConfig) => {
|
|
30
|
+
const headers = {...(userConfig?.headers ?? {}), ...makeIntentHeaderBySymbolFor(simConfig.symbol as Symbol)};
|
|
31
|
+
const method = userConfig?.method ?? 'post';
|
|
32
|
+
if (method === 'post' && userConfig?.multipartFormData) {
|
|
33
|
+
//@ts-ignore
|
|
34
|
+
return apiService.post({
|
|
35
|
+
target: `/${String(prop)}`,
|
|
36
|
+
config: {
|
|
37
|
+
responseTransform: userConfig?.bypassTransform ? 'response' : undefined,
|
|
38
|
+
transformText: userConfig?.transformText,
|
|
39
|
+
config: userConfig?.config,
|
|
40
|
+
fetch: {
|
|
41
|
+
credentials: 'include',
|
|
42
|
+
headers: headers,
|
|
43
|
+
body: ConvertUtils.toFormData(userConfig?.body)
|
|
50
44
|
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
} else if (method === 'post') {
|
|
48
|
+
//@ts-ignore
|
|
49
|
+
return apiService.postJson({
|
|
50
|
+
target: `/${String(prop)}`,
|
|
51
|
+
config: {
|
|
52
|
+
responseTransform: userConfig?.bypassTransform ? 'response' : undefined,
|
|
53
|
+
transformText: userConfig?.transformText,
|
|
54
|
+
config: userConfig?.config,
|
|
55
|
+
fetch: {
|
|
56
|
+
credentials: 'include',
|
|
57
|
+
headers: headers,
|
|
58
|
+
body: userConfig?.body
|
|
65
59
|
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
} else if (method === 'petch') {
|
|
63
|
+
//@ts-ignore
|
|
64
|
+
return apiService.patchJson({
|
|
65
|
+
target: `/${String(prop)}`,
|
|
66
|
+
config: {
|
|
67
|
+
responseTransform: userConfig?.bypassTransform ? 'response' : undefined,
|
|
68
|
+
transformText: userConfig?.transformText,
|
|
69
|
+
config: userConfig?.config,
|
|
70
|
+
fetch: {
|
|
71
|
+
credentials: 'include',
|
|
72
|
+
headers: headers,
|
|
73
|
+
body: userConfig?.body
|
|
80
74
|
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
} else {
|
|
78
|
+
//@ts-ignore
|
|
79
|
+
return apiService[method]({
|
|
80
|
+
target: {url: `/${String(prop)}`, searchParams: userConfig?.body},
|
|
81
|
+
config: {
|
|
82
|
+
responseTransform: userConfig?.bypassTransform ? 'response' : undefined,
|
|
83
|
+
transformText: userConfig?.transformText,
|
|
84
|
+
config: userConfig?.config,
|
|
85
|
+
fetch: {
|
|
86
|
+
credentials: 'include',
|
|
87
|
+
headers: headers
|
|
94
88
|
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
args.push(p);
|
|
99
|
-
return Reflect.apply(f, target, args);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
100
92
|
};
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
apply(target: T, thisArg: any, argArray: any[]): any {
|
|
106
|
-
console.log('SymbolIntentApiServiceProxy apply');
|
|
107
|
-
// @ts-ignore
|
|
108
|
-
return Reflect.apply(target, thisArg, argArray);
|
|
93
|
+
args.push(p);
|
|
94
|
+
return Reflect.apply(f, target, args);
|
|
95
|
+
};
|
|
109
96
|
}
|
|
110
|
-
|
|
111
|
-
|
|
97
|
+
return Reflect.get(target, prop, receiver);
|
|
98
|
+
},
|
|
112
99
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
100
|
+
apply(target: T, thisArg: any, argArray: any[]): any {
|
|
101
|
+
console.log('SymbolIntentApiServiceProxy apply');
|
|
102
|
+
// @ts-ignore
|
|
103
|
+
return Reflect.apply(target, thisArg, argArray);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
}
|
|
116
107
|
|
|
117
|
-
|
|
118
|
-
|
|
108
|
+
export default (config?: SimConfig): ConstructorType<any> => {
|
|
109
|
+
|
|
110
|
+
@sim(config)
|
|
111
|
+
class SymbolIntentApiServiceProxy<T extends object> implements ProxyHandler<T> {
|
|
112
|
+
constructor(private apiService: ApiService) {
|
|
113
|
+
// console.log('-------apiService', apiService);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
get(target: T, prop: string | symbol, receiver: any): any {
|
|
118
|
+
return createHandler<T>(this.apiService).get!(target, prop, receiver);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
apply(target: T, thisArg: any, argArray: any[]): any {
|
|
122
|
+
return createHandler<T>(this.apiService).apply!(target, thisArg, argArray);
|
|
123
|
+
}
|
|
119
124
|
}
|
|
120
|
-
|
|
125
|
+
return SymbolIntentApiServiceProxy;
|
|
126
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {ApiService} from '@dooboostore/simple-boot';
|
|
2
|
-
import {
|
|
2
|
+
import {createHandler} from './SymbolIntentApiServiceProxy';
|
|
3
3
|
|
|
4
4
|
export class SymbolIntentApiServiceProxyBase<T extends object = any> {
|
|
5
5
|
// 생성자는 프록시될 대상 객체(target)와 의존성을 주입받습니다.
|
|
@@ -7,7 +7,7 @@ export class SymbolIntentApiServiceProxyBase<T extends object = any> {
|
|
|
7
7
|
apiService: ApiService,
|
|
8
8
|
) {
|
|
9
9
|
// SymbolIntentApiServiceProxy의 static handler를 사용합니다.
|
|
10
|
-
const handler =
|
|
10
|
+
const handler = createHandler<T>(apiService);
|
|
11
11
|
|
|
12
12
|
// 생성자에서 Proxy 객체를 반환합니다.
|
|
13
13
|
// @ts-ignore
|
package/README.MD
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
# @dooboostore/simple-boot-http-server
|
|
2
|
-
|
|
3
|
-
[](https://www.npmjs.com/package/@dooboostore/simple-boot-http-server)
|
|
4
|
-
[](https://github.com/dooboostore-develop/packages/actions/workflows/main.yaml)
|
|
5
|
-
[](https://opensource.org/licenses/MIT)
|
|
6
|
-
|
|
7
|
-
**Full Documentation:** [https://dooboostore-develop.github.io/@dooboostore/simple-boot-http-server](https://dooboostore-develop.github.io/@dooboostore/simple-boot-http-server)
|
|
8
|
-
|
|
9
|
-
A lightweight and powerful HTTP web server framework for Node.js, built on `@dooboostore/simple-boot`.
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## Features
|
|
14
|
-
|
|
15
|
-
- **Declarative Routing**: Use decorators like `@Router`, `@Route`, `@GET`, `@POST`, etc., to map URL paths and HTTP methods directly to your controller methods.
|
|
16
|
-
- **Middleware via Filters**: Intercept the request-response cycle with `Filter` classes to implement cross-cutting concerns like logging, authentication, and CORS.
|
|
17
|
-
- **Lifecycle Endpoints**: Hook into the request lifecycle with `EndPoint` classes that run on request start, close, or error.
|
|
18
|
-
- **Integrated Exception Handling**: Leverage `@simple-boot`'s AOP capabilities to create robust global error handlers.
|
|
19
|
-
- **Built-in Session Management**: Easily manage user sessions with a built-in session manager and customizable storage.
|
|
20
|
-
- **HTTPS and HTTP/2 Support**: Secure your server with HTTPS and HTTP/2 configuration.
|
|
21
|
-
- **WebSocket Topics + Events**: Topic-based subscribe/request/response with server events.
|
|
22
|
-
- **WebSocket Binary File Transfer**: Send/receive files inside regular message payloads (JSON + binary framing).
|
|
23
|
-
- **WebSocket Auto Reconnect**: Automatic reconnect and re-subscribe with configurable retry.
|
|
24
|
-
|
|
25
|
-
## Quick Start
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
npx @dooboostore/create-simple-boot-http-server my-server
|
|
29
|
-
cd my-server
|
|
30
|
-
npm start
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## Security Hardening
|
|
34
|
-
|
|
35
|
-
- Enforce TLS in production: configure HTTPS (or terminate TLS at a trusted reverse proxy) and redirect HTTP to HTTPS.
|
|
36
|
-
- Keep session cookies hardened: use `httpOnly`, `secure`, `sameSite`, short expiration, and explicit `domain/path` when required.
|
|
37
|
-
- Protect WebSocket endpoints: validate origin, authenticate at connect/subscribe time, and authorize per topic.
|
|
38
|
-
- Validate all inputs: apply strict validation for route params, query/body payloads, and uploaded files (type/size/path).
|
|
39
|
-
- Avoid sensitive data leakage: never return stack traces, internal file paths, raw SQL errors, or secrets in responses/logs.
|
|
40
|
-
- Configure CORS minimally: allow only required origins/methods/headers, avoid wildcard credentials.
|
|
41
|
-
- Add rate limiting and timeout guards: mitigate brute force and resource-exhaustion attacks.
|
|
42
|
-
- Rotate secrets/keys regularly and load them from environment or a secret manager (never hardcode in source).
|
|
43
|
-
- Keep dependencies updated and scan regularly for CVEs.
|
|
44
|
-
|
|
45
|
-
### Minimal Production Checklist
|
|
46
|
-
|
|
47
|
-
- `HTTPS` enabled end-to-end
|
|
48
|
-
- Session cookie options set (`httpOnly`, `secure`, `sameSite`)
|
|
49
|
-
- CORS restricted to trusted origins
|
|
50
|
-
- Request/WS auth + authorization enforced
|
|
51
|
-
- Upload size/type limits configured
|
|
52
|
-
- Error responses sanitized
|
|
53
|
-
|
|
54
|
-
## Learn More
|
|
55
|
-
|
|
56
|
-
The detailed API documentation, including all decorators and usage examples, is available on our documentation website.
|
|
57
|
-
|
|
58
|
-
- WebSocket Guide: [document/websocket/README.md](document/websocket/README.md)
|
|
59
|
-
|
|
60
|
-
## License
|
|
61
|
-
|
|
62
|
-
This package is licensed under the [MIT License](https://opensource.org/licenses/MIT).
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ReqSearchParamsObj.d.ts","sourceRoot":"","sources":["../../../../../src/models/datas/search/ReqSearchParamsObj.ts"],"names":[],"mappings":"AAAA,qBAAa,kBAAkB;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACrB"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|