@tsed/platform-serverless 6.87.2 → 6.90.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.
- package/lib/{builder → cjs/builder}/PlatformServerless.d.ts +0 -0
- package/lib/cjs/builder/PlatformServerless.js +156 -0
- package/lib/cjs/builder/PlatformServerless.js.map +1 -0
- package/lib/{builder → cjs/builder}/PlatformServerlessHandler.d.ts +0 -0
- package/lib/cjs/builder/PlatformServerlessHandler.js +93 -0
- package/lib/cjs/builder/PlatformServerlessHandler.js.map +1 -0
- package/lib/{domain → cjs/domain}/ServerlessContext.d.ts +0 -0
- package/lib/cjs/domain/ServerlessContext.js +26 -0
- package/lib/cjs/domain/ServerlessContext.js.map +1 -0
- package/lib/{domain → cjs/domain}/ServerlessRequest.d.ts +0 -0
- package/lib/cjs/domain/ServerlessRequest.js +80 -0
- package/lib/cjs/domain/ServerlessRequest.js.map +1 -0
- package/lib/{domain → cjs/domain}/ServerlessResponse.d.ts +0 -0
- package/lib/cjs/domain/ServerlessResponse.js +193 -0
- package/lib/cjs/domain/ServerlessResponse.js.map +1 -0
- package/lib/{index.d.ts → cjs/index.d.ts} +0 -0
- package/lib/cjs/index.js +23 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/{services → cjs/services}/PlatformServerlessTest.d.ts +0 -0
- package/lib/cjs/services/PlatformServerlessTest.js +196 -0
- package/lib/cjs/services/PlatformServerlessTest.js.map +1 -0
- package/lib/{utils → cjs/utils}/getRequestId.d.ts +0 -0
- package/lib/cjs/utils/getRequestId.js +13 -0
- package/lib/cjs/utils/getRequestId.js.map +1 -0
- package/lib/{utils → cjs/utils}/setResponseHeaders.d.ts +0 -0
- package/lib/cjs/utils/setResponseHeaders.js +35 -0
- package/lib/cjs/utils/setResponseHeaders.js.map +1 -0
- package/lib/esm/builder/PlatformServerless.js +133 -0
- package/lib/esm/builder/PlatformServerless.js.map +1 -0
- package/lib/esm/builder/PlatformServerlessHandler.js +90 -0
- package/lib/esm/builder/PlatformServerlessHandler.js.map +1 -0
- package/lib/esm/domain/ServerlessContext.js +22 -0
- package/lib/esm/domain/ServerlessContext.js.map +1 -0
- package/lib/esm/domain/ServerlessRequest.js +76 -0
- package/lib/esm/domain/ServerlessRequest.js.map +1 -0
- package/lib/esm/domain/ServerlessResponse.js +189 -0
- package/lib/esm/domain/ServerlessResponse.js.map +1 -0
- package/lib/esm/index.js +11 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/services/PlatformServerlessTest.js +191 -0
- package/lib/esm/services/PlatformServerlessTest.js.map +1 -0
- package/lib/esm/utils/getRequestId.js +9 -0
- package/lib/esm/utils/getRequestId.js.map +1 -0
- package/lib/esm/utils/setResponseHeaders.js +31 -0
- package/lib/esm/utils/setResponseHeaders.js.map +1 -0
- package/lib/types/builder/PlatformServerless.d.ts +31 -0
- package/lib/types/builder/PlatformServerlessHandler.d.ts +19 -0
- package/lib/types/domain/ServerlessContext.d.ts +19 -0
- package/lib/types/domain/ServerlessRequest.d.ts +55 -0
- package/lib/types/domain/ServerlessResponse.d.ts +105 -0
- package/lib/types/index.d.ts +9 -0
- package/lib/types/services/PlatformServerlessTest.d.ts +46 -0
- package/lib/types/utils/getRequestId.d.ts +2 -0
- package/lib/types/utils/setResponseHeaders.d.ts +5 -0
- package/package.json +17 -13
- package/readme.md +52 -28
- package/tsconfig.compile.esm.json +23 -0
- package/lib/index-a6c91998.js +0 -955
- package/lib/index-a6c91998.js.map +0 -1
- package/lib/index-a7574150.js +0 -975
- package/lib/index-a7574150.js.map +0 -1
- package/lib/index-b255dcf0.js +0 -2350
- package/lib/index-b255dcf0.js.map +0 -1
- package/lib/index-eeb85309.js +0 -2354
- package/lib/index-eeb85309.js.map +0 -1
- package/lib/index.js +0 -90
- package/lib/index.js.map +0 -1
- package/lib/index.modern.js +0 -12
- package/lib/index.modern.js.map +0 -1
package/lib/cjs/index.js
ADDED
|
@@ -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"]}
|
|
File without changes
|
|
@@ -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"]}
|