@h4ad/serverless-adapter 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +204 -0
  3. package/lib/@types/binary-settings.d.ts +23 -0
  4. package/lib/@types/binary-settings.js +2 -0
  5. package/lib/@types/headers.d.ts +24 -0
  6. package/lib/@types/headers.js +2 -0
  7. package/lib/@types/helpers.d.ts +6 -0
  8. package/lib/@types/helpers.js +2 -0
  9. package/lib/@types/index.d.ts +3 -0
  10. package/lib/@types/index.js +15 -0
  11. package/lib/@types/proxy-params.d.ts +8 -0
  12. package/lib/@types/proxy-params.js +2 -0
  13. package/lib/adapters/aws/alb.adapter.d.ts +58 -0
  14. package/lib/adapters/aws/alb.adapter.js +119 -0
  15. package/lib/adapters/aws/api-gateway-v1.adapter.d.ts +63 -0
  16. package/lib/adapters/aws/api-gateway-v1.adapter.js +126 -0
  17. package/lib/adapters/aws/api-gateway-v2.adapter.d.ts +61 -0
  18. package/lib/adapters/aws/api-gateway-v2.adapter.js +123 -0
  19. package/lib/adapters/aws/dynamodb.adapter.d.ts +62 -0
  20. package/lib/adapters/aws/dynamodb.adapter.js +81 -0
  21. package/lib/adapters/aws/event-bridge.adapter.d.ts +66 -0
  22. package/lib/adapters/aws/event-bridge.adapter.js +91 -0
  23. package/lib/adapters/aws/index.d.ts +8 -0
  24. package/lib/adapters/aws/index.js +20 -0
  25. package/lib/adapters/aws/lambda-edge.adapter.d.ts +179 -0
  26. package/lib/adapters/aws/lambda-edge.adapter.js +248 -0
  27. package/lib/adapters/aws/sns.adapter.d.ts +62 -0
  28. package/lib/adapters/aws/sns.adapter.js +81 -0
  29. package/lib/adapters/aws/sqs.adapter.d.ts +62 -0
  30. package/lib/adapters/aws/sqs.adapter.js +81 -0
  31. package/lib/adapters/index.d.ts +1 -0
  32. package/lib/adapters/index.js +13 -0
  33. package/lib/contracts/adapter.contract.d.ts +152 -0
  34. package/lib/contracts/adapter.contract.js +2 -0
  35. package/lib/contracts/framework.contract.d.ts +15 -0
  36. package/lib/contracts/framework.contract.js +3 -0
  37. package/lib/contracts/handler.contract.d.ts +18 -0
  38. package/lib/contracts/handler.contract.js +3 -0
  39. package/lib/contracts/index.d.ts +4 -0
  40. package/lib/contracts/index.js +16 -0
  41. package/lib/contracts/resolver.contract.d.ts +70 -0
  42. package/lib/contracts/resolver.contract.js +3 -0
  43. package/lib/core/constants.d.ts +4 -0
  44. package/lib/core/constants.js +10 -0
  45. package/lib/core/current-invoke.d.ts +37 -0
  46. package/lib/core/current-invoke.js +34 -0
  47. package/lib/core/event-body.d.ts +16 -0
  48. package/lib/core/event-body.js +24 -0
  49. package/lib/core/headers.d.ts +27 -0
  50. package/lib/core/headers.js +53 -0
  51. package/lib/core/index.d.ts +10 -0
  52. package/lib/core/index.js +22 -0
  53. package/lib/core/is-binary.d.ts +55 -0
  54. package/lib/core/is-binary.js +91 -0
  55. package/lib/core/logger.d.ts +38 -0
  56. package/lib/core/logger.js +51 -0
  57. package/lib/core/no-op.d.ts +4 -0
  58. package/lib/core/no-op.js +8 -0
  59. package/lib/core/optional.d.ts +17 -0
  60. package/lib/core/optional.js +25 -0
  61. package/lib/core/path.d.ts +28 -0
  62. package/lib/core/path.js +56 -0
  63. package/lib/core/stream.d.ts +8 -0
  64. package/lib/core/stream.js +39 -0
  65. package/lib/frameworks/express.framework.d.ts +13 -0
  66. package/lib/frameworks/express.framework.js +17 -0
  67. package/lib/frameworks/fastify.framework.d.ts +13 -0
  68. package/lib/frameworks/fastify.framework.js +18 -0
  69. package/lib/frameworks/hapi.framework.d.ts +13 -0
  70. package/lib/frameworks/hapi.framework.js +18 -0
  71. package/lib/frameworks/index.d.ts +4 -0
  72. package/lib/frameworks/index.js +16 -0
  73. package/lib/frameworks/koa.framework.d.ts +13 -0
  74. package/lib/frameworks/koa.framework.js +17 -0
  75. package/lib/handlers/base/base.handler.d.ts +28 -0
  76. package/lib/handlers/base/base.handler.js +52 -0
  77. package/lib/handlers/base/index.d.ts +1 -0
  78. package/lib/handlers/base/index.js +13 -0
  79. package/lib/handlers/default.handler.d.ts +85 -0
  80. package/lib/handlers/default.handler.js +183 -0
  81. package/lib/handlers/index.d.ts +2 -0
  82. package/lib/handlers/index.js +14 -0
  83. package/lib/index.d.ts +9 -0
  84. package/lib/index.js +21 -0
  85. package/lib/network/index.d.ts +2 -0
  86. package/lib/network/index.js +14 -0
  87. package/lib/network/request.d.ts +15 -0
  88. package/lib/network/request.js +40 -0
  89. package/lib/network/response.d.ts +22 -0
  90. package/lib/network/response.js +104 -0
  91. package/lib/resolvers/aws-context.resolver.d.ts +21 -0
  92. package/lib/resolvers/aws-context.resolver.js +55 -0
  93. package/lib/resolvers/callback.resolver.d.ts +16 -0
  94. package/lib/resolvers/callback.resolver.js +40 -0
  95. package/lib/resolvers/index.d.ts +3 -0
  96. package/lib/resolvers/index.js +15 -0
  97. package/lib/resolvers/promise.resolver.d.ts +10 -0
  98. package/lib/resolvers/promise.resolver.js +38 -0
  99. package/lib/serverless-adapter.d.ts +114 -0
  100. package/lib/serverless-adapter.js +158 -0
  101. package/package.json +130 -0
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ //#region Imports
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.BaseHandler = void 0;
5
+ const network_1 = require("../../network");
6
+ //#endregion
7
+ /**
8
+ * The abstract class that represents the base class for a handler
9
+ */
10
+ class BaseHandler {
11
+ //#endregion
12
+ //#region Protected Methods
13
+ /**
14
+ * Get the adapter to handle a specific event and context
15
+ *
16
+ * @param event The event sent by serverless
17
+ * @param context The context sent by serverless
18
+ * @param adapters The list of adapters
19
+ * @param log The instance of logger
20
+ */
21
+ getAdapterByEventAndContext(event, context, adapters, log) {
22
+ const resolvedAdapters = adapters.filter(adapter => adapter.canHandle(event, context, log));
23
+ if (resolvedAdapters.length === 0) {
24
+ throw new Error("SERVERLESS_ADAPTER: Couldn't find adapter to handle this event.");
25
+ }
26
+ if (resolvedAdapters.length > 1) {
27
+ throw new Error(`SERVERLESS_ADAPTER: Two or more adapters was resolved by the event, the adapters are: ${adapters
28
+ .map(adapter => adapter.getAdapterName())
29
+ .join(', ')}.`);
30
+ }
31
+ return resolvedAdapters[0];
32
+ }
33
+ /**
34
+ * Get serverless request and response frmo the adapter request
35
+ *
36
+ * @param requestValues The request values from adapter
37
+ */
38
+ getServerlessRequestResponseFromAdapterRequest(requestValues) {
39
+ const request = new network_1.ServerlessRequest({
40
+ method: requestValues.method,
41
+ headers: requestValues.headers,
42
+ body: requestValues.body,
43
+ remoteAddress: requestValues.remoteAddress,
44
+ url: requestValues.path,
45
+ });
46
+ const response = new network_1.ServerlessResponse({
47
+ method: requestValues.method,
48
+ });
49
+ return [request, response];
50
+ }
51
+ }
52
+ exports.BaseHandler = BaseHandler;
@@ -0,0 +1 @@
1
+ export * from './base.handler';
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./base.handler"), exports);
@@ -0,0 +1,85 @@
1
+ import { BinarySettings, SingleValueHeaders } from '../@types';
2
+ import { AdapterContract, AdapterRequest, FrameworkContract, ResolverContract, ServerlessHandler } from '../contracts';
3
+ import { ILogger } from '../core';
4
+ import { ServerlessResponse } from '../network';
5
+ import { BaseHandler } from './base';
6
+ /**
7
+ * The class that implements a default serverless handler consisting of a function with event, context and callback parameters respectively
8
+ */
9
+ export declare class DefaultHandler<TApp, TEvent, TContext, TCallback, TResponse, TReturn> extends BaseHandler<TApp, TEvent, TContext, TCallback, TResponse, TReturn> {
10
+ /**
11
+ * @inheritDoc
12
+ */
13
+ getHandler(app: TApp, framework: FrameworkContract<TApp>, adapters: AdapterContract<TEvent, TContext, TResponse>[], resolverFactory: ResolverContract<TEvent, TContext, TCallback, TResponse, TReturn>, binarySettings: BinarySettings, respondWithErrors: boolean, log: ILogger): ServerlessHandler<TReturn>;
14
+ /**
15
+ * The hook executed on receive a request, before the request is being processed
16
+ *
17
+ * @param log The instance of logger
18
+ * @param event The event sent by serverless
19
+ * @param context The context sent by serverless
20
+ * @param binarySettings The binary settings
21
+ * @param respondWithErrors Indicates whether the error stack should be included in the response or not
22
+ */
23
+ protected onReceiveRequest(log: ILogger, event: TEvent, context: TContext, binarySettings: BinarySettings, respondWithErrors: boolean): void;
24
+ /**
25
+ * The hook executed after resolve the adapter that will be used to handle the request and response
26
+ *
27
+ * @param log The instance of logger
28
+ * @param adapter The adapter resolved
29
+ */
30
+ protected onResolveAdapter(log: ILogger, adapter: AdapterContract<TEvent, TContext, TResponse>): void;
31
+ /**
32
+ * The hook executed after resolves the request values that will be sent to the framework
33
+ *
34
+ * @param log The instance of logger
35
+ * @param requestValues The request values returned by the adapter
36
+ */
37
+ protected onResolveRequestValues(log: ILogger, requestValues: AdapterRequest): void;
38
+ /**
39
+ * The hook executed after handling the response sent by the framework
40
+ *
41
+ * @param log The instance of logger
42
+ * @param response The response sent by the framework
43
+ */
44
+ protected onResolveForwardedResponseToFramework(log: ILogger, response: ServerlessResponse): void;
45
+ /**
46
+ * The hook executed before sending response to the serverless
47
+ *
48
+ * @param log The instance of logger
49
+ * @param statusCode The status code of the response
50
+ * @param body The body of the response
51
+ * @param headers The headers of the response
52
+ * @param isBase64Encoded Indicates whether the response was encoded as binary or not
53
+ */
54
+ protected onForwardResponse(log: ILogger, statusCode: number, body: string, headers: SingleValueHeaders, isBase64Encoded: boolean): void;
55
+ /**
56
+ * The hook executed before sending response to the serverless with response from adapter
57
+ *
58
+ * @param log The instance of logger
59
+ * @param successResponse The success response resolved by the adapter
60
+ * @param body The body of the response sent by the framework
61
+ */
62
+ protected onForwardResponseAdapterResponse(log: ILogger, successResponse: TResponse, body: string): void;
63
+ /**
64
+ * The function to forward the event to the framework
65
+ *
66
+ * @param app The instance of the app (express, hapi, etc...)
67
+ * @param framework The framework that will process requests
68
+ * @param event The event sent by serverless
69
+ * @param context The context sent by serverless
70
+ * @param adapter The adapter resolved to this event
71
+ * @param log The instance of logger
72
+ * @param binarySettings The binary settings
73
+ */
74
+ protected forwardRequestToFramework(app: TApp, framework: FrameworkContract<TApp>, event: TEvent, context: TContext, adapter: AdapterContract<TEvent, TContext, TResponse>, binarySettings: BinarySettings, log: ILogger): Promise<TResponse>;
75
+ /**
76
+ * The function to forward the response back to the serverless
77
+ *
78
+ * @param event The event sent by serverless
79
+ * @param response The response of the framework
80
+ * @param adapter The adapter resolved to this event
81
+ * @param binarySettings The binary settings
82
+ * @param log The instance of logger
83
+ */
84
+ protected forwardResponse(event: TEvent, response: ServerlessResponse, adapter: AdapterContract<TEvent, TContext, TResponse>, binarySettings: BinarySettings, log: ILogger): TResponse;
85
+ }
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ //#region Imports
3
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
5
+ return new (P || (P = Promise))(function (resolve, reject) {
6
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
7
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
8
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
9
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
10
+ });
11
+ };
12
+ var __importDefault = (this && this.__importDefault) || function (mod) {
13
+ return (mod && mod.__esModule) ? mod : { "default": mod };
14
+ };
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.DefaultHandler = void 0;
17
+ const util_1 = __importDefault(require("util"));
18
+ const core_1 = require("../core");
19
+ const network_1 = require("../network");
20
+ const base_1 = require("./base");
21
+ //#endregion
22
+ /**
23
+ * The class that implements a default serverless handler consisting of a function with event, context and callback parameters respectively
24
+ */
25
+ class DefaultHandler extends base_1.BaseHandler {
26
+ //#region Public Methods
27
+ /**
28
+ * @inheritDoc
29
+ */
30
+ getHandler(app, framework, adapters, resolverFactory, binarySettings, respondWithErrors, log) {
31
+ return (event, context, callback) => {
32
+ this.onReceiveRequest(log, event, context, binarySettings, respondWithErrors);
33
+ const adapter = this.getAdapterByEventAndContext(event, context, adapters, log);
34
+ this.onResolveAdapter(log, adapter);
35
+ (0, core_1.setCurrentInvoke)({ event, context });
36
+ const resolver = resolverFactory.createResolver({
37
+ event,
38
+ context,
39
+ callback,
40
+ log,
41
+ respondWithErrors,
42
+ adapter,
43
+ });
44
+ return resolver.run(() => this.forwardRequestToFramework(app, framework, event, context, adapter, binarySettings, log));
45
+ };
46
+ }
47
+ //#endregion
48
+ //#region Hooks
49
+ /**
50
+ * The hook executed on receive a request, before the request is being processed
51
+ *
52
+ * @param log The instance of logger
53
+ * @param event The event sent by serverless
54
+ * @param context The context sent by serverless
55
+ * @param binarySettings The binary settings
56
+ * @param respondWithErrors Indicates whether the error stack should be included in the response or not
57
+ */
58
+ onReceiveRequest(log, event, context, binarySettings, respondWithErrors) {
59
+ log.debug('SERVERLESS_ADAPTER:PROXY', {
60
+ event: util_1.default.inspect(event, { depth: null }),
61
+ context: util_1.default.inspect(context, { depth: null }),
62
+ binarySettings,
63
+ respondWithErrors,
64
+ });
65
+ }
66
+ /**
67
+ * The hook executed after resolve the adapter that will be used to handle the request and response
68
+ *
69
+ * @param log The instance of logger
70
+ * @param adapter The adapter resolved
71
+ */
72
+ onResolveAdapter(log, adapter) {
73
+ log.debug('SERVERLESS_ADAPTER:RESOLVED_ADAPTER_NAME: ', adapter.getAdapterName());
74
+ }
75
+ /**
76
+ * The hook executed after resolves the request values that will be sent to the framework
77
+ *
78
+ * @param log The instance of logger
79
+ * @param requestValues The request values returned by the adapter
80
+ */
81
+ onResolveRequestValues(log, requestValues) {
82
+ var _a;
83
+ const body = (_a = requestValues.body) === null || _a === void 0 ? void 0 : _a.toString();
84
+ log.debug('SERVERLESS_ADAPTER:FORWARD_REQUEST_TO_FRAMEWORK:REQUEST_VALUES', {
85
+ requestValues: Object.assign(Object.assign({}, requestValues), { body }),
86
+ });
87
+ }
88
+ /**
89
+ * The hook executed after handling the response sent by the framework
90
+ *
91
+ * @param log The instance of logger
92
+ * @param response The response sent by the framework
93
+ */
94
+ onResolveForwardedResponseToFramework(log, response) {
95
+ log.debug('SERVERLESS_ADAPTER:FORWARD_REQUEST_TO_FRAMEWORK:RESPONSE', {
96
+ response,
97
+ });
98
+ }
99
+ /**
100
+ * The hook executed before sending response to the serverless
101
+ *
102
+ * @param log The instance of logger
103
+ * @param statusCode The status code of the response
104
+ * @param body The body of the response
105
+ * @param headers The headers of the response
106
+ * @param isBase64Encoded Indicates whether the response was encoded as binary or not
107
+ */
108
+ onForwardResponse(log, statusCode, body, headers, isBase64Encoded) {
109
+ log.debug('SERVERLESS_ADAPTER:FORWARD_RESPONSE:EVENT_SOURCE_RESPONSE_PARAMS', {
110
+ statusCode,
111
+ body,
112
+ headers,
113
+ isBase64Encoded,
114
+ });
115
+ }
116
+ /**
117
+ * The hook executed before sending response to the serverless with response from adapter
118
+ *
119
+ * @param log The instance of logger
120
+ * @param successResponse The success response resolved by the adapter
121
+ * @param body The body of the response sent by the framework
122
+ */
123
+ onForwardResponseAdapterResponse(log, successResponse, body) {
124
+ log.debug('SERVERLESS_ADAPTER:FORWARD_RESPONSE:EVENT_SOURCE_RESPONSE', {
125
+ successResponse: util_1.default.inspect(successResponse, { depth: null }),
126
+ body,
127
+ });
128
+ }
129
+ //#endregion
130
+ //#region Protected Methods
131
+ /**
132
+ * The function to forward the event to the framework
133
+ *
134
+ * @param app The instance of the app (express, hapi, etc...)
135
+ * @param framework The framework that will process requests
136
+ * @param event The event sent by serverless
137
+ * @param context The context sent by serverless
138
+ * @param adapter The adapter resolved to this event
139
+ * @param log The instance of logger
140
+ * @param binarySettings The binary settings
141
+ */
142
+ forwardRequestToFramework(app, framework, event, context, adapter, binarySettings, log) {
143
+ return __awaiter(this, void 0, void 0, function* () {
144
+ const requestValues = adapter.getRequest(event, context, log);
145
+ this.onResolveRequestValues(log, requestValues);
146
+ const [request, response] = this.getServerlessRequestResponseFromAdapterRequest(requestValues);
147
+ framework.sendRequest(app, request, response);
148
+ yield (0, core_1.waitForStreamComplete)(response);
149
+ this.onResolveForwardedResponseToFramework(log, response);
150
+ return this.forwardResponse(event, response, adapter, binarySettings, log);
151
+ });
152
+ }
153
+ /**
154
+ * The function to forward the response back to the serverless
155
+ *
156
+ * @param event The event sent by serverless
157
+ * @param response The response of the framework
158
+ * @param adapter The adapter resolved to this event
159
+ * @param binarySettings The binary settings
160
+ * @param log The instance of logger
161
+ */
162
+ forwardResponse(event, response, adapter, binarySettings, log) {
163
+ const statusCode = response.statusCode;
164
+ const headers = network_1.ServerlessResponse.headers(response);
165
+ const isBase64Encoded = (0, core_1.isBinary)(headers, binarySettings);
166
+ const encoding = isBase64Encoded ? 'base64' : 'utf8';
167
+ const body = network_1.ServerlessResponse.body(response).toString(encoding);
168
+ const logBody = isBase64Encoded ? '[BASE64_ENCODED]' : body;
169
+ this.onForwardResponse(log, statusCode, logBody, headers, isBase64Encoded);
170
+ const successResponse = adapter.getResponse({
171
+ event,
172
+ statusCode,
173
+ body,
174
+ headers,
175
+ isBase64Encoded,
176
+ response,
177
+ log,
178
+ });
179
+ this.onForwardResponseAdapterResponse(log, successResponse, logBody);
180
+ return successResponse;
181
+ }
182
+ }
183
+ exports.DefaultHandler = DefaultHandler;
@@ -0,0 +1,2 @@
1
+ export * from './base';
2
+ export * from './default.handler';
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./base"), exports);
14
+ __exportStar(require("./default.handler"), exports);
package/lib/index.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ export * from './@types';
2
+ export * from './adapters';
3
+ export * from './contracts';
4
+ export * from './core';
5
+ export * from './frameworks';
6
+ export * from './handlers';
7
+ export * from './network';
8
+ export * from './resolvers';
9
+ export * from './serverless-adapter';
package/lib/index.js ADDED
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./@types"), exports);
14
+ __exportStar(require("./adapters"), exports);
15
+ __exportStar(require("./contracts"), exports);
16
+ __exportStar(require("./core"), exports);
17
+ __exportStar(require("./frameworks"), exports);
18
+ __exportStar(require("./handlers"), exports);
19
+ __exportStar(require("./network"), exports);
20
+ __exportStar(require("./resolvers"), exports);
21
+ __exportStar(require("./serverless-adapter"), exports);
@@ -0,0 +1,2 @@
1
+ export * from './request';
2
+ export * from './response';
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./request"), exports);
14
+ __exportStar(require("./response"), exports);
@@ -0,0 +1,15 @@
1
+ /// <reference types="node" />
2
+ import http from 'http';
3
+ import { SingleValueHeaders } from '../@types';
4
+ export interface ServerlessRequestProps {
5
+ method: string;
6
+ url: string;
7
+ headers: SingleValueHeaders;
8
+ body?: Buffer;
9
+ remoteAddress?: string;
10
+ }
11
+ export declare class ServerlessRequest extends http.IncomingMessage {
12
+ constructor({ method, url, headers, body, remoteAddress, }: ServerlessRequestProps);
13
+ ip?: string;
14
+ body?: Buffer;
15
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ServerlessRequest = void 0;
7
+ // ATTRIBUTION: https://github.com/dougmoscrop/serverless-http
8
+ const http_1 = __importDefault(require("http"));
9
+ const core_1 = require("../core");
10
+ const HTTPS_PORT = 443;
11
+ class ServerlessRequest extends http_1.default.IncomingMessage {
12
+ constructor({ method, url, headers, body, remoteAddress, }) {
13
+ super({
14
+ encrypted: true,
15
+ readable: false,
16
+ remoteAddress,
17
+ address: () => ({ port: HTTPS_PORT }),
18
+ end: core_1.NO_OP,
19
+ destroy: core_1.NO_OP,
20
+ });
21
+ this.statusCode = 200;
22
+ this.statusMessage = 'OK';
23
+ this.complete = true;
24
+ this.httpVersion = '1.1';
25
+ this.httpVersionMajor = 1;
26
+ this.httpVersionMinor = 1;
27
+ this.method = method;
28
+ this.headers = headers;
29
+ this.body = body;
30
+ this.url = url;
31
+ this.ip = remoteAddress;
32
+ // ref: https://github.com/nodejs/node/blob/master/lib/internal/streams/readable.js#L1278
33
+ this._readableState.endEmitted = true;
34
+ this._read = () => {
35
+ this.push(body);
36
+ this.push(null);
37
+ };
38
+ }
39
+ }
40
+ exports.ServerlessRequest = ServerlessRequest;
@@ -0,0 +1,22 @@
1
+ /// <reference types="node" />
2
+ import http, { IncomingMessage, OutgoingHttpHeaders } from 'http';
3
+ declare const BODY: unique symbol;
4
+ declare const HEADERS: unique symbol;
5
+ export interface ServerlessResponseProps {
6
+ method?: string;
7
+ }
8
+ export declare class ServerlessResponse extends http.ServerResponse {
9
+ constructor({ method }: ServerlessResponseProps);
10
+ _header: string;
11
+ _headers?: Record<any, any>;
12
+ _wroteHeader?: boolean;
13
+ [BODY]: any[];
14
+ [HEADERS]: Record<any, any>;
15
+ get headers(): Record<any, any>;
16
+ static from(res: IncomingMessage): ServerlessResponse;
17
+ static body(res: ServerlessResponse): Buffer;
18
+ static headers(res: ServerlessResponse): Record<any, any>;
19
+ setHeader(key: string, value: number | string | readonly string[]): any;
20
+ writeHead(statusCode: number, reason?: string | OutgoingHttpHeaders, obj?: OutgoingHttpHeaders): any;
21
+ }
22
+ export {};
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ServerlessResponse = void 0;
7
+ // ATTRIBUTION: https://github.com/dougmoscrop/serverless-http
8
+ const http_1 = __importDefault(require("http"));
9
+ const core_1 = require("../core");
10
+ const headerEnd = '\r\n\r\n';
11
+ const BODY = Symbol('Response body');
12
+ const HEADERS = Symbol('Response headers');
13
+ function getString(data) {
14
+ if (Buffer.isBuffer(data))
15
+ return data.toString('utf8');
16
+ else if (typeof data === 'string')
17
+ return data;
18
+ else
19
+ throw new Error(`response.write() of unexpected type: ${typeof data}`);
20
+ }
21
+ function addData(stream, data) {
22
+ if (Buffer.isBuffer(data) || typeof data === 'string')
23
+ stream[BODY].push(Buffer.from(data));
24
+ else
25
+ throw new Error(`response.write() of unexpected type: ${typeof data}`);
26
+ }
27
+ class ServerlessResponse extends http_1.default.ServerResponse {
28
+ constructor({ method }) {
29
+ super({ method });
30
+ this[BODY] = [];
31
+ this[HEADERS] = {};
32
+ this.useChunkedEncodingByDefault = false;
33
+ this.chunkedEncoding = false;
34
+ this._header = '';
35
+ const socket = {
36
+ _writableState: {},
37
+ writable: true,
38
+ on: core_1.NO_OP,
39
+ removeListener: core_1.NO_OP,
40
+ destroy: core_1.NO_OP,
41
+ cork: core_1.NO_OP,
42
+ uncork: core_1.NO_OP,
43
+ write: (data, encoding, cb) => {
44
+ if (typeof encoding === 'function') {
45
+ cb = encoding;
46
+ encoding = null;
47
+ }
48
+ if (this._header === '' || this._wroteHeader)
49
+ addData(this, data);
50
+ else {
51
+ const string = getString(data);
52
+ const index = string.indexOf(headerEnd);
53
+ if (index !== -1) {
54
+ const remainder = string.slice(index + headerEnd.length);
55
+ if (remainder)
56
+ addData(this, remainder);
57
+ this._wroteHeader = true;
58
+ }
59
+ }
60
+ if (typeof cb === 'function')
61
+ cb();
62
+ },
63
+ };
64
+ this.assignSocket(socket);
65
+ }
66
+ get headers() {
67
+ return this[HEADERS];
68
+ }
69
+ static from(res) {
70
+ const response = new ServerlessResponse({ method: res.method });
71
+ response.statusCode = res.statusCode || 0;
72
+ response[HEADERS] = res.headers;
73
+ response[BODY] = res.body ? [Buffer.from(res.body)] : [];
74
+ response.end();
75
+ return response;
76
+ }
77
+ static body(res) {
78
+ return Buffer.concat(res[BODY]);
79
+ }
80
+ static headers(res) {
81
+ const headers = typeof res.getHeaders === 'function' ? res.getHeaders() : res._headers;
82
+ return Object.assign(headers, res[HEADERS]);
83
+ }
84
+ setHeader(key, value) {
85
+ if (this._wroteHeader)
86
+ this[HEADERS][key] = value;
87
+ else
88
+ super.setHeader(key, value);
89
+ }
90
+ writeHead(statusCode, reason, obj) {
91
+ const headers = typeof reason === 'string' ? obj : reason;
92
+ for (const name in headers) {
93
+ this.setHeader(name, headers[name]);
94
+ if (!this._wroteHeader) {
95
+ // we only need to initiate super.headers once
96
+ // writeHead will add the other headers itself
97
+ break;
98
+ }
99
+ }
100
+ // @ts-ignore
101
+ super.writeHead(statusCode, reason, obj);
102
+ }
103
+ }
104
+ exports.ServerlessResponse = ServerlessResponse;
@@ -0,0 +1,21 @@
1
+ import type { Context } from 'aws-lambda';
2
+ import { Resolver, ResolverContract, ResolverProps } from '../contracts';
3
+ /**
4
+ * The class that implements the resolver by using the AWS Context object.
5
+ *
6
+ * @note To use this resolver, you MUST leave `{@link https://docs.aws.amazon.com/lambda/latest/dg/nodejs-context.html callbackWaitsForEmptyEventLoop}` as true, otherwise, AWS will not wait for this resolver to resolve.
7
+ *
8
+ * ```md
9
+ * From the AWS Documentation, describing the functions used in this resolver:
10
+ * // Functions for compatibility with earlier Node.js Runtime v0.10.42
11
+ * // No longer documented, so they are deprecated, but they still work
12
+ * // as of the 12.x runtime, so they are not removed from the types.
13
+ * ```
14
+ * @deprecated
15
+ */
16
+ export declare class AwsContextResolver<TEvent, TCallback, TResponse> implements ResolverContract<TEvent, Context, TCallback, TResponse, void> {
17
+ /**
18
+ * @inheritDoc
19
+ */
20
+ createResolver({ context, event, log, respondWithErrors, adapter, }: ResolverProps<any, Context, any, any>): Resolver<any, void>;
21
+ }