@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.
- package/LICENSE +21 -0
- package/README.md +204 -0
- package/lib/@types/binary-settings.d.ts +23 -0
- package/lib/@types/binary-settings.js +2 -0
- package/lib/@types/headers.d.ts +24 -0
- package/lib/@types/headers.js +2 -0
- package/lib/@types/helpers.d.ts +6 -0
- package/lib/@types/helpers.js +2 -0
- package/lib/@types/index.d.ts +3 -0
- package/lib/@types/index.js +15 -0
- package/lib/@types/proxy-params.d.ts +8 -0
- package/lib/@types/proxy-params.js +2 -0
- package/lib/adapters/aws/alb.adapter.d.ts +58 -0
- package/lib/adapters/aws/alb.adapter.js +119 -0
- package/lib/adapters/aws/api-gateway-v1.adapter.d.ts +63 -0
- package/lib/adapters/aws/api-gateway-v1.adapter.js +126 -0
- package/lib/adapters/aws/api-gateway-v2.adapter.d.ts +61 -0
- package/lib/adapters/aws/api-gateway-v2.adapter.js +123 -0
- package/lib/adapters/aws/dynamodb.adapter.d.ts +62 -0
- package/lib/adapters/aws/dynamodb.adapter.js +81 -0
- package/lib/adapters/aws/event-bridge.adapter.d.ts +66 -0
- package/lib/adapters/aws/event-bridge.adapter.js +91 -0
- package/lib/adapters/aws/index.d.ts +8 -0
- package/lib/adapters/aws/index.js +20 -0
- package/lib/adapters/aws/lambda-edge.adapter.d.ts +179 -0
- package/lib/adapters/aws/lambda-edge.adapter.js +248 -0
- package/lib/adapters/aws/sns.adapter.d.ts +62 -0
- package/lib/adapters/aws/sns.adapter.js +81 -0
- package/lib/adapters/aws/sqs.adapter.d.ts +62 -0
- package/lib/adapters/aws/sqs.adapter.js +81 -0
- package/lib/adapters/index.d.ts +1 -0
- package/lib/adapters/index.js +13 -0
- package/lib/contracts/adapter.contract.d.ts +152 -0
- package/lib/contracts/adapter.contract.js +2 -0
- package/lib/contracts/framework.contract.d.ts +15 -0
- package/lib/contracts/framework.contract.js +3 -0
- package/lib/contracts/handler.contract.d.ts +18 -0
- package/lib/contracts/handler.contract.js +3 -0
- package/lib/contracts/index.d.ts +4 -0
- package/lib/contracts/index.js +16 -0
- package/lib/contracts/resolver.contract.d.ts +70 -0
- package/lib/contracts/resolver.contract.js +3 -0
- package/lib/core/constants.d.ts +4 -0
- package/lib/core/constants.js +10 -0
- package/lib/core/current-invoke.d.ts +37 -0
- package/lib/core/current-invoke.js +34 -0
- package/lib/core/event-body.d.ts +16 -0
- package/lib/core/event-body.js +24 -0
- package/lib/core/headers.d.ts +27 -0
- package/lib/core/headers.js +53 -0
- package/lib/core/index.d.ts +10 -0
- package/lib/core/index.js +22 -0
- package/lib/core/is-binary.d.ts +55 -0
- package/lib/core/is-binary.js +91 -0
- package/lib/core/logger.d.ts +38 -0
- package/lib/core/logger.js +51 -0
- package/lib/core/no-op.d.ts +4 -0
- package/lib/core/no-op.js +8 -0
- package/lib/core/optional.d.ts +17 -0
- package/lib/core/optional.js +25 -0
- package/lib/core/path.d.ts +28 -0
- package/lib/core/path.js +56 -0
- package/lib/core/stream.d.ts +8 -0
- package/lib/core/stream.js +39 -0
- package/lib/frameworks/express.framework.d.ts +13 -0
- package/lib/frameworks/express.framework.js +17 -0
- package/lib/frameworks/fastify.framework.d.ts +13 -0
- package/lib/frameworks/fastify.framework.js +18 -0
- package/lib/frameworks/hapi.framework.d.ts +13 -0
- package/lib/frameworks/hapi.framework.js +18 -0
- package/lib/frameworks/index.d.ts +4 -0
- package/lib/frameworks/index.js +16 -0
- package/lib/frameworks/koa.framework.d.ts +13 -0
- package/lib/frameworks/koa.framework.js +17 -0
- package/lib/handlers/base/base.handler.d.ts +28 -0
- package/lib/handlers/base/base.handler.js +52 -0
- package/lib/handlers/base/index.d.ts +1 -0
- package/lib/handlers/base/index.js +13 -0
- package/lib/handlers/default.handler.d.ts +85 -0
- package/lib/handlers/default.handler.js +183 -0
- package/lib/handlers/index.d.ts +2 -0
- package/lib/handlers/index.js +14 -0
- package/lib/index.d.ts +9 -0
- package/lib/index.js +21 -0
- package/lib/network/index.d.ts +2 -0
- package/lib/network/index.js +14 -0
- package/lib/network/request.d.ts +15 -0
- package/lib/network/request.js +40 -0
- package/lib/network/response.d.ts +22 -0
- package/lib/network/response.js +104 -0
- package/lib/resolvers/aws-context.resolver.d.ts +21 -0
- package/lib/resolvers/aws-context.resolver.js +55 -0
- package/lib/resolvers/callback.resolver.d.ts +16 -0
- package/lib/resolvers/callback.resolver.js +40 -0
- package/lib/resolvers/index.d.ts +3 -0
- package/lib/resolvers/index.js +15 -0
- package/lib/resolvers/promise.resolver.d.ts +10 -0
- package/lib/resolvers/promise.resolver.js +38 -0
- package/lib/serverless-adapter.d.ts +114 -0
- package/lib/serverless-adapter.js +158 -0
- 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,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,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
|
+
}
|