@comicrelief/lambda-wrapper 1.10.2 → 2.0.0-beta.10
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/README.md +196 -50
- package/dist/core/DependencyAwareClass.d.ts +16 -0
- package/dist/core/DependencyAwareClass.d.ts.map +1 -0
- package/dist/core/DependencyAwareClass.js +20 -0
- package/dist/core/DependencyAwareClass.js.map +1 -0
- package/dist/core/DependencyInjection.d.ts +62 -0
- package/dist/core/DependencyInjection.d.ts.map +1 -0
- package/dist/core/DependencyInjection.js +105 -0
- package/dist/core/DependencyInjection.js.map +1 -0
- package/dist/core/LambdaWrapper.d.ts +73 -0
- package/dist/core/LambdaWrapper.d.ts.map +1 -0
- package/dist/core/LambdaWrapper.js +170 -0
- package/dist/core/LambdaWrapper.js.map +1 -0
- package/dist/core/config.d.ts +20 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +21 -0
- package/dist/core/config.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -143
- package/dist/index.js.map +1 -0
- package/dist/models/ResponseModel.d.ts +73 -0
- package/dist/models/ResponseModel.d.ts.map +1 -0
- package/dist/models/ResponseModel.js +100 -0
- package/dist/models/ResponseModel.js.map +1 -0
- package/dist/models/SQSMessageModel.d.ts +46 -0
- package/dist/models/SQSMessageModel.d.ts.map +1 -0
- package/dist/models/SQSMessageModel.js +65 -0
- package/dist/models/SQSMessageModel.js.map +1 -0
- package/dist/services/BaseConfigService.d.ts +101 -0
- package/dist/services/BaseConfigService.d.ts.map +1 -0
- package/dist/services/BaseConfigService.js +180 -0
- package/dist/services/BaseConfigService.js.map +1 -0
- package/dist/services/HTTPService.d.ts +29 -0
- package/dist/services/HTTPService.d.ts.map +1 -0
- package/dist/services/HTTPService.js +55 -0
- package/dist/services/HTTPService.js.map +1 -0
- package/dist/services/LoggerService.d.ts +102 -0
- package/dist/services/LoggerService.d.ts.map +1 -0
- package/dist/services/LoggerService.js +249 -0
- package/dist/services/LoggerService.js.map +1 -0
- package/dist/services/RequestService.d.ts +119 -0
- package/dist/services/RequestService.d.ts.map +1 -0
- package/dist/services/RequestService.js +293 -0
- package/dist/services/RequestService.js.map +1 -0
- package/dist/services/SQSService.d.ts +263 -0
- package/dist/services/SQSService.d.ts.map +1 -0
- package/dist/services/SQSService.js +411 -0
- package/dist/services/SQSService.js.map +1 -0
- package/dist/services/TimerService.d.ts +22 -0
- package/dist/services/TimerService.d.ts.map +1 -0
- package/dist/services/TimerService.js +40 -0
- package/dist/services/TimerService.js.map +1 -0
- package/dist/types/Status.d.ts +6 -0
- package/dist/types/Status.d.ts.map +1 -0
- package/dist/types/Status.js +3 -0
- package/dist/types/Status.js.map +1 -0
- package/dist/utils/LambdaTermination.d.ts +14 -0
- package/dist/utils/LambdaTermination.d.ts.map +1 -0
- package/dist/utils/LambdaTermination.js +23 -0
- package/dist/utils/LambdaTermination.js.map +1 -0
- package/dist/utils/PromisifiedDelay.d.ts +17 -0
- package/dist/utils/PromisifiedDelay.d.ts.map +1 -0
- package/dist/utils/PromisifiedDelay.js +48 -0
- package/dist/utils/PromisifiedDelay.js.map +1 -0
- package/package.json +36 -26
- package/.eslintrc.yml +0 -16
- package/.github/dependabot.yml +0 -11
- package/.github/workflows/main.yml +0 -74
- package/babel.config.js +0 -13
- package/dist/Config/Dependencies.js +0 -33
- package/dist/DependencyInjection/DependencyAware.class.js +0 -40
- package/dist/DependencyInjection/DependencyInjection.class.js +0 -115
- package/dist/Model/CloudEvent.model.js +0 -138
- package/dist/Model/Model.model.js +0 -39
- package/dist/Model/Response.model.js +0 -135
- package/dist/Model/SQS/MarketingPreference.constraints.json +0 -28
- package/dist/Model/SQS/MarketingPreference.model.js +0 -583
- package/dist/Model/SQS/Message.model.js +0 -92
- package/dist/Model/Status.model.js +0 -71
- package/dist/Service/BaseConfig.service.js +0 -204
- package/dist/Service/HTTP.service.js +0 -57
- package/dist/Service/Logger.service.js +0 -256
- package/dist/Service/Request.service.js +0 -294
- package/dist/Service/SQS.service.js +0 -367
- package/dist/Service/Timer.service.js +0 -46
- package/dist/Wrapper/LambdaTermination.js +0 -34
- package/dist/Wrapper/LambdaWrapper.js +0 -143
- package/dist/Wrapper/PromisifiedDelay.js +0 -55
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
/**
|
|
8
|
-
*
|
|
9
|
-
*/
|
|
10
|
-
class LambdaTermination extends Error {
|
|
11
|
-
/**
|
|
12
|
-
* Triggers a Lambda Termination.
|
|
13
|
-
* Offers developer details (that are logged)
|
|
14
|
-
* an code for the Lambda and a front facing
|
|
15
|
-
* consumer message.
|
|
16
|
-
*
|
|
17
|
-
* @param {object|string} internal
|
|
18
|
-
* @param {number?} code
|
|
19
|
-
* @param {object|string?} body
|
|
20
|
-
* @param details
|
|
21
|
-
*/
|
|
22
|
-
constructor(internal, code = 500, body = null, details = 'unknown error') {
|
|
23
|
-
let stringified = internal;
|
|
24
|
-
if (typeof internal !== 'string') {
|
|
25
|
-
stringified = JSON.stringify(internal);
|
|
26
|
-
}
|
|
27
|
-
super(stringified);
|
|
28
|
-
this.internal = internal;
|
|
29
|
-
this.code = code;
|
|
30
|
-
this.body = body || 'unknown error';
|
|
31
|
-
this.details = details;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
exports.default = LambdaTermination;
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.handleSuccess = exports.handleError = exports.default = void 0;
|
|
7
|
-
var _epsagon = _interopRequireDefault(require("epsagon"));
|
|
8
|
-
var _Dependencies = require("../Config/Dependencies");
|
|
9
|
-
var _DependencyInjection = _interopRequireDefault(require("../DependencyInjection/DependencyInjection.class"));
|
|
10
|
-
var _Response = _interopRequireDefault(require("../Model/Response.model"));
|
|
11
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
|
-
/* eslint-disable sonarjs/cognitive-complexity */
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Processes the outcome once we have one
|
|
16
|
-
*
|
|
17
|
-
* @param di
|
|
18
|
-
* @param outcome
|
|
19
|
-
*/
|
|
20
|
-
const handleSuccess = (di, outcome) => {
|
|
21
|
-
const logger = di.get(_Dependencies.DEFINITIONS.LOGGER);
|
|
22
|
-
|
|
23
|
-
// Outcome may be undefined as not all lambdas have a return value.
|
|
24
|
-
logger.metric('lambda.statusCode', outcome && outcome.statusCode || 200);
|
|
25
|
-
return outcome;
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Gracefully handles an error
|
|
30
|
-
* logging in Epsagon and generating
|
|
31
|
-
* a response reflecting the `code`
|
|
32
|
-
* of the error, if defined.
|
|
33
|
-
*
|
|
34
|
-
* Note about Epsagon:
|
|
35
|
-
* Epsagon generates alerts for logs on level ERROR.
|
|
36
|
-
* This means that logger.error will produce an alert.
|
|
37
|
-
* To avoid not meaningful notifications, most likely
|
|
38
|
-
* coming from tests, we log INFO unless either:
|
|
39
|
-
*
|
|
40
|
-
* 1. `error.raiseOnEpsagon` is defined & truthy
|
|
41
|
-
* 2. `error.code` is defined and `error.code >= 500`.
|
|
42
|
-
*
|
|
43
|
-
* @param {DependencyInjection} di
|
|
44
|
-
* @param {Error} error
|
|
45
|
-
* @param {boolean} [throwError=false]
|
|
46
|
-
*/
|
|
47
|
-
exports.handleSuccess = handleSuccess;
|
|
48
|
-
const handleError = (di, error, throwError = false) => {
|
|
49
|
-
const logger = di.get(_Dependencies.DEFINITIONS.LOGGER);
|
|
50
|
-
logger.metric('lambda.statusCode', error.code || 500);
|
|
51
|
-
if (error.raiseOnEpsagon || !error.code || error.code >= 500) {
|
|
52
|
-
logger.error(error);
|
|
53
|
-
} else {
|
|
54
|
-
logger.info(error);
|
|
55
|
-
}
|
|
56
|
-
if (throwError) {
|
|
57
|
-
if (error instanceof Error) {
|
|
58
|
-
return error;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// We want to be absolutely sure
|
|
62
|
-
// that we are returning an error
|
|
63
|
-
// as Lambda sync handlers will only fail
|
|
64
|
-
// if the object is instanceof Error
|
|
65
|
-
return new Error(error);
|
|
66
|
-
}
|
|
67
|
-
const responseDetails = {
|
|
68
|
-
body: error.body || {},
|
|
69
|
-
code: error.code || 500,
|
|
70
|
-
details: error.details || 'unknown error'
|
|
71
|
-
};
|
|
72
|
-
return _Response.default.generate(responseDetails.body, responseDetails.code, responseDetails.details);
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Lambda Wrapper.
|
|
77
|
-
*
|
|
78
|
-
* Wraps a lambda handler, generating a new function
|
|
79
|
-
* that has access to the dependency injection
|
|
80
|
-
* for the service and handles logging and exceptions.
|
|
81
|
-
*
|
|
82
|
-
* @param configuration
|
|
83
|
-
* @param handler
|
|
84
|
-
* @param throwError
|
|
85
|
-
*/
|
|
86
|
-
exports.handleError = handleError;
|
|
87
|
-
var _default = (configuration, handler, throwError = false) => {
|
|
88
|
-
let instance = (event, context, callback) => {
|
|
89
|
-
const di = new _DependencyInjection.default(configuration, event, context);
|
|
90
|
-
const request = di.get(_Dependencies.DEFINITIONS.REQUEST);
|
|
91
|
-
const logger = di.get(_Dependencies.DEFINITIONS.LOGGER);
|
|
92
|
-
context.callbackWaitsForEmptyEventLoop = false;
|
|
93
|
-
|
|
94
|
-
// If the event is to trigger a warm up, then don't bother returning the function.
|
|
95
|
-
if (di.getEvent().source === 'serverless-plugin-warmup') {
|
|
96
|
-
return callback(null, 'Lambda is warm!');
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// Log the users ip address silently for use in error tracing
|
|
100
|
-
if (request.getIp() !== null) {
|
|
101
|
-
logger.metric('ipAddress', request.getIp(), true);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// Add metrics with user browser information for rapid debugging
|
|
105
|
-
const userBrowserAndDevice = request.getUserBrowserAndDevice();
|
|
106
|
-
if (userBrowserAndDevice !== null && typeof userBrowserAndDevice === 'object') {
|
|
107
|
-
Object.keys(userBrowserAndDevice).forEach(metricKey => {
|
|
108
|
-
logger.metric(metricKey, userBrowserAndDevice[metricKey], true);
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
let outcome;
|
|
112
|
-
try {
|
|
113
|
-
outcome = handler.call(instance, di, request, callback);
|
|
114
|
-
if (outcome instanceof Promise) {
|
|
115
|
-
outcome = outcome.then(value => handleSuccess(di, value)).catch(error => {
|
|
116
|
-
const handled = handleError(di, error, throwError);
|
|
117
|
-
if (throwError) {
|
|
118
|
-
// AWS Lambda with async handler is looking for a rejection
|
|
119
|
-
// and not an error object directly
|
|
120
|
-
// and will treat resolved errors as successful
|
|
121
|
-
// as it will cast the error to JSON, i.e. `{}`
|
|
122
|
-
throw handled;
|
|
123
|
-
}
|
|
124
|
-
return handled;
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
} catch (error) {
|
|
128
|
-
outcome = handleError(di, error, throwError);
|
|
129
|
-
}
|
|
130
|
-
return outcome;
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
// If the Epsagon token is enabled, then wrap the instance in the Epsagon wrapper
|
|
134
|
-
if (typeof process.env.EPSAGON_TOKEN === 'string' && process.env.EPSAGON_TOKEN !== 'undefined' && typeof process.env.EPSAGON_SERVICE_NAME === 'string' && process.env.EPSAGON_SERVICE_NAME !== 'undefined') {
|
|
135
|
-
_epsagon.default.init({
|
|
136
|
-
token: process.env.EPSAGON_TOKEN,
|
|
137
|
-
appName: process.env.EPSAGON_SERVICE_NAME
|
|
138
|
-
});
|
|
139
|
-
instance = _epsagon.default.lambdaWrapper(instance);
|
|
140
|
-
}
|
|
141
|
-
return instance;
|
|
142
|
-
};
|
|
143
|
-
exports.default = _default;
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
const STANDARD_LATENCY_DELAYS = {
|
|
8
|
-
2000: 70,
|
|
9
|
-
3500: 15,
|
|
10
|
-
4000: 10,
|
|
11
|
-
5000: 5
|
|
12
|
-
};
|
|
13
|
-
const HIGH_LATENCY_DELAYS = {
|
|
14
|
-
2000: 65,
|
|
15
|
-
3500: 15,
|
|
16
|
-
4000: 9,
|
|
17
|
-
5000: 5,
|
|
18
|
-
10_000: 5,
|
|
19
|
-
20_000: 1
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* PromisifiedDelay class
|
|
24
|
-
*/
|
|
25
|
-
class PromisifiedDelay {
|
|
26
|
-
/**
|
|
27
|
-
* PromisifiedDelay constructor
|
|
28
|
-
*
|
|
29
|
-
* @param highLatency
|
|
30
|
-
*/
|
|
31
|
-
constructor(highLatency = true) {
|
|
32
|
-
this.delays = [];
|
|
33
|
-
const delayArray = highLatency === true ? HIGH_LATENCY_DELAYS : STANDARD_LATENCY_DELAYS;
|
|
34
|
-
Object.keys(delayArray).forEach(delayDuration => {
|
|
35
|
-
const delayIterations = delayArray[delayDuration];
|
|
36
|
-
for (let i = 0; i < delayIterations; i += 1) {
|
|
37
|
-
this.delays.push(delayDuration);
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Create a promisified delay
|
|
44
|
-
*
|
|
45
|
-
* @returns {Promise<any>}
|
|
46
|
-
*/
|
|
47
|
-
get() {
|
|
48
|
-
return new Promise(resolve => {
|
|
49
|
-
setTimeout(() => {
|
|
50
|
-
resolve();
|
|
51
|
-
}, this.delays[Math.floor(Math.random() * this.delays.length)]);
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
exports.default = PromisifiedDelay;
|