@tsed/platform-serverless 7.0.0-alpha.2 → 7.0.0-beta.11

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 (57) hide show
  1. package/jest.config.js +4 -4
  2. package/lib/cjs/builder/PlatformServerless.js +160 -0
  3. package/lib/cjs/builder/PlatformServerless.js.map +1 -0
  4. package/lib/cjs/builder/PlatformServerlessHandler.js +93 -0
  5. package/lib/cjs/builder/PlatformServerlessHandler.js.map +1 -0
  6. package/lib/cjs/domain/ServerlessContext.js +26 -0
  7. package/lib/cjs/domain/ServerlessContext.js.map +1 -0
  8. package/lib/cjs/domain/ServerlessRequest.js +80 -0
  9. package/lib/cjs/domain/ServerlessRequest.js.map +1 -0
  10. package/lib/cjs/domain/ServerlessResponse.js +193 -0
  11. package/lib/cjs/domain/ServerlessResponse.js.map +1 -0
  12. package/lib/cjs/exports.js +16 -0
  13. package/lib/cjs/exports.js.map +1 -0
  14. package/lib/cjs/index.js +15 -0
  15. package/lib/cjs/index.js.map +1 -0
  16. package/lib/cjs/package.json +3 -0
  17. package/lib/cjs/utils/getRequestId.js +13 -0
  18. package/lib/cjs/utils/getRequestId.js.map +1 -0
  19. package/lib/cjs/utils/setResponseHeaders.js +35 -0
  20. package/lib/cjs/utils/setResponseHeaders.js.map +1 -0
  21. package/lib/esm/builder/PlatformServerless.js +133 -0
  22. package/lib/esm/builder/PlatformServerless.js.map +1 -0
  23. package/lib/esm/builder/PlatformServerlessHandler.js +90 -0
  24. package/lib/esm/builder/PlatformServerlessHandler.js.map +1 -0
  25. package/lib/esm/domain/ServerlessContext.js +22 -0
  26. package/lib/esm/domain/ServerlessContext.js.map +1 -0
  27. package/lib/esm/domain/ServerlessRequest.js +76 -0
  28. package/lib/esm/domain/ServerlessRequest.js.map +1 -0
  29. package/lib/esm/domain/ServerlessResponse.js +189 -0
  30. package/lib/esm/domain/ServerlessResponse.js.map +1 -0
  31. package/lib/esm/exports.js +4 -0
  32. package/lib/esm/exports.js.map +1 -0
  33. package/lib/esm/index.js +12 -0
  34. package/lib/esm/index.js.map +1 -0
  35. package/lib/esm/package.json +3 -0
  36. package/lib/esm/utils/getRequestId.js +9 -0
  37. package/lib/esm/utils/getRequestId.js.map +1 -0
  38. package/lib/esm/utils/setResponseHeaders.js +31 -0
  39. package/lib/esm/utils/setResponseHeaders.js.map +1 -0
  40. package/lib/{builder → types/builder}/PlatformServerless.d.ts +14 -6
  41. package/lib/{builder → types/builder}/PlatformServerlessHandler.d.ts +2 -2
  42. package/lib/{domain → types/domain}/ServerlessContext.d.ts +0 -0
  43. package/lib/{domain → types/domain}/ServerlessRequest.d.ts +0 -0
  44. package/lib/{domain → types/domain}/ServerlessResponse.d.ts +1 -1
  45. package/lib/types/exports.d.ts +3 -0
  46. package/lib/types/index.d.ts +11 -0
  47. package/lib/{utils → types/utils}/getRequestId.d.ts +0 -0
  48. package/lib/{utils → types/utils}/setResponseHeaders.d.ts +0 -0
  49. package/package.json +34 -21
  50. package/readme.md +283 -66
  51. package/tsconfig.compile.esm.json +12 -0
  52. package/lib/index.d.ts +0 -9
  53. package/lib/index.js +0 -987
  54. package/lib/index.js.map +0 -1
  55. package/lib/index.modern.js +0 -904
  56. package/lib/index.modern.js.map +0 -1
  57. package/lib/services/PlatformServerlessTest.d.ts +0 -41
package/jest.config.js CHANGED
@@ -5,10 +5,10 @@ module.exports = {
5
5
  ...require("@tsed/jest-config")(__dirname, "platform-serverless"),
6
6
  coverageThreshold: {
7
7
  global: {
8
- branches: 83.05,
9
- functions: 93.33,
10
- lines: 96.25,
11
- statements: 95.94
8
+ branches: 83.33,
9
+ functions: 98.63,
10
+ lines: 99.28,
11
+ statements: 98.93
12
12
  }
13
13
  }
14
14
  };
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.PlatformServerless = void 0;
27
+ const core_1 = require("@tsed/core");
28
+ const di_1 = require("@tsed/di");
29
+ const logger_1 = require("@tsed/logger");
30
+ const schema_1 = require("@tsed/schema");
31
+ const ServerlessContext_1 = require("../domain/ServerlessContext");
32
+ const PlatformServerlessHandler_1 = require("./PlatformServerlessHandler");
33
+ const getRequestId_1 = require("../utils/getRequestId");
34
+ /**
35
+ * @platform
36
+ */
37
+ class PlatformServerless {
38
+ constructor() {
39
+ this.name = "PlatformServerless";
40
+ }
41
+ get injector() {
42
+ return this._injector;
43
+ }
44
+ get settings() {
45
+ return this.injector.settings;
46
+ }
47
+ get promise() {
48
+ return this._promise;
49
+ }
50
+ static bootstrap(settings = {}) {
51
+ const platform = new PlatformServerless();
52
+ platform.createInjector(settings);
53
+ return platform;
54
+ }
55
+ handler() {
56
+ return async (event, context) => {
57
+ const [router] = await Promise.all([this.initRouter(), this.init()]);
58
+ const result = router.find(event.httpMethod, event.path);
59
+ if (result) {
60
+ const { handler, params } = result;
61
+ event.pathParameters = {
62
+ ...(event.pathParameters || {}),
63
+ ...params
64
+ };
65
+ return handler(event, context);
66
+ }
67
+ return {
68
+ statusCode: 404,
69
+ body: "Not found",
70
+ headers: {
71
+ "x-request-id": (0, getRequestId_1.getRequestId)(event, context)
72
+ },
73
+ isBase64Encoded: false
74
+ };
75
+ };
76
+ }
77
+ callbacks(tokens = [], callbacks = {}) {
78
+ return this.settings
79
+ .get("lambda", [])
80
+ .concat(tokens)
81
+ .reduce((callbacks, token) => {
82
+ const routes = (0, schema_1.getOperationsRoutes)(token);
83
+ return routes.reduce((callbacks, operationRoute) => {
84
+ var _a;
85
+ const { operationId, token, propertyName, method, url } = operationRoute;
86
+ // istanbul ignore next
87
+ if (method === "USE") {
88
+ return callbacks;
89
+ }
90
+ const callback = this.callback(token, propertyName);
91
+ (_a = this._router) === null || _a === void 0 ? void 0 : _a.on(method, url, callback);
92
+ return {
93
+ ...callbacks,
94
+ [operationId]: callback
95
+ };
96
+ }, callbacks);
97
+ }, callbacks);
98
+ }
99
+ async ready() {
100
+ await this.injector.emit("$onReady");
101
+ }
102
+ async stop() {
103
+ await this.injector.emit("$onDestroy");
104
+ return this.injector.destroy();
105
+ }
106
+ async init() {
107
+ if (!this._promise) {
108
+ this._promise = this.loadInjector().then(() => this.ready());
109
+ }
110
+ return this._promise;
111
+ }
112
+ callback(token, propertyKey) {
113
+ const entity = schema_1.JsonEntityStore.fromMethod(token, propertyKey);
114
+ let handler;
115
+ return async (event, context) => {
116
+ await this.init();
117
+ if (!handler) {
118
+ const platformHandler = this.injector.get(PlatformServerlessHandler_1.PlatformServerlessHandler);
119
+ handler = await platformHandler.createHandler(token, propertyKey);
120
+ }
121
+ const $ctx = new ServerlessContext_1.ServerlessContext({
122
+ event,
123
+ context,
124
+ id: (0, getRequestId_1.getRequestId)(event, context),
125
+ logger: this.injector.logger,
126
+ injector: this.injector,
127
+ endpoint: entity
128
+ });
129
+ return handler($ctx);
130
+ };
131
+ }
132
+ async initRouter() {
133
+ if (!this._router) {
134
+ const { default: FindMyMay } = await Promise.resolve().then(() => __importStar(require("find-my-way")));
135
+ this._router = FindMyMay({ caseSensitive: false, ignoreTrailingSlash: true });
136
+ this.callbacks();
137
+ }
138
+ return this._router;
139
+ }
140
+ createInjector(settings) {
141
+ var _a;
142
+ this._injector = new di_1.InjectorService();
143
+ this.injector.logger = logger_1.$log;
144
+ this.injector.settings.set(settings);
145
+ // istanbul ignore next
146
+ if (this.injector.settings.get("env") === core_1.Env.TEST && !((_a = settings === null || settings === void 0 ? void 0 : settings.logger) === null || _a === void 0 ? void 0 : _a.level)) {
147
+ logger_1.$log.stop();
148
+ }
149
+ return this;
150
+ }
151
+ async loadInjector() {
152
+ const container = (0, di_1.createContainer)();
153
+ (0, di_1.setLoggerLevel)(this.injector);
154
+ await this.injector.emit("$beforeInit");
155
+ await this.injector.load(container);
156
+ await this.injector.emit("$afterInit");
157
+ }
158
+ }
159
+ exports.PlatformServerless = PlatformServerless;
160
+ //# sourceMappingURL=PlatformServerless.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlatformServerless.js","sourceRoot":"","sources":["../../../src/builder/PlatformServerless.ts"],"names":[],"mappings":"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","sourcesContent":["import {Env, Type} from \"@tsed/core\";\nimport {createContainer, InjectorService, setLoggerLevel} from \"@tsed/di\";\nimport {$log, Logger} from \"@tsed/logger\";\nimport {getOperationsRoutes, JsonEntityStore} from \"@tsed/schema\";\nimport type {HTTPMethod, Instance} from \"find-my-way\";\nimport type {APIGatewayProxyResult, Handler} from \"aws-lambda\";\nimport {ServerlessContext} from \"../domain/ServerlessContext\";\nimport {PlatformServerlessHandler} from \"./PlatformServerlessHandler\";\nimport {getRequestId} from \"../utils/getRequestId\";\n\nexport interface PlatformServerlessSettings extends Partial<TsED.Configuration> {\n lambda?: Type[];\n}\n\n/**\n * @platform\n */\nexport class PlatformServerless {\n readonly name: string = \"PlatformServerless\";\n\n private _injector: InjectorService;\n private _router: Instance<any>;\n private _promise: Promise<any>;\n\n get injector(): InjectorService {\n return this._injector;\n }\n\n get settings() {\n return this.injector.settings;\n }\n\n get promise() {\n return this._promise;\n }\n\n static bootstrap(settings: Partial<TsED.Configuration> & {lambda?: Type[]} = {}): PlatformServerless {\n const platform = new PlatformServerless();\n platform.createInjector(settings);\n\n return platform;\n }\n\n public handler(): Handler {\n return async (event, context) => {\n const [router] = await Promise.all([this.initRouter(), this.init()]);\n const result = router.find(event.httpMethod as any, event.path);\n\n if (result) {\n const {handler, params} = result;\n\n event.pathParameters = {\n ...(event.pathParameters || {}),\n ...params\n };\n\n return (handler as any)(event, context);\n }\n\n return {\n statusCode: 404,\n body: \"Not found\",\n headers: {\n \"x-request-id\": getRequestId(event, context)\n },\n isBase64Encoded: false\n };\n };\n }\n\n public callbacks(tokens: Type | Type[] = [], callbacks: any = {}): Record<string, Handler> {\n return this.settings\n .get<Type[]>(\"lambda\", [])\n .concat(tokens)\n .reduce((callbacks, token) => {\n const routes = getOperationsRoutes(token);\n\n return routes.reduce((callbacks, operationRoute) => {\n const {operationId, token, propertyName, method, url} = operationRoute;\n\n // istanbul ignore next\n if (method === \"USE\") {\n return callbacks;\n }\n\n const callback = this.callback(token, propertyName);\n\n this._router?.on(method as HTTPMethod, url as string, callback as any);\n\n return {\n ...callbacks,\n [operationId]: callback\n };\n }, callbacks);\n }, callbacks);\n }\n\n public async ready() {\n await this.injector.emit(\"$onReady\");\n }\n\n public async stop() {\n await this.injector.emit(\"$onDestroy\");\n return this.injector.destroy();\n }\n\n public async init() {\n if (!this._promise) {\n this._promise = this.loadInjector().then(() => this.ready());\n }\n\n return this._promise;\n }\n\n protected callback(token: Type<any>, propertyKey: string): Handler {\n const entity = JsonEntityStore.fromMethod(token, propertyKey);\n let handler: ($ctx: ServerlessContext) => Promise<APIGatewayProxyResult>;\n\n return async (event, context) => {\n await this.init();\n\n if (!handler) {\n const platformHandler = this.injector.get<PlatformServerlessHandler>(PlatformServerlessHandler)!;\n handler = await platformHandler.createHandler(token, propertyKey);\n }\n\n const $ctx = new ServerlessContext({\n event,\n context,\n id: getRequestId(event, context),\n logger: this.injector.logger as Logger,\n injector: this.injector,\n endpoint: entity\n });\n\n return handler($ctx);\n };\n }\n\n protected async initRouter() {\n if (!this._router) {\n const {default: FindMyMay} = await import(\"find-my-way\");\n\n this._router = FindMyMay({caseSensitive: false, ignoreTrailingSlash: true});\n\n this.callbacks();\n }\n\n return this._router;\n }\n\n protected createInjector(settings: any) {\n this._injector = new InjectorService();\n this.injector.logger = $log;\n this.injector.settings.set(settings);\n\n // istanbul ignore next\n if (this.injector.settings.get(\"env\") === Env.TEST && !settings?.logger?.level) {\n $log.stop();\n }\n\n return this;\n }\n\n protected async loadInjector() {\n const container = createContainer();\n\n setLoggerLevel(this.injector);\n\n await this.injector.emit(\"$beforeInit\");\n\n await this.injector.load(container);\n\n await this.injector.emit(\"$afterInit\");\n }\n}\n"]}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PlatformServerlessHandler = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const core_1 = require("@tsed/core");
6
+ const di_1 = require("@tsed/di");
7
+ const json_mapper_1 = require("@tsed/json-mapper");
8
+ const platform_params_1 = require("@tsed/platform-params");
9
+ const setResponseHeaders_1 = require("../utils/setResponseHeaders");
10
+ let PlatformServerlessHandler = class PlatformServerlessHandler {
11
+ createHandler(token, propertyKey) {
12
+ const promisedHandler = this.params.compileHandler({
13
+ token,
14
+ propertyKey
15
+ });
16
+ return async ($ctx) => {
17
+ await this.injector.emit("$onRequest", $ctx);
18
+ await (0, di_1.runInContext)($ctx, async () => {
19
+ try {
20
+ const resolver = new core_1.AnyToPromise();
21
+ const handler = await promisedHandler;
22
+ const result = await resolver.call(() => handler({ $ctx }));
23
+ this.processResult(result, $ctx);
24
+ }
25
+ catch (er) {
26
+ $ctx.response.status(500).body(er);
27
+ const exceptions = await this.exceptionsManager;
28
+ await exceptions.catch(er, $ctx);
29
+ }
30
+ });
31
+ await this.injector.emit("$onResponse", $ctx);
32
+ return this.flush($ctx);
33
+ };
34
+ }
35
+ flush($ctx) {
36
+ (0, setResponseHeaders_1.setResponseHeaders)($ctx);
37
+ let body = $ctx.response.getBody();
38
+ if ((0, core_1.isSerializable)(body)) {
39
+ $ctx.response.set("content-type", "application/json");
40
+ body = JSON.stringify(body);
41
+ }
42
+ const response = {
43
+ statusCode: $ctx.response.getStatus(),
44
+ body: body === undefined ? "" : body,
45
+ headers: {
46
+ ...$ctx.response.getHeaders(),
47
+ "x-request-id": $ctx.id
48
+ },
49
+ isBase64Encoded: false
50
+ };
51
+ $ctx.destroy();
52
+ return response;
53
+ }
54
+ processResult({ status, headers, data }, $ctx) {
55
+ if (status) {
56
+ $ctx.response.status(status);
57
+ }
58
+ if (headers) {
59
+ $ctx.response.setHeaders(headers);
60
+ }
61
+ if (data !== undefined) {
62
+ data = $ctx.response.getStatus() !== 204 ? data : "";
63
+ if ((0, core_1.isSerializable)(data)) {
64
+ data = (0, json_mapper_1.serialize)(data, {
65
+ ...$ctx.endpoint.getResponseOptions($ctx.response.getStatus()),
66
+ useAlias: true,
67
+ endpoint: true
68
+ });
69
+ }
70
+ $ctx.response.body(data);
71
+ }
72
+ }
73
+ };
74
+ tslib_1.__decorate([
75
+ (0, di_1.Inject)(),
76
+ tslib_1.__metadata("design:type", di_1.InjectorService)
77
+ ], PlatformServerlessHandler.prototype, "injector", void 0);
78
+ tslib_1.__decorate([
79
+ (0, di_1.Inject)(),
80
+ tslib_1.__metadata("design:type", platform_params_1.PlatformParams)
81
+ ], PlatformServerlessHandler.prototype, "params", void 0);
82
+ tslib_1.__decorate([
83
+ (0, di_1.LazyInject)("PlatformExceptions", () => Promise.resolve().then(() => tslib_1.__importStar(require("@tsed/platform-exceptions")))),
84
+ tslib_1.__metadata("design:type", Promise)
85
+ ], PlatformServerlessHandler.prototype, "exceptionsManager", void 0);
86
+ PlatformServerlessHandler = tslib_1.__decorate([
87
+ (0, di_1.Injectable)({
88
+ scope: di_1.ProviderScope.SINGLETON,
89
+ imports: [platform_params_1.DeserializerPipe, platform_params_1.ValidationPipe]
90
+ })
91
+ ], PlatformServerlessHandler);
92
+ exports.PlatformServerlessHandler = PlatformServerlessHandler;
93
+ //# sourceMappingURL=PlatformServerlessHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlatformServerlessHandler.js","sourceRoot":"","sources":["../../../src/builder/PlatformServerlessHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import {AnyPromiseResult, AnyToPromise, isSerializable} from \"@tsed/core\";\nimport {BaseContext, Inject, Injectable, InjectorService, LazyInject, ProviderScope, runInContext, TokenProvider} from \"@tsed/di\";\nimport {serialize} from \"@tsed/json-mapper\";\nimport {DeserializerPipe, PlatformParams, ValidationPipe} from \"@tsed/platform-params\";\nimport type {PlatformExceptions} from \"@tsed/platform-exceptions\";\nimport {ServerlessContext} from \"../domain/ServerlessContext\";\nimport {setResponseHeaders} from \"../utils/setResponseHeaders\";\n\n@Injectable({\n scope: ProviderScope.SINGLETON,\n imports: [DeserializerPipe, ValidationPipe]\n})\nexport class PlatformServerlessHandler {\n @Inject()\n protected injector: InjectorService;\n\n @Inject()\n protected params: PlatformParams;\n\n @LazyInject(\"PlatformExceptions\", () => import(\"@tsed/platform-exceptions\"))\n protected exceptionsManager: Promise<PlatformExceptions>;\n\n createHandler(token: TokenProvider, propertyKey: string | symbol) {\n const promisedHandler = this.params.compileHandler({\n token,\n propertyKey\n });\n\n return async ($ctx: ServerlessContext) => {\n await this.injector.emit(\"$onRequest\", $ctx);\n\n await runInContext($ctx as any, async () => {\n try {\n const resolver = new AnyToPromise();\n const handler = await promisedHandler;\n const result = await resolver.call(() => handler({$ctx}));\n\n this.processResult(result, $ctx);\n } catch (er) {\n $ctx.response.status(500).body(er);\n const exceptions = await this.exceptionsManager;\n\n await exceptions.catch(er, $ctx as unknown as BaseContext);\n }\n });\n\n await this.injector.emit(\"$onResponse\", $ctx);\n\n return this.flush($ctx);\n };\n }\n\n private flush($ctx: ServerlessContext) {\n setResponseHeaders($ctx);\n\n let body: any = $ctx.response.getBody();\n\n if (isSerializable(body)) {\n $ctx.response.set(\"content-type\", \"application/json\");\n body = JSON.stringify(body);\n }\n\n const response = {\n statusCode: $ctx.response.getStatus(),\n body: body === undefined ? \"\" : body,\n headers: {\n ...$ctx.response.getHeaders(),\n \"x-request-id\": $ctx.id\n },\n isBase64Encoded: false\n };\n\n $ctx.destroy();\n\n return response;\n }\n\n private processResult({status, headers, data}: AnyPromiseResult, $ctx: ServerlessContext) {\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 data = $ctx.response.getStatus() !== 204 ? data : \"\";\n\n if (isSerializable(data)) {\n data = serialize(data, {\n ...$ctx.endpoint.getResponseOptions($ctx.response.getStatus()),\n useAlias: true,\n endpoint: true\n });\n }\n\n $ctx.response.body(data);\n }\n }\n}\n"]}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ServerlessContext = void 0;
4
+ const di_1 = require("@tsed/di");
5
+ const ServerlessRequest_1 = require("./ServerlessRequest");
6
+ const ServerlessResponse_1 = require("./ServerlessResponse");
7
+ class ServerlessContext extends di_1.DIContext {
8
+ constructor({ event, context, endpoint, ...options }) {
9
+ super({
10
+ ...options,
11
+ maxStackSize: 0
12
+ });
13
+ this.context = context;
14
+ this.event = event;
15
+ this.request = new ServerlessRequest_1.ServerlessRequest({ event, context });
16
+ this.response = new ServerlessResponse_1.ServerlessResponse({ event, context, request: this.request });
17
+ this.endpoint = endpoint;
18
+ }
19
+ async destroy() {
20
+ await super.destroy();
21
+ this.request.destroy();
22
+ this.response.destroy();
23
+ }
24
+ }
25
+ exports.ServerlessContext = ServerlessContext;
26
+ //# sourceMappingURL=ServerlessContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerlessContext.js","sourceRoot":"","sources":["../../../src/domain/ServerlessContext.ts"],"names":[],"mappings":";;;AAAA,iCAAqD;AAGrD,2DAAsD;AACtD,6DAAwD;AAQxD,MAAa,iBAAkB,SAAQ,cAAS;IAO9C,YAAY,EAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,EAA2B;QAC1E,KAAK,CAAC;YACJ,GAAG,OAAO;YACV,YAAY,EAAE,CAAC;SAChB,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,qCAAiB,CAAC,EAAC,KAAK,EAAE,OAAO,EAAC,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,GAAG,IAAI,uCAAkB,CAAC,EAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAC,CAAC,CAAC;QAChF,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QAEtB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;CACF;AAzBD,8CAyBC","sourcesContent":["import {DIContext, DIContextOptions} from \"@tsed/di\";\nimport {JsonEntityStore} from \"@tsed/schema\";\nimport {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, Context} from \"aws-lambda\";\nimport {ServerlessRequest} from \"./ServerlessRequest\";\nimport {ServerlessResponse} from \"./ServerlessResponse\";\n\nexport interface ServerlessContextOptions extends DIContextOptions {\n event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n context: Context;\n endpoint: JsonEntityStore;\n}\n\nexport class ServerlessContext extends DIContext {\n readonly response: ServerlessResponse;\n readonly request: ServerlessRequest;\n readonly context: Context;\n readonly event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n readonly endpoint: JsonEntityStore;\n\n constructor({event, context, endpoint, ...options}: ServerlessContextOptions) {\n super({\n ...options,\n maxStackSize: 0\n });\n this.context = context;\n this.event = event;\n this.request = new ServerlessRequest({event, context});\n this.response = new ServerlessResponse({event, context, request: this.request});\n this.endpoint = endpoint;\n }\n\n async destroy() {\n await super.destroy();\n\n this.request.destroy();\n this.response.destroy();\n }\n}\n"]}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ServerlessRequest = void 0;
4
+ const core_1 = require("@tsed/core");
5
+ /**
6
+ * @platform
7
+ */
8
+ class ServerlessRequest {
9
+ constructor({ event }) {
10
+ this.raw = event;
11
+ }
12
+ get secure() {
13
+ return true;
14
+ }
15
+ get host() {
16
+ return this.get("host");
17
+ }
18
+ get protocol() {
19
+ return "https";
20
+ }
21
+ /**
22
+ * Get the url of the request.
23
+ *
24
+ * Is equivalent of `express.response.originalUrl || express.response.url`.
25
+ */
26
+ get url() {
27
+ return this.raw.path;
28
+ }
29
+ get headers() {
30
+ return this.raw.headers;
31
+ }
32
+ get method() {
33
+ return this.raw.httpMethod;
34
+ }
35
+ /**
36
+ * Contains key-value pairs of data submitted in the request body. By default, it is `undefined`, and is populated when you use
37
+ * `body-parsing` middleware such as `express.json()` or `express.urlencoded()`.
38
+ */
39
+ get body() {
40
+ try {
41
+ return this.raw.body ? JSON.parse(this.raw.body) : {};
42
+ }
43
+ catch (er) {
44
+ return this.raw.body;
45
+ }
46
+ }
47
+ get rawBody() {
48
+ return this.raw.body;
49
+ }
50
+ /**
51
+ * This property is an object containing properties mapped to the named route `parameters`.
52
+ * For example, if you have the route `/user/:name`, then the `name` property is available as `req.params.name`.
53
+ * This object defaults to `{}`.
54
+ */
55
+ get params() {
56
+ return this.raw.pathParameters || {};
57
+ }
58
+ /**
59
+ * This property is an object containing a property for each query string parameter in the route.
60
+ * When query parser is set to disabled, it is an empty object `{}`, otherwise it is the result of the configured query parser.
61
+ */
62
+ get query() {
63
+ return this.raw.queryStringParameters || {};
64
+ }
65
+ /**
66
+ * Returns the HTTP request header specified by field. The match is case-insensitive.
67
+ *
68
+ * ```typescript
69
+ * request.get('Content-Type') // => "text/plain"
70
+ * ```
71
+ *
72
+ * @param name
73
+ */
74
+ get(name) {
75
+ return (0, core_1.getValue)(this.raw.headers, name);
76
+ }
77
+ destroy() { }
78
+ }
79
+ exports.ServerlessRequest = ServerlessRequest;
80
+ //# sourceMappingURL=ServerlessRequest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerlessRequest.js","sourceRoot":"","sources":["../../../src/domain/ServerlessRequest.ts"],"names":[],"mappings":";;;AACA,qCAAoC;AAMpC;;GAEG;AACH,MAAa,iBAAiB;IAG5B,YAAY,EAAC,KAAK,EAA2B;QAC3C,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;IACnB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,IAAI,IAAI;QACN,IAAI;YACF,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACvD;QAAC,OAAO,EAAE,EAAE;YACX,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;SACtB;IACH,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC;IAC9C,CAAC;IAED;;;;;;;;OAQG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAA,eAAQ,EAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,KAAI,CAAC;CACb;AAnFD,8CAmFC","sourcesContent":["import type {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, Context} from \"aws-lambda\";\nimport {getValue} from \"@tsed/core\";\n\nexport interface ServerlessRequestOptions {\n event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n context: Context;\n}\n/**\n * @platform\n */\nexport class ServerlessRequest {\n readonly raw: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n\n constructor({event}: ServerlessRequestOptions) {\n this.raw = event;\n }\n\n get secure(): boolean {\n return true;\n }\n\n get host(): string {\n return this.get(\"host\");\n }\n\n get protocol(): string {\n return \"https\";\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.path;\n }\n\n get headers() {\n return this.raw.headers;\n }\n\n get method(): string {\n return this.raw.httpMethod;\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 try {\n return this.raw.body ? JSON.parse(this.raw.body) : {};\n } catch (er) {\n return this.raw.body;\n }\n }\n\n get rawBody(): any {\n return this.raw.body;\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.pathParameters || {};\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.queryStringParameters || {};\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 getValue(this.raw.headers, name);\n }\n\n destroy() {}\n}\n"]}
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ var _ServerlessResponse_status, _ServerlessResponse_body, _ServerlessResponse_headers, _ServerlessResponse_locals, _ServerlessResponse_isHeadersSent, _ServerlessResponse_endListeners;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ServerlessResponse = void 0;
5
+ const tslib_1 = require("tslib");
6
+ const core_1 = require("@tsed/core");
7
+ const schema_1 = require("@tsed/schema");
8
+ const encodeurl_1 = tslib_1.__importDefault(require("encodeurl"));
9
+ const mime = tslib_1.__importStar(require("mime"));
10
+ /**
11
+ * @platform
12
+ */
13
+ class ServerlessResponse {
14
+ constructor({ event, request }) {
15
+ _ServerlessResponse_status.set(this, 200);
16
+ _ServerlessResponse_body.set(this, undefined);
17
+ _ServerlessResponse_headers.set(this, {});
18
+ _ServerlessResponse_locals.set(this, {});
19
+ _ServerlessResponse_isHeadersSent.set(this, false);
20
+ _ServerlessResponse_endListeners.set(this, []);
21
+ this.event = event;
22
+ this.request = request;
23
+ }
24
+ /**
25
+ * Get the current statusCode
26
+ */
27
+ get statusCode() {
28
+ return tslib_1.__classPrivateFieldGet(this, _ServerlessResponse_status, "f");
29
+ }
30
+ set statusCode(status) {
31
+ tslib_1.__classPrivateFieldSet(this, _ServerlessResponse_status, status, "f");
32
+ }
33
+ /**
34
+ * An object that contains response local variables scoped to the request, and therefore available only to the view(s) rendered during that request / response cycle (if any). Otherwise, this property is identical to app.locals.
35
+ *
36
+ * This property is useful for exposing request-level information such as the request path name, authenticated user, user settings, and so on.
37
+ */
38
+ get locals() {
39
+ return tslib_1.__classPrivateFieldGet(this, _ServerlessResponse_locals, "f");
40
+ }
41
+ get isHeadersSent() {
42
+ return tslib_1.__classPrivateFieldGet(this, _ServerlessResponse_isHeadersSent, "f");
43
+ }
44
+ getStatus() {
45
+ return tslib_1.__classPrivateFieldGet(this, _ServerlessResponse_status, "f");
46
+ }
47
+ /**
48
+ * Sets the HTTP status for the response.
49
+ *
50
+ * @param status
51
+ */
52
+ status(status) {
53
+ tslib_1.__classPrivateFieldSet(this, _ServerlessResponse_status, status, "f");
54
+ return this;
55
+ }
56
+ set(name, value) {
57
+ return this.setHeader(name, value);
58
+ }
59
+ /**
60
+ * Returns the HTTP response header specified by field. The match is case-insensitive.
61
+ *
62
+ * ```typescript
63
+ * response.get('Content-Type') // => "text/plain"
64
+ * ```
65
+ *
66
+ * @param name
67
+ */
68
+ get(name) {
69
+ return (0, core_1.getValue)(tslib_1.__classPrivateFieldGet(this, _ServerlessResponse_headers, "f"), name.toLowerCase());
70
+ }
71
+ getHeaders() {
72
+ return {
73
+ ...tslib_1.__classPrivateFieldGet(this, _ServerlessResponse_headers, "f")
74
+ };
75
+ }
76
+ hasStatus() {
77
+ return tslib_1.__classPrivateFieldGet(this, _ServerlessResponse_status, "f") !== 200;
78
+ }
79
+ /**
80
+ * Set header `field` to `val`, or pass
81
+ * an object of header fields.
82
+ *
83
+ * Examples:
84
+ * ```typescript
85
+ * response.setHeaders({ Accept: 'text/plain', 'X-API-Key': 'tobi' });
86
+ * ```
87
+ *
88
+ * Aliased as `res.header()`.
89
+ */
90
+ setHeaders(headers) {
91
+ // apply headers
92
+ Object.entries(headers).forEach(([key, item]) => {
93
+ this.setHeader(key, item);
94
+ });
95
+ return this;
96
+ }
97
+ setHeader(key, item) {
98
+ if (item !== null && item !== undefined) {
99
+ key = key.toLowerCase();
100
+ if (key === "location") {
101
+ // "back" is an alias for the referrer
102
+ if (item === "back") {
103
+ item = this.request.get("Referrer") || "/";
104
+ }
105
+ item = (0, encodeurl_1.default)(String(item));
106
+ }
107
+ tslib_1.__classPrivateFieldSet(this, _ServerlessResponse_headers, {
108
+ ...tslib_1.__classPrivateFieldGet(this, _ServerlessResponse_headers, "f"),
109
+ [key.toLowerCase()]: item
110
+ }, "f");
111
+ }
112
+ return this;
113
+ }
114
+ /**
115
+ * Set `Content-Type` response header with `type` through `mime.lookup()`
116
+ * when it does not contain "/", or set the Content-Type to `type` otherwise.
117
+ *
118
+ * Examples:
119
+ *
120
+ * res.type('.html');
121
+ * res.type('html');
122
+ * res.type('json');
123
+ * res.type('application/json');
124
+ * res.type('png');
125
+ */
126
+ contentType(contentType) {
127
+ this.setHeader("Content-Type", mime.getType(contentType));
128
+ return this;
129
+ }
130
+ contentLength(length) {
131
+ this.setHeader("Content-Length", length);
132
+ return this;
133
+ }
134
+ getContentLength() {
135
+ if (this.get("Content-Length")) {
136
+ return parseInt(this.get("Content-Length"), 10) || 0;
137
+ }
138
+ }
139
+ getContentType() {
140
+ return String(this.get("Content-Type") || "").split(";")[0];
141
+ }
142
+ /**
143
+ * Redirects to the URL derived from the specified path, with specified status, a positive integer that corresponds to an [HTTP status code](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html).
144
+ * If not specified, status defaults to `302 Found`.
145
+ *
146
+ * @param status
147
+ * @param url
148
+ */
149
+ redirect(status, url) {
150
+ // Set location header
151
+ const address = this.location(url).get("Location");
152
+ const body = `${(0, schema_1.getStatusMessage)(status)}. Redirecting to ${address}`;
153
+ this.status(status).set("Content-Length", Buffer.byteLength(body)).body(body);
154
+ return this;
155
+ }
156
+ /**
157
+ * Sets the response Location HTTP header to the specified path parameter.
158
+ *
159
+ * @param url
160
+ */
161
+ location(url) {
162
+ return this.set("Location", url);
163
+ }
164
+ /**
165
+ * Send any data to your consumer.
166
+ *
167
+ * This method accept a ReadableStream, a plain object, boolean, string, number, null and undefined data.
168
+ * It choose the better way to send the data.
169
+ *
170
+ * @param body
171
+ */
172
+ body(body) {
173
+ tslib_1.__classPrivateFieldSet(this, _ServerlessResponse_body, body, "f");
174
+ return this;
175
+ }
176
+ getBody() {
177
+ return tslib_1.__classPrivateFieldGet(this, _ServerlessResponse_body, "f");
178
+ }
179
+ isDone() {
180
+ return tslib_1.__classPrivateFieldGet(this, _ServerlessResponse_isHeadersSent, "f");
181
+ }
182
+ onEnd(cb) {
183
+ tslib_1.__classPrivateFieldGet(this, _ServerlessResponse_endListeners, "f").push(cb);
184
+ return this;
185
+ }
186
+ destroy() {
187
+ tslib_1.__classPrivateFieldGet(this, _ServerlessResponse_endListeners, "f").forEach((cb) => cb());
188
+ tslib_1.__classPrivateFieldSet(this, _ServerlessResponse_isHeadersSent, true, "f");
189
+ }
190
+ }
191
+ exports.ServerlessResponse = ServerlessResponse;
192
+ _ServerlessResponse_status = new WeakMap(), _ServerlessResponse_body = new WeakMap(), _ServerlessResponse_headers = new WeakMap(), _ServerlessResponse_locals = new WeakMap(), _ServerlessResponse_isHeadersSent = new WeakMap(), _ServerlessResponse_endListeners = new WeakMap();
193
+ //# sourceMappingURL=ServerlessResponse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerlessResponse.js","sourceRoot":"","sources":["../../../src/domain/ServerlessResponse.ts"],"names":[],"mappings":"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","sourcesContent":["import {getValue} from \"@tsed/core\";\nimport {getStatusMessage} from \"@tsed/schema\";\nimport type {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, Context} from \"aws-lambda\";\nimport encodeUrl from \"encodeurl\";\nimport * as mime from \"mime\";\nimport type {ServerlessRequest} from \"./ServerlessRequest\";\n\nexport interface ServerlessResponseOptions {\n event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n context: Context;\n request: ServerlessRequest;\n}\n\nexport type HeaderValue = boolean | number | string;\n\n/**\n * @platform\n */\nexport class ServerlessResponse {\n readonly event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n readonly request: ServerlessRequest;\n\n #status: number = 200;\n #body: any = undefined;\n #headers: Record<string, HeaderValue> = {};\n #locals: Record<string, any> = {};\n #isHeadersSent = false;\n #endListeners: Function[] = [];\n\n constructor({event, request}: ServerlessResponseOptions) {\n this.event = event;\n this.request = request;\n }\n\n /**\n * Get the current statusCode\n */\n get statusCode() {\n return this.#status;\n }\n\n set statusCode(status) {\n this.#status = status;\n }\n\n /**\n * An object that contains response local variables scoped to the request, and therefore available only to the view(s) rendered during that request / response cycle (if any). Otherwise, this property is identical to app.locals.\n *\n * This property is useful for exposing request-level information such as the request path name, authenticated user, user settings, and so on.\n */\n get locals() {\n return this.#locals;\n }\n\n get isHeadersSent() {\n return this.#isHeadersSent;\n }\n\n getStatus() {\n return this.#status;\n }\n\n /**\n * Sets the HTTP status for the response.\n *\n * @param status\n */\n status(status: number) {\n this.#status = status;\n return this;\n }\n\n set(name: string, value: any) {\n return this.setHeader(name, value);\n }\n\n /**\n * Returns the HTTP response header specified by field. The match is case-insensitive.\n *\n * ```typescript\n * response.get('Content-Type') // => \"text/plain\"\n * ```\n *\n * @param name\n */\n get(name: string): string | number | boolean | undefined {\n return getValue(this.#headers, name.toLowerCase());\n }\n\n getHeaders(): Record<string, HeaderValue> {\n return {\n ...this.#headers\n };\n }\n\n hasStatus() {\n return this.#status !== 200;\n }\n\n /**\n * Set header `field` to `val`, or pass\n * an object of header fields.\n *\n * Examples:\n * ```typescript\n * response.setHeaders({ Accept: 'text/plain', 'X-API-Key': 'tobi' });\n * ```\n *\n * Aliased as `res.header()`.\n */\n setHeaders(headers: Record<string, HeaderValue>) {\n // apply headers\n Object.entries(headers).forEach(([key, item]) => {\n this.setHeader(key, item);\n });\n\n return this;\n }\n\n setHeader(key: string, item: HeaderValue | null | undefined) {\n if (item !== null && item !== undefined) {\n key = key.toLowerCase();\n\n if (key === \"location\") {\n // \"back\" is an alias for the referrer\n if (item === \"back\") {\n item = this.request.get(\"Referrer\") || \"/\";\n }\n\n item = encodeUrl(String(item));\n }\n\n this.#headers = {\n ...this.#headers,\n [key.toLowerCase()]: item as any\n };\n }\n\n return this;\n }\n\n /**\n * Set `Content-Type` response header with `type` through `mime.lookup()`\n * when it does not contain \"/\", or set the Content-Type to `type` otherwise.\n *\n * Examples:\n *\n * res.type('.html');\n * res.type('html');\n * res.type('json');\n * res.type('application/json');\n * res.type('png');\n */\n contentType(contentType: string) {\n this.setHeader(\"Content-Type\", mime.getType(contentType));\n\n return this;\n }\n\n contentLength(length: number) {\n this.setHeader(\"Content-Length\", length);\n return this;\n }\n\n getContentLength() {\n if (this.get(\"Content-Length\")) {\n return parseInt(this.get(\"Content-Length\") as any, 10) || 0;\n }\n }\n\n getContentType() {\n return String(this.get(\"Content-Type\") || \"\").split(\";\")[0];\n }\n\n /**\n * Redirects to the URL derived from the specified path, with specified status, a positive integer that corresponds to an [HTTP status code](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html).\n * If not specified, status defaults to `302 Found`.\n *\n * @param status\n * @param url\n */\n redirect(status: number, url: string) {\n // Set location header\n const address = this.location(url).get(\"Location\");\n const body = `${getStatusMessage(status)}. Redirecting to ${address}`;\n\n this.status(status).set(\"Content-Length\", Buffer.byteLength(body)).body(body);\n\n return this;\n }\n\n /**\n * Sets the response Location HTTP header to the specified path parameter.\n *\n * @param url\n */\n location(url: string) {\n return this.set(\"Location\", url);\n }\n\n /**\n * Send any data to your consumer.\n *\n * This method accept a ReadableStream, a plain object, boolean, string, number, null and undefined data.\n * It choose the better way to send the data.\n *\n * @param body\n */\n body(body: any) {\n this.#body = body;\n\n return this;\n }\n\n getBody() {\n return this.#body;\n }\n\n isDone(): boolean {\n return this.#isHeadersSent;\n }\n\n onEnd(cb: Function) {\n this.#endListeners.push(cb);\n\n return this;\n }\n\n destroy() {\n this.#endListeners.forEach((cb: Function) => cb());\n this.#isHeadersSent = true;\n }\n}\n"]}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Lambda = exports.Options = exports.Patch = exports.Head = exports.Delete = exports.Put = exports.Post = exports.Get = void 0;
4
+ const tslib_1 = require("tslib");
5
+ tslib_1.__exportStar(require("@tsed/di"), exports);
6
+ var schema_1 = require("@tsed/schema");
7
+ Object.defineProperty(exports, "Get", { enumerable: true, get: function () { return schema_1.Get; } });
8
+ Object.defineProperty(exports, "Post", { enumerable: true, get: function () { return schema_1.Post; } });
9
+ Object.defineProperty(exports, "Put", { enumerable: true, get: function () { return schema_1.Put; } });
10
+ Object.defineProperty(exports, "Delete", { enumerable: true, get: function () { return schema_1.Delete; } });
11
+ Object.defineProperty(exports, "Head", { enumerable: true, get: function () { return schema_1.Head; } });
12
+ Object.defineProperty(exports, "Patch", { enumerable: true, get: function () { return schema_1.Patch; } });
13
+ Object.defineProperty(exports, "Options", { enumerable: true, get: function () { return schema_1.Options; } });
14
+ Object.defineProperty(exports, "Lambda", { enumerable: true, get: function () { return schema_1.Route; } });
15
+ tslib_1.__exportStar(require("@tsed/platform-params"), exports);
16
+ //# sourceMappingURL=exports.js.map