@dooboostore/simple-boot-http-server 1.0.24 → 1.0.26
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 +16 -4
- package/dist/cjs/SimpleBootHttpServer.js.map +2 -2
- package/dist/cjs/bundle-entry.js +34 -24
- package/dist/cjs/bundle-entry.js.map +2 -2
- 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/option/HttpServerOption.js.map +2 -2
- 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/cjs/proxy/TopicProtocolApiServiceProxy.js +244 -266
- package/dist/cjs/proxy/TopicProtocolApiServiceProxy.js.map +3 -3
- package/dist/cjs/websocket/WebSocketClient.js +2 -1
- package/dist/cjs/websocket/WebSocketClient.js.map +2 -2
- package/dist/esm/SimpleBootHttpServer.js +16 -4
- package/dist/esm/SimpleBootHttpServer.js.map +2 -2
- package/dist/esm/bundle-entry.js +14 -12
- package/dist/esm/bundle-entry.js.map +2 -2
- 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/option/HttpServerOption.js.map +2 -2
- 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/proxy/TopicProtocolApiServiceProxy.js +244 -266
- package/dist/esm/proxy/TopicProtocolApiServiceProxy.js.map +3 -3
- package/dist/esm/websocket/WebSocketClient.js +3 -2
- package/dist/esm/websocket/WebSocketClient.js.map +2 -2
- package/dist/esm-bundle/dooboostore-simple-boot-http-server.esm.js +19374 -4956
- 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/SimpleBootHttpServer.d.ts.map +1 -1
- package/dist/types/bundle-entry.d.ts +7 -12
- package/dist/types/bundle-entry.d.ts.map +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/option/HttpServerOption.d.ts +6 -2
- package/dist/types/option/HttpServerOption.d.ts.map +1 -1
- package/dist/types/proxy/SymbolIntentApiServiceProxy.d.ts +6 -8
- package/dist/types/proxy/SymbolIntentApiServiceProxy.d.ts.map +1 -1
- package/dist/types/proxy/TopicProtocolApiServiceProxy.d.ts +5 -15
- package/dist/types/proxy/TopicProtocolApiServiceProxy.d.ts.map +1 -1
- package/dist/types/websocket/WebSocketClient.d.ts.map +1 -1
- package/dist/umd-bundle/dooboostore-simple-boot-http-server.umd.js +19340 -4928
- package/dist/umd-bundle/dooboostore-simple-boot-http-server.umd.js.map +4 -4
- package/dist/umd-bundle/websocket-client.umd.js +378 -1468
- package/dist/umd-bundle/websocket-client.umd.js.map +4 -4
- package/package.json +8 -8
- package/src/SimpleBootHttpServer.ts +20 -6
- package/src/bundle-entry.ts +12 -12
- 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/option/HttpServerOption.ts +4 -2
- package/src/proxy/SymbolIntentApiServiceProxy.ts +103 -97
- package/src/proxy/SymbolIntentApiServiceProxyBase.ts +2 -2
- package/src/proxy/TopicProtocolApiServiceProxy.ts +260 -275
- package/src/websocket/WebSocketClient.ts +3 -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.26",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/cjs/index.js",
|
|
@@ -67,7 +67,12 @@
|
|
|
67
67
|
"url": "https://github.com/dooboostore-develop/packages"
|
|
68
68
|
},
|
|
69
69
|
"peerDependencies": {
|
|
70
|
-
"reflect-metadata": "^0.2.2"
|
|
70
|
+
"reflect-metadata": "^0.2.2",
|
|
71
|
+
"@dooboostore/core": "1.0.32",
|
|
72
|
+
"@dooboostore/core-node": "1.0.13",
|
|
73
|
+
"@dooboostore/core-web": "1.0.13",
|
|
74
|
+
"@dooboostore/dom-render": "1.0.114",
|
|
75
|
+
"@dooboostore/simple-boot": "1.0.57"
|
|
71
76
|
},
|
|
72
77
|
"devDependencies": {
|
|
73
78
|
"@babel/core": "^7.24.0",
|
|
@@ -91,12 +96,7 @@
|
|
|
91
96
|
"typescript": "^5.9.2",
|
|
92
97
|
"webpack": "^5.93.0",
|
|
93
98
|
"webpack-cli": "^5.1.4",
|
|
94
|
-
"webpack-dev-server": "^5.2.0"
|
|
95
|
-
"@dooboostore/core": "1.0.30",
|
|
96
|
-
"@dooboostore/simple-boot": "1.0.54",
|
|
97
|
-
"@dooboostore/core-web": "1.0.10",
|
|
98
|
-
"@dooboostore/dom-render": "1.0.113",
|
|
99
|
-
"@dooboostore/core-node": "1.0.12"
|
|
99
|
+
"webpack-dev-server": "^5.2.0"
|
|
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,11 +44,11 @@ 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
|
-
const targets = [...this.option.closeEndPoints ?? [], ...this.option.errorEndPoints ?? [], ...this.option.requestEndPoints ?? [], ...this.option.filters ?? []];
|
|
51
|
+
const targets = [...this.option.closeEndPoints ?? [], ...this.option.errorEndPoints ?? [], ...this.option.requestEndPoints ?? [], ...(this.option.filters ?? []).map(it=>it.filter)];
|
|
52
52
|
Promise.all(targets.map(it => (typeof it === 'function' ? this.simstanceManager.getOrNewSim({target: it as ConstructorType<any>}) : it) as OnInit).map(it => it.onInit(this))).then(it => {
|
|
53
53
|
this.startServer();
|
|
54
54
|
});
|
|
@@ -158,8 +158,22 @@ export class SimpleBootHttpServer extends SimpleApplication {
|
|
|
158
158
|
};
|
|
159
159
|
for (let i = 0; this.option.filters && i < this.option.filters.length; i++) {
|
|
160
160
|
const it = this.option.filters[i];
|
|
161
|
-
|
|
161
|
+
|
|
162
|
+
let isSkip = false;
|
|
163
|
+
if (typeof it.isSupport === 'boolean') {
|
|
164
|
+
isSkip = !it.isSupport;
|
|
165
|
+
} else if (typeof it.isSupport === 'object') {
|
|
166
|
+
isSkip = !it.isSupport.test(rr.reqUrlPathName)
|
|
167
|
+
} else if (typeof it.isSupport === 'function') {
|
|
168
|
+
isSkip = !it.isSupport(rr);
|
|
169
|
+
}
|
|
170
|
+
if(isSkip) {
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
|
|
162
174
|
let sw = true;
|
|
175
|
+
const itFilter = it.filter;
|
|
176
|
+
const execute = (typeof itFilter === 'function' ? this.simstanceManager.getOrNewSim({target: itFilter}) : itFilter) as Filter;
|
|
163
177
|
if (execute?.proceedBefore) {
|
|
164
178
|
sw = await execute.proceedBefore({rr, app: this, carrier: filter.carrier});
|
|
165
179
|
filter.filters.push({filter: execute, sw});
|
package/src/bundle-entry.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export * from './
|
|
5
|
-
|
|
6
|
-
export
|
|
7
|
-
|
|
8
|
-
export * from '
|
|
9
|
-
export * from '
|
|
10
|
-
export * from '
|
|
11
|
-
export * from '
|
|
12
|
-
export * from '
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
|
|
3
|
+
// simple-boot-http-server itself
|
|
4
|
+
export * from './index';
|
|
5
|
+
|
|
6
|
+
// Re-export peer dependencies so bundle consumers can access them
|
|
7
|
+
// without separately importing each package
|
|
8
|
+
export * as Core from '@dooboostore/core';
|
|
9
|
+
export * as CoreNode from '@dooboostore/core-node';
|
|
10
|
+
export * as CoreWeb from '@dooboostore/core-web';
|
|
11
|
+
export * as DomRender from '@dooboostore/dom-render';
|
|
12
|
+
export * as SimpleBoot from '@dooboostore/simple-boot';
|
|
@@ -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'
|
|
@@ -33,12 +33,14 @@ export type SessionOption = {
|
|
|
33
33
|
};
|
|
34
34
|
};
|
|
35
35
|
|
|
36
|
+
export type FilterSupportType = { filter: Filter | ConstructorType<Filter>, isSupport: boolean | ((rr: RequestResponse) => boolean) | RegExp };
|
|
37
|
+
|
|
36
38
|
export class HttpServerOption extends SimOption {
|
|
37
39
|
public static readonly DEFAULT_PORT = 8081;
|
|
38
40
|
public static readonly DEFAULT_HOSTNAME = '127.0.0.1';
|
|
39
41
|
public serverOption?: ServerOptions | HttpsServerOption;
|
|
40
42
|
public listen: ListenData;
|
|
41
|
-
public filters?:
|
|
43
|
+
public filters?: FilterSupportType[];
|
|
42
44
|
public fileUploadTempPath?: string;
|
|
43
45
|
public requestEndPoints?: (EndPoint | ConstructorType<EndPoint>)[];
|
|
44
46
|
public webSocketEndPoints?: (WebSocketEndPoint | ConstructorType<WebSocketEndPoint>)[];
|
|
@@ -66,7 +68,7 @@ export class HttpServerOption extends SimOption {
|
|
|
66
68
|
}: {
|
|
67
69
|
serverOption?: ServerOptions | HttpsServerOption;
|
|
68
70
|
listen?: Listen;
|
|
69
|
-
filters?: (
|
|
71
|
+
filters?: (FilterSupportType)[];
|
|
70
72
|
requestEndPoints?: (EndPoint | ConstructorType<EndPoint>)[];
|
|
71
73
|
closeEndPoints?: (EndPoint | ConstructorType<EndPoint>)[];
|
|
72
74
|
errorEndPoints?: (EndPoint | ConstructorType<EndPoint>)[];
|
|
@@ -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
|