@tsed/platform-serverless 6.88.1 → 6.89.0

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 (68) hide show
  1. package/lib/{builder → cjs/builder}/PlatformServerless.d.ts +0 -0
  2. package/lib/cjs/builder/PlatformServerless.js +156 -0
  3. package/lib/cjs/builder/PlatformServerless.js.map +1 -0
  4. package/lib/{builder → cjs/builder}/PlatformServerlessHandler.d.ts +0 -0
  5. package/lib/cjs/builder/PlatformServerlessHandler.js +93 -0
  6. package/lib/cjs/builder/PlatformServerlessHandler.js.map +1 -0
  7. package/lib/{domain → cjs/domain}/ServerlessContext.d.ts +0 -0
  8. package/lib/cjs/domain/ServerlessContext.js +26 -0
  9. package/lib/cjs/domain/ServerlessContext.js.map +1 -0
  10. package/lib/{domain → cjs/domain}/ServerlessRequest.d.ts +0 -0
  11. package/lib/cjs/domain/ServerlessRequest.js +80 -0
  12. package/lib/cjs/domain/ServerlessRequest.js.map +1 -0
  13. package/lib/{domain → cjs/domain}/ServerlessResponse.d.ts +0 -0
  14. package/lib/cjs/domain/ServerlessResponse.js +193 -0
  15. package/lib/cjs/domain/ServerlessResponse.js.map +1 -0
  16. package/lib/{index.d.ts → cjs/index.d.ts} +0 -0
  17. package/lib/cjs/index.js +23 -0
  18. package/lib/cjs/index.js.map +1 -0
  19. package/lib/{services → cjs/services}/PlatformServerlessTest.d.ts +0 -0
  20. package/lib/cjs/services/PlatformServerlessTest.js +196 -0
  21. package/lib/cjs/services/PlatformServerlessTest.js.map +1 -0
  22. package/lib/{utils → cjs/utils}/getRequestId.d.ts +0 -0
  23. package/lib/cjs/utils/getRequestId.js +13 -0
  24. package/lib/cjs/utils/getRequestId.js.map +1 -0
  25. package/lib/{utils → cjs/utils}/setResponseHeaders.d.ts +0 -0
  26. package/lib/cjs/utils/setResponseHeaders.js +35 -0
  27. package/lib/cjs/utils/setResponseHeaders.js.map +1 -0
  28. package/lib/esm/builder/PlatformServerless.js +133 -0
  29. package/lib/esm/builder/PlatformServerless.js.map +1 -0
  30. package/lib/esm/builder/PlatformServerlessHandler.js +90 -0
  31. package/lib/esm/builder/PlatformServerlessHandler.js.map +1 -0
  32. package/lib/esm/domain/ServerlessContext.js +22 -0
  33. package/lib/esm/domain/ServerlessContext.js.map +1 -0
  34. package/lib/esm/domain/ServerlessRequest.js +76 -0
  35. package/lib/esm/domain/ServerlessRequest.js.map +1 -0
  36. package/lib/esm/domain/ServerlessResponse.js +189 -0
  37. package/lib/esm/domain/ServerlessResponse.js.map +1 -0
  38. package/lib/esm/index.js +11 -0
  39. package/lib/esm/index.js.map +1 -0
  40. package/lib/esm/services/PlatformServerlessTest.js +191 -0
  41. package/lib/esm/services/PlatformServerlessTest.js.map +1 -0
  42. package/lib/esm/utils/getRequestId.js +9 -0
  43. package/lib/esm/utils/getRequestId.js.map +1 -0
  44. package/lib/esm/utils/setResponseHeaders.js +31 -0
  45. package/lib/esm/utils/setResponseHeaders.js.map +1 -0
  46. package/lib/types/builder/PlatformServerless.d.ts +31 -0
  47. package/lib/types/builder/PlatformServerlessHandler.d.ts +19 -0
  48. package/lib/types/domain/ServerlessContext.d.ts +19 -0
  49. package/lib/types/domain/ServerlessRequest.d.ts +55 -0
  50. package/lib/types/domain/ServerlessResponse.d.ts +105 -0
  51. package/lib/types/index.d.ts +9 -0
  52. package/lib/types/services/PlatformServerlessTest.d.ts +46 -0
  53. package/lib/types/utils/getRequestId.d.ts +2 -0
  54. package/lib/types/utils/setResponseHeaders.d.ts +5 -0
  55. package/package.json +17 -13
  56. package/tsconfig.compile.esm.json +23 -0
  57. package/lib/index-a6c91998.js +0 -955
  58. package/lib/index-a6c91998.js.map +0 -1
  59. package/lib/index-a7574150.js +0 -975
  60. package/lib/index-a7574150.js.map +0 -1
  61. package/lib/index-b255dcf0.js +0 -2350
  62. package/lib/index-b255dcf0.js.map +0 -1
  63. package/lib/index-eeb85309.js +0 -2354
  64. package/lib/index-eeb85309.js.map +0 -1
  65. package/lib/index.js +0 -90
  66. package/lib/index.js.map +0 -1
  67. package/lib/index.modern.js +0 -12
  68. package/lib/index.modern.js.map +0 -1
@@ -0,0 +1,23 @@
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
+ (0, 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
+ (0, tslib_1.__exportStar)(require("@tsed/platform-params"), exports);
16
+ (0, tslib_1.__exportStar)(require("./builder/PlatformServerlessHandler"), exports);
17
+ (0, tslib_1.__exportStar)(require("./builder/PlatformServerless"), exports);
18
+ (0, tslib_1.__exportStar)(require("./services/PlatformServerlessTest"), exports);
19
+ // decorators
20
+ (0, tslib_1.__exportStar)(require("./domain/ServerlessContext"), exports);
21
+ (0, tslib_1.__exportStar)(require("./domain/ServerlessResponse"), exports);
22
+ (0, tslib_1.__exportStar)(require("./domain/ServerlessResponse"), exports);
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;AAAA,wDAAyB;AACzB,uCAA2F;AAAnF,6FAAA,GAAG,OAAA;AAAE,8FAAA,IAAI,OAAA;AAAE,6FAAA,GAAG,OAAA;AAAE,gGAAA,MAAM,OAAA;AAAE,8FAAA,IAAI,OAAA;AAAE,+FAAA,KAAK,OAAA;AAAE,iGAAA,OAAO,OAAA;AAAE,gGAAA,KAAK,OAAU;AACrE,qEAAsC;AAEtC,mFAAoD;AACpD,4EAA6C;AAC7C,iFAAkD;AAElD,aAAa;AACb,0EAA2C;AAC3C,2EAA4C;AAC5C,2EAA4C","sourcesContent":["export * from \"@tsed/di\";\nexport {Get, Post, Put, Delete, Head, Patch, Options, Route as Lambda} from \"@tsed/schema\";\nexport * from \"@tsed/platform-params\";\n\nexport * from \"./builder/PlatformServerlessHandler\";\nexport * from \"./builder/PlatformServerless\";\nexport * from \"./services/PlatformServerlessTest\";\n\n// decorators\nexport * from \"./domain/ServerlessContext\";\nexport * from \"./domain/ServerlessResponse\";\nexport * from \"./domain/ServerlessResponse\";\n"]}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PlatformServerlessTest = exports.LambdaClientRequest = void 0;
4
+ const di_1 = require("@tsed/di");
5
+ const PlatformServerless_1 = require("../builder/PlatformServerless");
6
+ const ServerlessContext_1 = require("../domain/ServerlessContext");
7
+ class LambdaClientRequest extends Promise {
8
+ constructor() {
9
+ super(...arguments);
10
+ this.event = LambdaClientRequest.createFakeEvent();
11
+ this.context = LambdaClientRequest.createFakeContext();
12
+ }
13
+ static call(lambdaName) {
14
+ const resolvers = {};
15
+ const promise = new LambdaClientRequest((resolve, reject) => {
16
+ resolvers.resolve = resolve;
17
+ resolvers.reject = reject;
18
+ });
19
+ promise.init(lambdaName, resolvers.resolve, resolvers.reject);
20
+ return promise;
21
+ }
22
+ static get(path, options = {}) {
23
+ return this.call("handler").get(path, options);
24
+ }
25
+ static post(path, body, options = {}) {
26
+ return this.call("handler").post(path, body, options);
27
+ }
28
+ static put(path, body, options = {}) {
29
+ return this.call("handler").put(path, body, options);
30
+ }
31
+ static patch(path, body, options = {}) {
32
+ return this.call("handler").patch(path, body, options);
33
+ }
34
+ static delete(path, body, options = {}) {
35
+ return this.call("handler").delete(path, body, options);
36
+ }
37
+ static createFakeEvent(event = {}) {
38
+ return {
39
+ body: "",
40
+ headers: {},
41
+ httpMethod: "",
42
+ isBase64Encoded: false,
43
+ multiValueHeaders: {},
44
+ multiValueQueryStringParameters: {},
45
+ path: event.path || "/",
46
+ pathParameters: {},
47
+ queryStringParameters: {},
48
+ resource: "",
49
+ stageVariables: {},
50
+ ...event,
51
+ requestContext: {
52
+ ...event === null || event === void 0 ? void 0 : event.requestContext,
53
+ accountId: "",
54
+ apiId: "",
55
+ protocol: "https",
56
+ httpMethod: "",
57
+ identity: {},
58
+ path: event.path || "/",
59
+ stage: "",
60
+ requestId: "requestId",
61
+ requestTimeEpoch: 0,
62
+ resourceId: 1,
63
+ resourcePath: event.path || "/"
64
+ }
65
+ };
66
+ }
67
+ static createFakeContext(context) {
68
+ return {
69
+ awsRequestId: "awsRequestId",
70
+ callbackWaitsForEmptyEventLoop: false,
71
+ functionName: "",
72
+ functionVersion: "",
73
+ invokedFunctionArn: "",
74
+ logGroupName: "",
75
+ logStreamName: "",
76
+ memoryLimitInMB: "",
77
+ ...(context || {})
78
+ };
79
+ }
80
+ get(path, options = {}) {
81
+ Object.assign(this.event, options);
82
+ this.event.path = path;
83
+ this.event.httpMethod = "GET";
84
+ return this;
85
+ }
86
+ post(path, body = {}, options = {}) {
87
+ Object.assign(this.event, options);
88
+ this.event.path = path;
89
+ this.event.httpMethod = "POST";
90
+ this.body(body);
91
+ return this;
92
+ }
93
+ patch(path, body = {}, options = {}) {
94
+ Object.assign(this.event, options);
95
+ this.event.path = path;
96
+ this.event.httpMethod = "PATCH";
97
+ this.body(body);
98
+ return this;
99
+ }
100
+ put(path, body = {}, options = {}) {
101
+ Object.assign(this.event, options);
102
+ this.event.path = path;
103
+ this.event.httpMethod = "PUT";
104
+ this.body(body);
105
+ return this;
106
+ }
107
+ delete(path, body = {}, options = {}) {
108
+ Object.assign(this.event, options);
109
+ this.event.path = path;
110
+ this.event.httpMethod = "DELETE";
111
+ this.body(body);
112
+ return this;
113
+ }
114
+ query(query) {
115
+ this.event.queryStringParameters = {
116
+ ...this.event.queryStringParameters,
117
+ ...JSON.parse(JSON.stringify(query))
118
+ };
119
+ return this;
120
+ }
121
+ params(pathParameters) {
122
+ this.event.pathParameters = {
123
+ ...this.event.pathParameters,
124
+ ...JSON.parse(JSON.stringify(pathParameters))
125
+ };
126
+ return this;
127
+ }
128
+ headers(headers) {
129
+ this.event.headers = {
130
+ ...this.event.headers,
131
+ ...JSON.parse(JSON.stringify(headers))
132
+ };
133
+ return this;
134
+ }
135
+ body(body) {
136
+ if (body !== undefined) {
137
+ this.event.headers["content-type"] = "application/json";
138
+ this.event.body = JSON.stringify(body);
139
+ }
140
+ return this;
141
+ }
142
+ init(lambda, resolve, reject) {
143
+ setTimeout(async () => {
144
+ try {
145
+ const result = await PlatformServerlessTest.callbacks[lambda](this.event, this.context, resolve);
146
+ resolve(result);
147
+ }
148
+ catch (er) {
149
+ reject(er);
150
+ }
151
+ });
152
+ }
153
+ }
154
+ exports.LambdaClientRequest = LambdaClientRequest;
155
+ class PlatformServerlessTest extends di_1.DITest {
156
+ static bootstrap(settings = {}) {
157
+ return async function before() {
158
+ // @ts-ignore
159
+ const instance = PlatformServerless_1.PlatformServerless.bootstrap(di_1.DITest.configure(settings));
160
+ PlatformServerlessTest.instance = instance;
161
+ PlatformServerlessTest.callbacks = instance.callbacks();
162
+ PlatformServerlessTest.callbacks.handler = instance.handler();
163
+ // used by inject method
164
+ di_1.DITest.injector = instance.injector;
165
+ return instance.promise;
166
+ };
167
+ }
168
+ /**
169
+ * Resets the test injector of the test context, so it won't pollute your next test. Call this in your `tearDown` logic.
170
+ */
171
+ static async reset() {
172
+ if (PlatformServerlessTest.instance) {
173
+ await PlatformServerlessTest.instance.stop();
174
+ }
175
+ if (di_1.DITest.hasInjector()) {
176
+ await di_1.DITest.injector.destroy();
177
+ di_1.DITest._injector = null;
178
+ }
179
+ }
180
+ static createServerlessContext({ endpoint }) {
181
+ const context = LambdaClientRequest.createFakeContext();
182
+ const event = LambdaClientRequest.createFakeEvent();
183
+ return new ServerlessContext_1.ServerlessContext({
184
+ event,
185
+ context,
186
+ id: context.awsRequestId,
187
+ logger: PlatformServerlessTest.injector.logger,
188
+ injector: PlatformServerlessTest.injector,
189
+ endpoint
190
+ });
191
+ }
192
+ }
193
+ exports.PlatformServerlessTest = PlatformServerlessTest;
194
+ PlatformServerlessTest.callbacks = {};
195
+ PlatformServerlessTest.request = LambdaClientRequest;
196
+ //# sourceMappingURL=PlatformServerlessTest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlatformServerlessTest.js","sourceRoot":"","sources":["../../../src/services/PlatformServerlessTest.ts"],"names":[],"mappings":"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","sourcesContent":["import {Type} from \"@tsed/core\";\nimport {DITest} from \"@tsed/di\";\nimport {Logger} from \"@tsed/logger\";\nimport {JsonEntityStore} from \"@tsed/schema\";\nimport {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, APIGatewayProxyHandler, Context} from \"aws-lambda\";\nimport {APIGatewayProxyResult} from \"aws-lambda/trigger/api-gateway-proxy\";\nimport {PlatformServerless} from \"../builder/PlatformServerless\";\nimport {ServerlessContext} from \"../domain/ServerlessContext\";\n\nexport interface LambdaPromiseResult extends Promise<APIGatewayProxyResult> {}\n\nexport class LambdaClientRequest extends Promise<APIGatewayProxyResult> {\n event = LambdaClientRequest.createFakeEvent();\n context = LambdaClientRequest.createFakeContext();\n\n static call(lambdaName: string) {\n const resolvers: any = {};\n const promise = new LambdaClientRequest((resolve, reject) => {\n resolvers.resolve = resolve;\n resolvers.reject = reject;\n });\n\n promise.init(lambdaName, resolvers.resolve, resolvers.reject);\n\n return promise;\n }\n\n static get(path: string, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n return this.call(\"handler\").get(path, options);\n }\n\n static post(path: string, body?: any, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n return this.call(\"handler\").post(path, body, options);\n }\n\n static put(path: string, body?: any, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n return this.call(\"handler\").put(path, body, options);\n }\n\n static patch(path: string, body?: any, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n return this.call(\"handler\").patch(path, body, options);\n }\n\n static delete(path: string, body?: any, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n return this.call(\"handler\").delete(path, body, options);\n }\n\n static createFakeEvent(event: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n return {\n body: \"\",\n headers: {},\n httpMethod: \"\",\n isBase64Encoded: false,\n multiValueHeaders: {},\n multiValueQueryStringParameters: {},\n path: event.path || \"/\",\n pathParameters: {},\n queryStringParameters: {},\n resource: \"\",\n stageVariables: {},\n ...event,\n requestContext: {\n ...event?.requestContext,\n accountId: \"\",\n apiId: \"\",\n protocol: \"https\",\n httpMethod: \"\",\n identity: {} as any,\n path: event.path || \"/\",\n stage: \"\",\n requestId: \"requestId\",\n requestTimeEpoch: 0,\n resourceId: 1,\n resourcePath: event.path || \"/\"\n } as any\n } as APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;\n }\n\n static createFakeContext(context?: Context): Context {\n return {\n awsRequestId: \"awsRequestId\",\n callbackWaitsForEmptyEventLoop: false,\n functionName: \"\",\n functionVersion: \"\",\n invokedFunctionArn: \"\",\n logGroupName: \"\",\n logStreamName: \"\",\n memoryLimitInMB: \"\",\n ...(context || {})\n } as Context;\n }\n\n get(path: string, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"GET\";\n\n return this;\n }\n\n post(path: string, body: any = {}, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"POST\";\n\n this.body(body);\n\n return this;\n }\n\n patch(path: string, body: any = {}, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"PATCH\";\n\n this.body(body);\n\n return this;\n }\n\n put(path: string, body: any = {}, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"PUT\";\n\n this.body(body);\n\n return this;\n }\n\n delete(path: string, body: any = {}, options: Partial<APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>> = {}) {\n Object.assign(this.event, options);\n\n this.event.path = path;\n this.event.httpMethod = \"DELETE\";\n\n this.body(body);\n\n return this;\n }\n\n query(query: any) {\n this.event.queryStringParameters = {\n ...this.event.queryStringParameters,\n ...JSON.parse(JSON.stringify(query))\n };\n\n return this;\n }\n\n params(pathParameters: any) {\n this.event.pathParameters = {\n ...this.event.pathParameters,\n ...JSON.parse(JSON.stringify(pathParameters))\n };\n\n return this;\n }\n\n headers(headers: Record<string, any>) {\n this.event.headers = {\n ...this.event.headers,\n ...JSON.parse(JSON.stringify(headers))\n };\n\n return this;\n }\n\n body(body: any) {\n if (body !== undefined) {\n this.event.headers[\"content-type\"] = \"application/json\";\n\n this.event.body = JSON.stringify(body);\n }\n\n return this;\n }\n\n protected init(lambda: string, resolve: Function, reject: Function) {\n setTimeout(async () => {\n try {\n const result = await PlatformServerlessTest.callbacks[lambda](this.event, this.context, resolve as any);\n resolve(result as any);\n } catch (er) {\n reject(er);\n }\n });\n }\n}\n\nexport class PlatformServerlessTest extends DITest {\n static callbacks: Record<string, APIGatewayProxyHandler> = {};\n static instance: PlatformServerless;\n static request = LambdaClientRequest;\n\n static bootstrap(settings: Partial<TsED.Configuration & {lambda: Type[]}> = {}) {\n return async function before(): Promise<void> {\n // @ts-ignore\n const instance = PlatformServerless.bootstrap(DITest.configure(settings));\n PlatformServerlessTest.instance = instance;\n PlatformServerlessTest.callbacks = instance.callbacks();\n PlatformServerlessTest.callbacks.handler = instance.handler();\n // used by inject method\n DITest.injector = instance.injector;\n\n return instance.promise;\n };\n }\n\n /**\n * Resets the test injector of the test context, so it won't pollute your next test. Call this in your `tearDown` logic.\n */\n static async reset() {\n if (PlatformServerlessTest.instance) {\n await PlatformServerlessTest.instance.stop();\n }\n if (DITest.hasInjector()) {\n await DITest.injector.destroy();\n DITest._injector = null;\n }\n }\n\n static createServerlessContext({endpoint}: {endpoint: JsonEntityStore}) {\n const context: any = LambdaClientRequest.createFakeContext();\n const event: any = LambdaClientRequest.createFakeEvent();\n\n return new ServerlessContext({\n event,\n context,\n id: context.awsRequestId,\n logger: PlatformServerlessTest.injector.logger as Logger,\n injector: PlatformServerlessTest.injector,\n endpoint\n });\n }\n}\n"]}
File without changes
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getRequestId = void 0;
4
+ const uuid_1 = require("uuid");
5
+ function getRequestId(event, context) {
6
+ var _a;
7
+ if ((event === null || event === void 0 ? void 0 : event.headers) && event.headers["x-request-id"]) {
8
+ return event.headers["x-request-id"];
9
+ }
10
+ return ((_a = event === null || event === void 0 ? void 0 : event.requestContext) === null || _a === void 0 ? void 0 : _a.requestId) || (context === null || context === void 0 ? void 0 : context.awsRequestId) || (0, uuid_1.v4)().replace(/-/gi, "");
11
+ }
12
+ exports.getRequestId = getRequestId;
13
+ //# sourceMappingURL=getRequestId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getRequestId.js","sourceRoot":"","sources":["../../../src/utils/getRequestId.ts"],"names":[],"mappings":";;;AACA,+BAAwB;AAExB,SAAgB,YAAY,CAAC,KAAwE,EAAE,OAAgB;;IACrH,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,KAAI,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE;QACnD,OAAO,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;KACtC;IAED,OAAO,CAAA,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,cAAc,0CAAE,SAAS,MAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,YAAY,CAAA,IAAI,IAAA,SAAE,GAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC9F,CAAC;AAND,oCAMC","sourcesContent":["import {APIGatewayEventDefaultAuthorizerContext, APIGatewayProxyEventBase, Context} from \"aws-lambda\";\nimport {v4} from \"uuid\";\n\nexport function getRequestId(event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>, context: Context) {\n if (event?.headers && event.headers[\"x-request-id\"]) {\n return event.headers[\"x-request-id\"];\n }\n\n return event?.requestContext?.requestId || context?.awsRequestId || v4().replace(/-/gi, \"\");\n}\n"]}
File without changes
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setResponseHeaders = void 0;
4
+ function mergeHeaders(specHeaders, headers) {
5
+ return Object.entries(specHeaders).reduce((headers, [key, item]) => {
6
+ key = key.toLowerCase();
7
+ return {
8
+ ...headers,
9
+ [key]: headers[key] === undefined ? String(item.example) : headers[key]
10
+ };
11
+ }, headers);
12
+ }
13
+ /**
14
+ * @ignore
15
+ */
16
+ function setResponseHeaders(ctx) {
17
+ const { response, endpoint } = ctx;
18
+ const operation = endpoint.operation;
19
+ if (response.isDone()) {
20
+ return;
21
+ }
22
+ if (!response.hasStatus()) {
23
+ // apply status only if the isn't already modified
24
+ response.status(operation.getStatus());
25
+ }
26
+ const statusCode = response.statusCode;
27
+ const headers = operation.getHeadersOf(response.statusCode);
28
+ const mergedHeaders = mergeHeaders(headers, response.getHeaders());
29
+ response.setHeaders(mergedHeaders);
30
+ if (operation.isRedirection(statusCode)) {
31
+ response.redirect(statusCode, String(mergedHeaders["location"]));
32
+ }
33
+ }
34
+ exports.setResponseHeaders = setResponseHeaders;
35
+ //# sourceMappingURL=setResponseHeaders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setResponseHeaders.js","sourceRoot":"","sources":["../../../src/utils/setResponseHeaders.ts"],"names":[],"mappings":";;;AAIA,SAAS,YAAY,CAAC,WAA2D,EAAE,OAAoC;IACrH,OAAO,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;QACjE,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QACxB,OAAO;YACL,GAAG,OAAO;YACV,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;SACxE,CAAC;IACJ,CAAC,EAAE,OAAO,CAAC,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,GAAsB;IACvD,MAAM,EAAC,QAAQ,EAAE,QAAQ,EAAC,GAAG,GAAG,CAAC;IACjC,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAU,CAAC;IAEtC,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE;QACrB,OAAO;KACR;IAED,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE;QACzB,kDAAkD;QAClD,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;KACxC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;IACvC,MAAM,OAAO,GAAG,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAEnE,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAEnC,IAAI,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE;QACvC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;KAClE;AACH,CAAC;AAtBD,gDAsBC","sourcesContent":["import {JsonHeader} from \"@tsed/schema\";\nimport {ServerlessContext} from \"../domain/ServerlessContext\";\nimport {HeaderValue} from \"../domain/ServerlessResponse\";\n\nfunction mergeHeaders(specHeaders: Record<string, JsonHeader & {example: string}>, headers: Record<string, HeaderValue>) {\n return Object.entries(specHeaders).reduce((headers, [key, item]) => {\n key = key.toLowerCase();\n return {\n ...headers,\n [key]: headers[key] === undefined ? String(item.example) : headers[key]\n };\n }, headers);\n}\n\n/**\n * @ignore\n */\nexport function setResponseHeaders(ctx: ServerlessContext) {\n const {response, endpoint} = ctx;\n const operation = endpoint.operation!;\n\n if (response.isDone()) {\n return;\n }\n\n if (!response.hasStatus()) {\n // apply status only if the isn't already modified\n response.status(operation.getStatus());\n }\n\n const statusCode = response.statusCode;\n const headers = operation.getHeadersOf(response.statusCode);\n const mergedHeaders = mergeHeaders(headers, response.getHeaders());\n\n response.setHeaders(mergedHeaders);\n\n if (operation.isRedirection(statusCode)) {\n response.redirect(statusCode, String(mergedHeaders[\"location\"]));\n }\n}\n"]}
@@ -0,0 +1,133 @@
1
+ import { Env } from "@tsed/core";
2
+ import { createContainer, InjectorService, setLoggerLevel } from "@tsed/di";
3
+ import { $log } from "@tsed/logger";
4
+ import { getOperationsRoutes, JsonEntityStore } from "@tsed/schema";
5
+ import { ServerlessContext } from "../domain/ServerlessContext";
6
+ import { PlatformServerlessHandler } from "./PlatformServerlessHandler";
7
+ import { getRequestId } from "../utils/getRequestId";
8
+ /**
9
+ * @platform
10
+ */
11
+ export class PlatformServerless {
12
+ constructor() {
13
+ this.name = "PlatformServerless";
14
+ }
15
+ get injector() {
16
+ return this._injector;
17
+ }
18
+ get settings() {
19
+ return this.injector.settings;
20
+ }
21
+ get promise() {
22
+ return this._promise;
23
+ }
24
+ static bootstrap(settings = {}) {
25
+ const platform = new PlatformServerless();
26
+ platform.createInjector(settings);
27
+ return platform;
28
+ }
29
+ handler() {
30
+ return async (event, context) => {
31
+ const [router] = await Promise.all([this.initRouter(), this.init()]);
32
+ const result = router.find(event.httpMethod, event.path);
33
+ if (result) {
34
+ const { handler, params } = result;
35
+ event.pathParameters = {
36
+ ...(event.pathParameters || {}),
37
+ ...params
38
+ };
39
+ return handler(event, context);
40
+ }
41
+ return {
42
+ statusCode: 404,
43
+ body: "Not found",
44
+ headers: {
45
+ "x-request-id": getRequestId(event, context)
46
+ },
47
+ isBase64Encoded: false
48
+ };
49
+ };
50
+ }
51
+ callbacks(tokens = [], callbacks = {}) {
52
+ return this.settings
53
+ .get("lambda", [])
54
+ .concat(tokens)
55
+ .reduce((callbacks, token) => {
56
+ const routes = getOperationsRoutes(token);
57
+ return routes.reduce((callbacks, operationRoute) => {
58
+ var _a;
59
+ const { operationId, token, propertyName, method, url } = operationRoute;
60
+ // istanbul ignore next
61
+ if (method === "USE") {
62
+ return callbacks;
63
+ }
64
+ const callback = this.callback(token, propertyName);
65
+ (_a = this._router) === null || _a === void 0 ? void 0 : _a.on(method, url, callback);
66
+ return {
67
+ ...callbacks,
68
+ [operationId]: callback
69
+ };
70
+ }, callbacks);
71
+ }, callbacks);
72
+ }
73
+ async ready() {
74
+ await this.injector.emit("$onReady");
75
+ }
76
+ async stop() {
77
+ await this.injector.emit("$onDestroy");
78
+ return this.injector.destroy();
79
+ }
80
+ async init() {
81
+ if (!this._promise) {
82
+ this._promise = this.loadInjector().then(() => this.ready());
83
+ }
84
+ return this._promise;
85
+ }
86
+ callback(token, propertyKey) {
87
+ const entity = JsonEntityStore.fromMethod(token, propertyKey);
88
+ let handler;
89
+ return async (event, context) => {
90
+ await this.init();
91
+ if (!handler) {
92
+ const platformHandler = this.injector.get(PlatformServerlessHandler);
93
+ handler = await platformHandler.createHandler(token, propertyKey);
94
+ }
95
+ const $ctx = new ServerlessContext({
96
+ event,
97
+ context,
98
+ id: getRequestId(event, context),
99
+ logger: this.injector.logger,
100
+ injector: this.injector,
101
+ endpoint: entity
102
+ });
103
+ return handler($ctx);
104
+ };
105
+ }
106
+ async initRouter() {
107
+ if (!this._router) {
108
+ const { default: FindMyMay } = await import("find-my-way");
109
+ this._router = FindMyMay({ caseSensitive: false, ignoreTrailingSlash: true });
110
+ this.callbacks();
111
+ }
112
+ return this._router;
113
+ }
114
+ createInjector(settings) {
115
+ var _a;
116
+ this._injector = new InjectorService();
117
+ this.injector.logger = $log;
118
+ this.injector.settings.set(settings);
119
+ // istanbul ignore next
120
+ if (this.injector.settings.get("env") === Env.TEST && !((_a = settings === null || settings === void 0 ? void 0 : settings.logger) === null || _a === void 0 ? void 0 : _a.level)) {
121
+ $log.stop();
122
+ }
123
+ return this;
124
+ }
125
+ async loadInjector() {
126
+ const container = createContainer();
127
+ setLoggerLevel(this.injector);
128
+ await this.injector.emit("$beforeInit");
129
+ await this.injector.load(container);
130
+ await this.injector.emit("$afterInit");
131
+ }
132
+ }
133
+ //# 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,90 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { AnyToPromise, isSerializable } from "@tsed/core";
3
+ import { Inject, Injectable, InjectorService, LazyInject, ProviderScope } from "@tsed/di";
4
+ import { serialize } from "@tsed/json-mapper";
5
+ import { DeserializerPipe, PlatformParams, ValidationPipe } from "@tsed/platform-params";
6
+ import { setResponseHeaders } from "../utils/setResponseHeaders";
7
+ let PlatformServerlessHandler = class PlatformServerlessHandler {
8
+ createHandler(token, propertyKey) {
9
+ const promisedHandler = this.params.compileHandler({
10
+ token,
11
+ propertyKey
12
+ });
13
+ return async ($ctx) => {
14
+ await this.injector.emit("$onRequest", $ctx);
15
+ await this.injector.runInContext($ctx, async () => {
16
+ try {
17
+ const resolver = new AnyToPromise();
18
+ const handler = await promisedHandler;
19
+ const result = await resolver.call(() => handler({ $ctx }));
20
+ this.processResult(result, $ctx);
21
+ }
22
+ catch (er) {
23
+ $ctx.response.status(500).body(er);
24
+ const exceptions = await this.exceptionsManager;
25
+ await exceptions.catch(er, $ctx);
26
+ }
27
+ });
28
+ await this.injector.emit("$onResponse", $ctx);
29
+ return this.flush($ctx);
30
+ };
31
+ }
32
+ flush($ctx) {
33
+ setResponseHeaders($ctx);
34
+ let body = $ctx.response.getBody();
35
+ if (isSerializable(body)) {
36
+ $ctx.response.set("content-type", "application/json");
37
+ body = JSON.stringify(body);
38
+ }
39
+ const response = {
40
+ statusCode: $ctx.response.getStatus(),
41
+ body: body === undefined ? "" : body,
42
+ headers: {
43
+ ...$ctx.response.getHeaders(),
44
+ "x-request-id": $ctx.id
45
+ },
46
+ isBase64Encoded: false
47
+ };
48
+ $ctx.destroy();
49
+ return response;
50
+ }
51
+ processResult({ status, headers, data }, $ctx) {
52
+ if (status) {
53
+ $ctx.response.status(status);
54
+ }
55
+ if (headers) {
56
+ $ctx.response.setHeaders(headers);
57
+ }
58
+ if (data !== undefined) {
59
+ data = $ctx.response.getStatus() !== 204 ? data : "";
60
+ if (isSerializable(data)) {
61
+ data = serialize(data, {
62
+ ...$ctx.endpoint.getResponseOptions($ctx.response.getStatus()),
63
+ useAlias: true,
64
+ endpoint: true
65
+ });
66
+ }
67
+ $ctx.response.body(data);
68
+ }
69
+ }
70
+ };
71
+ __decorate([
72
+ Inject(),
73
+ __metadata("design:type", InjectorService)
74
+ ], PlatformServerlessHandler.prototype, "injector", void 0);
75
+ __decorate([
76
+ Inject(),
77
+ __metadata("design:type", PlatformParams)
78
+ ], PlatformServerlessHandler.prototype, "params", void 0);
79
+ __decorate([
80
+ LazyInject("PlatformExceptions", () => import("@tsed/platform-exceptions")),
81
+ __metadata("design:type", Promise)
82
+ ], PlatformServerlessHandler.prototype, "exceptionsManager", void 0);
83
+ PlatformServerlessHandler = __decorate([
84
+ Injectable({
85
+ scope: ProviderScope.SINGLETON,
86
+ imports: [DeserializerPipe, ValidationPipe]
87
+ })
88
+ ], PlatformServerlessHandler);
89
+ export { PlatformServerlessHandler };
90
+ //# 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, 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 this.injector.runInContext($ctx, 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,22 @@
1
+ import { DIContext } from "@tsed/di";
2
+ import { ServerlessRequest } from "./ServerlessRequest";
3
+ import { ServerlessResponse } from "./ServerlessResponse";
4
+ export class ServerlessContext extends DIContext {
5
+ constructor({ event, context, endpoint, ...options }) {
6
+ super({
7
+ ...options,
8
+ maxStackSize: 0
9
+ });
10
+ this.context = context;
11
+ this.event = event;
12
+ this.request = new ServerlessRequest({ event, context });
13
+ this.response = new ServerlessResponse({ event, context, request: this.request });
14
+ this.endpoint = endpoint;
15
+ }
16
+ async destroy() {
17
+ await super.destroy();
18
+ this.request.destroy();
19
+ this.response.destroy();
20
+ }
21
+ }
22
+ //# sourceMappingURL=ServerlessContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerlessContext.js","sourceRoot":"","sources":["../../../src/domain/ServerlessContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAoC,MAAM,UAAU,CAAC;AAGtE,OAAO,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAQxD,MAAM,OAAO,iBAAkB,SAAQ,SAAS;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,iBAAiB,CAAC,EAAC,KAAK,EAAE,OAAO,EAAC,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,GAAG,IAAI,kBAAkB,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","sourcesContent":["import {DIContext, DIContextOptions, LocalsContainer} 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"]}