@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.
Files changed (89) hide show
  1. package/README.md +196 -50
  2. package/dist/core/DependencyAwareClass.d.ts +16 -0
  3. package/dist/core/DependencyAwareClass.d.ts.map +1 -0
  4. package/dist/core/DependencyAwareClass.js +20 -0
  5. package/dist/core/DependencyAwareClass.js.map +1 -0
  6. package/dist/core/DependencyInjection.d.ts +62 -0
  7. package/dist/core/DependencyInjection.d.ts.map +1 -0
  8. package/dist/core/DependencyInjection.js +105 -0
  9. package/dist/core/DependencyInjection.js.map +1 -0
  10. package/dist/core/LambdaWrapper.d.ts +73 -0
  11. package/dist/core/LambdaWrapper.d.ts.map +1 -0
  12. package/dist/core/LambdaWrapper.js +170 -0
  13. package/dist/core/LambdaWrapper.js.map +1 -0
  14. package/dist/core/config.d.ts +20 -0
  15. package/dist/core/config.d.ts.map +1 -0
  16. package/dist/core/config.js +21 -0
  17. package/dist/core/config.js.map +1 -0
  18. package/dist/index.d.ts +28 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +57 -143
  21. package/dist/index.js.map +1 -0
  22. package/dist/models/ResponseModel.d.ts +73 -0
  23. package/dist/models/ResponseModel.d.ts.map +1 -0
  24. package/dist/models/ResponseModel.js +100 -0
  25. package/dist/models/ResponseModel.js.map +1 -0
  26. package/dist/models/SQSMessageModel.d.ts +46 -0
  27. package/dist/models/SQSMessageModel.d.ts.map +1 -0
  28. package/dist/models/SQSMessageModel.js +65 -0
  29. package/dist/models/SQSMessageModel.js.map +1 -0
  30. package/dist/services/BaseConfigService.d.ts +101 -0
  31. package/dist/services/BaseConfigService.d.ts.map +1 -0
  32. package/dist/services/BaseConfigService.js +180 -0
  33. package/dist/services/BaseConfigService.js.map +1 -0
  34. package/dist/services/HTTPService.d.ts +29 -0
  35. package/dist/services/HTTPService.d.ts.map +1 -0
  36. package/dist/services/HTTPService.js +55 -0
  37. package/dist/services/HTTPService.js.map +1 -0
  38. package/dist/services/LoggerService.d.ts +102 -0
  39. package/dist/services/LoggerService.d.ts.map +1 -0
  40. package/dist/services/LoggerService.js +249 -0
  41. package/dist/services/LoggerService.js.map +1 -0
  42. package/dist/services/RequestService.d.ts +119 -0
  43. package/dist/services/RequestService.d.ts.map +1 -0
  44. package/dist/services/RequestService.js +293 -0
  45. package/dist/services/RequestService.js.map +1 -0
  46. package/dist/services/SQSService.d.ts +263 -0
  47. package/dist/services/SQSService.d.ts.map +1 -0
  48. package/dist/services/SQSService.js +411 -0
  49. package/dist/services/SQSService.js.map +1 -0
  50. package/dist/services/TimerService.d.ts +22 -0
  51. package/dist/services/TimerService.d.ts.map +1 -0
  52. package/dist/services/TimerService.js +40 -0
  53. package/dist/services/TimerService.js.map +1 -0
  54. package/dist/types/Status.d.ts +6 -0
  55. package/dist/types/Status.d.ts.map +1 -0
  56. package/dist/types/Status.js +3 -0
  57. package/dist/types/Status.js.map +1 -0
  58. package/dist/utils/LambdaTermination.d.ts +14 -0
  59. package/dist/utils/LambdaTermination.d.ts.map +1 -0
  60. package/dist/utils/LambdaTermination.js +23 -0
  61. package/dist/utils/LambdaTermination.js.map +1 -0
  62. package/dist/utils/PromisifiedDelay.d.ts +17 -0
  63. package/dist/utils/PromisifiedDelay.d.ts.map +1 -0
  64. package/dist/utils/PromisifiedDelay.js +48 -0
  65. package/dist/utils/PromisifiedDelay.js.map +1 -0
  66. package/package.json +36 -26
  67. package/.eslintrc.yml +0 -16
  68. package/.github/dependabot.yml +0 -11
  69. package/.github/workflows/main.yml +0 -74
  70. package/babel.config.js +0 -13
  71. package/dist/Config/Dependencies.js +0 -33
  72. package/dist/DependencyInjection/DependencyAware.class.js +0 -40
  73. package/dist/DependencyInjection/DependencyInjection.class.js +0 -115
  74. package/dist/Model/CloudEvent.model.js +0 -138
  75. package/dist/Model/Model.model.js +0 -39
  76. package/dist/Model/Response.model.js +0 -135
  77. package/dist/Model/SQS/MarketingPreference.constraints.json +0 -28
  78. package/dist/Model/SQS/MarketingPreference.model.js +0 -583
  79. package/dist/Model/SQS/Message.model.js +0 -92
  80. package/dist/Model/Status.model.js +0 -71
  81. package/dist/Service/BaseConfig.service.js +0 -204
  82. package/dist/Service/HTTP.service.js +0 -57
  83. package/dist/Service/Logger.service.js +0 -256
  84. package/dist/Service/Request.service.js +0 -294
  85. package/dist/Service/SQS.service.js +0 -367
  86. package/dist/Service/Timer.service.js +0 -46
  87. package/dist/Wrapper/LambdaTermination.js +0 -34
  88. package/dist/Wrapper/LambdaWrapper.js +0 -143
  89. 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;