@tsed/common 7.0.0-beta.2 → 7.0.0-beta.20

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 (305) hide show
  1. package/coverage.json +6 -0
  2. package/jest.config.js +9 -0
  3. package/lib/cjs/builder/PlatformBuilder.js +94 -65
  4. package/lib/cjs/builder/PlatformBuilder.js.map +1 -1
  5. package/lib/cjs/config/interfaces/PlatformLoggerSettings.js.map +1 -1
  6. package/lib/cjs/config/interfaces/PlatformMulterSettings.js.map +1 -1
  7. package/lib/cjs/config/services/PlatformConfiguration.js +2 -66
  8. package/lib/cjs/config/services/PlatformConfiguration.js.map +1 -1
  9. package/lib/cjs/decorators/multer/multipartFile.js.map +1 -1
  10. package/lib/cjs/decorators/params/error.js +1 -1
  11. package/lib/cjs/decorators/params/error.js.map +1 -1
  12. package/lib/cjs/domain/AnyToPromiseWithCtx.js +4 -5
  13. package/lib/cjs/domain/AnyToPromiseWithCtx.js.map +1 -1
  14. package/lib/cjs/domain/EndpointMetadata.js +2 -66
  15. package/lib/cjs/domain/EndpointMetadata.js.map +1 -1
  16. package/lib/cjs/domain/PlatformContext.js +46 -38
  17. package/lib/cjs/domain/PlatformContext.js.map +1 -1
  18. package/lib/cjs/domain/PlatformRouteDetails.js +0 -21
  19. package/lib/cjs/domain/PlatformRouteDetails.js.map +1 -1
  20. package/lib/cjs/exports.js +32 -0
  21. package/lib/cjs/exports.js.map +1 -0
  22. package/lib/cjs/index.js +58 -30
  23. package/lib/cjs/index.js.map +1 -1
  24. package/lib/cjs/interfaces/PlatformRouteOptions.js.map +1 -1
  25. package/lib/cjs/interfaces/Route.js.map +1 -1
  26. package/lib/cjs/middlewares/PlatformAcceptMimesMiddleware.js +10 -9
  27. package/lib/cjs/middlewares/PlatformAcceptMimesMiddleware.js.map +1 -1
  28. package/lib/cjs/middlewares/PlatformMulterMiddleware.js +27 -13
  29. package/lib/cjs/middlewares/PlatformMulterMiddleware.js.map +1 -1
  30. package/lib/cjs/package.json +3 -0
  31. package/lib/cjs/services/FakeAdapter.js +49 -0
  32. package/lib/cjs/services/FakeAdapter.js.map +1 -0
  33. package/lib/cjs/services/Platform.js +33 -68
  34. package/lib/cjs/services/Platform.js.map +1 -1
  35. package/lib/cjs/services/PlatformAdapter.js +24 -0
  36. package/lib/cjs/services/PlatformAdapter.js.map +1 -0
  37. package/lib/cjs/services/PlatformApplication.js +26 -14
  38. package/lib/cjs/services/PlatformApplication.js.map +1 -1
  39. package/lib/cjs/services/PlatformHandler.js +115 -172
  40. package/lib/cjs/services/PlatformHandler.js.map +1 -1
  41. package/lib/cjs/services/PlatformMiddlewaresChain.js +46 -19
  42. package/lib/cjs/services/PlatformMiddlewaresChain.js.map +1 -1
  43. package/lib/cjs/services/PlatformRequest.js +17 -13
  44. package/lib/cjs/services/PlatformRequest.js.map +1 -1
  45. package/lib/cjs/services/PlatformResponse.js +20 -23
  46. package/lib/cjs/services/PlatformResponse.js.map +1 -1
  47. package/lib/cjs/services/PlatformTest.js +31 -10
  48. package/lib/cjs/services/PlatformTest.js.map +1 -1
  49. package/lib/cjs/utils/createContext.js +32 -21
  50. package/lib/cjs/utils/createContext.js.map +1 -1
  51. package/lib/cjs/utils/createHttpServer.js +6 -11
  52. package/lib/cjs/utils/createHttpServer.js.map +1 -1
  53. package/lib/cjs/utils/createHttpsServer.js +6 -11
  54. package/lib/cjs/utils/createHttpsServer.js.map +1 -1
  55. package/lib/cjs/utils/createInjector.js +16 -10
  56. package/lib/cjs/utils/createInjector.js.map +1 -1
  57. package/lib/cjs/utils/ensureContext.js +16 -0
  58. package/lib/cjs/utils/ensureContext.js.map +1 -0
  59. package/lib/cjs/utils/getConfiguration.js +6 -12
  60. package/lib/cjs/utils/getConfiguration.js.map +1 -1
  61. package/lib/cjs/utils/printRoutes.js +10 -8
  62. package/lib/cjs/utils/printRoutes.js.map +1 -1
  63. package/lib/cjs/utils/setResponseHeaders.js +8 -14
  64. package/lib/cjs/utils/setResponseHeaders.js.map +1 -1
  65. package/lib/esm/builder/PlatformBuilder.js +74 -68
  66. package/lib/esm/builder/PlatformBuilder.js.map +1 -1
  67. package/lib/esm/config/interfaces/PlatformLoggerSettings.js.map +1 -1
  68. package/lib/esm/config/interfaces/PlatformMulterSettings.js.map +1 -1
  69. package/lib/esm/config/services/PlatformConfiguration.js +0 -64
  70. package/lib/esm/config/services/PlatformConfiguration.js.map +1 -1
  71. package/lib/esm/decorators/multer/multerFileSize.js +1 -1
  72. package/lib/esm/decorators/multer/multerOptions.js +1 -1
  73. package/lib/esm/decorators/multer/multipartFile.js +1 -1
  74. package/lib/esm/decorators/multer/multipartFile.js.map +1 -1
  75. package/lib/esm/decorators/params/error.js +1 -1
  76. package/lib/esm/decorators/params/error.js.map +1 -1
  77. package/lib/esm/domain/AnyToPromiseWithCtx.js +4 -5
  78. package/lib/esm/domain/AnyToPromiseWithCtx.js.map +1 -1
  79. package/lib/esm/domain/EndpointMetadata.js +1 -66
  80. package/lib/esm/domain/EndpointMetadata.js.map +1 -1
  81. package/lib/esm/domain/PlatformContext.js +49 -41
  82. package/lib/esm/domain/PlatformContext.js.map +1 -1
  83. package/lib/esm/domain/PlatformRouteDetails.js +1 -19
  84. package/lib/esm/domain/PlatformRouteDetails.js.map +1 -1
  85. package/lib/esm/exports.js +14 -0
  86. package/lib/esm/exports.js.map +1 -0
  87. package/lib/esm/index.js +58 -27
  88. package/lib/esm/index.js.map +1 -1
  89. package/lib/esm/interfaces/PlatformRouteOptions.js.map +1 -1
  90. package/lib/esm/interfaces/Route.js.map +1 -1
  91. package/lib/esm/middlewares/PlatformAcceptMimesMiddleware.js +2 -1
  92. package/lib/esm/middlewares/PlatformAcceptMimesMiddleware.js.map +1 -1
  93. package/lib/esm/middlewares/PlatformMulterMiddleware.js +18 -5
  94. package/lib/esm/middlewares/PlatformMulterMiddleware.js.map +1 -1
  95. package/lib/esm/package.json +3 -0
  96. package/lib/esm/services/FakeAdapter.js +45 -0
  97. package/lib/esm/services/FakeAdapter.js.map +1 -0
  98. package/lib/esm/services/Platform.js +34 -69
  99. package/lib/esm/services/Platform.js.map +1 -1
  100. package/lib/esm/services/PlatformAdapter.js +20 -0
  101. package/lib/esm/services/PlatformAdapter.js.map +1 -0
  102. package/lib/esm/services/PlatformApplication.js +27 -15
  103. package/lib/esm/services/PlatformApplication.js.map +1 -1
  104. package/lib/esm/services/PlatformHandler.js +116 -173
  105. package/lib/esm/services/PlatformHandler.js.map +1 -1
  106. package/lib/esm/services/PlatformMiddlewaresChain.js +49 -22
  107. package/lib/esm/services/PlatformMiddlewaresChain.js.map +1 -1
  108. package/lib/esm/services/PlatformRequest.js +16 -12
  109. package/lib/esm/services/PlatformRequest.js.map +1 -1
  110. package/lib/esm/services/PlatformResponse.js +19 -22
  111. package/lib/esm/services/PlatformResponse.js.map +1 -1
  112. package/lib/esm/services/PlatformTest.js +34 -14
  113. package/lib/esm/services/PlatformTest.js.map +1 -1
  114. package/lib/esm/utils/createContext.js +33 -23
  115. package/lib/esm/utils/createContext.js.map +1 -1
  116. package/lib/esm/utils/createHttpServer.js +6 -11
  117. package/lib/esm/utils/createHttpServer.js.map +1 -1
  118. package/lib/esm/utils/createHttpsServer.js +6 -11
  119. package/lib/esm/utils/createHttpsServer.js.map +1 -1
  120. package/lib/esm/utils/createInjector.js +20 -14
  121. package/lib/esm/utils/createInjector.js.map +1 -1
  122. package/lib/esm/utils/ensureContext.js +12 -0
  123. package/lib/esm/utils/ensureContext.js.map +1 -0
  124. package/lib/esm/utils/getConfiguration.js +8 -14
  125. package/lib/esm/utils/getConfiguration.js.map +1 -1
  126. package/lib/esm/utils/printRoutes.js +10 -8
  127. package/lib/esm/utils/printRoutes.js.map +1 -1
  128. package/lib/esm/utils/setResponseHeaders.js +8 -14
  129. package/lib/esm/utils/setResponseHeaders.js.map +1 -1
  130. package/lib/types/builder/PlatformBuilder.d.ts +19 -17
  131. package/lib/types/config/interfaces/PlatformLoggerSettings.d.ts +2 -43
  132. package/lib/types/config/interfaces/PlatformMulterSettings.d.ts +6 -130
  133. package/lib/types/config/services/PlatformConfiguration.d.ts +6 -21
  134. package/lib/types/domain/AnyToPromiseWithCtx.d.ts +1 -9
  135. package/lib/types/domain/EndpointMetadata.d.ts +1 -50
  136. package/lib/types/domain/PlatformContext.d.ts +32 -18
  137. package/lib/types/domain/PlatformRouteDetails.d.ts +4 -20
  138. package/lib/types/exports.d.ts +13 -0
  139. package/lib/types/index.d.ts +56 -18
  140. package/lib/types/interfaces/PlatformRouteOptions.d.ts +1 -2
  141. package/lib/types/interfaces/Route.d.ts +2 -3
  142. package/lib/types/middlewares/PlatformMulterMiddleware.d.ts +8 -3
  143. package/lib/types/services/FakeAdapter.d.ts +31 -0
  144. package/lib/types/services/Platform.d.ts +9 -21
  145. package/lib/types/services/PlatformAdapter.d.ts +58 -0
  146. package/lib/types/services/PlatformApplication.d.ts +15 -7
  147. package/lib/types/services/PlatformHandler.d.ts +21 -59
  148. package/lib/types/services/PlatformMiddlewaresChain.d.ts +6 -3
  149. package/lib/types/services/PlatformRequest.d.ts +8 -10
  150. package/lib/types/services/PlatformResponse.d.ts +15 -19
  151. package/lib/types/services/PlatformTest.d.ts +5 -4
  152. package/lib/types/utils/createContext.d.ts +4 -1
  153. package/lib/types/utils/createHttpServer.d.ts +1 -1
  154. package/lib/types/utils/createHttpsServer.d.ts +3 -1
  155. package/lib/types/utils/createInjector.d.ts +5 -3
  156. package/lib/types/utils/ensureContext.d.ts +2 -0
  157. package/lib/types/utils/listenServer.d.ts +2 -0
  158. package/package.json +43 -26
  159. package/readme.md +52 -58
  160. package/tsconfig.compile.esm.json +2 -12
  161. package/lib/cjs/builder/PlatformControllerBuilder.js +0 -85
  162. package/lib/cjs/builder/PlatformControllerBuilder.js.map +0 -1
  163. package/lib/cjs/config/index.js +0 -7
  164. package/lib/cjs/config/index.js.map +0 -1
  165. package/lib/cjs/config/interfaces/EndpointDirectoriesSettings.js +0 -3
  166. package/lib/cjs/config/interfaces/EndpointDirectoriesSettings.js.map +0 -1
  167. package/lib/cjs/config/interfaces/index.js +0 -8
  168. package/lib/cjs/config/interfaces/index.js.map +0 -1
  169. package/lib/cjs/decorators/httpServer.js +0 -32
  170. package/lib/cjs/decorators/httpServer.js.map +0 -1
  171. package/lib/cjs/decorators/httpsServer.js +0 -32
  172. package/lib/cjs/decorators/httpsServer.js.map +0 -1
  173. package/lib/cjs/decorators/index.js +0 -21
  174. package/lib/cjs/decorators/index.js.map +0 -1
  175. package/lib/cjs/decorators/method/acceptMime.js +0 -28
  176. package/lib/cjs/decorators/method/acceptMime.js.map +0 -1
  177. package/lib/cjs/decorators/method/endpointFn.js +0 -15
  178. package/lib/cjs/decorators/method/endpointFn.js.map +0 -1
  179. package/lib/cjs/decorators/method/location.js +0 -6
  180. package/lib/cjs/decorators/method/location.js.map +0 -1
  181. package/lib/cjs/decorators/method/redirect.js +0 -6
  182. package/lib/cjs/decorators/method/redirect.js.map +0 -1
  183. package/lib/cjs/decorators/method/route.js +0 -13
  184. package/lib/cjs/decorators/method/route.js.map +0 -1
  185. package/lib/cjs/decorators/method/view.js +0 -34
  186. package/lib/cjs/decorators/method/view.js.map +0 -1
  187. package/lib/cjs/decorators/multer/index.js +0 -7
  188. package/lib/cjs/decorators/multer/index.js.map +0 -1
  189. package/lib/cjs/domain/ControllerProvider.js +0 -51
  190. package/lib/cjs/domain/ControllerProvider.js.map +0 -1
  191. package/lib/cjs/domain/HandlerMetadata.js +0 -57
  192. package/lib/cjs/domain/HandlerMetadata.js.map +0 -1
  193. package/lib/cjs/domain/index.js +0 -10
  194. package/lib/cjs/domain/index.js.map +0 -1
  195. package/lib/cjs/interfaces/PathType.js +0 -3
  196. package/lib/cjs/interfaces/PathType.js.map +0 -1
  197. package/lib/cjs/interfaces/PlatformAdapter.js +0 -3
  198. package/lib/cjs/interfaces/PlatformAdapter.js.map +0 -1
  199. package/lib/cjs/interfaces/index.js +0 -21
  200. package/lib/cjs/interfaces/index.js.map +0 -1
  201. package/lib/cjs/middlewares/__mock__/FakeCtrl.js +0 -12
  202. package/lib/cjs/middlewares/__mock__/FakeCtrl.js.map +0 -1
  203. package/lib/cjs/middlewares/bindEndpointMiddleware.js +0 -13
  204. package/lib/cjs/middlewares/bindEndpointMiddleware.js.map +0 -1
  205. package/lib/cjs/middlewares/index.js +0 -7
  206. package/lib/cjs/middlewares/index.js.map +0 -1
  207. package/lib/cjs/services/FakeRawDriver.js +0 -26
  208. package/lib/cjs/services/FakeRawDriver.js.map +0 -1
  209. package/lib/cjs/services/PlatformRouter.js +0 -126
  210. package/lib/cjs/services/PlatformRouter.js.map +0 -1
  211. package/lib/cjs/services/index.js +0 -12
  212. package/lib/cjs/services/index.js.map +0 -1
  213. package/lib/cjs/utils/createHandlerMetadata.js +0 -49
  214. package/lib/cjs/utils/createHandlerMetadata.js.map +0 -1
  215. package/lib/cjs/utils/index.js +0 -11
  216. package/lib/cjs/utils/index.js.map +0 -1
  217. package/lib/cjs/utils/useCtxHandler.js +0 -15
  218. package/lib/cjs/utils/useCtxHandler.js.map +0 -1
  219. package/lib/esm/builder/PlatformControllerBuilder.js +0 -79
  220. package/lib/esm/builder/PlatformControllerBuilder.js.map +0 -1
  221. package/lib/esm/config/index.js +0 -4
  222. package/lib/esm/config/index.js.map +0 -1
  223. package/lib/esm/config/interfaces/EndpointDirectoriesSettings.js +0 -2
  224. package/lib/esm/config/interfaces/EndpointDirectoriesSettings.js.map +0 -1
  225. package/lib/esm/config/interfaces/index.js +0 -5
  226. package/lib/esm/config/interfaces/index.js.map +0 -1
  227. package/lib/esm/decorators/httpServer.js +0 -28
  228. package/lib/esm/decorators/httpServer.js.map +0 -1
  229. package/lib/esm/decorators/httpsServer.js +0 -28
  230. package/lib/esm/decorators/httpsServer.js.map +0 -1
  231. package/lib/esm/decorators/index.js +0 -18
  232. package/lib/esm/decorators/index.js.map +0 -1
  233. package/lib/esm/decorators/method/acceptMime.js +0 -24
  234. package/lib/esm/decorators/method/acceptMime.js.map +0 -1
  235. package/lib/esm/decorators/method/endpointFn.js +0 -11
  236. package/lib/esm/decorators/method/endpointFn.js.map +0 -1
  237. package/lib/esm/decorators/method/location.js +0 -2
  238. package/lib/esm/decorators/method/location.js.map +0 -1
  239. package/lib/esm/decorators/method/redirect.js +0 -2
  240. package/lib/esm/decorators/method/redirect.js.map +0 -1
  241. package/lib/esm/decorators/method/route.js +0 -2
  242. package/lib/esm/decorators/method/route.js.map +0 -1
  243. package/lib/esm/decorators/method/view.js +0 -30
  244. package/lib/esm/decorators/method/view.js.map +0 -1
  245. package/lib/esm/decorators/multer/index.js +0 -4
  246. package/lib/esm/decorators/multer/index.js.map +0 -1
  247. package/lib/esm/domain/ControllerProvider.js +0 -47
  248. package/lib/esm/domain/ControllerProvider.js.map +0 -1
  249. package/lib/esm/domain/HandlerMetadata.js +0 -53
  250. package/lib/esm/domain/HandlerMetadata.js.map +0 -1
  251. package/lib/esm/domain/index.js +0 -7
  252. package/lib/esm/domain/index.js.map +0 -1
  253. package/lib/esm/interfaces/PathType.js +0 -2
  254. package/lib/esm/interfaces/PathType.js.map +0 -1
  255. package/lib/esm/interfaces/PlatformAdapter.js +0 -2
  256. package/lib/esm/interfaces/PlatformAdapter.js.map +0 -1
  257. package/lib/esm/interfaces/index.js +0 -18
  258. package/lib/esm/interfaces/index.js.map +0 -1
  259. package/lib/esm/middlewares/__mock__/FakeCtrl.js +0 -9
  260. package/lib/esm/middlewares/__mock__/FakeCtrl.js.map +0 -1
  261. package/lib/esm/middlewares/bindEndpointMiddleware.js +0 -9
  262. package/lib/esm/middlewares/bindEndpointMiddleware.js.map +0 -1
  263. package/lib/esm/middlewares/index.js +0 -4
  264. package/lib/esm/middlewares/index.js.map +0 -1
  265. package/lib/esm/services/FakeRawDriver.js +0 -22
  266. package/lib/esm/services/FakeRawDriver.js.map +0 -1
  267. package/lib/esm/services/PlatformRouter.js +0 -123
  268. package/lib/esm/services/PlatformRouter.js.map +0 -1
  269. package/lib/esm/services/index.js +0 -9
  270. package/lib/esm/services/index.js.map +0 -1
  271. package/lib/esm/utils/createHandlerMetadata.js +0 -45
  272. package/lib/esm/utils/createHandlerMetadata.js.map +0 -1
  273. package/lib/esm/utils/index.js +0 -8
  274. package/lib/esm/utils/index.js.map +0 -1
  275. package/lib/esm/utils/useCtxHandler.js +0 -11
  276. package/lib/esm/utils/useCtxHandler.js.map +0 -1
  277. package/lib/types/builder/PlatformControllerBuilder.d.ts +0 -17
  278. package/lib/types/config/index.d.ts +0 -3
  279. package/lib/types/config/interfaces/EndpointDirectoriesSettings.d.ts +0 -3
  280. package/lib/types/config/interfaces/index.d.ts +0 -97
  281. package/lib/types/decorators/httpServer.d.ts +0 -28
  282. package/lib/types/decorators/httpsServer.d.ts +0 -28
  283. package/lib/types/decorators/index.d.ts +0 -14
  284. package/lib/types/decorators/method/acceptMime.d.ts +0 -19
  285. package/lib/types/decorators/method/endpointFn.d.ts +0 -9
  286. package/lib/types/decorators/method/location.d.ts +0 -1
  287. package/lib/types/decorators/method/redirect.d.ts +0 -1
  288. package/lib/types/decorators/method/route.d.ts +0 -1
  289. package/lib/types/decorators/method/view.d.ts +0 -25
  290. package/lib/types/decorators/multer/index.d.ts +0 -3
  291. package/lib/types/domain/ControllerProvider.d.ts +0 -24
  292. package/lib/types/domain/HandlerMetadata.d.ts +0 -32
  293. package/lib/types/domain/index.d.ts +0 -6
  294. package/lib/types/interfaces/PathType.d.ts +0 -1
  295. package/lib/types/interfaces/PlatformAdapter.d.ts +0 -19
  296. package/lib/types/interfaces/index.d.ts +0 -17
  297. package/lib/types/middlewares/__mock__/FakeCtrl.d.ts +0 -2
  298. package/lib/types/middlewares/bindEndpointMiddleware.d.ts +0 -5
  299. package/lib/types/middlewares/index.d.ts +0 -3
  300. package/lib/types/services/FakeRawDriver.d.ts +0 -15
  301. package/lib/types/services/PlatformRouter.d.ts +0 -48
  302. package/lib/types/services/index.d.ts +0 -8
  303. package/lib/types/utils/createHandlerMetadata.d.ts +0 -8
  304. package/lib/types/utils/index.d.ts +0 -7
  305. package/lib/types/utils/useCtxHandler.d.ts +0 -13
@@ -1,230 +1,173 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
- import { AnyToPromiseStatus, isFunction, isStream } from "@tsed/core";
3
- import { Inject, Injectable, InjectorService, ProviderScope } from "@tsed/di";
2
+ import { AnyToPromiseResponseTypes, AnyToPromiseStatus, catchAsyncError, isFunction, isStream } from "@tsed/core";
3
+ import { Inject, Injectable, ProviderScope } from "@tsed/di";
4
4
  import { $log } from "@tsed/logger";
5
+ import { PlatformExceptions } from "@tsed/platform-exceptions";
5
6
  import { PlatformParams } from "@tsed/platform-params";
6
7
  import { PlatformResponseFilter } from "@tsed/platform-response-filter";
7
- import { AnyToPromiseWithCtx } from "../domain/AnyToPromiseWithCtx";
8
- import { HandlerMetadata } from "../domain/HandlerMetadata";
9
- import { HandlerType } from "../interfaces/HandlerType";
10
- import { createHandlerMetadata } from "../utils/createHandlerMetadata";
11
- import { setResponseHeaders } from "../utils/setResponseHeaders";
8
+ import { PlatformHandlerMetadata, PlatformHandlerType, PlatformRouters, useResponseHandler } from "@tsed/platform-router";
9
+ import { promisify } from "util";
10
+ import { AnyToPromiseWithCtx } from "../domain/AnyToPromiseWithCtx.js";
11
+ import { setResponseHeaders } from "../utils/setResponseHeaders.js";
12
+ import { PlatformApplication } from "./PlatformApplication.js";
13
+ import { PlatformMiddlewaresChain } from "./PlatformMiddlewaresChain.js";
12
14
  /**
13
15
  * Platform Handler abstraction layer. Wrap original class method to a pure platform handler (Express, Koa, etc...).
14
16
  * @platform
15
17
  */
16
18
  let PlatformHandler = class PlatformHandler {
17
- constructor(injector, params) {
18
- this.injector = injector;
19
- this.params = params;
19
+ platformRouters;
20
+ responseFilter;
21
+ platformParams;
22
+ platformExceptions;
23
+ platformApplication;
24
+ platformMiddlewaresChain;
25
+ constructor(platformRouters) {
26
+ this.platformRouters = platformRouters;
27
+ // configure the router module
28
+ platformRouters.hooks
29
+ .on("alterEndpointHandlers", (allMiddlewares, operationRoute) => {
30
+ allMiddlewares = this.platformMiddlewaresChain.get(allMiddlewares, operationRoute);
31
+ return [...allMiddlewares, useResponseHandler(this.onFinish.bind(this))];
32
+ })
33
+ .on("alterHandler", (handlerMetadata) => {
34
+ return this.platformApplication.adapter.mapHandler(this.createHandler(handlerMetadata), handlerMetadata);
35
+ });
20
36
  }
21
- /**
22
- * Create a native middleware based on the given metadata and return an instance of AnyToPromiseWithCtx
23
- * @param input
24
- * @param options
25
- */
26
- createHandler(input, options = {}) {
27
- return this.createRawHandler(createHandlerMetadata(this.injector, input, options));
37
+ createHandler(handlerMetadata) {
38
+ if (handlerMetadata.isInjectable()) {
39
+ const handler = this.platformParams.compileHandler(handlerMetadata);
40
+ return async ($ctx) => {
41
+ $ctx.handlerMetadata = handlerMetadata;
42
+ await catchAsyncError(() => this.onRequest(handler, $ctx));
43
+ return this.next($ctx);
44
+ };
45
+ }
46
+ return handlerMetadata.handler;
28
47
  }
29
48
  /**
30
- * Create injectable handler from the given provider
31
49
  * @param provider
32
50
  * @param propertyKey
33
51
  */
34
52
  createCustomHandler(provider, propertyKey) {
35
- const handler = this.compileHandler(new HandlerMetadata({
36
- token: provider.provide,
37
- target: provider.useClass,
38
- type: HandlerType.CUSTOM,
39
- scope: provider.scope,
53
+ const metadata = new PlatformHandlerMetadata({
54
+ provider,
55
+ type: PlatformHandlerType.CUSTOM,
40
56
  propertyKey
41
- }));
42
- return async ($ctx, next) => handler({
43
- $ctx,
44
- next
45
57
  });
58
+ const handler = this.platformParams.compileHandler(metadata.store);
59
+ return async ($ctx) => {
60
+ $ctx.handlerMetadata = metadata;
61
+ // @ts-ignore
62
+ return this.onRequest(handler, $ctx);
63
+ };
46
64
  }
47
65
  /**
48
66
  * Send the response to the consumer.
49
- * @param data
50
- * @param ctx
51
67
  * @protected
68
+ * @param $ctx
52
69
  */
53
- async flush(data, ctx) {
54
- const { response } = ctx;
55
- if (!response.isDone()) {
56
- data = await this.responseFilter.serialize(data, ctx);
57
- data = await this.responseFilter.transform(data, ctx);
70
+ async flush($ctx) {
71
+ const { response } = $ctx;
72
+ if (!$ctx.isDone()) {
73
+ let data = await this.responseFilter.serialize($ctx.data, $ctx);
74
+ data = await this.responseFilter.transform(data, $ctx);
58
75
  response.body(data);
59
76
  }
60
77
  }
61
- compileHandler(metadata) {
62
- if (metadata.type === HandlerType.CTX_FN) {
63
- return async (scope) => {
64
- // @ts-ignore
65
- return this.onCtxRequest({
66
- ...scope,
67
- handler: () => metadata.handler(scope.$ctx),
68
- metadata
69
- });
70
- };
78
+ /**
79
+ * @param $ctx
80
+ */
81
+ next($ctx) {
82
+ if (isStream($ctx.data) || $ctx.isDone()) {
83
+ return;
71
84
  }
72
- const promise = this.params.compileHandler({
73
- token: metadata.token,
74
- propertyKey: metadata.propertyKey,
75
- getCustomArgs: metadata.injectable ? undefined : this.getDefaultArgs(metadata)
76
- });
77
- return async (scope) => {
78
- const handler = await promise;
79
- // @ts-ignore
80
- return this.onRequest({
81
- ...scope,
82
- handler,
83
- metadata
84
- });
85
- };
86
- }
87
- async onCtxRequest(requestOptions) {
88
- await requestOptions.handler(requestOptions);
89
- return this.next(requestOptions);
85
+ return $ctx.error ? $ctx.next($ctx.error) : $ctx.next();
90
86
  }
91
87
  /**
92
88
  * Call handler when a request his handle
93
- * @param requestOptions
94
89
  */
95
- async onRequest(requestOptions) {
96
- const { $ctx, metadata, err, handler } = requestOptions;
97
- // istanbul ignore next
98
- if (!$ctx || $ctx.isDone()) {
90
+ async onRequest(handler, $ctx) {
91
+ if ($ctx.isDone()) {
99
92
  $log.error({
100
93
  name: "HEADERS_SENT",
101
- message: `An endpoint is called but the response is already send to the client. The call comes from the handler: ${metadata.toString()}`
94
+ message: `An endpoint is called but the response is already send to the client. The call comes from the handler: ${$ctx.handlerMetadata.toString()}`
102
95
  });
103
96
  return;
104
97
  }
105
- const resolver = new AnyToPromiseWithCtx({ $ctx, err });
106
- return this.injector.runInContext($ctx, async () => {
107
- try {
108
- const { state, data, status, headers } = await resolver.call(handler);
109
- if (state === AnyToPromiseStatus.RESOLVED) {
110
- if (status) {
111
- $ctx.response.status(status);
98
+ if (($ctx.error instanceof Error && !$ctx.handlerMetadata.hasErrorParam) || ($ctx.handlerMetadata.hasErrorParam && !$ctx.error)) {
99
+ return;
100
+ }
101
+ try {
102
+ const { handlerMetadata } = $ctx;
103
+ if (handlerMetadata.type === PlatformHandlerType.CTX_FN) {
104
+ return await handler({ $ctx });
105
+ }
106
+ const resolver = new AnyToPromiseWithCtx($ctx);
107
+ const { state, type, data, status, headers } = await resolver.call(handler);
108
+ // Note: restore previous handler metadata (for OIDC)
109
+ $ctx.handlerMetadata = handlerMetadata;
110
+ if (state === AnyToPromiseStatus.RESOLVED) {
111
+ if (status) {
112
+ $ctx.response.status(status);
113
+ }
114
+ if (headers) {
115
+ $ctx.response.setHeaders(headers);
116
+ }
117
+ if (data !== undefined) {
118
+ $ctx.data = data;
119
+ }
120
+ if (!$ctx.isDone()) {
121
+ $ctx.error = null;
122
+ // set headers each times that an endpoint is called
123
+ if (handlerMetadata.isEndpoint()) {
124
+ setResponseHeaders($ctx);
112
125
  }
113
- if (headers) {
114
- $ctx.response.setHeaders(headers);
126
+ // call returned middleware
127
+ if (isFunction($ctx.data) && !isStream($ctx.data)) {
128
+ return promisify($ctx.data)($ctx.getRequest(), $ctx.getResponse());
115
129
  }
116
- if (data !== undefined) {
117
- $ctx.data = data;
130
+ if (type === AnyToPromiseResponseTypes.STREAM) {
131
+ return this.flush($ctx);
118
132
  }
119
- // Can be canceled by the handler itself
120
- return await this.onSuccess($ctx.data, requestOptions);
121
133
  }
122
134
  }
123
- catch (er) {
124
- return this.onError(er, requestOptions);
125
- }
126
- });
127
- }
128
- async onError(er, requestOptions) {
129
- const { next, $ctx, metadata } = requestOptions;
130
- $ctx.data = er;
131
- if (!next) {
132
- throw er;
133
- }
134
- // istanbul ignore next
135
- if (!$ctx || ($ctx === null || $ctx === void 0 ? void 0 : $ctx.isDone())) {
136
- $log.warn({
137
- name: "HEADERS_SENT",
138
- message: `An error was caught after the headers were sent to the client. The error comes from the handler: ${metadata.toString()}`,
139
- stack: er.stack,
140
- origin: er,
141
- request_id: $ctx.id
142
- });
143
- return;
144
- }
145
- return next && next(er);
146
- }
147
- /**
148
- * Manage success scenario
149
- * @param data
150
- * @param requestOptions
151
- * @protected
152
- */
153
- async onSuccess(data, requestOptions) {
154
- const { metadata, $ctx, next } = requestOptions;
155
- // istanbul ignore next
156
- if ($ctx === null || $ctx === void 0 ? void 0 : $ctx.isDone()) {
157
- return;
158
- }
159
- // set headers each times that an endpoint is called
160
- if (metadata.type === HandlerType.ENDPOINT) {
161
- this.setHeaders($ctx);
162
- }
163
- // call returned middleware
164
- if (isFunction(data) && !isStream(data)) {
165
- return this.callReturnedMiddleware(data, $ctx, next);
166
- }
167
- if (metadata.isFinal()) {
168
- return this.flush(data, $ctx);
169
135
  }
170
- return this.next(requestOptions);
171
- }
172
- /**
173
- * Call the returned middleware by the handler.
174
- * @param middleware
175
- * @param ctx
176
- * @param next
177
- * @protected
178
- */
179
- callReturnedMiddleware(middleware, ctx, next) {
180
- return middleware(ctx.getRequest(), ctx.getResponse(), next);
181
- }
182
- /**
183
- * create Raw handler
184
- * @param metadata
185
- */
186
- createRawHandler(metadata) {
187
- if ([HandlerType.RAW_ERR_FN, HandlerType.RAW_FN].includes(metadata.type)) {
188
- return metadata.handler;
136
+ catch (error) {
137
+ $ctx.error = error;
138
+ throw error;
189
139
  }
190
- const handler = this.compileHandler(metadata);
191
- return async (request, response, next) => {
192
- return handler({
193
- next,
194
- $ctx: request.$ctx
195
- });
196
- };
197
- }
198
- /**
199
- * Set response headers
200
- * @param ctx
201
- * @protected
202
- */
203
- setHeaders(ctx) {
204
- return setResponseHeaders(ctx);
205
140
  }
206
- next(requestOptions) {
207
- const { $ctx, next } = requestOptions;
208
- return !$ctx.response.isDone() && next && next();
209
- }
210
- getDefaultArgs(metadata) {
211
- return async (scope) => [
212
- metadata.hasErrorParam && scope.err,
213
- scope.$ctx.request.request,
214
- scope.$ctx.response.response,
215
- metadata.hasNextFunction && scope.next
216
- ].filter(Boolean);
141
+ async onFinish($ctx) {
142
+ $ctx.error = await catchAsyncError(() => this.flush($ctx));
143
+ return $ctx.error && this.platformExceptions.catch($ctx.error, $ctx);
217
144
  }
218
145
  };
219
146
  __decorate([
220
147
  Inject(),
221
148
  __metadata("design:type", PlatformResponseFilter)
222
149
  ], PlatformHandler.prototype, "responseFilter", void 0);
150
+ __decorate([
151
+ Inject(),
152
+ __metadata("design:type", PlatformParams)
153
+ ], PlatformHandler.prototype, "platformParams", void 0);
154
+ __decorate([
155
+ Inject(),
156
+ __metadata("design:type", PlatformExceptions)
157
+ ], PlatformHandler.prototype, "platformExceptions", void 0);
158
+ __decorate([
159
+ Inject(),
160
+ __metadata("design:type", PlatformApplication)
161
+ ], PlatformHandler.prototype, "platformApplication", void 0);
162
+ __decorate([
163
+ Inject(),
164
+ __metadata("design:type", PlatformMiddlewaresChain)
165
+ ], PlatformHandler.prototype, "platformMiddlewaresChain", void 0);
223
166
  PlatformHandler = __decorate([
224
167
  Injectable({
225
168
  scope: ProviderScope.SINGLETON
226
169
  }),
227
- __metadata("design:paramtypes", [InjectorService, PlatformParams])
170
+ __metadata("design:paramtypes", [PlatformRouters])
228
171
  ], PlatformHandler);
229
172
  export { PlatformHandler };
230
173
  //# sourceMappingURL=PlatformHandler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlatformHandler.js","sourceRoot":"","sources":["../../../src/services/PlatformHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import {AnyToPromiseStatus, isFunction, isStream} from \"@tsed/core\";\nimport {Inject, Injectable, InjectorService, Provider, ProviderScope} from \"@tsed/di\";\nimport {$log} from \"@tsed/logger\";\nimport {ArgScope, HandlerWithScope, PlatformParams} from \"@tsed/platform-params\";\nimport {PlatformResponseFilter} from \"@tsed/platform-response-filter\";\nimport {AnyToPromiseWithCtx} from \"../domain/AnyToPromiseWithCtx\";\nimport {EndpointMetadata} from \"../domain/EndpointMetadata\";\nimport {HandlerMetadata} from \"../domain/HandlerMetadata\";\nimport {PlatformContext} from \"../domain/PlatformContext\";\nimport {HandlerType} from \"../interfaces/HandlerType\";\nimport {PlatformRouteWithoutHandlers} from \"../interfaces/PlatformRouteOptions\";\nimport {createHandlerMetadata} from \"../utils/createHandlerMetadata\";\nimport {setResponseHeaders} from \"../utils/setResponseHeaders\";\n\nexport interface OnRequestOptions {\n $ctx: PlatformContext;\n metadata: HandlerMetadata;\n handler: HandlerWithScope;\n next?: any;\n err?: any;\n\n [key: string]: any;\n}\n\n/**\n * Platform Handler abstraction layer. Wrap original class method to a pure platform handler (Express, Koa, etc...).\n * @platform\n */\n@Injectable({\n scope: ProviderScope.SINGLETON\n})\nexport class PlatformHandler {\n @Inject()\n protected responseFilter: PlatformResponseFilter;\n\n constructor(protected injector: InjectorService, protected params: PlatformParams) {}\n\n /**\n * Create a native middleware based on the given metadata and return an instance of AnyToPromiseWithCtx\n * @param input\n * @param options\n */\n createHandler(input: EndpointMetadata | HandlerMetadata | any, options: PlatformRouteWithoutHandlers = {}) {\n return this.createRawHandler(createHandlerMetadata(this.injector, input, options));\n }\n\n /**\n * Create injectable handler from the given provider\n * @param provider\n * @param propertyKey\n */\n createCustomHandler(provider: Provider, propertyKey: string) {\n const handler = this.compileHandler(\n new HandlerMetadata({\n token: provider.provide,\n target: provider.useClass,\n type: HandlerType.CUSTOM,\n scope: provider.scope,\n propertyKey\n })\n );\n\n return async ($ctx: PlatformContext, next?: any) =>\n handler({\n $ctx,\n next\n });\n }\n\n /**\n * Send the response to the consumer.\n * @param data\n * @param ctx\n * @protected\n */\n async flush(data: any, ctx: PlatformContext) {\n const {response} = ctx;\n\n if (!response.isDone()) {\n data = await this.responseFilter.serialize(data, ctx);\n data = await this.responseFilter.transform(data, ctx);\n response.body(data);\n }\n }\n\n compileHandler(metadata: HandlerMetadata) {\n if (metadata.type === HandlerType.CTX_FN) {\n return async (scope: Record<string, any>) => {\n // @ts-ignore\n return this.onCtxRequest({\n ...scope,\n handler: () => metadata.handler(scope.$ctx),\n metadata\n });\n };\n }\n\n const promise = this.params.compileHandler<PlatformContext>({\n token: metadata.token,\n propertyKey: metadata.propertyKey,\n getCustomArgs: metadata.injectable ? undefined : this.getDefaultArgs(metadata)\n });\n\n return async (scope: Record<string, any>) => {\n const handler = await promise;\n // @ts-ignore\n return this.onRequest({\n ...scope,\n handler,\n metadata\n });\n };\n }\n\n protected async onCtxRequest(requestOptions: OnRequestOptions): Promise<any> {\n await requestOptions.handler(requestOptions);\n\n return this.next(requestOptions);\n }\n\n /**\n * Call handler when a request his handle\n * @param requestOptions\n */\n protected async onRequest(requestOptions: OnRequestOptions): Promise<any> {\n const {$ctx, metadata, err, handler} = requestOptions;\n // istanbul ignore next\n if (!$ctx || $ctx.isDone()) {\n $log.error({\n name: \"HEADERS_SENT\",\n message: `An endpoint is called but the response is already send to the client. The call comes from the handler: ${metadata.toString()}`\n });\n return;\n }\n\n const resolver = new AnyToPromiseWithCtx({$ctx, err});\n\n return this.injector.runInContext($ctx, async () => {\n try {\n const {state, data, status, headers} = await resolver.call(handler);\n\n if (state === AnyToPromiseStatus.RESOLVED) {\n if (status) {\n $ctx.response.status(status);\n }\n\n if (headers) {\n $ctx.response.setHeaders(headers);\n }\n\n if (data !== undefined) {\n $ctx.data = data;\n }\n\n // Can be canceled by the handler itself\n return await this.onSuccess($ctx.data, requestOptions);\n }\n } catch (er) {\n return this.onError(er, requestOptions);\n }\n });\n }\n\n protected async onError(er: Error, requestOptions: OnRequestOptions) {\n const {next, $ctx, metadata} = requestOptions;\n $ctx.data = er;\n\n if (!next) {\n throw er;\n }\n\n // istanbul ignore next\n if (!$ctx || $ctx?.isDone()) {\n $log.warn({\n name: \"HEADERS_SENT\",\n message: `An error was caught after the headers were sent to the client. The error comes from the handler: ${metadata.toString()}`,\n stack: er.stack,\n origin: er,\n request_id: $ctx.id\n });\n\n return;\n }\n\n return next && next(er);\n }\n\n /**\n * Manage success scenario\n * @param data\n * @param requestOptions\n * @protected\n */\n protected async onSuccess(data: any, requestOptions: OnRequestOptions) {\n const {metadata, $ctx, next} = requestOptions;\n\n // istanbul ignore next\n if ($ctx?.isDone()) {\n return;\n }\n\n // set headers each times that an endpoint is called\n if (metadata.type === HandlerType.ENDPOINT) {\n this.setHeaders($ctx);\n }\n\n // call returned middleware\n if (isFunction(data) && !isStream(data)) {\n return this.callReturnedMiddleware(data, $ctx, next);\n }\n\n if (metadata.isFinal()) {\n return this.flush(data, $ctx);\n }\n\n return this.next(requestOptions);\n }\n\n /**\n * Call the returned middleware by the handler.\n * @param middleware\n * @param ctx\n * @param next\n * @protected\n */\n protected callReturnedMiddleware(middleware: any, ctx: PlatformContext, next: any) {\n return middleware(ctx.getRequest(), ctx.getResponse(), next);\n }\n\n /**\n * create Raw handler\n * @param metadata\n */\n protected createRawHandler(metadata: HandlerMetadata) {\n if ([HandlerType.RAW_ERR_FN, HandlerType.RAW_FN].includes(metadata.type)) {\n return metadata.handler;\n }\n\n const handler = this.compileHandler(metadata);\n\n return async (request: any, response: any, next: any) => {\n return handler({\n next,\n $ctx: request.$ctx\n });\n };\n }\n\n /**\n * Set response headers\n * @param ctx\n * @protected\n */\n protected setHeaders(ctx: PlatformContext) {\n return setResponseHeaders(ctx);\n }\n\n protected next(requestOptions: OnRequestOptions) {\n const {$ctx, next} = requestOptions;\n\n return !$ctx.response.isDone() && next && next();\n }\n\n protected getDefaultArgs(metadata: HandlerMetadata) {\n return async (scope: ArgScope<PlatformContext>) =>\n [\n metadata.hasErrorParam && scope.err,\n scope.$ctx.request.request,\n scope.$ctx.response.response,\n metadata.hasNextFunction && scope.next\n ].filter(Boolean);\n }\n}\n"]}
1
+ {"version":3,"file":"PlatformHandler.js","sourceRoot":"","sources":["../../../src/services/PlatformHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import {AnyToPromiseResponseTypes, AnyToPromiseStatus, catchAsyncError, isFunction, isStream} from \"@tsed/core\";\nimport {Inject, Injectable, Provider, ProviderScope} from \"@tsed/di\";\nimport {$log} from \"@tsed/logger\";\nimport {PlatformExceptions} from \"@tsed/platform-exceptions\";\nimport {PlatformParams, PlatformParamsCallback} from \"@tsed/platform-params\";\nimport {PlatformResponseFilter} from \"@tsed/platform-response-filter\";\nimport {PlatformHandlerMetadata, PlatformHandlerType, PlatformRouters, useResponseHandler} from \"@tsed/platform-router\";\nimport {JsonOperationRoute} from \"@tsed/schema\";\nimport {promisify} from \"util\";\nimport {AnyToPromiseWithCtx} from \"../domain/AnyToPromiseWithCtx\";\nimport {PlatformContext} from \"../domain/PlatformContext\";\nimport {setResponseHeaders} from \"../utils/setResponseHeaders\";\nimport {PlatformApplication} from \"./PlatformApplication\";\nimport {PlatformMiddlewaresChain} from \"./PlatformMiddlewaresChain\";\n\n/**\n * Platform Handler abstraction layer. Wrap original class method to a pure platform handler (Express, Koa, etc...).\n * @platform\n */\n@Injectable({\n scope: ProviderScope.SINGLETON\n})\nexport class PlatformHandler {\n @Inject()\n protected responseFilter: PlatformResponseFilter;\n\n @Inject()\n protected platformParams: PlatformParams;\n\n @Inject()\n protected platformExceptions: PlatformExceptions;\n\n @Inject()\n protected platformApplication: PlatformApplication;\n\n @Inject()\n protected platformMiddlewaresChain: PlatformMiddlewaresChain;\n\n constructor(protected platformRouters: PlatformRouters) {\n // configure the router module\n platformRouters.hooks\n .on(\"alterEndpointHandlers\", (allMiddlewares: any[], operationRoute: JsonOperationRoute) => {\n allMiddlewares = this.platformMiddlewaresChain.get(allMiddlewares, operationRoute);\n\n return [...allMiddlewares, useResponseHandler(this.onFinish.bind(this))];\n })\n .on(\"alterHandler\", (handlerMetadata: PlatformHandlerMetadata) => {\n return this.platformApplication.adapter.mapHandler(this.createHandler(handlerMetadata), handlerMetadata);\n });\n }\n\n createHandler(handlerMetadata: PlatformHandlerMetadata): any {\n if (handlerMetadata.isInjectable()) {\n const handler = this.platformParams.compileHandler(handlerMetadata);\n\n return async ($ctx: PlatformContext) => {\n $ctx.handlerMetadata = handlerMetadata;\n\n await catchAsyncError(() => this.onRequest(handler, $ctx));\n\n return this.next($ctx);\n };\n }\n\n return handlerMetadata.handler;\n }\n\n /**\n * @param provider\n * @param propertyKey\n */\n createCustomHandler(provider: Provider, propertyKey: string) {\n const metadata = new PlatformHandlerMetadata({\n provider,\n type: PlatformHandlerType.CUSTOM,\n propertyKey\n });\n\n const handler = this.platformParams.compileHandler(metadata.store);\n\n return async ($ctx: PlatformContext) => {\n $ctx.handlerMetadata = metadata;\n\n // @ts-ignore\n return this.onRequest(handler, $ctx);\n };\n }\n\n /**\n * Send the response to the consumer.\n * @protected\n * @param $ctx\n */\n async flush($ctx: PlatformContext) {\n const {response} = $ctx;\n\n if (!$ctx.isDone()) {\n let data = await this.responseFilter.serialize($ctx.data, $ctx as any);\n data = await this.responseFilter.transform(data, $ctx as any);\n response.body(data);\n }\n }\n\n /**\n * @param $ctx\n */\n next($ctx: PlatformContext) {\n if (isStream($ctx.data) || $ctx.isDone()) {\n return;\n }\n\n return $ctx.error ? $ctx.next($ctx.error) : $ctx.next();\n }\n\n /**\n * Call handler when a request his handle\n */\n async onRequest(handler: PlatformParamsCallback, $ctx: PlatformContext): Promise<any> {\n if ($ctx.isDone()) {\n $log.error({\n name: \"HEADERS_SENT\",\n message: `An endpoint is called but the response is already send to the client. The call comes from the handler: ${$ctx.handlerMetadata.toString()}`\n });\n return;\n }\n\n if (($ctx.error instanceof Error && !$ctx.handlerMetadata.hasErrorParam) || ($ctx.handlerMetadata.hasErrorParam && !$ctx.error)) {\n return;\n }\n\n try {\n const {handlerMetadata} = $ctx;\n\n if (handlerMetadata.type === PlatformHandlerType.CTX_FN) {\n return await handler({$ctx});\n }\n\n const resolver = new AnyToPromiseWithCtx($ctx);\n\n const {state, type, data, status, headers} = await resolver.call(handler);\n\n // Note: restore previous handler metadata (for OIDC)\n $ctx.handlerMetadata = handlerMetadata;\n\n if (state === AnyToPromiseStatus.RESOLVED) {\n if (status) {\n $ctx.response.status(status);\n }\n\n if (headers) {\n $ctx.response.setHeaders(headers);\n }\n\n if (data !== undefined) {\n $ctx.data = data;\n }\n\n if (!$ctx.isDone()) {\n $ctx.error = null;\n\n // set headers each times that an endpoint is called\n if (handlerMetadata.isEndpoint()) {\n setResponseHeaders($ctx);\n }\n\n // call returned middleware\n if (isFunction($ctx.data) && !isStream($ctx.data)) {\n return promisify($ctx.data)($ctx.getRequest(), $ctx.getResponse());\n }\n\n if (type === AnyToPromiseResponseTypes.STREAM) {\n return this.flush($ctx);\n }\n }\n }\n } catch (error) {\n $ctx.error = error;\n\n throw error;\n }\n }\n\n async onFinish($ctx: PlatformContext) {\n $ctx.error = await catchAsyncError(() => this.flush($ctx));\n\n return $ctx.error && this.platformExceptions.catch($ctx.error, $ctx);\n }\n}\n"]}
@@ -1,29 +1,56 @@
1
- import { __decorate } from "tslib";
2
- import { Injectable } from "@tsed/di";
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { isClass } from "@tsed/core";
3
+ import { Constant, Inject, Injectable } from "@tsed/di";
3
4
  import { ParamTypes } from "@tsed/platform-params";
4
- import { bindEndpointMiddleware } from "../middlewares/bindEndpointMiddleware";
5
- import { PlatformAcceptMimesMiddleware } from "../middlewares/PlatformAcceptMimesMiddleware";
6
- import { PlatformMulterMiddleware } from "../middlewares/PlatformMulterMiddleware";
7
- import { useCtxHandler } from "../utils/useCtxHandler";
5
+ import { JsonEntityStore } from "@tsed/schema";
6
+ import { PlatformAcceptMimesMiddleware } from "../middlewares/PlatformAcceptMimesMiddleware.js";
7
+ import { PlatformMulterMiddleware } from "../middlewares/PlatformMulterMiddleware.js";
8
+ import { PlatformAdapter } from "../services/PlatformAdapter.js";
8
9
  let PlatformMiddlewaresChain = class PlatformMiddlewaresChain {
9
- get(provider, operationRoute) {
10
- const { endpoint } = operationRoute;
11
- const { beforeMiddlewares, middlewares: mldwrs, afterMiddlewares } = endpoint;
12
- const { middlewares: { use, useAfter } } = provider;
13
- const hasFiles = [...operationRoute.endpoint.children.values()].find((item) => item.paramType === ParamTypes.FILES);
14
- return []
15
- .concat(useCtxHandler(bindEndpointMiddleware(endpoint)))
16
- .concat(PlatformAcceptMimesMiddleware)
17
- .concat(hasFiles && PlatformMulterMiddleware)
18
- .concat(beforeMiddlewares) // Endpoint before-middlewares
19
- .concat(use) // Controller use-middlewares
20
- .concat(mldwrs) // Endpoint middlewares
21
- .concat(endpoint) // Endpoint metadata
22
- .concat(afterMiddlewares) // Endpoint after-middlewares
23
- .concat(useAfter) // Controller after middlewares (equivalent to afterEach)
24
- .filter((item) => !!item);
10
+ acceptMimes;
11
+ adapter;
12
+ get(allMiddlewares, operationRoute) {
13
+ const { ACCEPT_MIMES, FILE, RAW_BODY, BODY } = this.getParamTypes(allMiddlewares, operationRoute);
14
+ return [
15
+ ACCEPT_MIMES && PlatformAcceptMimesMiddleware,
16
+ FILE && PlatformMulterMiddleware,
17
+ !FILE && RAW_BODY && this.adapter.bodyParser("raw"),
18
+ !FILE && !RAW_BODY && BODY && this.adapter.bodyParser("json"),
19
+ !FILE && !RAW_BODY && BODY && this.adapter.bodyParser("urlencoded"),
20
+ ...allMiddlewares
21
+ ].filter(Boolean);
22
+ }
23
+ hasAcceptMimes(operationRoute) {
24
+ return operationRoute.endpoint.acceptMimes.length || this.acceptMimes.length;
25
+ }
26
+ getParamTypes(middlewares, operationRoute) {
27
+ return middlewares.filter(isClass).reduce((paramTypes, token) => {
28
+ if (token !== operationRoute.endpoint) {
29
+ const entity = JsonEntityStore.fromMethod(token, "use");
30
+ if (entity.decoratorType === "method") {
31
+ const { FILE, RAW_BODY, BODY } = entity.getParamTypes();
32
+ paramTypes.FILE = paramTypes.FILE || FILE;
33
+ paramTypes.RAW_BODY = paramTypes.RAW_BODY || RAW_BODY;
34
+ paramTypes.BODY = paramTypes.BODY || BODY;
35
+ }
36
+ }
37
+ return paramTypes;
38
+ }, {
39
+ ACCEPT_MIMES: this.hasAcceptMimes(operationRoute),
40
+ FILE: operationRoute.has(ParamTypes.FILES),
41
+ RAW_BODY: operationRoute.has(ParamTypes.RAW_BODY),
42
+ BODY: operationRoute.has(ParamTypes.BODY) || operationRoute.method === "ALL"
43
+ });
25
44
  }
26
45
  };
46
+ __decorate([
47
+ Constant("acceptMimes", []),
48
+ __metadata("design:type", Array)
49
+ ], PlatformMiddlewaresChain.prototype, "acceptMimes", void 0);
50
+ __decorate([
51
+ Inject(),
52
+ __metadata("design:type", PlatformAdapter)
53
+ ], PlatformMiddlewaresChain.prototype, "adapter", void 0);
27
54
  PlatformMiddlewaresChain = __decorate([
28
55
  Injectable()
29
56
  ], PlatformMiddlewaresChain);
@@ -1 +1 @@
1
- {"version":3,"file":"PlatformMiddlewaresChain.js","sourceRoot":"","sources":["../../../src/services/PlatformMiddlewaresChain.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,UAAU,CAAC;AACpC,OAAO,EAAgB,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAIhE,OAAO,EAAC,sBAAsB,EAAC,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAC,6BAA6B,EAAC,MAAM,8CAA8C,CAAC;AAC3F,OAAO,EAAC,wBAAwB,EAAC,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAC,aAAa,EAAC,MAAM,wBAAwB,CAAC;AAGrD,IAAa,wBAAwB,GAArC,MAAa,wBAAwB;IACnC,GAAG,CAAC,QAA4B,EAAE,cAAoD;QACpF,MAAM,EAAC,QAAQ,EAAC,GAAG,cAAc,CAAC;QAClC,MAAM,EAAC,iBAAiB,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAC,GAAG,QAAQ,CAAC;QAE5E,MAAM,EACJ,WAAW,EAAE,EAAC,GAAG,EAAE,QAAQ,EAAC,EAC7B,GAAG,QAAQ,CAAC;QAEb,MAAM,QAAQ,GAAG,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAmB,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,UAAU,CAAC,KAAK,CAAC,CAAC;QAEnI,OAAQ,EAAY;aACjB,MAAM,CAAC,aAAa,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC;aACvD,MAAM,CAAC,6BAA6B,CAAC;aACrC,MAAM,CAAC,QAAQ,IAAI,wBAAwB,CAAC;aAC5C,MAAM,CAAC,iBAAiB,CAAC,CAAC,8BAA8B;aACxD,MAAM,CAAC,GAAG,CAAC,CAAC,6BAA6B;aACzC,MAAM,CAAC,MAAM,CAAC,CAAC,uBAAuB;aACtC,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB;aACrC,MAAM,CAAC,gBAAgB,CAAC,CAAC,6BAA6B;aACtD,MAAM,CAAC,QAAQ,CAAC,CAAC,yDAAyD;aAC1E,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;CACF,CAAA;AAvBY,wBAAwB;IADpC,UAAU,EAAE;GACA,wBAAwB,CAuBpC;SAvBY,wBAAwB","sourcesContent":["import {Injectable} from \"@tsed/di\";\nimport {ParamMetadata, ParamTypes} from \"@tsed/platform-params\";\nimport {JsonOperationRoute} from \"@tsed/schema\";\nimport {ControllerProvider} from \"../domain/ControllerProvider\";\nimport {EndpointMetadata} from \"../domain/EndpointMetadata\";\nimport {bindEndpointMiddleware} from \"../middlewares/bindEndpointMiddleware\";\nimport {PlatformAcceptMimesMiddleware} from \"../middlewares/PlatformAcceptMimesMiddleware\";\nimport {PlatformMulterMiddleware} from \"../middlewares/PlatformMulterMiddleware\";\nimport {useCtxHandler} from \"../utils/useCtxHandler\";\n\n@Injectable()\nexport class PlatformMiddlewaresChain {\n get(provider: ControllerProvider, operationRoute: JsonOperationRoute<EndpointMetadata>) {\n const {endpoint} = operationRoute;\n const {beforeMiddlewares, middlewares: mldwrs, afterMiddlewares} = endpoint;\n\n const {\n middlewares: {use, useAfter}\n } = provider;\n\n const hasFiles = [...operationRoute.endpoint.children.values()].find((item: ParamMetadata) => item.paramType === ParamTypes.FILES);\n\n return ([] as any[])\n .concat(useCtxHandler(bindEndpointMiddleware(endpoint)))\n .concat(PlatformAcceptMimesMiddleware)\n .concat(hasFiles && PlatformMulterMiddleware)\n .concat(beforeMiddlewares) // Endpoint before-middlewares\n .concat(use) // Controller use-middlewares\n .concat(mldwrs) // Endpoint middlewares\n .concat(endpoint) // Endpoint metadata\n .concat(afterMiddlewares) // Endpoint after-middlewares\n .concat(useAfter) // Controller after middlewares (equivalent to afterEach)\n .filter((item: any) => !!item);\n }\n}\n"]}
1
+ {"version":3,"file":"PlatformMiddlewaresChain.js","sourceRoot":"","sources":["../../../src/services/PlatformMiddlewaresChain.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAC;AACnC,OAAO,EAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAC,MAAM,UAAU,CAAC;AACtD,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAC,eAAe,EAAqB,MAAM,cAAc,CAAC;AACjE,OAAO,EAAC,6BAA6B,EAAC,MAAM,8CAA8C,CAAC;AAC3F,OAAO,EAAC,wBAAwB,EAAC,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAC,eAAe,EAAC,MAAM,6BAA6B,CAAC;AAG5D,IAAa,wBAAwB,GAArC,MAAa,wBAAwB;IAEzB,WAAW,CAAW;IAGtB,OAAO,CAAkB;IAEnC,GAAG,CAAC,cAAqB,EAAE,cAAkC;QAC3D,MAAM,EAAC,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QAEhG,OAAO;YACL,YAAY,IAAI,6BAA6B;YAC7C,IAAI,IAAI,wBAAwB;YAChC,CAAC,IAAI,IAAI,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;YACnD,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;YAC7D,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC;YACnE,GAAG,cAAc;SAClB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC;IAES,cAAc,CAAC,cAAkC;QACzD,OAAO,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;IAC/E,CAAC;IAES,aAAa,CAAC,WAAkB,EAAE,cAAkC;QAC5E,OAAO,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CACvC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE;YACpB,IAAI,KAAK,KAAK,cAAc,CAAC,QAAQ,EAAE;gBACrC,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBAExD,IAAI,MAAM,CAAC,aAAa,KAAK,QAAQ,EAAE;oBACrC,MAAM,EAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAC,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;oBACtD,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,IAAI,IAAI,CAAC;oBAC1C,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,QAAQ,CAAC;oBACtD,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,IAAI,IAAI,CAAC;iBAC3C;aACF;YAED,OAAO,UAAU,CAAC;QACpB,CAAC,EACD;YACE,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC;YACjD,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;YAC1C,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;YACjD,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,KAAK;SAC7E,CACF,CAAC;IACJ,CAAC;CACF,CAAA;AA9CC;IADC,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC;;6DACI;AAGhC;IADC,MAAM,EAAE;8BACU,eAAe;yDAAC;AALxB,wBAAwB;IADpC,UAAU,EAAE;GACA,wBAAwB,CAgDpC;SAhDY,wBAAwB","sourcesContent":["import {isClass} from \"@tsed/core\";\nimport {Constant, Inject, Injectable} from \"@tsed/di\";\nimport {ParamTypes} from \"@tsed/platform-params\";\nimport {JsonEntityStore, JsonOperationRoute} from \"@tsed/schema\";\nimport {PlatformAcceptMimesMiddleware} from \"../middlewares/PlatformAcceptMimesMiddleware\";\nimport {PlatformMulterMiddleware} from \"../middlewares/PlatformMulterMiddleware\";\nimport {PlatformAdapter} from \"../services/PlatformAdapter\";\n\n@Injectable()\nexport class PlatformMiddlewaresChain {\n @Constant(\"acceptMimes\", [])\n protected acceptMimes: string[];\n\n @Inject()\n protected adapter: PlatformAdapter;\n\n get(allMiddlewares: any[], operationRoute: JsonOperationRoute) {\n const {ACCEPT_MIMES, FILE, RAW_BODY, BODY} = this.getParamTypes(allMiddlewares, operationRoute);\n\n return [\n ACCEPT_MIMES && PlatformAcceptMimesMiddleware,\n FILE && PlatformMulterMiddleware,\n !FILE && RAW_BODY && this.adapter.bodyParser(\"raw\"),\n !FILE && !RAW_BODY && BODY && this.adapter.bodyParser(\"json\"),\n !FILE && !RAW_BODY && BODY && this.adapter.bodyParser(\"urlencoded\"),\n ...allMiddlewares\n ].filter(Boolean);\n }\n\n protected hasAcceptMimes(operationRoute: JsonOperationRoute) {\n return operationRoute.endpoint.acceptMimes.length || this.acceptMimes.length;\n }\n\n protected getParamTypes(middlewares: any[], operationRoute: JsonOperationRoute) {\n return middlewares.filter(isClass).reduce(\n (paramTypes, token) => {\n if (token !== operationRoute.endpoint) {\n const entity = JsonEntityStore.fromMethod(token, \"use\");\n\n if (entity.decoratorType === \"method\") {\n const {FILE, RAW_BODY, BODY} = entity.getParamTypes();\n paramTypes.FILE = paramTypes.FILE || FILE;\n paramTypes.RAW_BODY = paramTypes.RAW_BODY || RAW_BODY;\n paramTypes.BODY = paramTypes.BODY || BODY;\n }\n }\n\n return paramTypes;\n },\n {\n ACCEPT_MIMES: this.hasAcceptMimes(operationRoute),\n FILE: operationRoute.has(ParamTypes.FILES),\n RAW_BODY: operationRoute.has(ParamTypes.RAW_BODY),\n BODY: operationRoute.has(ParamTypes.BODY) || operationRoute.method === \"ALL\"\n }\n );\n }\n}\n"]}
@@ -5,9 +5,18 @@ import { Injectable, ProviderScope, Scope } from "@tsed/di";
5
5
  * @platform
6
6
  */
7
7
  let PlatformRequest = class PlatformRequest {
8
- constructor({ request }, $ctx) {
8
+ $ctx;
9
+ constructor($ctx) {
9
10
  this.$ctx = $ctx;
10
- this.raw = request;
11
+ }
12
+ /**
13
+ * The current @@PlatformResponse@@.
14
+ */
15
+ get response() {
16
+ return this.$ctx.response;
17
+ }
18
+ get raw() {
19
+ return this.$ctx.event.request;
11
20
  }
12
21
  get secure() {
13
22
  return this.raw.secure;
@@ -74,6 +83,9 @@ let PlatformRequest = class PlatformRequest {
74
83
  get files() {
75
84
  return this.raw.files;
76
85
  }
86
+ get route() {
87
+ return this.$ctx.handlerMetadata?.path;
88
+ }
77
89
  /**
78
90
  * Return the original request framework instance
79
91
  */
@@ -105,14 +117,6 @@ let PlatformRequest = class PlatformRequest {
105
117
  isAborted() {
106
118
  return this.raw.aborted;
107
119
  }
108
- destroy() {
109
- // @ts-ignore
110
- delete this.raw;
111
- // @ts-ignore
112
- delete this.response;
113
- // @ts-ignore
114
- delete this.$ctx;
115
- }
116
120
  /**
117
121
  * Return the Framework response object (express, koa, etc...)
118
122
  */
@@ -123,13 +127,13 @@ let PlatformRequest = class PlatformRequest {
123
127
  * Return the Node.js response object
124
128
  */
125
129
  getReq() {
126
- return this.raw;
130
+ return this.$ctx.event.request;
127
131
  }
128
132
  };
129
133
  PlatformRequest = __decorate([
130
134
  Injectable(),
131
135
  Scope(ProviderScope.INSTANCE),
132
- __metadata("design:paramtypes", [Object, Function])
136
+ __metadata("design:paramtypes", [Function])
133
137
  ], PlatformRequest);
134
138
  export { PlatformRequest };
135
139
  //# sourceMappingURL=PlatformRequest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlatformRequest.js","sourceRoot":"","sources":["../../../src/services/PlatformRequest.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,UAAU,EAAE,aAAa,EAAE,KAAK,EAAC,MAAM,UAAU,CAAC;AAgB1D;;;GAGG;AAGH,IAAa,eAAe,GAA5B,MAAa,eAAe;IAQ1B,YAAY,EAAC,OAAO,EAAgB,EAAY,IAAqB;QAArB,SAAI,GAAJ,IAAI,CAAiB;QACnE,IAAI,CAAC,GAAG,GAAG,OAAc,CAAC;IAC5B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;IACzB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC9C,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,GAAG,CAAC,OAAc,CAAC;IACjC,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;IAED;;;;;;;;OAQG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAaD,OAAO,CAAC,IAAwB;QAC9B,aAAa;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,OAAO;QACL,aAAa;QACb,OAAO,IAAI,CAAC,GAAG,CAAC;QAChB,aAAa;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC;QACrB,aAAa;QACb,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,GAAU,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,GAAU,CAAC;IACzB,CAAC;CACF,CAAA;AA/JY,eAAe;IAF3B,UAAU,EAAE;IACZ,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC;;GACjB,eAAe,CA+J3B;SA/JY,eAAe","sourcesContent":["import {Injectable, ProviderScope, Scope} from \"@tsed/di\";\nimport {IncomingHttpHeaders, IncomingMessage} from \"http\";\nimport type {PlatformContext} from \"../domain/PlatformContext\";\nimport {IncomingEvent} from \"../interfaces/IncomingEvent\";\nimport type {PlatformResponse} from \"./PlatformResponse\";\n\ndeclare global {\n namespace TsED {\n // @ts-ignore\n export interface Request {\n id: string;\n $ctx: PlatformContext;\n }\n }\n}\n\n/**\n * Platform Request abstraction layer.\n * @platform\n */\n@Injectable()\n@Scope(ProviderScope.INSTANCE)\nexport class PlatformRequest<T extends {[key: string]: any} = any> {\n public raw: T;\n\n /**\n * The current @@PlatformResponse@@.\n */\n public response: PlatformResponse;\n\n constructor({request}: IncomingEvent, protected $ctx: PlatformContext) {\n this.raw = request as any;\n }\n\n get secure(): boolean {\n return this.raw.secure;\n }\n\n get host(): string {\n return this.get(\"host\");\n }\n\n get protocol(): string {\n return this.raw.protocol;\n }\n\n /**\n * Get the url of the request.\n *\n * Is equivalent of `express.response.originalUrl || express.response.url`.\n */\n get url(): string {\n return this.raw.originalUrl || this.raw.url;\n }\n\n get headers(): IncomingHttpHeaders {\n return this.raw.headers;\n }\n\n get method(): string {\n return this.raw.method;\n }\n\n /**\n * Contains key-value pairs of data submitted in the request body. By default, it is `undefined`, and is populated when you use\n * `body-parsing` middleware such as `express.json()` or `express.urlencoded()`.\n */\n get body(): any {\n return this.raw.body;\n }\n\n get rawBody(): any {\n return this.raw.rawBody || this.raw.body;\n }\n\n /**\n * When using `cookie-parser` middleware, this property is an object that contains cookies sent by the request.\n * If the request contains no cookies, it defaults to `{}`.\n */\n get cookies(): {[key: string]: any} {\n return this.raw.cookies;\n }\n\n /**\n * This property is an object containing properties mapped to the named route `parameters`.\n * For example, if you have the route `/user/:name`, then the `name` property is available as `req.params.name`.\n * This object defaults to `{}`.\n */\n get params(): {[key: string]: any} {\n return this.raw.params;\n }\n\n /**\n * This property is an object containing a property for each query string parameter in the route.\n * When query parser is set to disabled, it is an empty object `{}`, otherwise it is the result of the configured query parser.\n */\n get query(): {[key: string]: any} {\n return this.raw.query;\n }\n\n /**\n * This property is an object containing a property for each session attributes set by any code.\n * It require to install a middleware like express-session to work.\n */\n get session(): {[key: string]: any} {\n return this.raw.session as any;\n }\n\n get files() {\n return this.raw.files;\n }\n\n /**\n * Return the original request framework instance\n */\n get request() {\n return this.getRequest();\n }\n\n /**\n * Return the original request node.js instance\n */\n get req() {\n return this.getReq();\n }\n\n /**\n * Returns the HTTP request header specified by field. The match is case-insensitive.\n *\n * ```typescript\n * request.get('Content-Type') // => \"text/plain\"\n * ```\n *\n * @param name\n */\n get(name: string) {\n return this.raw.get(name);\n }\n\n /**\n * Checks if the specified content types are acceptable, based on the request’s Accept HTTP header field. The method returns the best match, or if none of the specified content types is acceptable, returns false (in which case, the application should respond with 406 \"Not Acceptable\").\n *\n * The type value may be a single MIME type string (such as “application/json”), an extension name such as “json”, a comma-delimited list, or an array. For a list or array, the method returns the best match (if any).\n *\n * @param mime\n */\n accepts(mime: string): string | false;\n\n accepts(mime: string[]): string[] | false;\n\n accepts(mime?: string | string[]): string | string[] | false {\n // @ts-ignore\n return this.raw.accepts(mime);\n }\n\n isAborted() {\n return this.raw.aborted;\n }\n\n destroy() {\n // @ts-ignore\n delete this.raw;\n // @ts-ignore\n delete this.response;\n // @ts-ignore\n delete this.$ctx;\n }\n\n /**\n * Return the Framework response object (express, koa, etc...)\n */\n getRequest<Req = T>(): Req {\n return this.raw as any;\n }\n\n /**\n * Return the Node.js response object\n */\n getReq(): IncomingMessage {\n return this.raw as any;\n }\n}\n"]}
1
+ {"version":3,"file":"PlatformRequest.js","sourceRoot":"","sources":["../../../src/services/PlatformRequest.ts"],"names":[],"mappings":"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","sourcesContent":["import {Injectable, ProviderScope, Scope} from \"@tsed/di\";\nimport {IncomingHttpHeaders, IncomingMessage} from \"http\";\nimport type {PlatformContext} from \"../domain/PlatformContext\";\nimport type {PlatformResponse} from \"./PlatformResponse\";\n\ndeclare global {\n namespace TsED {\n // @ts-ignore\n export interface Request {\n id: string;\n }\n }\n}\n\n/**\n * Platform Request abstraction layer.\n * @platform\n */\n@Injectable()\n@Scope(ProviderScope.INSTANCE)\nexport class PlatformRequest<Req extends {[key: string]: any} = any> {\n constructor(readonly $ctx: PlatformContext) {}\n\n /**\n * The current @@PlatformResponse@@.\n */\n get response(): PlatformResponse {\n return this.$ctx.response;\n }\n\n get raw(): Req {\n return this.$ctx.event.request as any;\n }\n\n get secure(): boolean {\n return this.raw.secure;\n }\n\n get host(): string {\n return this.get(\"host\");\n }\n\n get protocol(): string {\n return this.raw.protocol;\n }\n\n /**\n * Get the url of the request.\n *\n * Is equivalent of `express.response.originalUrl || express.response.url`.\n */\n get url(): string {\n return this.raw.originalUrl || this.raw.url;\n }\n\n get headers(): IncomingHttpHeaders {\n return this.raw.headers;\n }\n\n get method(): string {\n return this.raw.method;\n }\n\n /**\n * Contains key-value pairs of data submitted in the request body. By default, it is `undefined`, and is populated when you use\n * `body-parsing` middleware such as `express.json()` or `express.urlencoded()`.\n */\n get body(): any {\n return this.raw.body;\n }\n\n get rawBody(): any {\n return this.raw.rawBody || this.raw.body;\n }\n\n /**\n * When using `cookie-parser` middleware, this property is an object that contains cookies sent by the request.\n * If the request contains no cookies, it defaults to `{}`.\n */\n get cookies(): {[key: string]: any} {\n return this.raw.cookies;\n }\n\n /**\n * This property is an object containing properties mapped to the named route `parameters`.\n * For example, if you have the route `/user/:name`, then the `name` property is available as `req.params.name`.\n * This object defaults to `{}`.\n */\n get params(): {[key: string]: any} {\n return this.raw.params;\n }\n\n /**\n * This property is an object containing a property for each query string parameter in the route.\n * When query parser is set to disabled, it is an empty object `{}`, otherwise it is the result of the configured query parser.\n */\n get query(): {[key: string]: any} {\n return this.raw.query;\n }\n\n /**\n * This property is an object containing a property for each session attributes set by any code.\n * It require to install a middleware like express-session to work.\n */\n get session(): {[key: string]: any} {\n return this.raw.session as any;\n }\n\n get files() {\n return this.raw.files;\n }\n\n get route() {\n return this.$ctx.handlerMetadata?.path;\n }\n\n /**\n * Return the original request framework instance\n */\n get request() {\n return this.getRequest();\n }\n\n /**\n * Return the original request node.js instance\n */\n get req() {\n return this.getReq();\n }\n\n /**\n * Returns the HTTP request header specified by field. The match is case-insensitive.\n *\n * ```typescript\n * request.get('Content-Type') // => \"text/plain\"\n * ```\n *\n * @param name\n */\n get(name: string) {\n return this.raw.get(name);\n }\n\n /**\n * Checks if the specified content types are acceptable, based on the request’s Accept HTTP header field. The method returns the best match, or if none of the specified content types is acceptable, returns false (in which case, the application should respond with 406 \"Not Acceptable\").\n *\n * The type value may be a single MIME type string (such as “application/json”), an extension name such as “json”, a comma-delimited list, or an array. For a list or array, the method returns the best match (if any).\n *\n * @param mime\n */\n accepts(mime: string): string | false;\n\n accepts(mime: string[]): string[] | false;\n\n accepts(mime?: string | string[]): string | string[] | false {\n // @ts-ignore\n return this.raw.accepts(mime);\n }\n\n isAborted() {\n return this.raw.aborted;\n }\n\n /**\n * Return the Framework response object (express, koa, etc...)\n */\n getRequest<R = Req>(): R {\n return this.raw as any;\n }\n\n /**\n * Return the Node.js response object\n */\n getReq(): IncomingMessage {\n return this.$ctx.event.request;\n }\n}\n"]}