@comicrelief/lambda-wrapper 1.10.1 → 1.10.2

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.
@@ -4,15 +4,10 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _Dependencies = require("../Config/Dependencies");
9
-
10
8
  var _DependencyAware = _interopRequireDefault(require("../DependencyInjection/DependencyAware.class"));
11
-
12
9
  var _DependencyInjection = _interopRequireDefault(require("../DependencyInjection/DependencyInjection.class"));
13
-
14
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
11
  /**
17
12
  * TimerService class
18
13
  */
@@ -26,30 +21,26 @@ class TimerService extends _DependencyAware.default {
26
21
  super(di);
27
22
  this.timers = {};
28
23
  }
24
+
29
25
  /**
30
26
  * Start timer
31
27
  *
32
28
  * @param identifier
33
29
  */
34
-
35
-
36
30
  start(identifier) {
37
31
  this.timers[identifier] = Date.now();
38
32
  }
33
+
39
34
  /**
40
35
  * Stop timer
41
36
  *
42
37
  * @param identifier
43
38
  */
44
-
45
-
46
39
  stop(identifier) {
47
40
  if (typeof this.timers[identifier] !== 'undefined') {
48
41
  const duration = Date.now() - this.timers[identifier];
49
42
  this.getContainer().get(_Dependencies.DEFINITIONS.LOGGER).info(`Timing - ${identifier} took ${duration}ms to complete`);
50
43
  }
51
44
  }
52
-
53
45
  }
54
-
55
46
  exports.default = TimerService;
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  /**
9
8
  *
10
9
  */
@@ -22,18 +21,14 @@ class LambdaTermination extends Error {
22
21
  */
23
22
  constructor(internal, code = 500, body = null, details = 'unknown error') {
24
23
  let stringified = internal;
25
-
26
24
  if (typeof internal !== 'string') {
27
25
  stringified = JSON.stringify(internal);
28
26
  }
29
-
30
27
  super(stringified);
31
28
  this.internal = internal;
32
29
  this.code = code;
33
30
  this.body = body || 'unknown error';
34
31
  this.details = details;
35
32
  }
36
-
37
33
  }
38
-
39
34
  exports.default = LambdaTermination;
@@ -4,17 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.handleSuccess = exports.handleError = exports.default = void 0;
7
-
8
7
  var _epsagon = _interopRequireDefault(require("epsagon"));
9
-
10
8
  var _Dependencies = require("../Config/Dependencies");
11
-
12
9
  var _DependencyInjection = _interopRequireDefault(require("../DependencyInjection/DependencyInjection.class"));
13
-
14
10
  var _Response = _interopRequireDefault(require("../Model/Response.model"));
15
-
16
11
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
-
18
12
  /* eslint-disable sonarjs/cognitive-complexity */
19
13
 
20
14
  /**
@@ -24,11 +18,13 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
24
18
  * @param outcome
25
19
  */
26
20
  const handleSuccess = (di, outcome) => {
27
- const logger = di.get(_Dependencies.DEFINITIONS.LOGGER); // Outcome may be undefined as not all lambdas have a return value.
21
+ const logger = di.get(_Dependencies.DEFINITIONS.LOGGER);
28
22
 
23
+ // Outcome may be undefined as not all lambdas have a return value.
29
24
  logger.metric('lambda.statusCode', outcome && outcome.statusCode || 200);
30
25
  return outcome;
31
26
  };
27
+
32
28
  /**
33
29
  * Gracefully handles an error
34
30
  * logging in Epsagon and generating
@@ -48,32 +44,26 @@ const handleSuccess = (di, outcome) => {
48
44
  * @param {Error} error
49
45
  * @param {boolean} [throwError=false]
50
46
  */
51
-
52
-
53
47
  exports.handleSuccess = handleSuccess;
54
-
55
48
  const handleError = (di, error, throwError = false) => {
56
49
  const logger = di.get(_Dependencies.DEFINITIONS.LOGGER);
57
50
  logger.metric('lambda.statusCode', error.code || 500);
58
-
59
51
  if (error.raiseOnEpsagon || !error.code || error.code >= 500) {
60
52
  logger.error(error);
61
53
  } else {
62
54
  logger.info(error);
63
55
  }
64
-
65
56
  if (throwError) {
66
57
  if (error instanceof Error) {
67
58
  return error;
68
- } // We want to be absolutely sure
59
+ }
60
+
61
+ // We want to be absolutely sure
69
62
  // that we are returning an error
70
63
  // as Lambda sync handlers will only fail
71
64
  // if the object is instanceof Error
72
-
73
-
74
65
  return new Error(error);
75
66
  }
76
-
77
67
  const responseDetails = {
78
68
  body: error.body || {},
79
69
  code: error.code || 500,
@@ -81,6 +71,7 @@ const handleError = (di, error, throwError = false) => {
81
71
  };
82
72
  return _Response.default.generate(responseDetails.body, responseDetails.code, responseDetails.details);
83
73
  };
74
+
84
75
  /**
85
76
  * Lambda Wrapper.
86
77
  *
@@ -92,44 +83,37 @@ const handleError = (di, error, throwError = false) => {
92
83
  * @param handler
93
84
  * @param throwError
94
85
  */
95
-
96
-
97
86
  exports.handleError = handleError;
98
-
99
87
  var _default = (configuration, handler, throwError = false) => {
100
88
  let instance = (event, context, callback) => {
101
89
  const di = new _DependencyInjection.default(configuration, event, context);
102
90
  const request = di.get(_Dependencies.DEFINITIONS.REQUEST);
103
91
  const logger = di.get(_Dependencies.DEFINITIONS.LOGGER);
104
- context.callbackWaitsForEmptyEventLoop = false; // If the event is to trigger a warm up, then don't bother returning the function.
92
+ context.callbackWaitsForEmptyEventLoop = false;
105
93
 
94
+ // If the event is to trigger a warm up, then don't bother returning the function.
106
95
  if (di.getEvent().source === 'serverless-plugin-warmup') {
107
96
  return callback(null, 'Lambda is warm!');
108
- } // Log the users ip address silently for use in error tracing
109
-
97
+ }
110
98
 
99
+ // Log the users ip address silently for use in error tracing
111
100
  if (request.getIp() !== null) {
112
101
  logger.metric('ipAddress', request.getIp(), true);
113
- } // Add metrics with user browser information for rapid debugging
114
-
102
+ }
115
103
 
104
+ // Add metrics with user browser information for rapid debugging
116
105
  const userBrowserAndDevice = request.getUserBrowserAndDevice();
117
-
118
106
  if (userBrowserAndDevice !== null && typeof userBrowserAndDevice === 'object') {
119
107
  Object.keys(userBrowserAndDevice).forEach(metricKey => {
120
108
  logger.metric(metricKey, userBrowserAndDevice[metricKey], true);
121
109
  });
122
110
  }
123
-
124
111
  let outcome;
125
-
126
112
  try {
127
113
  outcome = handler.call(instance, di, request, callback);
128
-
129
114
  if (outcome instanceof Promise) {
130
115
  outcome = outcome.then(value => handleSuccess(di, value)).catch(error => {
131
116
  const handled = handleError(di, error, throwError);
132
-
133
117
  if (throwError) {
134
118
  // AWS Lambda with async handler is looking for a rejection
135
119
  // and not an error object directly
@@ -137,28 +121,23 @@ var _default = (configuration, handler, throwError = false) => {
137
121
  // as it will cast the error to JSON, i.e. `{}`
138
122
  throw handled;
139
123
  }
140
-
141
124
  return handled;
142
125
  });
143
126
  }
144
127
  } catch (error) {
145
128
  outcome = handleError(di, error, throwError);
146
129
  }
147
-
148
130
  return outcome;
149
- }; // If the Epsagon token is enabled, then wrap the instance in the Epsagon wrapper
150
-
131
+ };
151
132
 
133
+ // If the Epsagon token is enabled, then wrap the instance in the Epsagon wrapper
152
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') {
153
135
  _epsagon.default.init({
154
136
  token: process.env.EPSAGON_TOKEN,
155
137
  appName: process.env.EPSAGON_SERVICE_NAME
156
138
  });
157
-
158
139
  instance = _epsagon.default.lambdaWrapper(instance);
159
140
  }
160
-
161
141
  return instance;
162
142
  };
163
-
164
143
  exports.default = _default;
@@ -18,10 +18,10 @@ const HIGH_LATENCY_DELAYS = {
18
18
  10_000: 5,
19
19
  20_000: 1
20
20
  };
21
+
21
22
  /**
22
23
  * PromisifiedDelay class
23
24
  */
24
-
25
25
  class PromisifiedDelay {
26
26
  /**
27
27
  * PromisifiedDelay constructor
@@ -33,19 +33,17 @@ class PromisifiedDelay {
33
33
  const delayArray = highLatency === true ? HIGH_LATENCY_DELAYS : STANDARD_LATENCY_DELAYS;
34
34
  Object.keys(delayArray).forEach(delayDuration => {
35
35
  const delayIterations = delayArray[delayDuration];
36
-
37
36
  for (let i = 0; i < delayIterations; i += 1) {
38
37
  this.delays.push(delayDuration);
39
38
  }
40
39
  });
41
40
  }
41
+
42
42
  /**
43
43
  * Create a promisified delay
44
44
  *
45
45
  * @returns {Promise<any>}
46
46
  */
47
-
48
-
49
47
  get() {
50
48
  return new Promise(resolve => {
51
49
  setTimeout(() => {
@@ -53,7 +51,5 @@ class PromisifiedDelay {
53
51
  }, this.delays[Math.floor(Math.random() * this.delays.length)]);
54
52
  });
55
53
  }
56
-
57
54
  }
58
-
59
55
  exports.default = PromisifiedDelay;
package/dist/index.js CHANGED
@@ -123,41 +123,22 @@ Object.defineProperty(exports, "StatusModel", {
123
123
  return _Status.default;
124
124
  }
125
125
  });
126
-
127
126
  var _Dependencies = require("./Config/Dependencies");
128
-
129
127
  var _DependencyAware = _interopRequireDefault(require("./DependencyInjection/DependencyAware.class"));
130
-
131
128
  var _DependencyInjection = _interopRequireDefault(require("./DependencyInjection/DependencyInjection.class"));
132
-
133
129
  var _Model = _interopRequireDefault(require("./Model/Model.model"));
134
-
135
130
  var _Response = _interopRequireDefault(require("./Model/Response.model"));
136
-
137
131
  var _Status = _interopRequireWildcard(require("./Model/Status.model"));
138
-
139
132
  var _Message = _interopRequireDefault(require("./Model/SQS/Message.model"));
140
-
141
133
  var _MarketingPreference = _interopRequireDefault(require("./Model/SQS/MarketingPreference.model"));
142
-
143
134
  var _BaseConfig = _interopRequireDefault(require("./Service/BaseConfig.service"));
144
-
145
135
  var _HTTP = _interopRequireWildcard(require("./Service/HTTP.service"));
146
-
147
136
  var _Logger = _interopRequireDefault(require("./Service/Logger.service"));
148
-
149
137
  var _Request = _interopRequireDefault(require("./Service/Request.service"));
150
-
151
138
  var _SQS = _interopRequireWildcard(require("./Service/SQS.service"));
152
-
153
139
  var _LambdaTermination = _interopRequireDefault(require("./Wrapper/LambdaTermination"));
154
-
155
140
  var _LambdaWrapper = _interopRequireDefault(require("./Wrapper/LambdaWrapper"));
156
-
157
141
  var _PromisifiedDelay = _interopRequireDefault(require("./Wrapper/PromisifiedDelay"));
158
-
159
142
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
160
-
161
143
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
162
-
163
144
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@comicrelief/lambda-wrapper",
3
- "version": "1.10.1",
3
+ "version": "1.10.2",
4
4
  "description": "Lambda wrapper for all Comic Relief Serverless Projects",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -12,17 +12,17 @@
12
12
  "author": "Adam Clark",
13
13
  "license": "ISC",
14
14
  "devDependencies": {
15
- "@babel/cli": "^7.18.10",
16
- "@babel/core": "^7.18.10",
17
- "@babel/eslint-parser": "^7.18.9",
18
- "@babel/node": "^7.18.10",
19
- "@babel/plugin-syntax-flow": "^7.18.6",
20
- "@babel/plugin-transform-flow-strip-types": "^7.18.9",
21
- "@babel/plugin-transform-react-jsx": "^7.18.10",
22
- "@babel/preset-env": "^7.18.10",
15
+ "@babel/cli": "^7.22.9",
16
+ "@babel/core": "^7.22.9",
17
+ "@babel/eslint-parser": "^7.22.9",
18
+ "@babel/node": "^7.22.6",
19
+ "@babel/plugin-syntax-flow": "^7.22.5",
20
+ "@babel/plugin-transform-flow-strip-types": "^7.22.5",
21
+ "@babel/plugin-transform-react-jsx": "^7.22.5",
22
+ "@babel/preset-env": "^7.22.9",
23
23
  "@comicrelief/eslint-config": "^2.0.3",
24
- "@types/jest": "^28.1.6",
25
- "aws-sdk": "^2.1194.0",
24
+ "@types/jest": "^28.1.8",
25
+ "aws-sdk": "^2.1427.0",
26
26
  "babel-jest": "^28.1.3",
27
27
  "eslint": "^8.22.0",
28
28
  "eslint-plugin-flowtype": "^8.0.3",
@@ -30,23 +30,23 @@
30
30
  "eslint-plugin-jsdoc": "^39.3.2",
31
31
  "eslint-plugin-sonarjs": "^0.13.0",
32
32
  "eslint-plugin-unicorn": "^42.0.0",
33
- "jest": "^28.1.3",
33
+ "jest": "^29.6.2",
34
34
  "nyc": "^15.1.0",
35
- "semantic-release": "^19.0.3"
35
+ "semantic-release": "^19.0.5"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "aws-sdk": "^2.831.0"
39
39
  },
40
40
  "dependencies": {
41
- "@sentry/node": "^6.0.1",
41
+ "@sentry/node": "^6.19.7",
42
42
  "alai": "1.0.3",
43
43
  "async": "^3.2.4",
44
44
  "axios": "^0.27.2",
45
- "epsagon": "^1.123.2",
45
+ "epsagon": "^1.123.3",
46
46
  "useragent": "2.3.0",
47
47
  "uuid": "^8.3.2",
48
48
  "validate.js": "0.13.1",
49
- "winston": "^3.8.1",
50
- "xml2js": "^0.4.23"
49
+ "winston": "^3.10.0",
50
+ "xml2js": "^0.6.2"
51
51
  }
52
52
  }