@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.
Files changed (190) hide show
  1. package/README.md +113 -0
  2. package/dist/cjs/SimpleBootHttpServer.js +16 -4
  3. package/dist/cjs/SimpleBootHttpServer.js.map +2 -2
  4. package/dist/cjs/bundle-entry.js +34 -24
  5. package/dist/cjs/bundle-entry.js.map +2 -2
  6. package/dist/cjs/decorators/MethodMapping.js +33 -3
  7. package/dist/cjs/decorators/MethodMapping.js.map +2 -2
  8. package/dist/cjs/errors/BadRequestError.js +2 -1
  9. package/dist/cjs/errors/BadRequestError.js.map +2 -2
  10. package/dist/cjs/errors/ForbiddenError.js +2 -1
  11. package/dist/cjs/errors/ForbiddenError.js.map +2 -2
  12. package/dist/cjs/errors/InternalServerError.js +2 -1
  13. package/dist/cjs/errors/InternalServerError.js.map +2 -2
  14. package/dist/cjs/errors/NotFoundError.js +2 -1
  15. package/dist/cjs/errors/NotFoundError.js.map +2 -2
  16. package/dist/cjs/errors/UnauthorizedError.js +2 -1
  17. package/dist/cjs/errors/UnauthorizedError.js.map +2 -2
  18. package/dist/cjs/filters/IntentSchemeFilter.js +1 -2
  19. package/dist/cjs/filters/IntentSchemeFilter.js.map +2 -2
  20. package/dist/cjs/filters/ResourceFilter.js +3 -2
  21. package/dist/cjs/filters/ResourceFilter.js.map +2 -2
  22. package/dist/cjs/filters/index.js +3 -1
  23. package/dist/cjs/filters/index.js.map +2 -2
  24. package/dist/cjs/index.js +2 -0
  25. package/dist/cjs/index.js.map +2 -2
  26. package/dist/cjs/inject/InjectSituationType.js +1 -1
  27. package/dist/cjs/inject/InjectSituationType.js.map +2 -2
  28. package/dist/cjs/models/RequestResponse.js +19 -2
  29. package/dist/cjs/models/RequestResponse.js.map +2 -2
  30. package/dist/cjs/models/datas/body/index.js +28 -0
  31. package/dist/cjs/models/datas/body/index.js.map +7 -0
  32. package/dist/cjs/models/datas/index.js +32 -0
  33. package/dist/cjs/models/datas/index.js.map +7 -0
  34. package/dist/cjs/models/datas/{body → path}/ReqPathData.js.map +1 -1
  35. package/dist/cjs/models/datas/{search → path}/ReqSearchParamsObj.js.map +1 -1
  36. package/dist/cjs/models/datas/path/index.js +24 -0
  37. package/dist/cjs/models/datas/path/index.js.map +7 -0
  38. package/dist/cjs/models/index.js +4 -16
  39. package/dist/cjs/models/index.js.map +2 -2
  40. package/dist/cjs/models/method/index.js +22 -0
  41. package/dist/cjs/models/method/index.js.map +7 -0
  42. package/dist/cjs/models/method/patch/index.js +22 -0
  43. package/dist/cjs/models/method/patch/index.js.map +7 -0
  44. package/dist/cjs/option/HttpServerOption.js.map +2 -2
  45. package/dist/cjs/proxy/SymbolIntentApiServiceProxy.js +98 -95
  46. package/dist/cjs/proxy/SymbolIntentApiServiceProxy.js.map +3 -3
  47. package/dist/cjs/proxy/SymbolIntentApiServiceProxyBase.js +1 -1
  48. package/dist/cjs/proxy/SymbolIntentApiServiceProxyBase.js.map +2 -2
  49. package/dist/cjs/proxy/TopicProtocolApiServiceProxy.js +244 -266
  50. package/dist/cjs/proxy/TopicProtocolApiServiceProxy.js.map +3 -3
  51. package/dist/cjs/websocket/WebSocketClient.js +2 -1
  52. package/dist/cjs/websocket/WebSocketClient.js.map +2 -2
  53. package/dist/esm/SimpleBootHttpServer.js +16 -4
  54. package/dist/esm/SimpleBootHttpServer.js.map +2 -2
  55. package/dist/esm/bundle-entry.js +14 -12
  56. package/dist/esm/bundle-entry.js.map +2 -2
  57. package/dist/esm/decorators/MethodMapping.js +22 -2
  58. package/dist/esm/decorators/MethodMapping.js.map +2 -2
  59. package/dist/esm/errors/BadRequestError.js +2 -1
  60. package/dist/esm/errors/BadRequestError.js.map +2 -2
  61. package/dist/esm/errors/ForbiddenError.js +2 -1
  62. package/dist/esm/errors/ForbiddenError.js.map +2 -2
  63. package/dist/esm/errors/InternalServerError.js +2 -1
  64. package/dist/esm/errors/InternalServerError.js.map +2 -2
  65. package/dist/esm/errors/NotFoundError.js +2 -1
  66. package/dist/esm/errors/NotFoundError.js.map +2 -2
  67. package/dist/esm/errors/UnauthorizedError.js +2 -1
  68. package/dist/esm/errors/UnauthorizedError.js.map +2 -2
  69. package/dist/esm/filters/IntentSchemeFilter.js +2 -3
  70. package/dist/esm/filters/IntentSchemeFilter.js.map +2 -2
  71. package/dist/esm/filters/ResourceFilter.js +3 -2
  72. package/dist/esm/filters/ResourceFilter.js.map +2 -2
  73. package/dist/esm/filters/index.js +1 -0
  74. package/dist/esm/filters/index.js.map +2 -2
  75. package/dist/esm/index.js +1 -0
  76. package/dist/esm/index.js.map +2 -2
  77. package/dist/esm/inject/InjectSituationType.js +1 -1
  78. package/dist/esm/inject/InjectSituationType.js.map +2 -2
  79. package/dist/esm/models/RequestResponse.js +19 -2
  80. package/dist/esm/models/RequestResponse.js.map +2 -2
  81. package/dist/esm/models/datas/body/index.js +5 -0
  82. package/dist/esm/models/datas/body/index.js.map +7 -0
  83. package/dist/esm/models/datas/index.js +7 -0
  84. package/dist/esm/models/datas/index.js.map +7 -0
  85. package/dist/esm/models/datas/{body → path}/ReqPathData.js.map +1 -1
  86. package/dist/esm/models/datas/{search → path}/ReqSearchParamsObj.js.map +1 -1
  87. package/dist/esm/models/datas/path/index.js +3 -0
  88. package/dist/esm/models/datas/path/index.js.map +7 -0
  89. package/dist/esm/models/index.js +2 -8
  90. package/dist/esm/models/index.js.map +2 -2
  91. package/dist/esm/models/method/index.js +2 -0
  92. package/dist/esm/models/method/index.js.map +7 -0
  93. package/dist/esm/models/method/patch/index.js +2 -0
  94. package/dist/esm/models/method/patch/index.js.map +7 -0
  95. package/dist/esm/option/HttpServerOption.js.map +2 -2
  96. package/dist/esm/proxy/SymbolIntentApiServiceProxy.js +98 -95
  97. package/dist/esm/proxy/SymbolIntentApiServiceProxy.js.map +3 -3
  98. package/dist/esm/proxy/SymbolIntentApiServiceProxyBase.js +2 -2
  99. package/dist/esm/proxy/SymbolIntentApiServiceProxyBase.js.map +2 -2
  100. package/dist/esm/proxy/TopicProtocolApiServiceProxy.js +244 -266
  101. package/dist/esm/proxy/TopicProtocolApiServiceProxy.js.map +3 -3
  102. package/dist/esm/websocket/WebSocketClient.js +3 -2
  103. package/dist/esm/websocket/WebSocketClient.js.map +2 -2
  104. package/dist/esm-bundle/dooboostore-simple-boot-http-server.esm.js +19374 -4956
  105. package/dist/esm-bundle/dooboostore-simple-boot-http-server.esm.js.map +4 -4
  106. package/dist/types/SimpleBootHttpServer.d.ts +1 -1
  107. package/dist/types/SimpleBootHttpServer.d.ts.map +1 -1
  108. package/dist/types/bundle-entry.d.ts +7 -12
  109. package/dist/types/bundle-entry.d.ts.map +1 -1
  110. package/dist/types/decorators/MethodMapping.d.ts +10 -0
  111. package/dist/types/decorators/MethodMapping.d.ts.map +1 -1
  112. package/dist/types/errors/BadRequestError.d.ts +2 -2
  113. package/dist/types/errors/BadRequestError.d.ts.map +1 -1
  114. package/dist/types/errors/ForbiddenError.d.ts +2 -2
  115. package/dist/types/errors/ForbiddenError.d.ts.map +1 -1
  116. package/dist/types/errors/InternalServerError.d.ts +2 -2
  117. package/dist/types/errors/InternalServerError.d.ts.map +1 -1
  118. package/dist/types/errors/NotFoundError.d.ts +2 -2
  119. package/dist/types/errors/NotFoundError.d.ts.map +1 -1
  120. package/dist/types/errors/UnauthorizedError.d.ts +2 -2
  121. package/dist/types/errors/UnauthorizedError.d.ts.map +1 -1
  122. package/dist/types/filters/ResourceFilter.d.ts.map +1 -1
  123. package/dist/types/filters/index.d.ts +1 -0
  124. package/dist/types/filters/index.d.ts.map +1 -1
  125. package/dist/types/index.d.ts +1 -0
  126. package/dist/types/index.d.ts.map +1 -1
  127. package/dist/types/inject/InjectSituationType.d.ts.map +1 -1
  128. package/dist/types/models/RequestResponse.d.ts +3 -1
  129. package/dist/types/models/RequestResponse.d.ts.map +1 -1
  130. package/dist/types/models/datas/body/index.d.ts +5 -0
  131. package/dist/types/models/datas/body/index.d.ts.map +1 -0
  132. package/dist/types/models/datas/index.d.ts +7 -0
  133. package/dist/types/models/datas/index.d.ts.map +1 -0
  134. package/dist/types/models/datas/{body → path}/ReqPathData.d.ts.map +1 -1
  135. package/dist/types/models/datas/path/ReqSearchParamsObj.d.ts.map +1 -0
  136. package/dist/types/models/datas/path/index.d.ts +3 -0
  137. package/dist/types/models/datas/path/index.d.ts.map +1 -0
  138. package/dist/types/models/index.d.ts +2 -8
  139. package/dist/types/models/index.d.ts.map +1 -1
  140. package/dist/types/models/method/index.d.ts +2 -0
  141. package/dist/types/models/method/index.d.ts.map +1 -0
  142. package/dist/types/models/method/patch/index.d.ts +2 -0
  143. package/dist/types/models/method/patch/index.d.ts.map +1 -0
  144. package/dist/types/option/HttpServerOption.d.ts +6 -2
  145. package/dist/types/option/HttpServerOption.d.ts.map +1 -1
  146. package/dist/types/proxy/SymbolIntentApiServiceProxy.d.ts +6 -8
  147. package/dist/types/proxy/SymbolIntentApiServiceProxy.d.ts.map +1 -1
  148. package/dist/types/proxy/TopicProtocolApiServiceProxy.d.ts +5 -15
  149. package/dist/types/proxy/TopicProtocolApiServiceProxy.d.ts.map +1 -1
  150. package/dist/types/websocket/WebSocketClient.d.ts.map +1 -1
  151. package/dist/umd-bundle/dooboostore-simple-boot-http-server.umd.js +19340 -4928
  152. package/dist/umd-bundle/dooboostore-simple-boot-http-server.umd.js.map +4 -4
  153. package/dist/umd-bundle/websocket-client.umd.js +378 -1468
  154. package/dist/umd-bundle/websocket-client.umd.js.map +4 -4
  155. package/package.json +8 -8
  156. package/src/SimpleBootHttpServer.ts +20 -6
  157. package/src/bundle-entry.ts +12 -12
  158. package/src/decorators/MethodMapping.ts +13 -1
  159. package/src/errors/BadRequestError.ts +7 -3
  160. package/src/errors/ForbiddenError.ts +7 -3
  161. package/src/errors/InternalServerError.ts +7 -3
  162. package/src/errors/NotFoundError.ts +7 -3
  163. package/src/errors/UnauthorizedError.ts +7 -3
  164. package/src/filters/IntentSchemeFilter.ts +2 -2
  165. package/src/filters/ResourceFilter.ts +5 -2
  166. package/src/filters/index.ts +1 -0
  167. package/src/index.ts +1 -0
  168. package/src/inject/InjectSituationType.ts +1 -1
  169. package/src/models/RequestResponse.ts +28 -2
  170. package/src/models/datas/body/index.ts +4 -0
  171. package/src/models/datas/index.ts +6 -0
  172. package/src/models/datas/path/index.ts +2 -0
  173. package/src/models/index.ts +2 -8
  174. package/src/models/method/index.ts +1 -0
  175. package/src/models/method/patch/index.ts +1 -0
  176. package/src/option/HttpServerOption.ts +4 -2
  177. package/src/proxy/SymbolIntentApiServiceProxy.ts +103 -97
  178. package/src/proxy/SymbolIntentApiServiceProxyBase.ts +2 -2
  179. package/src/proxy/TopicProtocolApiServiceProxy.ts +260 -275
  180. package/src/websocket/WebSocketClient.ts +3 -2
  181. package/README.MD +0 -62
  182. package/dist/types/models/datas/search/ReqSearchParamsObj.d.ts.map +0 -1
  183. /package/dist/cjs/models/datas/{body → path}/ReqPathData.js +0 -0
  184. /package/dist/cjs/models/datas/{search → path}/ReqSearchParamsObj.js +0 -0
  185. /package/dist/esm/models/datas/{body → path}/ReqPathData.js +0 -0
  186. /package/dist/esm/models/datas/{search → path}/ReqSearchParamsObj.js +0 -0
  187. /package/dist/types/models/datas/{body → path}/ReqPathData.d.ts +0 -0
  188. /package/dist/types/models/datas/{search → path}/ReqSearchParamsObj.d.ts +0 -0
  189. /package/src/models/datas/{body → path}/ReqPathData.ts +0 -0
  190. /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.24",
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/search/ReqSearchParamsObj";
31
+ import {ReqSearchParamsObj} from "./models/datas/path/ReqSearchParamsObj";
32
32
  import {SimConfig} from '@dooboostore/simple-boot';
33
- import {ReqPathData} from './models/datas/body/ReqPathData';
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 | Symbol, any>) {
48
- otherInstanceSim ??= new Map<ConstructorType<any> | Function | SimConfig | Symbol, any>();
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
- const execute = (typeof it === 'function' ? this.simstanceManager.getOrNewSim({target: it}) : it) as Filter;
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});
@@ -1,12 +1,12 @@
1
- export * from './codes';
2
- export * from './decorators';
3
- export * from './endpoints';
4
- export * from './errors';
5
- export * from './filters';
6
- export * from './inject';
7
- export * from './lifecycle';
8
- export * from './models';
9
- export * from './option';
10
- export * from './resolvers';
11
- export * from './session';
12
- export * from './SimpleBootHttpServer';
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('MappingMetadataKey');
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
- constructor({status = HttpStatus.BadRequest, message = 'Bad Request'}: {status?: number, message?: string} = {}) {
6
- super({status, message});
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
- constructor({status = HttpStatus.Forbidden, message = 'Forbidden'}: {status?: number, message?: string} = {}) {
6
- super({status, message});
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
- constructor({status = HttpStatus.InternalServerError, message = 'Internal Server Error'}: {status?: number, message?: string} = {}) {
6
- super({status, message});
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
- constructor({status = HttpStatus.NotFound, message = 'Not Found'}: {status?: number, message?: string} = {}) {
6
- super({status, message});
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
- constructor({status = HttpStatus.Unauthorized, message = 'Unauthorized'}: {status?: number, message?: string} = {}) {
6
- super({status, message});
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 { Intent } from '@dooboostore/simple-boot';
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
- @Sim
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
- return RegExp(it).test(url);
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
  })??[]
@@ -5,3 +5,4 @@ export * from './HttpStatusFilter';
5
5
  export * from './OpenApi3Filter';
6
6
  export * from './ResourceFilter';
7
7
  export * from './ThrowFilter';
8
+ export * from './IntentSchemeFilter'
package/src/index.ts CHANGED
@@ -3,6 +3,7 @@ export * from './decorators';
3
3
  export * from './endpoints';
4
4
  export * from './errors';
5
5
  export * from './filters';
6
+ export * from './proxy';
6
7
  export * from './inject';
7
8
  export * from './lifecycle';
8
9
  export * from './models';
@@ -1,3 +1,3 @@
1
1
  export namespace InjectSituationType {
2
- export const TransactionManager = Symbol('TransactionManager');
2
+ export const TransactionManager = Symbol.for('simple-boot-http-server:transaction-manager-token');
3
3
  }
@@ -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
- return (this.reqHeaderFirst(HttpHeaders.ContentType) ?? '').toLowerCase().indexOf(mime.toLocaleLowerCase()) > -1;
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
- return (this.reqHeaderFirst(HttpHeaders.Accept) ?? '').toLowerCase().indexOf(mime.toLocaleLowerCase()) > -1;
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
  }
@@ -0,0 +1,4 @@
1
+ export * from './ReqJsonBody'
2
+ export * from './ReqFormUrlBody'
3
+ export * from './ReqMultipartFormBody'
4
+ export * from '../path/ReqPathData'
@@ -0,0 +1,6 @@
1
+ export * from './body'
2
+ export * from './path'
3
+ export * from './HeaderData'
4
+ export * from './MultipartData'
5
+ export * from './Resource'
6
+ export * from './ReqHeader'
@@ -0,0 +1,2 @@
1
+ export * from './ReqSearchParamsObj'
2
+ export * from './ReqPathData'
@@ -1,9 +1,3 @@
1
1
  export * from './RequestResponse';
2
- export * from './datas/HeaderData';
3
- export * from './datas/MultipartData';
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?: (Filter | ConstructorType<Filter>)[];
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?: (Filter | ConstructorType<Filter>)[];
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 { getSim, Sim } from '@dooboostore/simple-boot';
1
+ import {getSim, sim, Sim, SimConfig} from '@dooboostore/simple-boot';
2
2
  import { makeIntentHeaderBySymbolFor } from '../codes/HttpHeaders';
3
- import { ConvertUtils } from '@dooboostore/core';
3
+ import {ConstructorType, ConvertUtils} from '@dooboostore/core';
4
4
  import { ApiService } from '@dooboostore/simple-boot';
5
5
 
6
- export type Config<T = any> = {
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
- static createHandler<T extends object>(apiService: ApiService): ProxyHandler<T> {
24
- return {
25
- get(target: T, prop: string | symbol, receiver: any): any {
26
- if (prop === '_SimpleBoot_origin') {
27
- return target;
28
- }
29
- const simConfig = getSim(target);
30
- const value = Reflect.get(target, prop, receiver);
31
- if (typeof value === 'function' && simConfig?.symbol) {
32
- return function (...args: any[]) {
33
- const f = value as Function;
34
- const p = (userConfig: Config) => {
35
- const headers = { ...(userConfig?.headers ?? {}), ...makeIntentHeaderBySymbolFor(simConfig.symbol as Symbol) };
36
- const method = userConfig?.method ?? 'post';
37
- if (method === 'post' && userConfig?.multipartFormData) {
38
- //@ts-ignore
39
- return apiService.post({
40
- target: `/${String(prop)}`,
41
- config: {
42
- responseTransform: userConfig?.bypassTransform ? 'response' : undefined,
43
- transformText: userConfig?.transformText,
44
- config: userConfig?.config,
45
- fetch: {
46
- credentials: 'include',
47
- headers: headers,
48
- body: ConvertUtils.toFormData(userConfig?.body)
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
- } else if (method === 'post') {
53
- //@ts-ignore
54
- return apiService.postJson({
55
- target: `/${String(prop)}`,
56
- config: {
57
- responseTransform: userConfig?.bypassTransform ? 'response' : undefined,
58
- transformText: userConfig?.transformText,
59
- config: userConfig?.config,
60
- fetch: {
61
- credentials: 'include',
62
- headers: headers,
63
- body: userConfig?.body
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
- } else if (method === 'petch') {
68
- //@ts-ignore
69
- return apiService.patchJson({
70
- target: `/${String(prop)}`,
71
- config: {
72
- responseTransform: userConfig?.bypassTransform ? 'response' : undefined,
73
- transformText: userConfig?.transformText,
74
- config: userConfig?.config,
75
- fetch: {
76
- credentials: 'include',
77
- headers: headers,
78
- body: userConfig?.body
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
- } else {
83
- //@ts-ignore
84
- return apiService[method]({
85
- target: { url: `/${String(prop)}`, searchParams: userConfig?.body },
86
- config: {
87
- responseTransform: userConfig?.bypassTransform ? 'response' : undefined,
88
- transformText: userConfig?.transformText,
89
- config: userConfig?.config,
90
- fetch: {
91
- credentials: 'include',
92
- headers: headers
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
- return Reflect.get(target, prop, receiver);
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
- get(target: T, prop: string | symbol, receiver: any): any {
114
- return SymbolIntentApiServiceProxy.createHandler<T>(this.apiService).get!(target, prop, receiver);
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
- apply(target: T, thisArg: any, argArray: any[]): any {
118
- return SymbolIntentApiServiceProxy.createHandler<T>(this.apiService).apply!(target, thisArg, argArray);
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 {SymbolIntentApiServiceProxy} from './SymbolIntentApiServiceProxy';
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 = SymbolIntentApiServiceProxy.createHandler<T>(apiService);
10
+ const handler = createHandler<T>(apiService);
11
11
 
12
12
  // 생성자에서 Proxy 객체를 반환합니다.
13
13
  // @ts-ignore