@tsed/common 7.0.0-beta.9 → 7.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/coverage.json +6 -0
- package/jest.config.js +9 -0
- package/lib/cjs/builder/PlatformBuilder.js +86 -68
- package/lib/cjs/builder/PlatformBuilder.js.map +1 -1
- package/lib/cjs/config/interfaces/PlatformLoggerSettings.js.map +1 -1
- package/lib/cjs/config/services/PlatformConfiguration.js +0 -64
- package/lib/cjs/config/services/PlatformConfiguration.js.map +1 -1
- package/lib/cjs/decorators/params/error.js +1 -1
- package/lib/cjs/decorators/params/error.js.map +1 -1
- package/lib/cjs/domain/AnyToPromiseWithCtx.js +4 -5
- package/lib/cjs/domain/AnyToPromiseWithCtx.js.map +1 -1
- package/lib/cjs/domain/PlatformContext.js +46 -38
- package/lib/cjs/domain/PlatformContext.js.map +1 -1
- package/lib/cjs/domain/PlatformRouteDetails.js +0 -21
- package/lib/cjs/domain/PlatformRouteDetails.js.map +1 -1
- package/lib/cjs/exports.js +1 -0
- package/lib/cjs/exports.js.map +1 -1
- package/lib/cjs/index.js +1 -9
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/interfaces/PlatformRouteOptions.js.map +1 -1
- package/lib/cjs/interfaces/Route.js.map +1 -1
- package/lib/cjs/middlewares/PlatformAcceptMimesMiddleware.js +2 -1
- package/lib/cjs/middlewares/PlatformAcceptMimesMiddleware.js.map +1 -1
- package/lib/cjs/middlewares/PlatformMulterMiddleware.js +2 -0
- package/lib/cjs/middlewares/PlatformMulterMiddleware.js.map +1 -1
- package/lib/cjs/services/FakeAdapter.js +6 -12
- package/lib/cjs/services/FakeAdapter.js.map +1 -1
- package/lib/cjs/services/Platform.js +30 -86
- package/lib/cjs/services/Platform.js.map +1 -1
- package/lib/cjs/services/PlatformAdapter.js +10 -0
- package/lib/cjs/services/PlatformAdapter.js.map +1 -1
- package/lib/cjs/services/PlatformApplication.js +23 -9
- package/lib/cjs/services/PlatformApplication.js.map +1 -1
- package/lib/cjs/services/PlatformHandler.js +112 -171
- package/lib/cjs/services/PlatformHandler.js.map +1 -1
- package/lib/cjs/services/PlatformMiddlewaresChain.js +5 -19
- package/lib/cjs/services/PlatformMiddlewaresChain.js.map +1 -1
- package/lib/cjs/services/PlatformRequest.js +16 -12
- package/lib/cjs/services/PlatformRequest.js.map +1 -1
- package/lib/cjs/services/PlatformResponse.js +19 -22
- package/lib/cjs/services/PlatformResponse.js.map +1 -1
- package/lib/cjs/services/PlatformTest.js +29 -9
- package/lib/cjs/services/PlatformTest.js.map +1 -1
- package/lib/cjs/utils/createContext.js +32 -21
- package/lib/cjs/utils/createContext.js.map +1 -1
- package/lib/cjs/utils/createHttpServer.js +3 -3
- package/lib/cjs/utils/createHttpServer.js.map +1 -1
- package/lib/cjs/utils/createHttpsServer.js +3 -3
- package/lib/cjs/utils/createHttpsServer.js.map +1 -1
- package/lib/cjs/utils/createInjector.js +6 -8
- package/lib/cjs/utils/createInjector.js.map +1 -1
- package/lib/cjs/utils/ensureContext.js +16 -0
- package/lib/cjs/utils/ensureContext.js.map +1 -0
- package/lib/cjs/utils/getConfiguration.js +6 -12
- package/lib/cjs/utils/getConfiguration.js.map +1 -1
- package/lib/cjs/utils/printRoutes.js +10 -8
- package/lib/cjs/utils/printRoutes.js.map +1 -1
- package/lib/cjs/utils/setResponseHeaders.js +8 -14
- package/lib/cjs/utils/setResponseHeaders.js.map +1 -1
- package/lib/esm/builder/PlatformBuilder.js +63 -68
- package/lib/esm/builder/PlatformBuilder.js.map +1 -1
- package/lib/esm/config/interfaces/PlatformLoggerSettings.js.map +1 -1
- package/lib/esm/config/services/PlatformConfiguration.js +0 -64
- package/lib/esm/config/services/PlatformConfiguration.js.map +1 -1
- package/lib/esm/decorators/params/error.js +1 -1
- package/lib/esm/decorators/params/error.js.map +1 -1
- package/lib/esm/domain/AnyToPromiseWithCtx.js +4 -5
- package/lib/esm/domain/AnyToPromiseWithCtx.js.map +1 -1
- package/lib/esm/domain/PlatformContext.js +46 -38
- package/lib/esm/domain/PlatformContext.js.map +1 -1
- package/lib/esm/domain/PlatformRouteDetails.js +1 -19
- package/lib/esm/domain/PlatformRouteDetails.js.map +1 -1
- package/lib/esm/exports.js +1 -0
- package/lib/esm/exports.js.map +1 -1
- package/lib/esm/index.js +1 -9
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/interfaces/PlatformRouteOptions.js.map +1 -1
- package/lib/esm/interfaces/Route.js.map +1 -1
- package/lib/esm/middlewares/PlatformAcceptMimesMiddleware.js +2 -1
- package/lib/esm/middlewares/PlatformAcceptMimesMiddleware.js.map +1 -1
- package/lib/esm/middlewares/PlatformMulterMiddleware.js +2 -0
- package/lib/esm/middlewares/PlatformMulterMiddleware.js.map +1 -1
- package/lib/esm/services/FakeAdapter.js +6 -12
- package/lib/esm/services/FakeAdapter.js.map +1 -1
- package/lib/esm/services/Platform.js +31 -87
- package/lib/esm/services/Platform.js.map +1 -1
- package/lib/esm/services/PlatformAdapter.js +10 -0
- package/lib/esm/services/PlatformAdapter.js.map +1 -1
- package/lib/esm/services/PlatformApplication.js +23 -9
- package/lib/esm/services/PlatformApplication.js.map +1 -1
- package/lib/esm/services/PlatformHandler.js +114 -173
- package/lib/esm/services/PlatformHandler.js.map +1 -1
- package/lib/esm/services/PlatformMiddlewaresChain.js +5 -19
- package/lib/esm/services/PlatformMiddlewaresChain.js.map +1 -1
- package/lib/esm/services/PlatformRequest.js +16 -12
- package/lib/esm/services/PlatformRequest.js.map +1 -1
- package/lib/esm/services/PlatformResponse.js +19 -22
- package/lib/esm/services/PlatformResponse.js.map +1 -1
- package/lib/esm/services/PlatformTest.js +29 -9
- package/lib/esm/services/PlatformTest.js.map +1 -1
- package/lib/esm/utils/createContext.js +30 -20
- package/lib/esm/utils/createContext.js.map +1 -1
- package/lib/esm/utils/createHttpServer.js +3 -3
- package/lib/esm/utils/createHttpServer.js.map +1 -1
- package/lib/esm/utils/createHttpsServer.js +3 -3
- package/lib/esm/utils/createHttpsServer.js.map +1 -1
- package/lib/esm/utils/createInjector.js +7 -9
- package/lib/esm/utils/createInjector.js.map +1 -1
- package/lib/esm/utils/ensureContext.js +12 -0
- package/lib/esm/utils/ensureContext.js.map +1 -0
- package/lib/esm/utils/getConfiguration.js +8 -14
- package/lib/esm/utils/getConfiguration.js.map +1 -1
- package/lib/esm/utils/printRoutes.js +10 -8
- package/lib/esm/utils/printRoutes.js.map +1 -1
- package/lib/esm/utils/setResponseHeaders.js +8 -14
- package/lib/esm/utils/setResponseHeaders.js.map +1 -1
- package/lib/types/builder/PlatformBuilder.d.ts +17 -16
- package/lib/types/config/interfaces/PlatformLoggerSettings.d.ts +2 -43
- package/lib/types/config/services/PlatformConfiguration.d.ts +6 -22
- package/lib/types/domain/AnyToPromiseWithCtx.d.ts +1 -9
- package/lib/types/domain/PlatformContext.d.ts +32 -18
- package/lib/types/domain/PlatformRouteDetails.d.ts +4 -19
- package/lib/types/exports.d.ts +1 -0
- package/lib/types/index.d.ts +1 -9
- package/lib/types/interfaces/PlatformRouteOptions.d.ts +0 -1
- package/lib/types/interfaces/Route.d.ts +2 -3
- package/lib/types/middlewares/PlatformMulterMiddleware.d.ts +1 -1
- package/lib/types/services/FakeAdapter.d.ts +7 -6
- package/lib/types/services/Platform.d.ts +7 -28
- package/lib/types/services/PlatformAdapter.d.ts +22 -11
- package/lib/types/services/PlatformApplication.d.ts +14 -6
- package/lib/types/services/PlatformHandler.d.ts +21 -59
- package/lib/types/services/PlatformMiddlewaresChain.d.ts +1 -2
- package/lib/types/services/PlatformRequest.d.ts +8 -10
- package/lib/types/services/PlatformResponse.d.ts +11 -15
- package/lib/types/services/PlatformTest.d.ts +4 -3
- package/lib/types/utils/createContext.d.ts +4 -1
- package/lib/types/utils/createHttpsServer.d.ts +1 -0
- package/lib/types/utils/createInjector.d.ts +2 -2
- package/lib/types/utils/ensureContext.d.ts +2 -0
- package/lib/types/utils/listenServer.d.ts +2 -0
- package/package.json +28 -23
- package/readme.md +2 -1
- package/lib/cjs/builder/PlatformControllerBuilder.js +0 -82
- package/lib/cjs/builder/PlatformControllerBuilder.js.map +0 -1
- package/lib/cjs/config/interfaces/EndpointDirectoriesSettings.js +0 -3
- package/lib/cjs/config/interfaces/EndpointDirectoriesSettings.js.map +0 -1
- package/lib/cjs/domain/ControllerProvider.js +0 -51
- package/lib/cjs/domain/ControllerProvider.js.map +0 -1
- package/lib/cjs/domain/HandlerMetadata.js +0 -57
- package/lib/cjs/domain/HandlerMetadata.js.map +0 -1
- package/lib/cjs/middlewares/__mock__/FakeCtrl.js +0 -12
- package/lib/cjs/middlewares/__mock__/FakeCtrl.js.map +0 -1
- package/lib/cjs/middlewares/bindEndpointMiddleware.js +0 -13
- package/lib/cjs/middlewares/bindEndpointMiddleware.js.map +0 -1
- package/lib/cjs/services/PlatformRouter.js +0 -108
- package/lib/cjs/services/PlatformRouter.js.map +0 -1
- package/lib/cjs/utils/__mock__/Test1.js +0 -8
- package/lib/cjs/utils/__mock__/Test1.js.map +0 -1
- package/lib/cjs/utils/__mock__/Test2.js +0 -8
- package/lib/cjs/utils/__mock__/Test2.js.map +0 -1
- package/lib/cjs/utils/createHandlerMetadata.js +0 -49
- package/lib/cjs/utils/createHandlerMetadata.js.map +0 -1
- package/lib/cjs/utils/importProviders.js +0 -29
- package/lib/cjs/utils/importProviders.js.map +0 -1
- package/lib/cjs/utils/useCtxHandler.js +0 -15
- package/lib/cjs/utils/useCtxHandler.js.map +0 -1
- package/lib/esm/builder/PlatformControllerBuilder.js +0 -76
- package/lib/esm/builder/PlatformControllerBuilder.js.map +0 -1
- package/lib/esm/config/interfaces/EndpointDirectoriesSettings.js +0 -2
- package/lib/esm/config/interfaces/EndpointDirectoriesSettings.js.map +0 -1
- package/lib/esm/domain/ControllerProvider.js +0 -47
- package/lib/esm/domain/ControllerProvider.js.map +0 -1
- package/lib/esm/domain/HandlerMetadata.js +0 -53
- package/lib/esm/domain/HandlerMetadata.js.map +0 -1
- package/lib/esm/middlewares/__mock__/FakeCtrl.js +0 -9
- package/lib/esm/middlewares/__mock__/FakeCtrl.js.map +0 -1
- package/lib/esm/middlewares/bindEndpointMiddleware.js +0 -9
- package/lib/esm/middlewares/bindEndpointMiddleware.js.map +0 -1
- package/lib/esm/services/PlatformRouter.js +0 -105
- package/lib/esm/services/PlatformRouter.js.map +0 -1
- package/lib/esm/utils/__mock__/Test1.js +0 -4
- package/lib/esm/utils/__mock__/Test1.js.map +0 -1
- package/lib/esm/utils/__mock__/Test2.js +0 -4
- package/lib/esm/utils/__mock__/Test2.js.map +0 -1
- package/lib/esm/utils/createHandlerMetadata.js +0 -45
- package/lib/esm/utils/createHandlerMetadata.js.map +0 -1
- package/lib/esm/utils/importProviders.js +0 -25
- package/lib/esm/utils/importProviders.js.map +0 -1
- package/lib/esm/utils/useCtxHandler.js +0 -11
- package/lib/esm/utils/useCtxHandler.js.map +0 -1
- package/lib/types/builder/PlatformControllerBuilder.d.ts +0 -18
- package/lib/types/config/interfaces/EndpointDirectoriesSettings.d.ts +0 -3
- package/lib/types/domain/ControllerProvider.d.ts +0 -24
- package/lib/types/domain/HandlerMetadata.d.ts +0 -32
- package/lib/types/middlewares/__mock__/FakeCtrl.d.ts +0 -2
- package/lib/types/middlewares/bindEndpointMiddleware.d.ts +0 -6
- package/lib/types/services/PlatformRouter.d.ts +0 -51
- package/lib/types/utils/__mock__/Test1.d.ts +0 -3
- package/lib/types/utils/__mock__/Test2.d.ts +0 -3
- package/lib/types/utils/createHandlerMetadata.d.ts +0 -8
- package/lib/types/utils/importProviders.d.ts +0 -10
- package/lib/types/utils/useCtxHandler.d.ts +0 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlatformAdapter.js","sourceRoot":"","sources":["../../../src/services/PlatformAdapter.ts"],"names":[],"mappings":";;;AACA,iCAAyE;
|
|
1
|
+
{"version":3,"file":"PlatformAdapter.js","sourceRoot":"","sources":["../../../src/services/PlatformAdapter.ts"],"names":[],"mappings":";;;AACA,iCAAyE;AAKzE,+CAA0C;AAE1C,MAAsB,eAAe;IACnC;;OAEG;IACH,SAAS,CAAiB;IAC1B;;OAEG;IACH,MAAM,CAAa;IACnB,gBAAgB,CAAsB;IACtC,eAAe,CAAsB;CAsCtC;AAhDD,0CAgDC;AAMD,IAAA,qBAAgB,EAAC;IACf,OAAO,EAAE,eAAe;IACxB,IAAI,EAAE,CAAC,oBAAe,CAAC;IACvB,QAAQ,EAAE,yBAAW;CACtB,CAAC,CAAC","sourcesContent":["import {Type} from \"@tsed/core\";\nimport {InjectorService, ProviderOpts, registerProvider} from \"@tsed/di\";\nimport {PlatformHandlerMetadata, PlatformLayer} from \"@tsed/platform-router\";\nimport {IncomingMessage, ServerResponse} from \"http\";\nimport {PlatformMulter, PlatformMulterSettings} from \"../config/interfaces/PlatformMulterSettings\";\nimport {PlatformStaticsOptions} from \"../config/interfaces/PlatformStaticsSettings\";\nimport {FakeAdapter} from \"./FakeAdapter\";\n\nexport abstract class PlatformAdapter<App = TsED.Application> {\n /**\n * Load providers in top priority\n */\n providers: ProviderOpts[];\n /**\n * Called after the injector instantiation\n */\n onInit?: () => any;\n beforeLoadRoutes?: () => Promise<any>;\n afterLoadRoutes?: () => Promise<any>;\n /**\n * create initial context\n */\n abstract useContext: () => any;\n /**\n * Map router layer to the targeted framework\n */\n abstract mapLayers: (layer: PlatformLayer[]) => void;\n /**\n * Map handler to the targeted framework\n */\n abstract mapHandler: (handler: Function, layer: PlatformHandlerMetadata) => Function;\n\n /**\n * Return the app instance\n */\n abstract app(): {app: App; callback(): (req: IncomingMessage, res: ServerResponse) => void};\n\n /**\n * Return the statics middlewares\n * @param endpoint\n * @param options\n */\n abstract statics(endpoint: string, options: PlatformStaticsOptions): any;\n\n /**\n * Return the multipart middleware\n * @param options\n */\n abstract multipart(options: PlatformMulterSettings): PlatformMulter;\n\n /**\n * Return the body parser for the given\n * @param type\n * @param opts\n */\n abstract bodyParser(type: string, opts?: Record<string, any>): any;\n}\n\nexport interface PlatformBuilderSettings<App = TsED.Application> extends Partial<TsED.Configuration> {\n adapter?: Type<PlatformAdapter<App>>;\n}\n\nregisterProvider({\n provide: PlatformAdapter,\n deps: [InjectorService],\n useClass: FakeAdapter\n});\n"]}
|
|
@@ -3,30 +3,44 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.PlatformApplication = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const di_1 = require("@tsed/di");
|
|
6
|
-
const
|
|
7
|
-
const PlatformRouter_1 = require("./PlatformRouter");
|
|
6
|
+
const platform_router_1 = require("@tsed/platform-router");
|
|
8
7
|
const PlatformAdapter_1 = require("./PlatformAdapter");
|
|
9
8
|
/**
|
|
10
9
|
* `PlatformApplication` is used to provide all routes collected by annotation `@Controller`.
|
|
11
10
|
*
|
|
12
11
|
* @platform
|
|
13
12
|
*/
|
|
14
|
-
let PlatformApplication = class PlatformApplication extends
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
let PlatformApplication = class PlatformApplication extends platform_router_1.PlatformRouter {
|
|
14
|
+
adapter;
|
|
15
|
+
injector;
|
|
16
|
+
rawApp;
|
|
17
|
+
rawCallback;
|
|
18
|
+
constructor(adapter, injector) {
|
|
19
|
+
super(injector);
|
|
20
|
+
this.adapter = adapter;
|
|
21
|
+
this.injector = injector;
|
|
17
22
|
const { app, callback } = adapter.app();
|
|
18
|
-
this.rawApp =
|
|
19
|
-
this.
|
|
23
|
+
this.rawApp = app;
|
|
24
|
+
this.rawCallback = callback;
|
|
20
25
|
}
|
|
21
26
|
getApp() {
|
|
22
|
-
return this.
|
|
27
|
+
return this.rawApp;
|
|
28
|
+
}
|
|
29
|
+
multer(options) {
|
|
30
|
+
return this.adapter.multipart(options);
|
|
31
|
+
}
|
|
32
|
+
callback(req, res) {
|
|
33
|
+
if (req && res) {
|
|
34
|
+
return this.callback()(req, res);
|
|
35
|
+
}
|
|
36
|
+
return this.rawCallback();
|
|
23
37
|
}
|
|
24
38
|
};
|
|
25
39
|
PlatformApplication = tslib_1.__decorate([
|
|
26
40
|
(0, di_1.Injectable)({
|
|
27
41
|
scope: di_1.ProviderScope.SINGLETON
|
|
28
42
|
}),
|
|
29
|
-
tslib_1.__metadata("design:paramtypes", [
|
|
43
|
+
tslib_1.__metadata("design:paramtypes", [PlatformAdapter_1.PlatformAdapter, di_1.InjectorService])
|
|
30
44
|
], PlatformApplication);
|
|
31
45
|
exports.PlatformApplication = PlatformApplication;
|
|
32
46
|
//# sourceMappingURL=PlatformApplication.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlatformApplication.js","sourceRoot":"","sources":["../../../src/services/PlatformApplication.ts"],"names":[],"mappings":";;;;AAAA,
|
|
1
|
+
{"version":3,"file":"PlatformApplication.js","sourceRoot":"","sources":["../../../src/services/PlatformApplication.ts"],"names":[],"mappings":";;;;AAAA,iCAAoE;AACpE,2DAAqD;AAGrD,uDAAkD;AASlD;;;;GAIG;AAIH,IAAa,mBAAmB,GAAhC,MAAa,mBAA4C,SAAQ,gCAAc;IAI1D;IAAsC;IAHzD,MAAM,CAAM;IACZ,WAAW,CAAY;IAEvB,YAAmB,OAA6B,EAAS,QAAyB;QAChF,KAAK,CAAC,QAAQ,CAAC,CAAC;QADC,YAAO,GAAP,OAAO,CAAsB;QAAS,aAAQ,GAAR,QAAQ,CAAiB;QAEhF,MAAM,EAAC,GAAG,EAAE,QAAQ,EAAC,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAEtC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;QAClB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,OAA+B;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAID,QAAQ,CAAC,GAAqB,EAAE,GAAoB;QAClD,IAAI,GAAG,IAAI,GAAG,EAAE;YACd,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;SAClC;QAED,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;CACF,CAAA;AA7BY,mBAAmB;IAH/B,IAAA,eAAU,EAAC;QACV,KAAK,EAAE,kBAAa,CAAC,SAAS;KAC/B,CAAC;6CAK4B,iCAAe,EAAwB,oBAAe;GAJvE,mBAAmB,CA6B/B;AA7BY,kDAAmB","sourcesContent":["import {Injectable, InjectorService, ProviderScope} from \"@tsed/di\";\nimport {PlatformRouter} from \"@tsed/platform-router\";\nimport {IncomingMessage, ServerResponse} from \"http\";\nimport {PlatformMulterSettings} from \"../config/interfaces/PlatformMulterSettings\";\nimport {PlatformAdapter} from \"./PlatformAdapter\";\n\ndeclare global {\n namespace TsED {\n // @ts-ignore\n export interface Application {}\n }\n}\n\n/**\n * `PlatformApplication` is used to provide all routes collected by annotation `@Controller`.\n *\n * @platform\n */\n@Injectable({\n scope: ProviderScope.SINGLETON\n})\nexport class PlatformApplication<App = TsED.Application> extends PlatformRouter {\n rawApp: App;\n rawCallback: () => any;\n\n constructor(public adapter: PlatformAdapter<App>, public injector: InjectorService) {\n super(injector);\n const {app, callback} = adapter.app();\n\n this.rawApp = app;\n this.rawCallback = callback;\n }\n\n getApp(): App {\n return this.rawApp;\n }\n\n multer(options: PlatformMulterSettings) {\n return this.adapter.multipart(options);\n }\n\n callback(): (req: IncomingMessage, res: ServerResponse) => any;\n callback(req: IncomingMessage, res: ServerResponse): any;\n callback(req?: IncomingMessage, res?: ServerResponse) {\n if (req && res) {\n return this.callback()(req, res);\n }\n\n return this.rawCallback();\n }\n}\n"]}
|
|
@@ -5,231 +5,172 @@ const tslib_1 = require("tslib");
|
|
|
5
5
|
const core_1 = require("@tsed/core");
|
|
6
6
|
const di_1 = require("@tsed/di");
|
|
7
7
|
const logger_1 = require("@tsed/logger");
|
|
8
|
+
const platform_exceptions_1 = require("@tsed/platform-exceptions");
|
|
8
9
|
const platform_params_1 = require("@tsed/platform-params");
|
|
9
10
|
const platform_response_filter_1 = require("@tsed/platform-response-filter");
|
|
11
|
+
const platform_router_1 = require("@tsed/platform-router");
|
|
12
|
+
const util_1 = require("util");
|
|
10
13
|
const AnyToPromiseWithCtx_1 = require("../domain/AnyToPromiseWithCtx");
|
|
11
|
-
const HandlerMetadata_1 = require("../domain/HandlerMetadata");
|
|
12
|
-
const HandlerType_1 = require("../interfaces/HandlerType");
|
|
13
|
-
const createHandlerMetadata_1 = require("../utils/createHandlerMetadata");
|
|
14
14
|
const setResponseHeaders_1 = require("../utils/setResponseHeaders");
|
|
15
|
+
const PlatformApplication_1 = require("./PlatformApplication");
|
|
16
|
+
const PlatformMiddlewaresChain_1 = require("./PlatformMiddlewaresChain");
|
|
15
17
|
/**
|
|
16
18
|
* Platform Handler abstraction layer. Wrap original class method to a pure platform handler (Express, Koa, etc...).
|
|
17
19
|
* @platform
|
|
18
20
|
*/
|
|
19
21
|
let PlatformHandler = class PlatformHandler {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
22
|
+
platformRouters;
|
|
23
|
+
responseFilter;
|
|
24
|
+
platformParams;
|
|
25
|
+
platformExceptions;
|
|
26
|
+
platformApplication;
|
|
27
|
+
platformMiddlewaresChain;
|
|
28
|
+
constructor(platformRouters) {
|
|
29
|
+
this.platformRouters = platformRouters;
|
|
30
|
+
// configure the router module
|
|
31
|
+
platformRouters.hooks
|
|
32
|
+
.on("alterEndpointHandlers", (allMiddlewares, operationRoute) => {
|
|
33
|
+
allMiddlewares = this.platformMiddlewaresChain.get(allMiddlewares, operationRoute);
|
|
34
|
+
return [...allMiddlewares, (0, platform_router_1.useResponseHandler)(this.onFinish.bind(this))];
|
|
35
|
+
})
|
|
36
|
+
.on("alterHandler", (handlerMetadata) => {
|
|
37
|
+
return this.platformApplication.adapter.mapHandler(this.createHandler(handlerMetadata), handlerMetadata);
|
|
38
|
+
});
|
|
23
39
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
40
|
+
createHandler(handlerMetadata) {
|
|
41
|
+
if (handlerMetadata.isInjectable()) {
|
|
42
|
+
const handler = this.platformParams.compileHandler(handlerMetadata);
|
|
43
|
+
return async ($ctx) => {
|
|
44
|
+
$ctx.handlerMetadata = handlerMetadata;
|
|
45
|
+
await (0, core_1.catchAsyncError)(() => this.onRequest(handler, $ctx));
|
|
46
|
+
return this.next($ctx);
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return handlerMetadata.handler;
|
|
31
50
|
}
|
|
32
51
|
/**
|
|
33
|
-
* Create injectable handler from the given provider
|
|
34
52
|
* @param provider
|
|
35
53
|
* @param propertyKey
|
|
36
54
|
*/
|
|
37
55
|
createCustomHandler(provider, propertyKey) {
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
type: HandlerType_1.HandlerType.CUSTOM,
|
|
42
|
-
scope: provider.scope,
|
|
56
|
+
const metadata = new platform_router_1.PlatformHandlerMetadata({
|
|
57
|
+
provider,
|
|
58
|
+
type: platform_router_1.PlatformHandlerType.CUSTOM,
|
|
43
59
|
propertyKey
|
|
44
|
-
}));
|
|
45
|
-
return async ($ctx, next) => handler({
|
|
46
|
-
$ctx,
|
|
47
|
-
next
|
|
48
60
|
});
|
|
61
|
+
const handler = this.platformParams.compileHandler(metadata.store);
|
|
62
|
+
return async ($ctx) => {
|
|
63
|
+
$ctx.handlerMetadata = metadata;
|
|
64
|
+
// @ts-ignore
|
|
65
|
+
return this.onRequest(handler, $ctx);
|
|
66
|
+
};
|
|
49
67
|
}
|
|
50
68
|
/**
|
|
51
69
|
* Send the response to the consumer.
|
|
52
|
-
* @param data
|
|
53
|
-
* @param ctx
|
|
54
70
|
* @protected
|
|
71
|
+
* @param $ctx
|
|
55
72
|
*/
|
|
56
|
-
async flush(
|
|
57
|
-
const { response } = ctx;
|
|
58
|
-
if (
|
|
59
|
-
data = await this.responseFilter.serialize(data, ctx);
|
|
60
|
-
data = await this.responseFilter.transform(data, ctx);
|
|
73
|
+
async flush($ctx) {
|
|
74
|
+
const { response } = $ctx;
|
|
75
|
+
if (!$ctx.isDone()) {
|
|
76
|
+
let data = await this.responseFilter.serialize($ctx.data, $ctx);
|
|
77
|
+
data = await this.responseFilter.transform(data, $ctx);
|
|
61
78
|
response.body(data);
|
|
62
79
|
}
|
|
63
80
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
handler: () => metadata.handler(scope.$ctx),
|
|
71
|
-
metadata
|
|
72
|
-
});
|
|
73
|
-
};
|
|
81
|
+
/**
|
|
82
|
+
* @param $ctx
|
|
83
|
+
*/
|
|
84
|
+
next($ctx) {
|
|
85
|
+
if ((0, core_1.isStream)($ctx.data) || $ctx.isDone()) {
|
|
86
|
+
return;
|
|
74
87
|
}
|
|
75
|
-
|
|
76
|
-
token: metadata.token,
|
|
77
|
-
propertyKey: metadata.propertyKey,
|
|
78
|
-
getCustomArgs: metadata.injectable ? undefined : this.getDefaultArgs(metadata)
|
|
79
|
-
});
|
|
80
|
-
return async (scope) => {
|
|
81
|
-
const handler = await promise;
|
|
82
|
-
// @ts-ignore
|
|
83
|
-
return this.onRequest({
|
|
84
|
-
...scope,
|
|
85
|
-
handler,
|
|
86
|
-
metadata
|
|
87
|
-
});
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
async onCtxRequest(requestOptions) {
|
|
91
|
-
await requestOptions.handler(requestOptions);
|
|
92
|
-
return this.next(requestOptions);
|
|
88
|
+
return $ctx.error ? $ctx.next($ctx.error) : $ctx.next();
|
|
93
89
|
}
|
|
94
90
|
/**
|
|
95
91
|
* Call handler when a request his handle
|
|
96
|
-
* @param requestOptions
|
|
97
92
|
*/
|
|
98
|
-
async onRequest(
|
|
99
|
-
|
|
100
|
-
// istanbul ignore next
|
|
101
|
-
if (!$ctx || $ctx.isDone()) {
|
|
93
|
+
async onRequest(handler, $ctx) {
|
|
94
|
+
if ($ctx.isDone()) {
|
|
102
95
|
logger_1.$log.error({
|
|
103
96
|
name: "HEADERS_SENT",
|
|
104
|
-
message: `An endpoint is called but the response is already send to the client. The call comes from the handler: ${
|
|
97
|
+
message: `An endpoint is called but the response is already send to the client. The call comes from the handler: ${$ctx.handlerMetadata.toString()}`
|
|
105
98
|
});
|
|
106
99
|
return;
|
|
107
100
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
101
|
+
if (($ctx.error instanceof Error && !$ctx.handlerMetadata.hasErrorParam) || ($ctx.handlerMetadata.hasErrorParam && !$ctx.error)) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
const { handlerMetadata } = $ctx;
|
|
106
|
+
if (handlerMetadata.type === platform_router_1.PlatformHandlerType.CTX_FN) {
|
|
107
|
+
return await handler({ $ctx });
|
|
108
|
+
}
|
|
109
|
+
const resolver = new AnyToPromiseWithCtx_1.AnyToPromiseWithCtx($ctx);
|
|
110
|
+
const { state, type, data, status, headers } = await resolver.call(handler);
|
|
111
|
+
// Note: restore previous handler metadata (for OIDC)
|
|
112
|
+
$ctx.handlerMetadata = handlerMetadata;
|
|
113
|
+
if (state === core_1.AnyToPromiseStatus.RESOLVED) {
|
|
114
|
+
if (status) {
|
|
115
|
+
$ctx.response.status(status);
|
|
116
|
+
}
|
|
117
|
+
if (headers) {
|
|
118
|
+
$ctx.response.setHeaders(headers);
|
|
119
|
+
}
|
|
120
|
+
if (data !== undefined) {
|
|
121
|
+
$ctx.data = data;
|
|
122
|
+
}
|
|
123
|
+
if (!$ctx.isDone()) {
|
|
124
|
+
$ctx.error = null;
|
|
125
|
+
// set headers each times that an endpoint is called
|
|
126
|
+
if (handlerMetadata.isEndpoint()) {
|
|
127
|
+
(0, setResponseHeaders_1.setResponseHeaders)($ctx);
|
|
115
128
|
}
|
|
116
|
-
|
|
117
|
-
|
|
129
|
+
// call returned middleware
|
|
130
|
+
if ((0, core_1.isFunction)($ctx.data) && !(0, core_1.isStream)($ctx.data)) {
|
|
131
|
+
return (0, util_1.promisify)($ctx.data)($ctx.getRequest(), $ctx.getResponse());
|
|
118
132
|
}
|
|
119
|
-
if (
|
|
120
|
-
$ctx
|
|
133
|
+
if (type === core_1.AnyToPromiseResponseTypes.STREAM) {
|
|
134
|
+
return this.flush($ctx);
|
|
121
135
|
}
|
|
122
|
-
// Can be canceled by the handler itself
|
|
123
|
-
return await this.onSuccess($ctx.data, requestOptions);
|
|
124
136
|
}
|
|
125
137
|
}
|
|
126
|
-
catch (er) {
|
|
127
|
-
return this.onError(er, requestOptions);
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
async onError(er, requestOptions) {
|
|
132
|
-
const { next, $ctx, metadata } = requestOptions;
|
|
133
|
-
if ($ctx) {
|
|
134
|
-
$ctx.data = er;
|
|
135
138
|
}
|
|
136
|
-
|
|
137
|
-
|
|
139
|
+
catch (error) {
|
|
140
|
+
$ctx.error = error;
|
|
141
|
+
throw error;
|
|
138
142
|
}
|
|
139
|
-
// istanbul ignore next
|
|
140
|
-
if (!$ctx || $ctx.isDone()) {
|
|
141
|
-
logger_1.$log.warn({
|
|
142
|
-
name: "HEADERS_SENT",
|
|
143
|
-
message: `An error was caught after the headers were sent to the client. The error comes from the handler: ${metadata.toString()}`,
|
|
144
|
-
stack: er.stack,
|
|
145
|
-
origin: er,
|
|
146
|
-
request_id: $ctx === null || $ctx === void 0 ? void 0 : $ctx.id
|
|
147
|
-
});
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
return next(er);
|
|
151
143
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
* @param requestOptions
|
|
156
|
-
* @protected
|
|
157
|
-
*/
|
|
158
|
-
async onSuccess(data, requestOptions) {
|
|
159
|
-
const { metadata, $ctx, next } = requestOptions;
|
|
160
|
-
// istanbul ignore next
|
|
161
|
-
if ($ctx === null || $ctx === void 0 ? void 0 : $ctx.isDone()) {
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
// set headers each times that an endpoint is called
|
|
165
|
-
if (metadata.type === HandlerType_1.HandlerType.ENDPOINT) {
|
|
166
|
-
this.setHeaders($ctx);
|
|
167
|
-
}
|
|
168
|
-
// call returned middleware
|
|
169
|
-
if ((0, core_1.isFunction)(data) && !(0, core_1.isStream)(data)) {
|
|
170
|
-
return this.callReturnedMiddleware(data, $ctx, next);
|
|
171
|
-
}
|
|
172
|
-
if (metadata.isFinal()) {
|
|
173
|
-
return this.flush(data, $ctx);
|
|
174
|
-
}
|
|
175
|
-
return this.next(requestOptions);
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Call the returned middleware by the handler.
|
|
179
|
-
* @param middleware
|
|
180
|
-
* @param ctx
|
|
181
|
-
* @param next
|
|
182
|
-
* @protected
|
|
183
|
-
*/
|
|
184
|
-
callReturnedMiddleware(middleware, ctx, next) {
|
|
185
|
-
return middleware(ctx.getRequest(), ctx.getResponse(), next);
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* create Raw handler
|
|
189
|
-
* @param metadata
|
|
190
|
-
*/
|
|
191
|
-
createRawHandler(metadata) {
|
|
192
|
-
if ([HandlerType_1.HandlerType.RAW_ERR_FN, HandlerType_1.HandlerType.RAW_FN].includes(metadata.type)) {
|
|
193
|
-
return metadata.handler;
|
|
194
|
-
}
|
|
195
|
-
const handler = this.compileHandler(metadata);
|
|
196
|
-
return async (request, response, next) => {
|
|
197
|
-
return handler({
|
|
198
|
-
next,
|
|
199
|
-
$ctx: request.$ctx
|
|
200
|
-
});
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Set response headers
|
|
205
|
-
* @param ctx
|
|
206
|
-
* @protected
|
|
207
|
-
*/
|
|
208
|
-
setHeaders(ctx) {
|
|
209
|
-
return (0, setResponseHeaders_1.setResponseHeaders)(ctx);
|
|
210
|
-
}
|
|
211
|
-
next(requestOptions) {
|
|
212
|
-
const { $ctx, next } = requestOptions;
|
|
213
|
-
return !$ctx.response.isDone() && next && next();
|
|
214
|
-
}
|
|
215
|
-
getDefaultArgs(metadata) {
|
|
216
|
-
return async (scope) => [
|
|
217
|
-
metadata.hasErrorParam && scope.err,
|
|
218
|
-
scope.$ctx.request.request,
|
|
219
|
-
scope.$ctx.response.response,
|
|
220
|
-
metadata.hasNextFunction && scope.next
|
|
221
|
-
].filter(Boolean);
|
|
144
|
+
async onFinish($ctx) {
|
|
145
|
+
$ctx.error = await (0, core_1.catchAsyncError)(() => this.flush($ctx));
|
|
146
|
+
return $ctx.error && this.platformExceptions.catch($ctx.error, $ctx);
|
|
222
147
|
}
|
|
223
148
|
};
|
|
224
149
|
tslib_1.__decorate([
|
|
225
150
|
(0, di_1.Inject)(),
|
|
226
151
|
tslib_1.__metadata("design:type", platform_response_filter_1.PlatformResponseFilter)
|
|
227
152
|
], PlatformHandler.prototype, "responseFilter", void 0);
|
|
153
|
+
tslib_1.__decorate([
|
|
154
|
+
(0, di_1.Inject)(),
|
|
155
|
+
tslib_1.__metadata("design:type", platform_params_1.PlatformParams)
|
|
156
|
+
], PlatformHandler.prototype, "platformParams", void 0);
|
|
157
|
+
tslib_1.__decorate([
|
|
158
|
+
(0, di_1.Inject)(),
|
|
159
|
+
tslib_1.__metadata("design:type", platform_exceptions_1.PlatformExceptions)
|
|
160
|
+
], PlatformHandler.prototype, "platformExceptions", void 0);
|
|
161
|
+
tslib_1.__decorate([
|
|
162
|
+
(0, di_1.Inject)(),
|
|
163
|
+
tslib_1.__metadata("design:type", PlatformApplication_1.PlatformApplication)
|
|
164
|
+
], PlatformHandler.prototype, "platformApplication", void 0);
|
|
165
|
+
tslib_1.__decorate([
|
|
166
|
+
(0, di_1.Inject)(),
|
|
167
|
+
tslib_1.__metadata("design:type", PlatformMiddlewaresChain_1.PlatformMiddlewaresChain)
|
|
168
|
+
], PlatformHandler.prototype, "platformMiddlewaresChain", void 0);
|
|
228
169
|
PlatformHandler = tslib_1.__decorate([
|
|
229
170
|
(0, di_1.Injectable)({
|
|
230
171
|
scope: di_1.ProviderScope.SINGLETON
|
|
231
172
|
}),
|
|
232
|
-
tslib_1.__metadata("design:paramtypes", [
|
|
173
|
+
tslib_1.__metadata("design:paramtypes", [platform_router_1.PlatformRouters])
|
|
233
174
|
], PlatformHandler);
|
|
234
175
|
exports.PlatformHandler = PlatformHandler;
|
|
235
176
|
//# 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, runInContext} from \"@tsed/di\";\nimport {$log} from \"@tsed/logger\";\nimport {ArgScope, HandlerWithScope, PlatformParams} from \"@tsed/platform-params\";\nimport {PlatformResponseFilter} from \"@tsed/platform-response-filter\";\nimport {EndpointMetadata} from \"@tsed/schema\";\nimport {AnyToPromiseWithCtx} from \"../domain/AnyToPromiseWithCtx\";\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 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\n if ($ctx) {\n $ctx.data = er;\n }\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(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"]}
|
|
@@ -2,33 +2,19 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PlatformMiddlewaresChain = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
|
+
const core_1 = require("@tsed/core");
|
|
5
6
|
const di_1 = require("@tsed/di");
|
|
6
7
|
const platform_params_1 = require("@tsed/platform-params");
|
|
7
8
|
const schema_1 = require("@tsed/schema");
|
|
8
|
-
const bindEndpointMiddleware_1 = require("../middlewares/bindEndpointMiddleware");
|
|
9
9
|
const PlatformAcceptMimesMiddleware_1 = require("../middlewares/PlatformAcceptMimesMiddleware");
|
|
10
10
|
const PlatformMulterMiddleware_1 = require("../middlewares/PlatformMulterMiddleware");
|
|
11
|
-
const useCtxHandler_1 = require("../utils/useCtxHandler");
|
|
12
11
|
const PlatformAdapter_1 = require("../services/PlatformAdapter");
|
|
13
|
-
const core_1 = require("@tsed/core");
|
|
14
12
|
let PlatformMiddlewaresChain = class PlatformMiddlewaresChain {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const { middlewares: { useBefore, use, useAfter } } = provider;
|
|
19
|
-
const allMiddlewares = [
|
|
20
|
-
...parentMiddlewares,
|
|
21
|
-
...useBefore,
|
|
22
|
-
...beforeMiddlewares,
|
|
23
|
-
...use,
|
|
24
|
-
...mldwrs,
|
|
25
|
-
endpoint,
|
|
26
|
-
...afterMiddlewares,
|
|
27
|
-
...useAfter
|
|
28
|
-
];
|
|
13
|
+
acceptMimes;
|
|
14
|
+
adapter;
|
|
15
|
+
get(allMiddlewares, operationRoute) {
|
|
29
16
|
const { ACCEPT_MIMES, FILE, RAW_BODY, BODY } = this.getParamTypes(allMiddlewares, operationRoute);
|
|
30
17
|
return [
|
|
31
|
-
(0, useCtxHandler_1.useCtxHandler)((0, bindEndpointMiddleware_1.bindEndpointMiddleware)(endpoint)),
|
|
32
18
|
ACCEPT_MIMES && PlatformAcceptMimesMiddleware_1.PlatformAcceptMimesMiddleware,
|
|
33
19
|
FILE && PlatformMulterMiddleware_1.PlatformMulterMiddleware,
|
|
34
20
|
!FILE && RAW_BODY && this.adapter.bodyParser("raw"),
|
|
@@ -56,7 +42,7 @@ let PlatformMiddlewaresChain = class PlatformMiddlewaresChain {
|
|
|
56
42
|
ACCEPT_MIMES: this.hasAcceptMimes(operationRoute),
|
|
57
43
|
FILE: operationRoute.has(platform_params_1.ParamTypes.FILES),
|
|
58
44
|
RAW_BODY: operationRoute.has(platform_params_1.ParamTypes.RAW_BODY),
|
|
59
|
-
BODY: operationRoute.has(platform_params_1.ParamTypes.BODY)
|
|
45
|
+
BODY: operationRoute.has(platform_params_1.ParamTypes.BODY) || operationRoute.method === "ALL"
|
|
60
46
|
});
|
|
61
47
|
}
|
|
62
48
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlatformMiddlewaresChain.js","sourceRoot":"","sources":["../../../src/services/PlatformMiddlewaresChain.ts"],"names":[],"mappings":";;;;AAAA,iCAAsD;AACtD,2DAAiD;AACjD,yCAAiE;
|
|
1
|
+
{"version":3,"file":"PlatformMiddlewaresChain.js","sourceRoot":"","sources":["../../../src/services/PlatformMiddlewaresChain.ts"],"names":[],"mappings":";;;;AAAA,qCAAmC;AACnC,iCAAsD;AACtD,2DAAiD;AACjD,yCAAiE;AACjE,gGAA2F;AAC3F,sFAAiF;AACjF,iEAA4D;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,6DAA6B;YAC7C,IAAI,IAAI,mDAAwB;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,cAAO,CAAC,CAAC,MAAM,CACvC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE;YACpB,IAAI,KAAK,KAAK,cAAc,CAAC,QAAQ,EAAE;gBACrC,MAAM,MAAM,GAAG,wBAAe,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,4BAAU,CAAC,KAAK,CAAC;YAC1C,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,4BAAU,CAAC,QAAQ,CAAC;YACjD,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC,4BAAU,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,KAAK;SAC7E,CACF,CAAC;IACJ,CAAC;CACF,CAAA;AA9CC;IADC,IAAA,aAAQ,EAAC,aAAa,EAAE,EAAE,CAAC;;6DACI;AAGhC;IADC,IAAA,WAAM,GAAE;sCACU,iCAAe;yDAAC;AALxB,wBAAwB;IADpC,IAAA,eAAU,GAAE;GACA,wBAAwB,CAgDpC;AAhDY,4DAAwB","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"]}
|
|
@@ -8,9 +8,18 @@ const di_1 = require("@tsed/di");
|
|
|
8
8
|
* @platform
|
|
9
9
|
*/
|
|
10
10
|
let PlatformRequest = class PlatformRequest {
|
|
11
|
-
|
|
11
|
+
$ctx;
|
|
12
|
+
constructor($ctx) {
|
|
12
13
|
this.$ctx = $ctx;
|
|
13
|
-
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The current @@PlatformResponse@@.
|
|
17
|
+
*/
|
|
18
|
+
get response() {
|
|
19
|
+
return this.$ctx.response;
|
|
20
|
+
}
|
|
21
|
+
get raw() {
|
|
22
|
+
return this.$ctx.event.request;
|
|
14
23
|
}
|
|
15
24
|
get secure() {
|
|
16
25
|
return this.raw.secure;
|
|
@@ -77,6 +86,9 @@ let PlatformRequest = class PlatformRequest {
|
|
|
77
86
|
get files() {
|
|
78
87
|
return this.raw.files;
|
|
79
88
|
}
|
|
89
|
+
get route() {
|
|
90
|
+
return this.$ctx.handlerMetadata?.path;
|
|
91
|
+
}
|
|
80
92
|
/**
|
|
81
93
|
* Return the original request framework instance
|
|
82
94
|
*/
|
|
@@ -108,14 +120,6 @@ let PlatformRequest = class PlatformRequest {
|
|
|
108
120
|
isAborted() {
|
|
109
121
|
return this.raw.aborted;
|
|
110
122
|
}
|
|
111
|
-
destroy() {
|
|
112
|
-
// @ts-ignore
|
|
113
|
-
delete this.raw;
|
|
114
|
-
// @ts-ignore
|
|
115
|
-
delete this.response;
|
|
116
|
-
// @ts-ignore
|
|
117
|
-
delete this.$ctx;
|
|
118
|
-
}
|
|
119
123
|
/**
|
|
120
124
|
* Return the Framework response object (express, koa, etc...)
|
|
121
125
|
*/
|
|
@@ -126,13 +130,13 @@ let PlatformRequest = class PlatformRequest {
|
|
|
126
130
|
* Return the Node.js response object
|
|
127
131
|
*/
|
|
128
132
|
getReq() {
|
|
129
|
-
return this.
|
|
133
|
+
return this.$ctx.event.request;
|
|
130
134
|
}
|
|
131
135
|
};
|
|
132
136
|
PlatformRequest = tslib_1.__decorate([
|
|
133
137
|
(0, di_1.Injectable)(),
|
|
134
138
|
(0, di_1.Scope)(di_1.ProviderScope.INSTANCE),
|
|
135
|
-
tslib_1.__metadata("design:paramtypes", [
|
|
139
|
+
tslib_1.__metadata("design:paramtypes", [Function])
|
|
136
140
|
], PlatformRequest);
|
|
137
141
|
exports.PlatformRequest = PlatformRequest;
|
|
138
142
|
//# sourceMappingURL=PlatformRequest.js.map
|