@dooboostore/simple-boot-http-server 1.0.23 → 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.
Files changed (259) hide show
  1. package/README.md +113 -0
  2. package/dist/cjs/SimpleBootHttpServer.js +80 -40
  3. package/dist/cjs/SimpleBootHttpServer.js.map +3 -3
  4. package/dist/cjs/codes/HttpHeaders.js +14 -3
  5. package/dist/cjs/codes/HttpHeaders.js.map +2 -2
  6. package/dist/cjs/codes/Mimes.js +2 -0
  7. package/dist/cjs/codes/Mimes.js.map +2 -2
  8. package/dist/cjs/decorators/MethodMapping.js +40 -9
  9. package/dist/cjs/decorators/MethodMapping.js.map +3 -3
  10. package/dist/cjs/endpoints/WebSocketEndPoint.js +16 -0
  11. package/dist/cjs/endpoints/WebSocketEndPoint.js.map +7 -0
  12. package/dist/cjs/errors/BadRequestError.js +2 -1
  13. package/dist/cjs/errors/BadRequestError.js.map +2 -2
  14. package/dist/cjs/errors/ForbiddenError.js +2 -1
  15. package/dist/cjs/errors/ForbiddenError.js.map +2 -2
  16. package/dist/cjs/errors/InternalServerError.js +2 -1
  17. package/dist/cjs/errors/InternalServerError.js.map +2 -2
  18. package/dist/cjs/errors/NotFoundError.js +2 -1
  19. package/dist/cjs/errors/NotFoundError.js.map +2 -2
  20. package/dist/cjs/errors/UnauthorizedError.js +2 -1
  21. package/dist/cjs/errors/UnauthorizedError.js.map +2 -2
  22. package/dist/cjs/filters/CacheFilter.js +75 -35
  23. package/dist/cjs/filters/CacheFilter.js.map +3 -3
  24. package/dist/cjs/filters/IntentSchemeFilter.js +97 -0
  25. package/dist/cjs/filters/IntentSchemeFilter.js.map +7 -0
  26. package/dist/cjs/filters/ResourceFilter.js +6 -2
  27. package/dist/cjs/filters/ResourceFilter.js.map +2 -2
  28. package/dist/cjs/filters/TopicProtocolFilter.js +343 -0
  29. package/dist/cjs/filters/TopicProtocolFilter.js.map +7 -0
  30. package/dist/cjs/filters/index.js +5 -1
  31. package/dist/cjs/filters/index.js.map +2 -2
  32. package/dist/cjs/index.js +30 -0
  33. package/dist/cjs/index.js.map +2 -2
  34. package/dist/cjs/inject/InjectSituationType.js +1 -1
  35. package/dist/cjs/inject/InjectSituationType.js.map +2 -2
  36. package/dist/cjs/models/RequestResponse.js +70 -91
  37. package/dist/cjs/models/RequestResponse.js.map +3 -3
  38. package/dist/cjs/models/datas/body/index.js +28 -0
  39. package/dist/cjs/models/datas/body/index.js.map +7 -0
  40. package/dist/cjs/models/datas/index.js +32 -0
  41. package/dist/cjs/models/datas/index.js.map +7 -0
  42. package/dist/cjs/models/datas/path/ReqPathData.js +29 -0
  43. package/dist/cjs/models/datas/path/ReqPathData.js.map +7 -0
  44. package/dist/cjs/models/datas/{search → path}/ReqSearchParamsObj.js.map +1 -1
  45. package/dist/cjs/models/datas/path/index.js +24 -0
  46. package/dist/cjs/models/datas/path/index.js.map +7 -0
  47. package/dist/cjs/models/index.js +4 -16
  48. package/dist/cjs/models/index.js.map +2 -2
  49. package/dist/cjs/models/method/index.js +22 -0
  50. package/dist/cjs/models/method/index.js.map +7 -0
  51. package/dist/cjs/models/method/patch/index.js +22 -0
  52. package/dist/cjs/models/method/patch/index.js.map +7 -0
  53. package/dist/cjs/option/HttpServerOption.js +25 -5
  54. package/dist/cjs/option/HttpServerOption.js.map +2 -2
  55. package/dist/cjs/proxy/SymbolIntentApiServiceProxy.js +144 -0
  56. package/dist/cjs/proxy/SymbolIntentApiServiceProxy.js.map +7 -0
  57. package/dist/cjs/proxy/SymbolIntentApiServiceProxyBase.js +35 -0
  58. package/dist/cjs/proxy/SymbolIntentApiServiceProxyBase.js.map +7 -0
  59. package/dist/cjs/proxy/TopicProtocolApiServiceProxy.js +324 -0
  60. package/dist/cjs/proxy/TopicProtocolApiServiceProxy.js.map +7 -0
  61. package/dist/cjs/proxy/index.js +26 -0
  62. package/dist/cjs/proxy/index.js.map +7 -0
  63. package/dist/cjs/resolvers/ResourceResolver.js +2 -2
  64. package/dist/cjs/resolvers/ResourceResolver.js.map +2 -2
  65. package/dist/cjs/session/SessionManager.js +2 -2
  66. package/dist/cjs/session/SessionManager.js.map +2 -2
  67. package/dist/cjs/websocket/WebSocketClient.js +554 -0
  68. package/dist/cjs/websocket/WebSocketClient.js.map +7 -0
  69. package/dist/cjs/websocket/WebSocketManager.js +652 -0
  70. package/dist/cjs/websocket/WebSocketManager.js.map +7 -0
  71. package/dist/cjs/websocket/index.js +24 -0
  72. package/dist/cjs/websocket/index.js.map +7 -0
  73. package/dist/esm/SimpleBootHttpServer.js +60 -20
  74. package/dist/esm/SimpleBootHttpServer.js.map +2 -2
  75. package/dist/esm/codes/HttpHeaders.js +12 -2
  76. package/dist/esm/codes/HttpHeaders.js.map +2 -2
  77. package/dist/esm/codes/Mimes.js +2 -0
  78. package/dist/esm/codes/Mimes.js.map +2 -2
  79. package/dist/esm/decorators/MethodMapping.js +24 -3
  80. package/dist/esm/decorators/MethodMapping.js.map +2 -2
  81. package/dist/esm/endpoints/WebSocketEndPoint.js +1 -0
  82. package/dist/esm/endpoints/WebSocketEndPoint.js.map +7 -0
  83. package/dist/esm/errors/BadRequestError.js +2 -1
  84. package/dist/esm/errors/BadRequestError.js.map +2 -2
  85. package/dist/esm/errors/ForbiddenError.js +2 -1
  86. package/dist/esm/errors/ForbiddenError.js.map +2 -2
  87. package/dist/esm/errors/InternalServerError.js +2 -1
  88. package/dist/esm/errors/InternalServerError.js.map +2 -2
  89. package/dist/esm/errors/NotFoundError.js +2 -1
  90. package/dist/esm/errors/NotFoundError.js.map +2 -2
  91. package/dist/esm/errors/UnauthorizedError.js +2 -1
  92. package/dist/esm/errors/UnauthorizedError.js.map +2 -2
  93. package/dist/esm/filters/CacheFilter.js +67 -27
  94. package/dist/esm/filters/CacheFilter.js.map +2 -2
  95. package/dist/esm/filters/IntentSchemeFilter.js +74 -0
  96. package/dist/esm/filters/IntentSchemeFilter.js.map +7 -0
  97. package/dist/esm/filters/ResourceFilter.js +6 -2
  98. package/dist/esm/filters/ResourceFilter.js.map +2 -2
  99. package/dist/esm/filters/TopicProtocolFilter.js +310 -0
  100. package/dist/esm/filters/TopicProtocolFilter.js.map +7 -0
  101. package/dist/esm/filters/index.js +2 -0
  102. package/dist/esm/filters/index.js.map +2 -2
  103. package/dist/esm/index.js +13 -0
  104. package/dist/esm/index.js.map +2 -2
  105. package/dist/esm/inject/InjectSituationType.js +1 -1
  106. package/dist/esm/inject/InjectSituationType.js.map +2 -2
  107. package/dist/esm/models/RequestResponse.js +65 -86
  108. package/dist/esm/models/RequestResponse.js.map +2 -2
  109. package/dist/esm/models/datas/body/index.js +5 -0
  110. package/dist/esm/models/datas/body/index.js.map +7 -0
  111. package/dist/esm/models/datas/index.js +7 -0
  112. package/dist/esm/models/datas/index.js.map +7 -0
  113. package/dist/esm/models/datas/path/ReqPathData.js +6 -0
  114. package/dist/esm/models/datas/path/ReqPathData.js.map +7 -0
  115. package/dist/esm/models/datas/{search → path}/ReqSearchParamsObj.js.map +1 -1
  116. package/dist/esm/models/datas/path/index.js +3 -0
  117. package/dist/esm/models/datas/path/index.js.map +7 -0
  118. package/dist/esm/models/index.js +2 -8
  119. package/dist/esm/models/index.js.map +2 -2
  120. package/dist/esm/models/method/index.js +2 -0
  121. package/dist/esm/models/method/index.js.map +7 -0
  122. package/dist/esm/models/method/patch/index.js +2 -0
  123. package/dist/esm/models/method/patch/index.js.map +7 -0
  124. package/dist/esm/option/HttpServerOption.js +24 -4
  125. package/dist/esm/option/HttpServerOption.js.map +2 -2
  126. package/dist/esm/proxy/SymbolIntentApiServiceProxy.js +121 -0
  127. package/dist/esm/proxy/SymbolIntentApiServiceProxy.js.map +7 -0
  128. package/dist/esm/proxy/SymbolIntentApiServiceProxyBase.js +12 -0
  129. package/dist/esm/proxy/SymbolIntentApiServiceProxyBase.js.map +7 -0
  130. package/dist/esm/proxy/TopicProtocolApiServiceProxy.js +301 -0
  131. package/dist/esm/proxy/TopicProtocolApiServiceProxy.js.map +7 -0
  132. package/dist/esm/proxy/index.js +4 -0
  133. package/dist/esm/proxy/index.js.map +7 -0
  134. package/dist/esm/resolvers/ResourceResolver.js +1 -1
  135. package/dist/esm/resolvers/ResourceResolver.js.map +1 -1
  136. package/dist/esm/session/SessionManager.js +1 -1
  137. package/dist/esm/session/SessionManager.js.map +1 -1
  138. package/dist/esm/websocket/WebSocketClient.js +529 -0
  139. package/dist/esm/websocket/WebSocketClient.js.map +7 -0
  140. package/dist/esm/websocket/WebSocketManager.js +622 -0
  141. package/dist/esm/websocket/WebSocketManager.js.map +7 -0
  142. package/dist/esm/websocket/index.js +3 -0
  143. package/dist/esm/websocket/index.js.map +7 -0
  144. package/dist/esm-bundle/dooboostore-simple-boot-http-server.esm.js +18209 -5299
  145. package/dist/esm-bundle/dooboostore-simple-boot-http-server.esm.js.map +4 -4
  146. package/dist/types/SimpleBootHttpServer.d.ts +5 -3
  147. package/dist/types/SimpleBootHttpServer.d.ts.map +1 -1
  148. package/dist/types/codes/HttpHeaders.d.ts +3 -0
  149. package/dist/types/codes/HttpHeaders.d.ts.map +1 -1
  150. package/dist/types/codes/Mimes.d.ts +3 -1
  151. package/dist/types/codes/Mimes.d.ts.map +1 -1
  152. package/dist/types/decorators/MethodMapping.d.ts +13 -2
  153. package/dist/types/decorators/MethodMapping.d.ts.map +1 -1
  154. package/dist/types/endpoints/WebSocketEndPoint.d.ts +17 -0
  155. package/dist/types/endpoints/WebSocketEndPoint.d.ts.map +1 -0
  156. package/dist/types/errors/BadRequestError.d.ts +2 -2
  157. package/dist/types/errors/BadRequestError.d.ts.map +1 -1
  158. package/dist/types/errors/ForbiddenError.d.ts +2 -2
  159. package/dist/types/errors/ForbiddenError.d.ts.map +1 -1
  160. package/dist/types/errors/InternalServerError.d.ts +2 -2
  161. package/dist/types/errors/InternalServerError.d.ts.map +1 -1
  162. package/dist/types/errors/NotFoundError.d.ts +2 -2
  163. package/dist/types/errors/NotFoundError.d.ts.map +1 -1
  164. package/dist/types/errors/UnauthorizedError.d.ts +2 -2
  165. package/dist/types/errors/UnauthorizedError.d.ts.map +1 -1
  166. package/dist/types/filters/CacheFilter.d.ts +6 -0
  167. package/dist/types/filters/CacheFilter.d.ts.map +1 -1
  168. package/dist/types/filters/IntentSchemeFilter.d.ts +20 -0
  169. package/dist/types/filters/IntentSchemeFilter.d.ts.map +1 -0
  170. package/dist/types/filters/ResourceFilter.d.ts.map +1 -1
  171. package/dist/types/filters/TopicProtocolFilter.d.ts +34 -0
  172. package/dist/types/filters/TopicProtocolFilter.d.ts.map +1 -0
  173. package/dist/types/filters/index.d.ts +2 -0
  174. package/dist/types/filters/index.d.ts.map +1 -1
  175. package/dist/types/index.d.ts +13 -0
  176. package/dist/types/index.d.ts.map +1 -1
  177. package/dist/types/inject/InjectSituationType.d.ts.map +1 -1
  178. package/dist/types/models/RequestResponse.d.ts +12 -7
  179. package/dist/types/models/RequestResponse.d.ts.map +1 -1
  180. package/dist/types/models/datas/body/index.d.ts +5 -0
  181. package/dist/types/models/datas/body/index.d.ts.map +1 -0
  182. package/dist/types/models/datas/index.d.ts +7 -0
  183. package/dist/types/models/datas/index.d.ts.map +1 -0
  184. package/dist/types/models/datas/path/ReqPathData.d.ts +4 -0
  185. package/dist/types/models/datas/path/ReqPathData.d.ts.map +1 -0
  186. package/dist/types/models/datas/path/ReqSearchParamsObj.d.ts.map +1 -0
  187. package/dist/types/models/datas/path/index.d.ts +3 -0
  188. package/dist/types/models/datas/path/index.d.ts.map +1 -0
  189. package/dist/types/models/index.d.ts +2 -8
  190. package/dist/types/models/index.d.ts.map +1 -1
  191. package/dist/types/models/method/index.d.ts +2 -0
  192. package/dist/types/models/method/index.d.ts.map +1 -0
  193. package/dist/types/models/method/patch/index.d.ts +2 -0
  194. package/dist/types/models/method/patch/index.d.ts.map +1 -0
  195. package/dist/types/option/HttpServerOption.d.ts +30 -20
  196. package/dist/types/option/HttpServerOption.d.ts.map +1 -1
  197. package/dist/types/proxy/SymbolIntentApiServiceProxy.d.ts +16 -0
  198. package/dist/types/proxy/SymbolIntentApiServiceProxy.d.ts.map +1 -0
  199. package/dist/types/proxy/SymbolIntentApiServiceProxyBase.d.ts +5 -0
  200. package/dist/types/proxy/SymbolIntentApiServiceProxyBase.d.ts.map +1 -0
  201. package/dist/types/proxy/TopicProtocolApiServiceProxy.d.ts +28 -0
  202. package/dist/types/proxy/TopicProtocolApiServiceProxy.d.ts.map +1 -0
  203. package/dist/types/proxy/index.d.ts +4 -0
  204. package/dist/types/proxy/index.d.ts.map +1 -0
  205. package/dist/types/session/SessionManager.d.ts +2 -17
  206. package/dist/types/session/SessionManager.d.ts.map +1 -1
  207. package/dist/types/websocket/WebSocketClient.d.ts +88 -0
  208. package/dist/types/websocket/WebSocketClient.d.ts.map +1 -0
  209. package/dist/types/websocket/WebSocketManager.d.ts +163 -0
  210. package/dist/types/websocket/WebSocketManager.d.ts.map +1 -0
  211. package/dist/types/websocket/index.d.ts +3 -0
  212. package/dist/types/websocket/index.d.ts.map +1 -0
  213. package/dist/umd-bundle/dooboostore-simple-boot-http-server.umd.js +18108 -5198
  214. package/dist/umd-bundle/dooboostore-simple-boot-http-server.umd.js.map +4 -4
  215. package/dist/umd-bundle/websocket-client.umd.js +11374 -0
  216. package/dist/umd-bundle/websocket-client.umd.js.map +7 -0
  217. package/package.json +24 -15
  218. package/src/SimpleBootHttpServer.ts +367 -313
  219. package/src/codes/HttpHeaders.ts +13 -2
  220. package/src/codes/Mimes.ts +27 -25
  221. package/src/decorators/MethodMapping.ts +17 -4
  222. package/src/endpoints/WebSocketEndPoint.ts +12 -0
  223. package/src/errors/BadRequestError.ts +7 -3
  224. package/src/errors/ForbiddenError.ts +7 -3
  225. package/src/errors/InternalServerError.ts +7 -3
  226. package/src/errors/NotFoundError.ts +7 -3
  227. package/src/errors/UnauthorizedError.ts +7 -3
  228. package/src/filters/CacheFilter.ts +112 -67
  229. package/src/filters/IntentSchemeFilter.ts +69 -0
  230. package/src/filters/ResourceFilter.ts +10 -2
  231. package/src/filters/TopicProtocolFilter.ts +349 -0
  232. package/src/filters/index.ts +2 -0
  233. package/src/index.ts +13 -12
  234. package/src/inject/InjectSituationType.ts +1 -1
  235. package/src/models/RequestResponse.ts +136 -242
  236. package/src/models/datas/body/index.ts +4 -0
  237. package/src/models/datas/index.ts +6 -0
  238. package/src/models/datas/path/ReqPathData.ts +3 -0
  239. package/src/models/datas/path/index.ts +2 -0
  240. package/src/models/index.ts +2 -8
  241. package/src/models/method/index.ts +1 -0
  242. package/src/models/method/patch/index.ts +1 -0
  243. package/src/option/HttpServerOption.ts +73 -23
  244. package/src/proxy/SymbolIntentApiServiceProxy.ts +126 -0
  245. package/src/proxy/SymbolIntentApiServiceProxyBase.ts +16 -0
  246. package/src/proxy/TopicProtocolApiServiceProxy.ts +328 -0
  247. package/src/proxy/index.ts +3 -0
  248. package/src/resolvers/ResourceResolver.ts +1 -1
  249. package/src/session/SessionManager.ts +3 -3
  250. package/src/websocket/WebSocketClient.ts +637 -0
  251. package/src/websocket/WebSocketManager.ts +713 -0
  252. package/src/websocket/index.ts +2 -0
  253. package/tsconfig.json +3 -1
  254. package/README.MD +0 -36
  255. package/dist/types/models/datas/search/ReqSearchParamsObj.d.ts.map +0 -1
  256. /package/dist/cjs/models/datas/{search → path}/ReqSearchParamsObj.js +0 -0
  257. /package/dist/esm/models/datas/{search → path}/ReqSearchParamsObj.js +0 -0
  258. /package/dist/types/models/datas/{search → path}/ReqSearchParamsObj.d.ts +0 -0
  259. /package/src/models/datas/{search → path}/ReqSearchParamsObj.ts +0 -0
@@ -1,346 +1,400 @@
1
- import { SimpleApplication } from '@dooboostore/simple-boot/SimpleApplication';
2
- import { HttpServerOption } from './option/HttpServerOption';
3
- import { ConstructorType } from '@dooboostore/core/types';
4
- import { IncomingMessage, Server as HttpServer, ServerResponse } from 'http'
5
- import { Server as HttpsServer } from 'https'; // Add HTTPS support
6
- import { RequestResponse } from './models/RequestResponse';
7
- import { getUrlMapping, getUrlMappings, SaveMappingConfig, UrlMappingSituationType } from './decorators/MethodMapping';
8
- import { HttpStatus } from './codes/HttpStatus';
9
- import { HttpHeaders } from './codes/HttpHeaders';
10
- import { Mimes } from './codes/Mimes';
11
- import { Filter } from './filters/Filter';
12
- import { ExceptionHandlerSituationType, targetExceptionHandler } from '@dooboostore/simple-boot/decorators/exception/ExceptionDecorator';
13
- import { getInject, SituationTypeContainer, SituationTypeContainers } from '@dooboostore/simple-boot/decorators/inject/Inject';
14
- import { EndPoint } from './endpoints/EndPoint';
15
- import { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';
16
- import { ReqFormUrlBody } from './models/datas/body/ReqFormUrlBody';
17
- import { ReqJsonBody } from './models/datas/body/ReqJsonBody';
18
- import { ReqHeader } from './models/datas/ReqHeader';
19
- import { RouterModule } from '@dooboostore/simple-boot/route/RouterModule';
20
- import { ReqMultipartFormBody } from './models/datas/body/ReqMultipartFormBody';
21
- import { execValidationInValid, getValidIndex } from '@dooboostore/simple-boot/decorators/validate/Validation';
22
- import { ValidException } from '@dooboostore/simple-boot/errors/ValidException';
23
- import { HttpError } from './errors/HttpError';
24
- import { getRoute } from '@dooboostore/simple-boot/decorators/route/Router';
25
- import { OnInit } from './lifecycle/OnInit';
26
- import { URLSearchParams } from 'url';
27
- import { HttpMethod } from './codes/HttpMethod';
28
- import { SessionManager } from './session/SessionManager';
29
- import { InjectSituationType } from './inject/InjectSituationType';
30
- import {ReqSearchParamsObj} from "./models/datas/search/ReqSearchParamsObj";
1
+ import {SimpleApplication} from '@dooboostore/simple-boot';
2
+ import {HttpServerOption} from './option/HttpServerOption';
3
+ import {ConstructorType} from '@dooboostore/core';
4
+ import {IncomingMessage, Server as HttpServer, ServerResponse} from 'http'
5
+ import {Server as HttpsServer} from 'https'; // Add HTTPS support
6
+ import {WebSocketServer, WebSocket} from 'ws';
7
+ import {RequestResponse} from './models/RequestResponse';
8
+ import {getUrlMapping, getUrlMappings, SaveMappingConfig, UrlMappingSituationType} from './decorators/MethodMapping';
9
+ import {HttpStatus} from './codes/HttpStatus';
10
+ import {HttpHeaders} from './codes/HttpHeaders';
11
+ import {Mimes} from './codes/Mimes';
12
+ import {Filter} from './filters/Filter';
13
+ import {ExceptionHandlerSituationType, targetExceptionHandler} from '@dooboostore/simple-boot';
14
+ import {getInject, SituationTypeContainer, SituationTypeContainers} from '@dooboostore/simple-boot';
15
+ import {EndPoint} from './endpoints/EndPoint';
16
+ import {ReflectUtils} from '@dooboostore/core';
17
+ import {ReqFormUrlBody} from './models/datas/body/ReqFormUrlBody';
18
+ import {ReqJsonBody} from './models/datas/body/ReqJsonBody';
19
+ import {ReqHeader} from './models/datas/ReqHeader';
20
+ import {RouterModule} from '@dooboostore/simple-boot';
21
+ import {ReqMultipartFormBody} from './models/datas/body/ReqMultipartFormBody';
22
+ import {execValidationInValid, getValidIndex} from '@dooboostore/simple-boot';
23
+ import {ValidException} from '@dooboostore/simple-boot';
24
+ import {HttpError} from './errors/HttpError';
25
+ import {getRoute} from '@dooboostore/simple-boot';
26
+ import {OnInit} from './lifecycle/OnInit';
27
+ import {URLSearchParams} from 'url';
28
+ import {HttpMethod} from './codes/HttpMethod';
29
+ import {SessionManager} from './session/SessionManager';
30
+ import {InjectSituationType} from './inject/InjectSituationType';
31
+ import {ReqSearchParamsObj} from "./models/datas/path/ReqSearchParamsObj";
32
+ import {SimConfig} from '@dooboostore/simple-boot';
33
+ import {ReqPathData} from './models/datas/path/ReqPathData';
34
+ import {WebSocketEndPoint} from './endpoints/WebSocketEndPoint';
31
35
 
32
36
  export class SimpleBootHttpServer extends SimpleApplication {
33
- public server?: HttpServer | HttpsServer;
34
- private sessionManager: SessionManager;
35
- constructor(public option: HttpServerOption = new HttpServerOption()) {
36
- super(option);
37
- this.sessionManager = new SessionManager(this.option);
38
- }
39
-
37
+ public server?: HttpServer | HttpsServer;
38
+ private sessionManager: SessionManager;
39
+ private webSocketClients = new Map<WebSocket, { request: IncomingMessage }>();
40
40
 
41
- public run(otherInstanceSim?: Map<ConstructorType<any>, any>) {
42
- super.run(otherInstanceSim);
43
- const targets = [...this.option.closeEndPoints ?? [], ...this.option.errorEndPoints ?? [], ...this.option.requestEndPoints ?? [], ...this.option.filters ?? []];
44
- 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 => {
45
- this.startServer();
46
- });
47
- return this;
48
- }
41
+ constructor(public option: HttpServerOption = new HttpServerOption()) {
42
+ super(option);
43
+ this.sessionManager = new SessionManager(this.option);
44
+ }
49
45
 
50
- private startServer() {
51
46
 
52
- // const a = this.option.serverOption as HttpsServerOption;
53
- // this.option.serverOption?.
54
-
55
- if (this.option.serverOption && 'key' in this.option.serverOption && 'cert' in this.option.serverOption) {
56
- this.server = new HttpsServer(this.option.serverOption);
57
- const httpServer = new HttpServer();
58
- httpServer.on('request', (req: IncomingMessage, res: ServerResponse) => {
59
- res.writeHead(301, { Location: `https://${req.headers.host}${req.url}` });
60
- res.end();
61
- });
62
- httpServer.listen(80, this.option.listen.hostname, () => {
63
- console.log('HTTP redirect server running on port 80');
64
- });
65
- } else if (this.option.serverOption) {
66
- this.server = new HttpServer(this.option.serverOption);
67
- } else {
68
- this.server = new HttpServer();
69
- }
70
- // const thisRef = this;
71
- this.server.on('request', async (req: IncomingMessage, res: ServerResponse) => {
72
- // console.log('request', req.url);
73
- const transactionManager = this.option.transactionManagerFactory ? await this.option.transactionManagerFactory() : undefined;
74
- res.on('close', async () => {
75
- if (this.option.closeEndPoints) {
76
- for (const it of this.option.closeEndPoints) {
77
- try {
78
- const execute = (typeof it === 'function' ? this.simstanceManager.getOrNewSim({target:it}) : it) as EndPoint;
79
- const endPoint = execute?.endPoint(rr, this);
80
- if (endPoint instanceof Promise) {
81
- await endPoint;
82
- }
83
- } catch (e) {
84
- }
85
- }
86
- }
47
+ public run(otherInstanceSim?: Map<ConstructorType<any> | Function | SimConfig | symbol, any>) {
48
+ otherInstanceSim ??= new Map<ConstructorType<any> | Function | SimConfig | symbol, any>();
49
+ otherInstanceSim.set(SimpleBootHttpServer, this);
50
+ super.run(otherInstanceSim);
51
+ const targets = [...this.option.closeEndPoints ?? [], ...this.option.errorEndPoints ?? [], ...this.option.requestEndPoints ?? [], ...this.option.filters ?? []];
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
+ this.startServer();
54
+ });
55
+ return this;
56
+ }
87
57
 
88
- if (!rr.resIsDone()) {
89
- rr.resEnd();
90
- }
91
- });
92
- res.on('error', async () => {
93
- if (this.option.errorEndPoints) {
94
- for (const it of this.option.errorEndPoints) {
95
- try {
96
- const execute = (typeof it === 'function' ? this.simstanceManager.getOrNewSim({target:it}) : it) as EndPoint;
97
- const endPoint = execute?.endPoint(rr, this);
98
- if (endPoint instanceof Promise) {
99
- await endPoint;
100
- }
101
- } catch (e) {
102
- }
103
- }
104
- }
58
+ private startServer() {
105
59
 
106
- if (!rr.resIsDone()) {
107
- rr.resEnd();
108
- }
109
- });
60
+ // const a = this.option.serverOption as HttpsServerOption;
61
+ // this.option.serverOption?.
110
62
 
111
- const rr = new RequestResponse(req, res,{sessionManager: this.sessionManager, option: this.option});
112
- /*
113
- default setting first
114
- */
115
- rr.resSetHeader(HttpHeaders.Server, 'simple-boot-http-server');
116
- const cookie = rr.reqCookieGet(this.option.sessionOption.key);
117
- if (!cookie) {
118
- const session = await this.sessionManager.session();
119
- rr.resSetHeader(HttpHeaders.SetCookie, `${this.option.sessionOption.key}=${session.uuid}; Path=/; HttpOnly`);
63
+ if (this.option.serverOption && 'key' in this.option.serverOption && 'cert' in this.option.serverOption) {
64
+ this.server = new HttpsServer(this.option.serverOption);
65
+ const httpServer = new HttpServer();
66
+ httpServer.on('request', (req: IncomingMessage, res: ServerResponse) => {
67
+ res.writeHead(301, {Location: `https://${req.headers.host}${req.url}`});
68
+ res.end();
69
+ });
70
+ httpServer.listen(80, this.option.listen.hostname, () => {
71
+ console.log('HTTP redirect server running on port 80');
72
+ });
73
+ } else if (this.option.serverOption) {
74
+ this.server = new HttpServer(this.option.serverOption);
75
+ } else {
76
+ this.server = new HttpServer();
77
+ }
78
+ // const thisRef = this;
79
+ this.server.on('request', async (req: IncomingMessage, res: ServerResponse) => {
80
+ // console.log('request', req.url);
81
+ const transactionManager = this.option.transactionManagerFactory ? await this.option.transactionManagerFactory() : undefined;
82
+ res.on('close', async () => {
83
+ if (this.option.closeEndPoints) {
84
+ for (const it of this.option.closeEndPoints) {
85
+ try {
86
+ const execute = (typeof it === 'function' ? this.simstanceManager.getOrNewSim({target: it}) : it) as EndPoint;
87
+ const endPoint = execute?.endPoint(rr, this);
88
+ if (endPoint instanceof Promise) {
89
+ await endPoint;
90
+ }
91
+ } catch (e) {
120
92
  }
93
+ }
94
+ }
121
95
 
122
- const otherStorage = new Map<ConstructorType<any>, any>();
123
- otherStorage.set(RequestResponse, rr);
124
- otherStorage.set(IncomingMessage, req);
125
- otherStorage.set(ServerResponse, res);
96
+ if (!rr.resIsDone()) {
97
+ rr.resEnd();
98
+ }
99
+ });
100
+ res.on('error', async () => {
101
+ if (this.option.errorEndPoints) {
102
+ for (const it of this.option.errorEndPoints) {
126
103
  try {
127
- transactionManager?.try();
128
- if (this.option.requestEndPoints) {
129
- for (const it of this.option.requestEndPoints) {
130
- try {
131
- const execute = (typeof it === 'function' ? this.simstanceManager.getOrNewSim<EndPoint>({target:it}) : it) as EndPoint;
132
- execute?.endPoint(rr, this);
133
- } catch (e) {
134
- }
135
- }
136
- }
104
+ const execute = (typeof it === 'function' ? this.simstanceManager.getOrNewSim({target: it}) : it) as EndPoint;
105
+ const endPoint = execute?.endPoint(rr, this);
106
+ if (endPoint instanceof Promise) {
107
+ await endPoint;
108
+ }
109
+ } catch (e) {
110
+ }
111
+ }
112
+ }
137
113
 
138
- const filter = {
139
- carrier: new Map<string, any>(),
140
- filters: [] as { filter: Filter, sw: boolean }[]
141
- };
142
- for (let i = 0; this.option.filters && i < this.option.filters.length; i++) {
143
- const it = this.option.filters[i];
144
- const execute = (typeof it === 'function' ? this.simstanceManager.getOrNewSim({target:it}) : it) as Filter;
145
- let sw = true;
146
- if (execute?.proceedBefore) {
147
- sw = await execute.proceedBefore({rr, app: this, carrier: filter.carrier});
148
- filter.filters.push({filter: execute, sw});
149
- }
150
- if (!sw) {
151
- break;
152
- }
153
- }
114
+ if (!rr.resIsDone()) {
115
+ rr.resEnd();
116
+ }
117
+ });
154
118
 
155
- // body.. something..
156
- if (!rr.resIsDone()) {
157
- const routerModule = await super.routing(rr.reqIntent);
158
- otherStorage.set(RouterModule, routerModule);
159
- const moduleInstance = routerModule?.getModuleInstance?.();
160
- let methods: SaveMappingConfig[] = [];
161
- if (routerModule && moduleInstance) {
162
- // router 클래스 내부에서 선언된 Route일때
163
- if (routerModule.propertyKeys) {
164
- const map = routerModule.propertyKeys?.map((it: string | symbol) => {
165
- return {propertyKey: it, config: getUrlMapping(moduleInstance, it)} as SaveMappingConfig
166
- });
167
- methods.push(...(map ?? []));
168
- } else {
169
- methods.push(...(getUrlMappings(moduleInstance).filter(it => !getRoute(moduleInstance, it.propertyKey)) ?? []));
170
- }
119
+ const rr = new RequestResponse(req, res, {sessionManager: this.sessionManager, option: this.option});
120
+ /*
121
+ default setting first
122
+ */
123
+ rr.resSetHeader(HttpHeaders.Server, 'simple-boot-http-server');
124
+ const cookie = rr.reqCookieGet(this.option.sessionOption.key);
125
+ if (!cookie) {
126
+ const session = await this.sessionManager.session();
171
127
 
172
- // options로 요청오면은 allow로 넣고 그냥 200처리해야됨.
173
- if (rr.reqMethod()?.toUpperCase() === HttpMethod.OPTIONS.toUpperCase()) {
174
- rr.resSetHeader(HttpHeaders.Allow, methods.map(it => it.config.method).join(', '));
175
- rr.resStatusCode(HttpStatus.Ok);
176
- }
128
+ const cookieParts: string[] = [];
129
+ cookieParts.push(`${this.option.sessionOption.key}=${session.uuid}`);
130
+ cookieParts.push(`Path=${this.option.sessionOption.path}`);
131
+ if (this.option.sessionOption.httpOnly) cookieParts.push('HttpOnly');
132
+ if (this.option.sessionOption.secure) cookieParts.push('Secure');
133
+ if (this.option.sessionOption.sameSite != null && this.option.sessionOption.sameSite) cookieParts.push(`SameSite=${this.option.sessionOption.sameSite}`);
134
+ const maxAge = (this.option.sessionOption as any).maxAge ?? (this.sessionManager.sessionOption)?.maxAge;
135
+ if (maxAge != null) cookieParts.push(`Max-Age=${maxAge}`);
136
+ rr.resSetHeader(HttpHeaders.SetCookie, cookieParts.join('; '));
137
+ }
177
138
 
178
- // method 찾기
179
- methods = methods.filter(it => it && it.propertyKey && it.config && rr.reqMethod()?.toUpperCase() === it.config.method.toUpperCase());
180
- methods.sort((a, b) => {
181
- return ((b.config?.req?.contentType?.length ?? 0) + (b.config?.req?.accept?.length ?? 0)) - ((a.config?.req?.contentType?.length ?? 0) + (a.config?.req?.accept?.length ?? 0));
182
- });
183
- methods = methods
184
- .filter(it => it.config?.req?.contentType ? (!!it.config?.req?.contentType?.find(sit => rr.reqHasContentTypeHeader(sit))) : true)
185
- .filter(it => it.config?.req?.accept ? (!!it.config?.req?.accept?.find(sit => rr.reqHasAcceptHeader(sit))) : true);
139
+ const otherStorage = new Map<ConstructorType<any>, any>();
140
+ otherStorage.set(RequestResponse, rr);
141
+ otherStorage.set(IncomingMessage, req);
142
+ otherStorage.set(ServerResponse, res);
143
+ try {
144
+ transactionManager?.try();
145
+ if (this.option.requestEndPoints) {
146
+ for (const it of this.option.requestEndPoints) {
147
+ try {
148
+ const execute = (typeof it === 'function' ? this.simstanceManager.getOrNewSim<EndPoint>({target: it}) : it) as EndPoint;
149
+ execute?.endPoint(rr, this);
150
+ } catch (e) {
151
+ }
152
+ }
153
+ }
186
154
 
187
- if (methods[0]) {
188
- const it = methods[0];
189
- const paramTypes = ReflectUtils.getParameterTypes(moduleInstance, it.propertyKey)
190
- const injects = getInject(moduleInstance, it.propertyKey);
191
- const validIndexs = getValidIndex(moduleInstance, it.propertyKey);
192
- if (injects) {
193
- const isJson = injects.find(it => it.config?.situationType === UrlMappingSituationType.REQ_JSON_BODY);
194
- const isSearchParamsObj = injects.find(it => it.config?.situationType === UrlMappingSituationType.REQ_URL_SEARCH_PARAMS_OBJ);
195
- const isFormUrl = injects.find(it => it.config?.situationType === UrlMappingSituationType.REQ_FORM_URL_BODY);
196
- const isTransactionManager = injects.find(it => it.config?.situationType === InjectSituationType.TransactionManager);
197
- const siturationContainers = new SituationTypeContainers();
198
- if (isJson) {
199
- let data = await rr.reqBodyJsonData()
200
- if (isJson.type) {
201
- data = Object.assign(new isJson.type(), data);
202
- }
203
- if (validIndexs.includes(isJson.index)) {
204
- const inValid = execValidationInValid(data);
205
- if ((inValid?.length ?? 0) > 0) {
206
- throw new ValidException(inValid);
207
- }
208
- }
209
- siturationContainers.push(new SituationTypeContainer({
210
- situationType: UrlMappingSituationType.REQ_JSON_BODY,
211
- data
212
- }));
213
- }
214
- if (isSearchParamsObj) {
215
- let data = rr.reqUrlSearchParamsObj
216
- if (validIndexs.includes(isSearchParamsObj.index)) {
217
- const inValid = execValidationInValid(data);
218
- if ((inValid?.length ?? 0) > 0) {
219
- throw new ValidException(inValid);
220
- }
221
- }
222
- siturationContainers.push(new SituationTypeContainer({
223
- situationType: UrlMappingSituationType.REQ_URL_SEARCH_PARAMS_OBJ,
224
- data
225
- }));
226
- }
227
- if (isFormUrl) {
228
- let data = await rr.reqBodyFormUrlData()
229
- if (isFormUrl.type) {
230
- data = Object.assign(new isFormUrl.type(), data);
231
- }
232
- if (validIndexs.includes(isFormUrl.index)) {
233
- const inValid = execValidationInValid(data);
234
- if ((inValid?.length ?? 0) > 0) {
235
- throw new ValidException(inValid);
236
- }
237
- }
238
- siturationContainers.push(new SituationTypeContainer({situationType: UrlMappingSituationType.REQ_FORM_URL_BODY, data}));
239
- }
155
+ const filter = {
156
+ carrier: new Map<string, any>(),
157
+ filters: [] as { filter: Filter, sw: boolean }[]
158
+ };
159
+ for (let i = 0; this.option.filters && i < this.option.filters.length; i++) {
160
+ const it = this.option.filters[i];
161
+ const execute = (typeof it === 'function' ? this.simstanceManager.getOrNewSim({target: it}) : it) as Filter;
162
+ let sw = true;
163
+ if (execute?.proceedBefore) {
164
+ sw = await execute.proceedBefore({rr, app: this, carrier: filter.carrier});
165
+ filter.filters.push({filter: execute, sw});
166
+ }
167
+ if (!sw) {
168
+ break;
169
+ }
170
+ }
240
171
 
241
- if (isTransactionManager && isTransactionManager.type && transactionManager && transactionManager.hasTransaction(isTransactionManager.type)) {
242
- let data = await transactionManager.getTransaction(isTransactionManager.type);
243
- if (data) {
244
- data = await data.try(isTransactionManager.config.argument);
245
- siturationContainers.push(new SituationTypeContainer({situationType: InjectSituationType.TransactionManager, data, index: isTransactionManager.index}));
246
- }
247
- }
248
- if (siturationContainers.length) {
249
- otherStorage.set(SituationTypeContainers, siturationContainers);
250
- }
251
- }
172
+ // body.. something..
173
+ if (!rr.resIsDone()) {
174
+ const routerModule = await super.routing(rr.reqIntent);
175
+ otherStorage.set(RouterModule, routerModule);
176
+ const moduleInstance = routerModule?.getModuleInstance?.();
177
+ let methods: SaveMappingConfig[] = [];
178
+ if (routerModule && moduleInstance) {
179
+ // router 클래스 내부에서 선언된 Route일때
180
+ if (routerModule.propertyKeys) {
181
+ const map = routerModule.propertyKeys?.map((it: string | symbol) => {
182
+ return {propertyKey: it, config: getUrlMapping(moduleInstance, it)} as SaveMappingConfig
183
+ });
184
+ methods.push(...(map ?? []));
185
+ } else {
186
+ methods.push(...(getUrlMappings(moduleInstance).filter(it => !getRoute(moduleInstance, it.propertyKey)) ?? []));
187
+ }
252
188
 
253
- for (const paramType of paramTypes) {
254
- if (paramType === ReqFormUrlBody) {
255
- otherStorage.set(ReqFormUrlBody, await rr.reqBodyReqFormUrlBody())
256
- } else if (paramType === ReqJsonBody) {
257
- otherStorage.set(ReqJsonBody, await rr.reqBodyReqJsonBody())
258
- } else if (paramType === ReqSearchParamsObj) {
259
- otherStorage.set(ReqSearchParamsObj, rr.reqUrlSearchParamsObj)
260
- }else if (paramType === URLSearchParams) {
261
- otherStorage.set(URLSearchParams, rr.reqUrlSearchParams)
262
- } else if (paramType === ReqMultipartFormBody) {
263
- otherStorage.set(ReqMultipartFormBody, rr.reqBodyMultipartFormData())
264
- } else if (paramType === ReqHeader) {
265
- otherStorage.set(ReqHeader, rr.reqHeaderObj)
266
- }
267
- }
189
+ // options로 요청오면은 allow로 넣고 그냥 200처리해야됨.
190
+ if (rr.reqMethod()?.toUpperCase() === HttpMethod.OPTIONS.toUpperCase()) {
191
+ rr.resSetHeader(HttpHeaders.Allow, methods.map(it => it.config.method).join(', '));
192
+ rr.resStatusCode(HttpStatus.Ok);
193
+ }
268
194
 
269
- // execute !!!
270
- let data = await this.simstanceManager.executeBindParameterSimPromise({
271
- target: moduleInstance,
272
- targetKey: it.propertyKey
273
- }, otherStorage);
274
- /*
275
- 여기에서 정해진 타입 리턴에 따른 조치
276
- ...
277
- */
278
- if (it.config?.resolver) {
279
- const execute = typeof it.config.resolver === 'function' ? this.simstanceManager.getOrNewSim({target:it.config.resolver}) : it.config.resolver;
280
- data = await execute?.resolve?.(data, rr);
281
- }
282
- const status = it.config?.res?.status ?? HttpStatus.Ok;
283
- const headers = it.config?.res?.header ?? {};
284
- if (it.config?.res?.contentType) {
285
- headers[HttpHeaders.ContentType] = it.config?.res?.contentType;
286
- }
287
- if ((it.config?.res?.contentType?.toLowerCase().indexOf(Mimes.ApplicationJson.toLowerCase()) ?? -1) > -1) {
288
- data = JSON.stringify(data);
289
- } else if (data && typeof data === 'object') {
290
- data = JSON.stringify(data);
291
- }
292
- rr.resSetHeaders(headers)
293
- rr.resSetStatusCode(status);
294
- rr.resWrite(data);
295
- }
296
- }
195
+ // method 찾기
196
+ methods = methods.filter(it => it && it.propertyKey && it.config && rr.reqMethod()?.toUpperCase() === it.config.method.toUpperCase());
197
+ methods.sort((a, b) => {
198
+ return ((b.config?.req?.contentType?.length ?? 0) + (b.config?.req?.accept?.length ?? 0)) - ((a.config?.req?.contentType?.length ?? 0) + (a.config?.req?.accept?.length ?? 0));
199
+ });
200
+ methods = methods
201
+ .filter(it => it.config?.req?.contentType ? (!!it.config?.req?.contentType?.find(sit => rr.reqHasContentTypeHeader(sit))) : true)
202
+ .filter(it => it.config?.req?.accept ? (!!it.config?.req?.accept?.find(sit => rr.reqHasAcceptHeader(sit))) : true);
297
203
 
298
- if (this.option.noSuchRouteEndPointMappingThrow && methods.length <= 0 && rr.reqMethod()?.toUpperCase() !== HttpMethod.OPTIONS) {
299
- throw this.option.noSuchRouteEndPointMappingThrow(rr);
204
+ if (methods[0]) {
205
+ const it = methods[0];
206
+ const paramTypes = ReflectUtils.getParameterTypes(moduleInstance, it.propertyKey)
207
+ const injects = getInject(moduleInstance, it.propertyKey);
208
+ const validIndexs = getValidIndex(moduleInstance, it.propertyKey);
209
+ if (injects) {
210
+ const isPathData = injects.find(it => it.config?.situationType === UrlMappingSituationType.REQ_PATH_DATA);
211
+ const isJson = injects.find(it => it.config?.situationType === UrlMappingSituationType.REQ_JSON_BODY);
212
+ const isSearchParamsObj = injects.find(it => it.config?.situationType === UrlMappingSituationType.REQ_URL_SEARCH_PARAMS_OBJ);
213
+ const isFormUrl = injects.find(it => it.config?.situationType === UrlMappingSituationType.REQ_FORM_URL_BODY);
214
+ // 우선 다시 제거한다.. 트랜젝션 어떻게 할지 다시 생각
215
+ // const isTransactionManager = injects.find(it => it.config?.situationType === InjectSituationType.TransactionManager);
216
+ const siturationContainers = new SituationTypeContainers();
217
+ if (isPathData) {
218
+ let data = await routerModule.pathData
219
+ if (isPathData.type) {
220
+ data = Object.assign(new isPathData.type(), data);
221
+ }
222
+ if (validIndexs.includes(isPathData.index)) {
223
+ const inValid = execValidationInValid(data);
224
+ if ((inValid?.length ?? 0) > 0) {
225
+ throw new ValidException(inValid);
300
226
  }
227
+ }
228
+ siturationContainers.push(new SituationTypeContainer({
229
+ situationType: UrlMappingSituationType.REQ_PATH_DATA,
230
+ data
231
+ }));
301
232
  }
302
-
303
- // after
304
- for (const it of filter.filters.reverse()) {
305
- if (it.filter?.proceedAfter && !await it.filter.proceedAfter({rr, app:this, before: it.sw, carrier: filter.carrier})) {
306
- break;
233
+ if (isJson) {
234
+ let data = await rr.reqBodyJsonData();
235
+ if (data !== null && isJson.type) {
236
+ data = Object.assign(new isJson.type(), data);
237
+ }
238
+ if (validIndexs.includes(isJson.index)) {
239
+ const inValid = execValidationInValid(data);
240
+ if ((inValid?.length ?? 0) > 0) {
241
+ throw new ValidException(inValid);
307
242
  }
243
+ }
244
+ siturationContainers.push(new SituationTypeContainer({
245
+ situationType: UrlMappingSituationType.REQ_JSON_BODY,
246
+ data
247
+ }));
308
248
  }
309
- } catch (e) {
310
- transactionManager?.catch(e);
311
- rr.resStatusCode(e instanceof HttpError ? e.status : HttpStatus.InternalServerError)
312
- const execute = typeof this.option.globalAdvice === 'function' ? this.simstanceManager.getOrNewSim(this.option.globalAdvice) : this.option.globalAdvice;
313
- if (!execute) {
314
- rr.resEnd();
315
- // rr.resEnd().catch(e => {
316
- // });
317
- return;
249
+ if (isSearchParamsObj) {
250
+ let data = rr.reqUrlSearchParamsObj
251
+ if (validIndexs.includes(isSearchParamsObj.index)) {
252
+ const inValid = execValidationInValid(data);
253
+ if ((inValid?.length ?? 0) > 0) {
254
+ throw new ValidException(inValid);
255
+ }
256
+ }
257
+ siturationContainers.push(new SituationTypeContainer({
258
+ situationType: UrlMappingSituationType.REQ_URL_SEARCH_PARAMS_OBJ,
259
+ data
260
+ }));
318
261
  }
319
- if (e && typeof e === 'object') {
320
- otherStorage.set(e.constructor as ConstructorType<any>, e);
321
- otherStorage.set(SituationTypeContainer, new SituationTypeContainer({
322
- situationType: ExceptionHandlerSituationType.ERROR_OBJECT,
323
- data: e
324
- }));
262
+ if (isFormUrl) {
263
+ let data = await rr.reqBodyFormUrlData()
264
+ if (isFormUrl.type) {
265
+ data = Object.assign(new isFormUrl.type(), data);
266
+ }
267
+ if (validIndexs.includes(isFormUrl.index)) {
268
+ const inValid = execValidationInValid(data);
269
+ if ((inValid?.length ?? 0) > 0) {
270
+ throw new ValidException(inValid);
271
+ }
272
+ }
273
+ siturationContainers.push(new SituationTypeContainer({situationType: UrlMappingSituationType.REQ_FORM_URL_BODY, data}));
325
274
  }
326
- const target = targetExceptionHandler(execute, e);
327
- if (target) {
328
- await this.simstanceManager.executeBindParameterSimPromise({
329
- target: execute,
330
- targetKey: target.propertyKey
331
- }, otherStorage);
275
+ // 트랜젝션 우선 제거 나중에 어떻게 구현할지 생각..
276
+ // if (isTransactionManager && isTransactionManager.type && transactionManager && transactionManager.hasTransaction(isTransactionManager.type)) {
277
+ // let data = await transactionManager.getTransaction(isTransactionManager.type);
278
+ // if (data) {
279
+ // data = await data.try(isTransactionManager.config.argument);
280
+ // siturationContainers.push(new SituationTypeContainer({situationType: InjectSituationType.TransactionManager, data, index: isTransactionManager.index}));
281
+ // }
282
+ // }
283
+ if (siturationContainers.length) {
284
+ otherStorage.set(SituationTypeContainers, siturationContainers);
332
285
  }
333
- } finally {
334
- transactionManager?.finally();
335
- }
286
+ }
287
+
288
+ for (const paramType of paramTypes) {
289
+ if (paramType === ReqFormUrlBody) {
290
+ otherStorage.set(ReqFormUrlBody, await rr.reqBodyReqFormUrlBody())
291
+ } else if (paramType === ReqPathData) {
292
+ otherStorage.set(ReqPathData, routerModule.pathData)
293
+ } else if (paramType === ReqJsonBody) {
294
+ otherStorage.set(ReqJsonBody, await rr.reqBodyReqJsonBody())
295
+ } else if (paramType === ReqSearchParamsObj) {
296
+ otherStorage.set(ReqSearchParamsObj, rr.reqUrlSearchParamsObj)
297
+ } else if (paramType === URLSearchParams) {
298
+ otherStorage.set(URLSearchParams, rr.reqUrlSearchParams)
299
+ } else if (paramType === ReqMultipartFormBody) {
300
+ otherStorage.set(ReqMultipartFormBody, rr.reqBodyMultipartFormData())
301
+ } else if (paramType === ReqHeader) {
302
+ otherStorage.set(ReqHeader, rr.reqHeaderObj)
303
+ }
304
+ }
336
305
 
337
- if (!rr.resIsDone()) {
338
- rr.resEnd();
306
+ // execute !!!
307
+ let data = await this.simstanceManager.executeBindParameterSimPromise({
308
+ target: moduleInstance,
309
+ targetKey: it.propertyKey
310
+ }, otherStorage);
311
+ /*
312
+ 여기에서 정해진 타입 리턴에 따른 조치
313
+ ...
314
+ */
315
+ if (it.config?.resolver) {
316
+ const execute = typeof it.config.resolver === 'function' ? this.simstanceManager.getOrNewSim({target: it.config.resolver}) : it.config.resolver;
317
+ data = await execute?.resolve?.(data, rr);
318
+ }
319
+ const status = it.config?.res?.status ?? HttpStatus.Ok;
320
+ const headers = it.config?.res?.header ?? {};
321
+ if (it.config?.res?.contentType) {
322
+ headers[HttpHeaders.ContentType] = it.config?.res?.contentType;
323
+ }
324
+ if ((it.config?.res?.contentType?.toLowerCase().indexOf(Mimes.ApplicationJson.toLowerCase()) ?? -1) > -1) {
325
+ data = JSON.stringify(data);
326
+ } else if (data && typeof data === 'object') {
327
+ data = JSON.stringify(data);
328
+ }
329
+ rr.resSetHeaders(headers)
330
+ rr.resSetStatusCode(status);
331
+ rr.resWrite(data);
339
332
  }
340
- });
333
+ }
334
+
335
+ if (this.option.noSuchRouteEndPointMappingThrow && methods.length <= 0 && rr.reqMethod()?.toUpperCase() !== HttpMethod.OPTIONS) {
336
+ throw this.option.noSuchRouteEndPointMappingThrow(rr);
337
+ }
338
+ }
339
+
340
+ // after
341
+ for (const it of filter.filters.reverse()) {
342
+ if (it.filter?.proceedAfter && !await it.filter.proceedAfter({rr, app: this, before: it.sw, carrier: filter.carrier})) {
343
+ break;
344
+ }
345
+ }
346
+ } catch (e) {
347
+ console.error('request error:', e);
348
+ transactionManager?.catch(e);
349
+ rr.resStatusCode(e instanceof HttpError ? e.status : HttpStatus.InternalServerError)
350
+ const execute = typeof this.option.globalAdvice === 'function' ? this.simstanceManager.getOrNewSim(this.option.globalAdvice) : this.option.globalAdvice;
351
+ if (!execute) {
352
+ rr.resEnd();
353
+ // rr.resEnd().catch(e => {
354
+ // });
355
+ return;
356
+ }
357
+ if (e && typeof e === 'object') {
358
+ otherStorage.set(e.constructor as ConstructorType<any>, e);
359
+ otherStorage.set(SituationTypeContainer, new SituationTypeContainer({
360
+ situationType: ExceptionHandlerSituationType.ERROR_OBJECT,
361
+ data: e
362
+ }));
363
+ }
364
+ const target = targetExceptionHandler(execute, e);
365
+ if (target) {
366
+ await this.simstanceManager.executeBindParameterSimPromise({
367
+ target: execute,
368
+ targetKey: target.propertyKey
369
+ }, otherStorage);
370
+ }
371
+ } finally {
372
+ transactionManager?.finally();
373
+ }
374
+
375
+ if (!rr.resIsDone()) {
376
+ rr.resEnd();
377
+ }
378
+ });
341
379
 
342
- this.server.listen(this.option.listen.port, this.option.listen.hostname, this.option.listen.backlog, () => {
343
- this.option.listen.listeningListener?.(this, this.server);
380
+ if (this.option.webSocketEndPoints) {
381
+ const webSocketServer = new WebSocketServer({server: this.server});
382
+ const execute = this.option.webSocketEndPoints.map(it => typeof it === 'function' ? this.simstanceManager.getOrNewSim({target: it}) : it);
383
+ webSocketServer.on('connection', async (ws, request) => {
384
+ this.webSocketClients.set(ws, {request});
385
+ const wsSet = {socket: ws, request};
386
+ execute.forEach(it => it.connect?.(wsSet));
387
+ ws.on('error', err => execute.forEach(it => it.error?.(wsSet, err)));
388
+ ws.on('message', (data, isBinary) => execute.forEach(it => it.message(wsSet, {data, isBinary})));
389
+ ws.on('ping', () => execute.forEach(it => it.ping?.(wsSet)));
390
+ ws.on('close', () => {
391
+ this.webSocketClients.delete(ws);
392
+ execute.forEach(it => it.close?.(wsSet));
344
393
  });
394
+ });
345
395
  }
396
+ this.server.listen(this.option.listen.port, this.option.listen.hostname, this.option.listen.backlog, () => {
397
+ this.option.listen.listeningListener?.(this, this.server);
398
+ });
399
+ }
346
400
  }