@tsed/platform-serverless 7.0.0-beta.15 → 7.0.0-beta.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/coverage.json +6 -0
- package/jest.config.js +1 -6
- package/lib/cjs/domain/ServerlessContext.js +5 -3
- package/lib/cjs/domain/ServerlessContext.js.map +1 -1
- package/lib/cjs/domain/ServerlessRequest.js +21 -13
- package/lib/cjs/domain/ServerlessRequest.js.map +1 -1
- package/lib/cjs/domain/ServerlessResponse.js +12 -11
- package/lib/cjs/domain/ServerlessResponse.js.map +1 -1
- package/lib/cjs/utils/setResponseHeaders.js +1 -1
- package/lib/cjs/utils/setResponseHeaders.js.map +1 -1
- package/lib/esm/domain/ServerlessContext.js +5 -3
- package/lib/esm/domain/ServerlessContext.js.map +1 -1
- package/lib/esm/domain/ServerlessRequest.js +21 -13
- package/lib/esm/domain/ServerlessRequest.js.map +1 -1
- package/lib/esm/domain/ServerlessResponse.js +12 -11
- package/lib/esm/domain/ServerlessResponse.js.map +1 -1
- package/lib/esm/utils/setResponseHeaders.js +1 -1
- package/lib/esm/utils/setResponseHeaders.js.map +1 -1
- package/lib/types/domain/ServerlessContext.d.ts +1 -0
- package/lib/types/domain/ServerlessRequest.d.ts +6 -8
- package/lib/types/domain/ServerlessResponse.d.ts +6 -11
- package/package.json +9 -9
package/coverage.json
ADDED
package/jest.config.js
CHANGED
|
@@ -17,15 +17,17 @@ class ServerlessContext extends di_1.DIContext {
|
|
|
17
17
|
});
|
|
18
18
|
this.context = context;
|
|
19
19
|
this.event = event;
|
|
20
|
-
this.request = new ServerlessRequest_1.ServerlessRequest(
|
|
21
|
-
this.response = new ServerlessResponse_1.ServerlessResponse(
|
|
20
|
+
this.request = new ServerlessRequest_1.ServerlessRequest(this);
|
|
21
|
+
this.response = new ServerlessResponse_1.ServerlessResponse(this);
|
|
22
22
|
this.endpoint = endpoint;
|
|
23
23
|
}
|
|
24
24
|
async destroy() {
|
|
25
25
|
await super.destroy();
|
|
26
|
-
this.request.destroy();
|
|
27
26
|
this.response.destroy();
|
|
28
27
|
}
|
|
28
|
+
isDone() {
|
|
29
|
+
return this.response.isDone();
|
|
30
|
+
}
|
|
29
31
|
}
|
|
30
32
|
exports.ServerlessContext = ServerlessContext;
|
|
31
33
|
//# sourceMappingURL=ServerlessContext.js.map
|
|
@@ -1 +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;IACrC,QAAQ,CAAqB;IAC7B,OAAO,CAAoB;IAC3B,OAAO,CAAU;IACjB,KAAK,CAAoE;IACzE,QAAQ,CAAkB;IAEnC,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,
|
|
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;IACrC,QAAQ,CAAqB;IAC7B,OAAO,CAAoB;IAC3B,OAAO,CAAU;IACjB,KAAK,CAAoE;IACzE,QAAQ,CAAkB;IAEnC,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,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,GAAG,IAAI,uCAAkB,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IAChC,CAAC;CACF;AA3BD,8CA2BC","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(this);\n this.response = new ServerlessResponse(this);\n this.endpoint = endpoint;\n }\n\n async destroy() {\n await super.destroy();\n this.response.destroy();\n }\n\n isDone() {\n return this.response.isDone();\n }\n}\n"]}
|
|
@@ -6,9 +6,18 @@ const core_1 = require("@tsed/core");
|
|
|
6
6
|
* @platform
|
|
7
7
|
*/
|
|
8
8
|
class ServerlessRequest {
|
|
9
|
-
|
|
10
|
-
constructor(
|
|
11
|
-
this
|
|
9
|
+
$ctx;
|
|
10
|
+
constructor($ctx) {
|
|
11
|
+
this.$ctx = $ctx;
|
|
12
|
+
}
|
|
13
|
+
get event() {
|
|
14
|
+
return this.$ctx.event;
|
|
15
|
+
}
|
|
16
|
+
get raw() {
|
|
17
|
+
return this.event;
|
|
18
|
+
}
|
|
19
|
+
get response() {
|
|
20
|
+
return this.$ctx.response;
|
|
12
21
|
}
|
|
13
22
|
get secure() {
|
|
14
23
|
return true;
|
|
@@ -25,13 +34,13 @@ class ServerlessRequest {
|
|
|
25
34
|
* Is equivalent of `express.response.originalUrl || express.response.url`.
|
|
26
35
|
*/
|
|
27
36
|
get url() {
|
|
28
|
-
return this.
|
|
37
|
+
return this.event.path;
|
|
29
38
|
}
|
|
30
39
|
get headers() {
|
|
31
|
-
return this.
|
|
40
|
+
return this.event.headers;
|
|
32
41
|
}
|
|
33
42
|
get method() {
|
|
34
|
-
return this.
|
|
43
|
+
return this.event.httpMethod;
|
|
35
44
|
}
|
|
36
45
|
/**
|
|
37
46
|
* Contains key-value pairs of data submitted in the request body. By default, it is `undefined`, and is populated when you use
|
|
@@ -39,14 +48,14 @@ class ServerlessRequest {
|
|
|
39
48
|
*/
|
|
40
49
|
get body() {
|
|
41
50
|
try {
|
|
42
|
-
return this.
|
|
51
|
+
return this.event.body ? JSON.parse(this.event.body) : {};
|
|
43
52
|
}
|
|
44
53
|
catch (er) {
|
|
45
|
-
return this.
|
|
54
|
+
return this.event.body;
|
|
46
55
|
}
|
|
47
56
|
}
|
|
48
57
|
get rawBody() {
|
|
49
|
-
return this.
|
|
58
|
+
return this.event.body;
|
|
50
59
|
}
|
|
51
60
|
/**
|
|
52
61
|
* This property is an object containing properties mapped to the named route `parameters`.
|
|
@@ -54,14 +63,14 @@ class ServerlessRequest {
|
|
|
54
63
|
* This object defaults to `{}`.
|
|
55
64
|
*/
|
|
56
65
|
get params() {
|
|
57
|
-
return this.
|
|
66
|
+
return this.event.pathParameters || {};
|
|
58
67
|
}
|
|
59
68
|
/**
|
|
60
69
|
* This property is an object containing a property for each query string parameter in the route.
|
|
61
70
|
* When query parser is set to disabled, it is an empty object `{}`, otherwise it is the result of the configured query parser.
|
|
62
71
|
*/
|
|
63
72
|
get query() {
|
|
64
|
-
return this.
|
|
73
|
+
return this.event.queryStringParameters || {};
|
|
65
74
|
}
|
|
66
75
|
/**
|
|
67
76
|
* Returns the HTTP request header specified by field. The match is case-insensitive.
|
|
@@ -73,9 +82,8 @@ class ServerlessRequest {
|
|
|
73
82
|
* @param name
|
|
74
83
|
*/
|
|
75
84
|
get(name) {
|
|
76
|
-
return (0, core_1.getValue)(this.
|
|
85
|
+
return (0, core_1.getValue)(this.event.headers, name);
|
|
77
86
|
}
|
|
78
|
-
destroy() { }
|
|
79
87
|
}
|
|
80
88
|
exports.ServerlessRequest = ServerlessRequest;
|
|
81
89
|
//# sourceMappingURL=ServerlessRequest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerlessRequest.js","sourceRoot":"","sources":["../../../src/domain/ServerlessRequest.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"ServerlessRequest.js","sourceRoot":"","sources":["../../../src/domain/ServerlessRequest.ts"],"names":[],"mappings":";;;AAAA,qCAAoC;AAGpC;;GAEG;AACH,MAAa,iBAAiB;IACN;IAAtB,YAAsB,IAAuB;QAAvB,SAAI,GAAJ,IAAI,CAAmB;IAAG,CAAC;IAEjD,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACzB,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC5B,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,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;IAC5B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,IAAI,IAAI;QACN,IAAI;YACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3D;QAAC,OAAO,EAAE,EAAE;YACX,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;SACxB;IACH,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC;IAChD,CAAC;IAED;;;;;;;;OAQG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAA,eAAQ,EAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;CACF;AAzFD,8CAyFC","sourcesContent":["import {getValue} from \"@tsed/core\";\nimport {ServerlessContext} from \"./ServerlessContext\";\n\n/**\n * @platform\n */\nexport class ServerlessRequest {\n constructor(protected $ctx: ServerlessContext) {}\n\n get event() {\n return this.$ctx.event;\n }\n\n get raw() {\n return this.event;\n }\n\n get response() {\n return this.$ctx.response;\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.event.path;\n }\n\n get headers() {\n return this.event.headers;\n }\n\n get method(): string {\n return this.event.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.event.body ? JSON.parse(this.event.body) : {};\n } catch (er) {\n return this.event.body;\n }\n }\n\n get rawBody(): any {\n return this.event.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.event.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.event.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.event.headers, name);\n }\n}\n"]}
|
|
@@ -10,17 +10,23 @@ const mime = tslib_1.__importStar(require("mime"));
|
|
|
10
10
|
* @platform
|
|
11
11
|
*/
|
|
12
12
|
class ServerlessResponse {
|
|
13
|
-
|
|
14
|
-
request;
|
|
13
|
+
$ctx;
|
|
15
14
|
#status = 200;
|
|
16
15
|
#body = undefined;
|
|
17
16
|
#headers = {};
|
|
18
17
|
#locals = {};
|
|
19
18
|
#isHeadersSent = false;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
constructor($ctx) {
|
|
20
|
+
this.$ctx = $ctx;
|
|
21
|
+
}
|
|
22
|
+
get event() {
|
|
23
|
+
return this.$ctx.event;
|
|
24
|
+
}
|
|
25
|
+
get raw() {
|
|
26
|
+
return this.event;
|
|
27
|
+
}
|
|
28
|
+
get request() {
|
|
29
|
+
return this.$ctx.request;
|
|
24
30
|
}
|
|
25
31
|
/**
|
|
26
32
|
* Get the current statusCode
|
|
@@ -180,12 +186,7 @@ class ServerlessResponse {
|
|
|
180
186
|
isDone() {
|
|
181
187
|
return this.#isHeadersSent;
|
|
182
188
|
}
|
|
183
|
-
onEnd(cb) {
|
|
184
|
-
this.#endListeners.push(cb);
|
|
185
|
-
return this;
|
|
186
|
-
}
|
|
187
189
|
destroy() {
|
|
188
|
-
this.#endListeners.forEach((cb) => cb());
|
|
189
190
|
this.#isHeadersSent = true;
|
|
190
191
|
}
|
|
191
192
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerlessResponse.js","sourceRoot":"","sources":["../../../src/domain/ServerlessResponse.ts"],"names":[],"mappings":";;;;AAAA,qCAAoC;AACpC,yCAA8C;
|
|
1
|
+
{"version":3,"file":"ServerlessResponse.js","sourceRoot":"","sources":["../../../src/domain/ServerlessResponse.ts"],"names":[],"mappings":";;;;AAAA,qCAAoC;AACpC,yCAA8C;AAC9C,kEAAkC;AAClC,mDAA6B;AAK7B;;GAEG;AACH,MAAa,kBAAkB;IAOP;IANtB,OAAO,GAAW,GAAG,CAAC;IACtB,KAAK,GAAQ,SAAS,CAAC;IACvB,QAAQ,GAAgC,EAAE,CAAC;IAC3C,OAAO,GAAwB,EAAE,CAAC;IAClC,cAAc,GAAG,KAAK,CAAC;IAEvB,YAAsB,IAAuB;QAAvB,SAAI,GAAJ,IAAI,CAAmB;IAAG,CAAC;IAEjD,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACzB,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAI,UAAU,CAAC,MAAM;QACnB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,MAAc;QACnB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,IAAY,EAAE,KAAU;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED;;;;;;;;OAQG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAA,eAAQ,EAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,UAAU;QACR,OAAO;YACL,GAAG,IAAI,CAAC,QAAQ;SACjB,CAAC;IACJ,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,KAAK,GAAG,CAAC;IAC9B,CAAC;IAED;;;;;;;;;;OAUG;IACH,UAAU,CAAC,OAAoC;QAC7C,gBAAgB;QAChB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;YAC9C,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,GAAW,EAAE,IAAoC;QACzD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE;YACvC,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YAExB,IAAI,GAAG,KAAK,UAAU,EAAE;gBACtB,sCAAsC;gBACtC,IAAI,IAAI,KAAK,MAAM,EAAE;oBACnB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC;iBAC5C;gBAED,IAAI,GAAG,IAAA,mBAAS,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;aAChC;YAED,IAAI,CAAC,QAAQ,GAAG;gBACd,GAAG,IAAI,CAAC,QAAQ;gBAChB,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,IAAW;aACjC,CAAC;SACH;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,WAAmB;QAC7B,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QAE1D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa,CAAC,MAAc;QAC1B,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB;QACd,IAAI,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE;YAC9B,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;SAC7D;IACH,CAAC;IAED,cAAc;QACZ,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,MAAc,EAAE,GAAW;QAClC,sBAAsB;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,GAAG,IAAA,yBAAgB,EAAC,MAAM,CAAC,oBAAoB,OAAO,EAAE,CAAC;QAEtE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9E,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,GAAW;QAClB,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC;IAED;;;;;;;OAOG;IACH,IAAI,CAAC,IAAS;QACZ,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;CACF;AApND,gDAoNC","sourcesContent":["import {getValue} from \"@tsed/core\";\nimport {getStatusMessage} from \"@tsed/schema\";\nimport encodeUrl from \"encodeurl\";\nimport * as mime from \"mime\";\nimport {ServerlessContext} from \"./ServerlessContext\";\n\nexport type HeaderValue = boolean | number | string;\n\n/**\n * @platform\n */\nexport class ServerlessResponse {\n #status: number = 200;\n #body: any = undefined;\n #headers: Record<string, HeaderValue> = {};\n #locals: Record<string, any> = {};\n #isHeadersSent = false;\n\n constructor(protected $ctx: ServerlessContext) {}\n\n get event() {\n return this.$ctx.event;\n }\n\n get raw() {\n return this.event;\n }\n\n get request() {\n return this.$ctx.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 destroy() {\n this.#isHeadersSent = true;\n }\n}\n"]}
|
|
@@ -16,7 +16,7 @@ function mergeHeaders(specHeaders, headers) {
|
|
|
16
16
|
function setResponseHeaders(ctx) {
|
|
17
17
|
const { response, endpoint } = ctx;
|
|
18
18
|
const operation = endpoint.operation;
|
|
19
|
-
if (
|
|
19
|
+
if (ctx.isDone()) {
|
|
20
20
|
return;
|
|
21
21
|
}
|
|
22
22
|
if (!response.hasStatus()) {
|
|
@@ -1 +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,
|
|
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,GAAG,CAAC,MAAM,EAAE,EAAE;QAChB,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 (ctx.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"]}
|
|
@@ -14,14 +14,16 @@ export class ServerlessContext extends DIContext {
|
|
|
14
14
|
});
|
|
15
15
|
this.context = context;
|
|
16
16
|
this.event = event;
|
|
17
|
-
this.request = new ServerlessRequest(
|
|
18
|
-
this.response = new ServerlessResponse(
|
|
17
|
+
this.request = new ServerlessRequest(this);
|
|
18
|
+
this.response = new ServerlessResponse(this);
|
|
19
19
|
this.endpoint = endpoint;
|
|
20
20
|
}
|
|
21
21
|
async destroy() {
|
|
22
22
|
await super.destroy();
|
|
23
|
-
this.request.destroy();
|
|
24
23
|
this.response.destroy();
|
|
25
24
|
}
|
|
25
|
+
isDone() {
|
|
26
|
+
return this.response.isDone();
|
|
27
|
+
}
|
|
26
28
|
}
|
|
27
29
|
//# sourceMappingURL=ServerlessContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerlessContext.js","sourceRoot":"","sources":["../../../src/domain/ServerlessContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAmB,MAAM,UAAU,CAAC;AAGrD,OAAO,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAQxD,MAAM,OAAO,iBAAkB,SAAQ,SAAS;IACrC,QAAQ,CAAqB;IAC7B,OAAO,CAAoB;IAC3B,OAAO,CAAU;IACjB,KAAK,CAAoE;IACzE,QAAQ,CAAkB;IAEnC,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,
|
|
1
|
+
{"version":3,"file":"ServerlessContext.js","sourceRoot":"","sources":["../../../src/domain/ServerlessContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAmB,MAAM,UAAU,CAAC;AAGrD,OAAO,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAQxD,MAAM,OAAO,iBAAkB,SAAQ,SAAS;IACrC,QAAQ,CAAqB;IAC7B,OAAO,CAAoB;IAC3B,OAAO,CAAU;IACjB,KAAK,CAAoE;IACzE,QAAQ,CAAkB;IAEnC,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,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IAChC,CAAC;CACF","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(this);\n this.response = new ServerlessResponse(this);\n this.endpoint = endpoint;\n }\n\n async destroy() {\n await super.destroy();\n this.response.destroy();\n }\n\n isDone() {\n return this.response.isDone();\n }\n}\n"]}
|
|
@@ -3,9 +3,18 @@ import { getValue } from "@tsed/core";
|
|
|
3
3
|
* @platform
|
|
4
4
|
*/
|
|
5
5
|
export class ServerlessRequest {
|
|
6
|
-
|
|
7
|
-
constructor(
|
|
8
|
-
this
|
|
6
|
+
$ctx;
|
|
7
|
+
constructor($ctx) {
|
|
8
|
+
this.$ctx = $ctx;
|
|
9
|
+
}
|
|
10
|
+
get event() {
|
|
11
|
+
return this.$ctx.event;
|
|
12
|
+
}
|
|
13
|
+
get raw() {
|
|
14
|
+
return this.event;
|
|
15
|
+
}
|
|
16
|
+
get response() {
|
|
17
|
+
return this.$ctx.response;
|
|
9
18
|
}
|
|
10
19
|
get secure() {
|
|
11
20
|
return true;
|
|
@@ -22,13 +31,13 @@ export class ServerlessRequest {
|
|
|
22
31
|
* Is equivalent of `express.response.originalUrl || express.response.url`.
|
|
23
32
|
*/
|
|
24
33
|
get url() {
|
|
25
|
-
return this.
|
|
34
|
+
return this.event.path;
|
|
26
35
|
}
|
|
27
36
|
get headers() {
|
|
28
|
-
return this.
|
|
37
|
+
return this.event.headers;
|
|
29
38
|
}
|
|
30
39
|
get method() {
|
|
31
|
-
return this.
|
|
40
|
+
return this.event.httpMethod;
|
|
32
41
|
}
|
|
33
42
|
/**
|
|
34
43
|
* Contains key-value pairs of data submitted in the request body. By default, it is `undefined`, and is populated when you use
|
|
@@ -36,14 +45,14 @@ export class ServerlessRequest {
|
|
|
36
45
|
*/
|
|
37
46
|
get body() {
|
|
38
47
|
try {
|
|
39
|
-
return this.
|
|
48
|
+
return this.event.body ? JSON.parse(this.event.body) : {};
|
|
40
49
|
}
|
|
41
50
|
catch (er) {
|
|
42
|
-
return this.
|
|
51
|
+
return this.event.body;
|
|
43
52
|
}
|
|
44
53
|
}
|
|
45
54
|
get rawBody() {
|
|
46
|
-
return this.
|
|
55
|
+
return this.event.body;
|
|
47
56
|
}
|
|
48
57
|
/**
|
|
49
58
|
* This property is an object containing properties mapped to the named route `parameters`.
|
|
@@ -51,14 +60,14 @@ export class ServerlessRequest {
|
|
|
51
60
|
* This object defaults to `{}`.
|
|
52
61
|
*/
|
|
53
62
|
get params() {
|
|
54
|
-
return this.
|
|
63
|
+
return this.event.pathParameters || {};
|
|
55
64
|
}
|
|
56
65
|
/**
|
|
57
66
|
* This property is an object containing a property for each query string parameter in the route.
|
|
58
67
|
* When query parser is set to disabled, it is an empty object `{}`, otherwise it is the result of the configured query parser.
|
|
59
68
|
*/
|
|
60
69
|
get query() {
|
|
61
|
-
return this.
|
|
70
|
+
return this.event.queryStringParameters || {};
|
|
62
71
|
}
|
|
63
72
|
/**
|
|
64
73
|
* Returns the HTTP request header specified by field. The match is case-insensitive.
|
|
@@ -70,8 +79,7 @@ export class ServerlessRequest {
|
|
|
70
79
|
* @param name
|
|
71
80
|
*/
|
|
72
81
|
get(name) {
|
|
73
|
-
return getValue(this.
|
|
82
|
+
return getValue(this.event.headers, name);
|
|
74
83
|
}
|
|
75
|
-
destroy() { }
|
|
76
84
|
}
|
|
77
85
|
//# sourceMappingURL=ServerlessRequest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerlessRequest.js","sourceRoot":"","sources":["../../../src/domain/ServerlessRequest.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ServerlessRequest.js","sourceRoot":"","sources":["../../../src/domain/ServerlessRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,YAAY,CAAC;AAGpC;;GAEG;AACH,MAAM,OAAO,iBAAiB;IACN;IAAtB,YAAsB,IAAuB;QAAvB,SAAI,GAAJ,IAAI,CAAmB;IAAG,CAAC;IAEjD,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACzB,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC5B,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,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;IAC5B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,IAAI,IAAI;QACN,IAAI;YACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3D;QAAC,OAAO,EAAE,EAAE;YACX,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;SACxB;IACH,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC;IAChD,CAAC;IAED;;;;;;;;OAQG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;CACF","sourcesContent":["import {getValue} from \"@tsed/core\";\nimport {ServerlessContext} from \"./ServerlessContext\";\n\n/**\n * @platform\n */\nexport class ServerlessRequest {\n constructor(protected $ctx: ServerlessContext) {}\n\n get event() {\n return this.$ctx.event;\n }\n\n get raw() {\n return this.event;\n }\n\n get response() {\n return this.$ctx.response;\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.event.path;\n }\n\n get headers() {\n return this.event.headers;\n }\n\n get method(): string {\n return this.event.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.event.body ? JSON.parse(this.event.body) : {};\n } catch (er) {\n return this.event.body;\n }\n }\n\n get rawBody(): any {\n return this.event.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.event.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.event.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.event.headers, name);\n }\n}\n"]}
|
|
@@ -6,17 +6,23 @@ import * as mime from "mime";
|
|
|
6
6
|
* @platform
|
|
7
7
|
*/
|
|
8
8
|
export class ServerlessResponse {
|
|
9
|
-
|
|
10
|
-
request;
|
|
9
|
+
$ctx;
|
|
11
10
|
#status = 200;
|
|
12
11
|
#body = undefined;
|
|
13
12
|
#headers = {};
|
|
14
13
|
#locals = {};
|
|
15
14
|
#isHeadersSent = false;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
constructor($ctx) {
|
|
16
|
+
this.$ctx = $ctx;
|
|
17
|
+
}
|
|
18
|
+
get event() {
|
|
19
|
+
return this.$ctx.event;
|
|
20
|
+
}
|
|
21
|
+
get raw() {
|
|
22
|
+
return this.event;
|
|
23
|
+
}
|
|
24
|
+
get request() {
|
|
25
|
+
return this.$ctx.request;
|
|
20
26
|
}
|
|
21
27
|
/**
|
|
22
28
|
* Get the current statusCode
|
|
@@ -176,12 +182,7 @@ export class ServerlessResponse {
|
|
|
176
182
|
isDone() {
|
|
177
183
|
return this.#isHeadersSent;
|
|
178
184
|
}
|
|
179
|
-
onEnd(cb) {
|
|
180
|
-
this.#endListeners.push(cb);
|
|
181
|
-
return this;
|
|
182
|
-
}
|
|
183
185
|
destroy() {
|
|
184
|
-
this.#endListeners.forEach((cb) => cb());
|
|
185
186
|
this.#isHeadersSent = true;
|
|
186
187
|
}
|
|
187
188
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerlessResponse.js","sourceRoot":"","sources":["../../../src/domain/ServerlessResponse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,YAAY,CAAC;AACpC,OAAO,EAAC,gBAAgB,EAAC,MAAM,cAAc,CAAC;
|
|
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 encodeUrl from \"encodeurl\";\nimport * as mime from \"mime\";\nimport {ServerlessContext} from \"./ServerlessContext\";\n\nexport type HeaderValue = boolean | number | string;\n\n/**\n * @platform\n */\nexport class ServerlessResponse {\n #status: number = 200;\n #body: any = undefined;\n #headers: Record<string, HeaderValue> = {};\n #locals: Record<string, any> = {};\n #isHeadersSent = false;\n\n constructor(protected $ctx: ServerlessContext) {}\n\n get event() {\n return this.$ctx.event;\n }\n\n get raw() {\n return this.event;\n }\n\n get request() {\n return this.$ctx.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 destroy() {\n this.#isHeadersSent = true;\n }\n}\n"]}
|
|
@@ -13,7 +13,7 @@ function mergeHeaders(specHeaders, headers) {
|
|
|
13
13
|
export function setResponseHeaders(ctx) {
|
|
14
14
|
const { response, endpoint } = ctx;
|
|
15
15
|
const operation = endpoint.operation;
|
|
16
|
-
if (
|
|
16
|
+
if (ctx.isDone()) {
|
|
17
17
|
return;
|
|
18
18
|
}
|
|
19
19
|
if (!response.hasStatus()) {
|
|
@@ -1 +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,MAAM,UAAU,kBAAkB,CAAC,GAAsB;IACvD,MAAM,EAAC,QAAQ,EAAE,QAAQ,EAAC,GAAG,GAAG,CAAC;IACjC,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAU,CAAC;IAEtC,IAAI,
|
|
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,MAAM,UAAU,kBAAkB,CAAC,GAAsB;IACvD,MAAM,EAAC,QAAQ,EAAE,QAAQ,EAAC,GAAG,GAAG,CAAC;IACjC,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAU,CAAC;IAEtC,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE;QAChB,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","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 (ctx.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"]}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import
|
|
2
|
-
export interface ServerlessRequestOptions {
|
|
3
|
-
event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;
|
|
4
|
-
context: Context;
|
|
5
|
-
}
|
|
1
|
+
import { ServerlessContext } from "./ServerlessContext";
|
|
6
2
|
/**
|
|
7
3
|
* @platform
|
|
8
4
|
*/
|
|
9
5
|
export declare class ServerlessRequest {
|
|
10
|
-
|
|
11
|
-
constructor(
|
|
6
|
+
protected $ctx: ServerlessContext;
|
|
7
|
+
constructor($ctx: ServerlessContext);
|
|
8
|
+
get event(): import("aws-lambda").APIGatewayProxyEventBase<import("aws-lambda").APIGatewayEventDefaultAuthorizerContext>;
|
|
9
|
+
get raw(): import("aws-lambda").APIGatewayProxyEventBase<import("aws-lambda").APIGatewayEventDefaultAuthorizerContext>;
|
|
10
|
+
get response(): import("./ServerlessResponse").ServerlessResponse;
|
|
12
11
|
get secure(): boolean;
|
|
13
12
|
get host(): string;
|
|
14
13
|
get protocol(): string;
|
|
@@ -51,5 +50,4 @@ export declare class ServerlessRequest {
|
|
|
51
50
|
* @param name
|
|
52
51
|
*/
|
|
53
52
|
get(name: string): any;
|
|
54
|
-
destroy(): void;
|
|
55
53
|
}
|
|
@@ -1,19 +1,15 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type { ServerlessRequest } from "./ServerlessRequest";
|
|
3
|
-
export interface ServerlessResponseOptions {
|
|
4
|
-
event: APIGatewayProxyEventBase<APIGatewayEventDefaultAuthorizerContext>;
|
|
5
|
-
context: Context;
|
|
6
|
-
request: ServerlessRequest;
|
|
7
|
-
}
|
|
1
|
+
import { ServerlessContext } from "./ServerlessContext";
|
|
8
2
|
export declare type HeaderValue = boolean | number | string;
|
|
9
3
|
/**
|
|
10
4
|
* @platform
|
|
11
5
|
*/
|
|
12
6
|
export declare class ServerlessResponse {
|
|
13
7
|
#private;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
8
|
+
protected $ctx: ServerlessContext;
|
|
9
|
+
constructor($ctx: ServerlessContext);
|
|
10
|
+
get event(): import("aws-lambda").APIGatewayProxyEventBase<import("aws-lambda").APIGatewayEventDefaultAuthorizerContext>;
|
|
11
|
+
get raw(): import("aws-lambda").APIGatewayProxyEventBase<import("aws-lambda").APIGatewayEventDefaultAuthorizerContext>;
|
|
12
|
+
get request(): import("./ServerlessRequest").ServerlessRequest;
|
|
17
13
|
/**
|
|
18
14
|
* Get the current statusCode
|
|
19
15
|
*/
|
|
@@ -100,6 +96,5 @@ export declare class ServerlessResponse {
|
|
|
100
96
|
body(body: any): this;
|
|
101
97
|
getBody(): any;
|
|
102
98
|
isDone(): boolean;
|
|
103
|
-
onEnd(cb: Function): this;
|
|
104
99
|
destroy(): void;
|
|
105
100
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tsed/platform-serverless",
|
|
3
|
-
"version": "7.0.0-beta.
|
|
3
|
+
"version": "7.0.0-beta.18",
|
|
4
4
|
"description": "Platform serverless module for Ts.ED Framework",
|
|
5
5
|
"private": false,
|
|
6
6
|
"source": "./src/index.ts",
|
|
@@ -21,26 +21,26 @@
|
|
|
21
21
|
"test": "cross-env NODE_ENV=test jest"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@tsed/core": "7.0.0-beta.
|
|
25
|
-
"@tsed/exceptions": "7.0.0-beta.
|
|
26
|
-
"@tsed/json-mapper": "7.0.0-beta.
|
|
27
|
-
"@tsed/platform-exceptions": "7.0.0-beta.
|
|
28
|
-
"@tsed/platform-params": "7.0.0-beta.
|
|
29
|
-
"@tsed/schema": "7.0.0-beta.
|
|
24
|
+
"@tsed/core": "7.0.0-beta.18",
|
|
25
|
+
"@tsed/exceptions": "7.0.0-beta.18",
|
|
26
|
+
"@tsed/json-mapper": "7.0.0-beta.18",
|
|
27
|
+
"@tsed/platform-exceptions": "7.0.0-beta.18",
|
|
28
|
+
"@tsed/platform-params": "7.0.0-beta.18",
|
|
29
|
+
"@tsed/schema": "7.0.0-beta.18",
|
|
30
30
|
"encodeurl": "^1.0.2",
|
|
31
31
|
"mime": "^2.5.2",
|
|
32
32
|
"tslib": "2.4.0",
|
|
33
33
|
"uuid": "^8.3.2"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
|
-
"@tsed/platform-serverless-testing": "7.0.0-beta.
|
|
36
|
+
"@tsed/platform-serverless-testing": "7.0.0-beta.18",
|
|
37
37
|
"@types/aws-lambda": "^8.10.83",
|
|
38
38
|
"@types/encodeurl": "^1.0.0",
|
|
39
39
|
"@types/mime": "^2.0.3",
|
|
40
40
|
"find-my-way": "^7.0.0"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
|
-
"@tsed/di": "^7.0.0-beta.
|
|
43
|
+
"@tsed/di": "^7.0.0-beta.18",
|
|
44
44
|
"@tsed/logger": ">=6.2.0"
|
|
45
45
|
},
|
|
46
46
|
"peerDependenciesMeta": {
|