serverless-offline 8.5.0 → 8.8.0

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 (44) hide show
  1. package/README.md +118 -77
  2. package/dist/ServerlessOffline.js +27 -8
  3. package/dist/config/supportedRuntimes.js +1 -1
  4. package/dist/debugLog.js +3 -1
  5. package/dist/events/{http/authCanExecuteResource.js → authCanExecuteResource.js} +0 -0
  6. package/dist/events/{http/authFunctionNameExtractor.js → authFunctionNameExtractor.js} +1 -1
  7. package/dist/events/{http/authMatchPolicyResource.js → authMatchPolicyResource.js} +0 -0
  8. package/dist/events/authValidateContext.js +53 -0
  9. package/dist/events/http/Endpoint.js +3 -1
  10. package/dist/events/http/HttpServer.js +28 -21
  11. package/dist/events/http/OfflineEndpoint.js +23 -25
  12. package/dist/events/http/createAuthScheme.js +23 -12
  13. package/dist/events/http/createJWTAuthScheme.js +6 -2
  14. package/dist/events/http/lambda-events/LambdaIntegrationEvent.js +26 -0
  15. package/dist/events/http/lambda-events/LambdaProxyIntegrationEvent.js +16 -14
  16. package/dist/events/http/lambda-events/LambdaProxyIntegrationEventV2.js +22 -12
  17. package/dist/events/http/lambda-events/VelocityContext.js +3 -1
  18. package/dist/events/http/lambda-events/renderVelocityTemplateObject.js +4 -1
  19. package/dist/events/schedule/Schedule.js +10 -9
  20. package/dist/events/websocket/HttpServer.js +3 -1
  21. package/dist/events/websocket/WebSocketClients.js +224 -5
  22. package/dist/events/websocket/WebSocketServer.js +5 -6
  23. package/dist/events/websocket/lambda-events/WebSocketAuthorizerEvent.js +99 -0
  24. package/dist/events/websocket/lambda-events/index.js +8 -0
  25. package/dist/index.js +0 -4
  26. package/dist/lambda/HttpServer.js +3 -1
  27. package/dist/lambda/Lambda.js +5 -1
  28. package/dist/lambda/LambdaFunction.js +1 -1
  29. package/dist/lambda/handler-runner/HandlerRunner.js +0 -27
  30. package/dist/lambda/handler-runner/child-process-runner/childProcessHelper.js +15 -6
  31. package/dist/lambda/handler-runner/docker-runner/DockerContainer.js +6 -5
  32. package/dist/lambda/handler-runner/go-runner/GoRunner.js +34 -15
  33. package/dist/lambda/handler-runner/in-process-runner/InProcessRunner.js +23 -14
  34. package/dist/lambda/handler-runner/java-runner/JavaRunner.js +4 -3
  35. package/dist/lambda/handler-runner/python-runner/PythonRunner.js +15 -10
  36. package/dist/lambda/handler-runner/ruby-runner/RubyRunner.js +3 -6
  37. package/dist/lambda/handler-runner/worker-thread-runner/workerThreadHelper.js +3 -1
  38. package/dist/utils/generateHapiPath.js +1 -1
  39. package/dist/utils/getHttpApiCorsConfig.js +4 -8
  40. package/dist/utils/index.js +11 -4
  41. package/dist/utils/lowerCaseKeys.js +14 -0
  42. package/dist/utils/resolveJoins.js +4 -2
  43. package/package.json +26 -29
  44. package/dist/checkEngine.js +0 -21
@@ -7,6 +7,8 @@ exports.default = void 0;
7
7
 
8
8
  var _ws = require("ws");
9
9
 
10
+ var _boom = require("@hapi/boom");
11
+
10
12
  var _index = require("./lambda-events/index.js");
11
13
 
12
14
  var _debugLog = _interopRequireDefault(require("../../debugLog.js"));
@@ -17,6 +19,12 @@ var _index2 = require("../../config/index.js");
17
19
 
18
20
  var _index3 = require("../../utils/index.js");
19
21
 
22
+ var _authFunctionNameExtractor = _interopRequireDefault(require("../authFunctionNameExtractor.js"));
23
+
24
+ var _authCanExecuteResource = _interopRequireDefault(require("../authCanExecuteResource.js"));
25
+
26
+ var _authValidateContext = _interopRequireDefault(require("../authValidateContext.js"));
27
+
20
28
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
29
 
22
30
  function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; }
@@ -36,8 +44,14 @@ var _lambda = /*#__PURE__*/_classPrivateFieldLooseKey("lambda");
36
44
 
37
45
  var _options = /*#__PURE__*/_classPrivateFieldLooseKey("options");
38
46
 
47
+ var _serverless = /*#__PURE__*/_classPrivateFieldLooseKey("serverless");
48
+
39
49
  var _webSocketRoutes = /*#__PURE__*/_classPrivateFieldLooseKey("webSocketRoutes");
40
50
 
51
+ var _webSocketAuthorizers = /*#__PURE__*/_classPrivateFieldLooseKey("webSocketAuthorizers");
52
+
53
+ var _webSocketAuthorizersCache = /*#__PURE__*/_classPrivateFieldLooseKey("webSocketAuthorizersCache");
54
+
41
55
  var _websocketsApiRouteSelectionExpression = /*#__PURE__*/_classPrivateFieldLooseKey("websocketsApiRouteSelectionExpression");
42
56
 
43
57
  var _idleTimeouts = /*#__PURE__*/_classPrivateFieldLooseKey("idleTimeouts");
@@ -58,10 +72,22 @@ class WebSocketClients {
58
72
  writable: true,
59
73
  value: null
60
74
  });
75
+ Object.defineProperty(this, _serverless, {
76
+ writable: true,
77
+ value: null
78
+ });
61
79
  Object.defineProperty(this, _webSocketRoutes, {
62
80
  writable: true,
63
81
  value: new Map()
64
82
  });
83
+ Object.defineProperty(this, _webSocketAuthorizers, {
84
+ writable: true,
85
+ value: new Map()
86
+ });
87
+ Object.defineProperty(this, _webSocketAuthorizersCache, {
88
+ writable: true,
89
+ value: new Map()
90
+ });
65
91
  Object.defineProperty(this, _websocketsApiRouteSelectionExpression, {
66
92
  writable: true,
67
93
  value: null
@@ -76,6 +102,7 @@ class WebSocketClients {
76
102
  });
77
103
  _classPrivateFieldLooseBase(this, _lambda)[_lambda] = lambda;
78
104
  _classPrivateFieldLooseBase(this, _options)[_options] = options;
105
+ _classPrivateFieldLooseBase(this, _serverless)[_serverless] = serverless;
79
106
  _classPrivateFieldLooseBase(this, _websocketsApiRouteSelectionExpression)[_websocketsApiRouteSelectionExpression] = serverless.service.provider.websocketsApiRouteSelectionExpression || _index2.DEFAULT_WEBSOCKETS_API_ROUTE_SELECTION_EXPRESSION;
80
107
 
81
108
  if (v3Utils) {
@@ -161,7 +188,9 @@ class WebSocketClients {
161
188
  }
162
189
 
163
190
  async verifyClient(connectionId, request) {
164
- const route = _classPrivateFieldLooseBase(this, _webSocketRoutes)[_webSocketRoutes].get('$connect');
191
+ const routeName = '$connect';
192
+
193
+ const route = _classPrivateFieldLooseBase(this, _webSocketRoutes)[_webSocketRoutes].get(routeName);
165
194
 
166
195
  if (!route) {
167
196
  return {
@@ -172,6 +201,109 @@ class WebSocketClients {
172
201
 
173
202
  const connectEvent = new _index.WebSocketConnectEvent(connectionId, request, _classPrivateFieldLooseBase(this, _options)[_options]).create();
174
203
 
204
+ const authFunName = _classPrivateFieldLooseBase(this, _webSocketAuthorizers)[_webSocketAuthorizers].get(routeName);
205
+
206
+ if (authFunName) {
207
+ const authorizerFunction = _classPrivateFieldLooseBase(this, _lambda)[_lambda].get(authFunName);
208
+
209
+ const authorizeEvent = new _index.WebSocketAuthorizerEvent(connectionId, request, _classPrivateFieldLooseBase(this, _serverless)[_serverless].service.provider, _classPrivateFieldLooseBase(this, _options)[_options]).create();
210
+ authorizerFunction.setEvent(authorizeEvent);
211
+
212
+ if (this.log) {
213
+ this.log.notice();
214
+ this.log.notice(`Running Authorization function for ${routeName} (λ: ${authFunName})`);
215
+ } else {
216
+ console.log(''); // Just to make things a little pretty
217
+
218
+ (0, _serverlessLog.default)(`Running Authorization function for ${routeName} (λ: ${authFunName})`);
219
+ }
220
+
221
+ try {
222
+ const result = await authorizerFunction.runHandler();
223
+ if (result === 'Unauthorized') return {
224
+ verified: false,
225
+ statusCode: 401
226
+ };
227
+ const policy = result; // Validate that the policy document has the principalId set
228
+
229
+ if (!policy.principalId) {
230
+ if (this.log) {
231
+ this.log.notice(`Authorization response did not include a principalId: (λ: ${authFunName})`);
232
+ } else {
233
+ (0, _serverlessLog.default)(`Authorization response did not include a principalId: (λ: ${authFunName})`);
234
+ }
235
+
236
+ return {
237
+ verified: false,
238
+ statusCode: 403
239
+ };
240
+ }
241
+
242
+ if (!(0, _authCanExecuteResource.default)(policy.policyDocument, authorizeEvent.methodArn)) {
243
+ if (this.log) {
244
+ this.log.notice(`Authorization response didn't authorize user to access resource: (λ: ${authFunName})`);
245
+ } else {
246
+ (0, _serverlessLog.default)(`Authorization response didn't authorize user to access resource: (λ: ${authFunName})`);
247
+ }
248
+
249
+ return {
250
+ verified: false,
251
+ statusCode: 403
252
+ };
253
+ }
254
+
255
+ if (this.log) {
256
+ this.log.notice(`Authorization function returned a successful response: (λ: ${authFunName})`);
257
+ } else {
258
+ (0, _serverlessLog.default)(`Authorization function returned a successful response: (λ: ${authFunName})`);
259
+ }
260
+
261
+ const validatedContext = (0, _authValidateContext.default)(policy.context, authorizerFunction);
262
+ if (validatedContext instanceof Error) throw validatedContext;
263
+
264
+ _classPrivateFieldLooseBase(this, _webSocketAuthorizersCache)[_webSocketAuthorizersCache].set(connectionId, {
265
+ identity: {
266
+ apiKey: policy.usageIdentifierKey,
267
+ sourceIp: authorizeEvent.requestContext.sourceIp,
268
+ userAgent: authorizeEvent.headers['user-agent'] || ''
269
+ },
270
+ authorizer: {
271
+ integrationLatency: '42',
272
+ principalId: policy.principalId,
273
+ ...validatedContext
274
+ }
275
+ });
276
+ } catch (err) {
277
+ if (this.log) {
278
+ this.log.debug(`Error in route handler '${routeName}' authorizer`, err);
279
+ } else {
280
+ (0, _debugLog.default)(`Error in route handler '${routeName}' authorizer`, err);
281
+ }
282
+
283
+ let headers = [];
284
+ let message;
285
+
286
+ if ((0, _boom.isBoom)(err)) {
287
+ headers = err.output.headers;
288
+ message = err.output.payload.message;
289
+ }
290
+
291
+ return {
292
+ verified: false,
293
+ statusCode: 500,
294
+ headers,
295
+ message
296
+ };
297
+ }
298
+ }
299
+
300
+ const authorizerData = _classPrivateFieldLooseBase(this, _webSocketAuthorizersCache)[_webSocketAuthorizersCache].get(connectionId);
301
+
302
+ if (authorizerData) {
303
+ connectEvent.requestContext.identity = authorizerData.identity;
304
+ connectEvent.requestContext.authorizer = authorizerData.authorizer;
305
+ }
306
+
175
307
  const lambdaFunction = _classPrivateFieldLooseBase(this, _lambda)[_lambda].get(route.functionKey);
176
308
 
177
309
  lambdaFunction.setEvent(connectEvent);
@@ -186,6 +318,8 @@ class WebSocketClients {
186
318
  statusCode
187
319
  };
188
320
  } catch (err) {
321
+ _classPrivateFieldLooseBase(this, _webSocketAuthorizersCache)[_webSocketAuthorizersCache].delete(connectionId);
322
+
189
323
  if (this.log) {
190
324
  this.log.debug(`Error in route handler '${route.functionKey}'`, err);
191
325
  } else {
@@ -226,9 +360,19 @@ class WebSocketClients {
226
360
  }
227
361
  };
228
362
 
363
+ const authorizerData = _classPrivateFieldLooseBase(this, _webSocketAuthorizersCache)[_webSocketAuthorizersCache].get(connectionId);
364
+
365
+ let authorizedEvent;
366
+
367
+ if (authorizerData) {
368
+ authorizedEvent = event;
369
+ authorizedEvent.requestContext.identity = authorizerData.identity;
370
+ authorizedEvent.requestContext.authorizer = authorizerData.authorizer;
371
+ }
372
+
229
373
  const lambdaFunction = _classPrivateFieldLooseBase(this, _lambda)[_lambda].get(route.functionKey);
230
374
 
231
- lambdaFunction.setEvent(event);
375
+ lambdaFunction.setEvent(authorizedEvent || event);
232
376
 
233
377
  try {
234
378
  const {
@@ -290,7 +434,14 @@ class WebSocketClients {
290
434
 
291
435
  this._clearIdleTimeout(webSocketClient);
292
436
 
293
- this._processEvent(webSocketClient, connectionId, '$disconnect', disconnectEvent);
437
+ const authorizerData = _classPrivateFieldLooseBase(this, _webSocketAuthorizersCache)[_webSocketAuthorizersCache].get(connectionId);
438
+
439
+ if (authorizerData) {
440
+ disconnectEvent.requestContext.identity = authorizerData.identity;
441
+ disconnectEvent.requestContext.authorizer = authorizerData.authorizer;
442
+ }
443
+
444
+ this._processEvent(webSocketClient, connectionId, '$disconnect', disconnectEvent).finally(() => _classPrivateFieldLooseBase(this, _webSocketAuthorizersCache)[_webSocketAuthorizersCache].delete(connectionId));
294
445
  });
295
446
  webSocketClient.on('message', message => {
296
447
  if (this.log) {
@@ -309,12 +460,76 @@ class WebSocketClients {
309
460
 
310
461
  const event = new _index.WebSocketEvent(connectionId, route, message).create();
311
462
 
463
+ const authorizerData = _classPrivateFieldLooseBase(this, _webSocketAuthorizersCache)[_webSocketAuthorizersCache].get(connectionId);
464
+
465
+ if (authorizerData) {
466
+ event.requestContext.identity = authorizerData.identity;
467
+ event.requestContext.authorizer = authorizerData.authorizer;
468
+ }
469
+
312
470
  this._onWebSocketUsed(connectionId);
313
471
 
314
472
  this._processEvent(webSocketClient, connectionId, route, event);
315
473
  });
316
474
  }
317
475
 
476
+ _extractAuthFunctionName(endpoint) {
477
+ if (typeof endpoint.authorizer === 'object' && endpoint.authorizer.type && endpoint.authorizer.type.toUpperCase() === 'TOKEN') {
478
+ if (this.log) {
479
+ this.log.debug(`Websockets does not support the TOKEN authorization type`);
480
+ } else {
481
+ (0, _debugLog.default)(`WARNING: Websockets does not support the TOKEN authorization type`);
482
+ }
483
+
484
+ return null;
485
+ }
486
+
487
+ const result = (0, _authFunctionNameExtractor.default)(endpoint, null, this);
488
+ return result.unsupportedAuth ? null : result.authorizerName;
489
+ }
490
+
491
+ _configureAuthorization(endpoint, functionKey) {
492
+ if (!endpoint.authorizer) {
493
+ return;
494
+ }
495
+
496
+ if (endpoint.route === '$connect') {
497
+ const authFunctionName = this._extractAuthFunctionName(endpoint);
498
+
499
+ if (!authFunctionName) {
500
+ return;
501
+ }
502
+
503
+ if (this.log) {
504
+ this.log.notice(`Configuring Authorization: ${functionKey} ${authFunctionName}`);
505
+ } else {
506
+ (0, _serverlessLog.default)(`Configuring Authorization: ${functionKey} ${authFunctionName}`);
507
+ }
508
+
509
+ const authFunction = _classPrivateFieldLooseBase(this, _serverless)[_serverless].service.getFunction(authFunctionName);
510
+
511
+ if (!authFunction) {
512
+ if (this.log) {
513
+ this.log.error(`Authorization function ${authFunctionName} does not exist`);
514
+ } else {
515
+ (0, _serverlessLog.default)(`WARNING: Authorization function ${authFunctionName} does not exist`);
516
+ }
517
+
518
+ return;
519
+ }
520
+
521
+ _classPrivateFieldLooseBase(this, _webSocketAuthorizers)[_webSocketAuthorizers].set(endpoint.route, authFunctionName);
522
+
523
+ return;
524
+ }
525
+
526
+ if (this.log) {
527
+ this.log.notice(`Configuring Authorization is supported only on $connect route`);
528
+ } else {
529
+ (0, _serverlessLog.default)(`Configuring Authorization is supported only on $connect route`);
530
+ }
531
+ }
532
+
318
533
  addRoute(functionKey, definition) {
319
534
  // set the route name
320
535
  _classPrivateFieldLooseBase(this, _webSocketRoutes)[_webSocketRoutes].set(definition.route, {
@@ -322,10 +537,14 @@ class WebSocketClients {
322
537
  definition
323
538
  });
324
539
 
540
+ if (!_classPrivateFieldLooseBase(this, _options)[_options].noAuth) {
541
+ this._configureAuthorization(definition, functionKey);
542
+ }
543
+
325
544
  if (this.log) {
326
- this.log.notice(`route '${definition}'`);
545
+ this.log.notice(`route '${definition.route} (λ: ${functionKey})'`);
327
546
  } else {
328
- (0, _serverlessLog.default)(`route '${definition}'`);
547
+ (0, _serverlessLog.default)(`route '${definition.route} (λ: ${functionKey})'`);
329
548
  }
330
549
  }
331
550
 
@@ -57,10 +57,7 @@ class WebSocketServer {
57
57
  req
58
58
  }, cb) => {
59
59
  const connectionId = (0, _index.createUniqueId)();
60
- const {
61
- headers
62
- } = req;
63
- const key = headers['sec-websocket-key'];
60
+ const key = req.headers['sec-websocket-key'];
64
61
 
65
62
  if (this.log) {
66
63
  this.log.debug(`verifyClient:${key} ${connectionId}`);
@@ -73,11 +70,13 @@ class WebSocketServer {
73
70
 
74
71
  _classPrivateFieldLooseBase(this, _webSocketClients)[_webSocketClients].verifyClient(connectionId, req).then(({
75
72
  verified,
76
- statusCode
73
+ statusCode,
74
+ message,
75
+ headers
77
76
  }) => {
78
77
  try {
79
78
  if (!verified) {
80
- cb(false, statusCode);
79
+ cb(false, statusCode, message, headers);
81
80
  return;
82
81
  }
83
82
 
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _WebSocketRequestContext = _interopRequireDefault(require("./WebSocketRequestContext.js"));
9
+
10
+ var _index = require("../../../utils/index.js");
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+
14
+ function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; }
15
+
16
+ var id = 0;
17
+
18
+ function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; }
19
+
20
+ var _connectionId = /*#__PURE__*/_classPrivateFieldLooseKey("connectionId");
21
+
22
+ var _httpsProtocol = /*#__PURE__*/_classPrivateFieldLooseKey("httpsProtocol");
23
+
24
+ var _rawHeaders = /*#__PURE__*/_classPrivateFieldLooseKey("rawHeaders");
25
+
26
+ var _url = /*#__PURE__*/_classPrivateFieldLooseKey("url");
27
+
28
+ var _websocketPort = /*#__PURE__*/_classPrivateFieldLooseKey("websocketPort");
29
+
30
+ var _provider = /*#__PURE__*/_classPrivateFieldLooseKey("provider");
31
+
32
+ class WebSocketAuthorizerEvent {
33
+ constructor(connectionId, request, provider, options) {
34
+ Object.defineProperty(this, _connectionId, {
35
+ writable: true,
36
+ value: null
37
+ });
38
+ Object.defineProperty(this, _httpsProtocol, {
39
+ writable: true,
40
+ value: null
41
+ });
42
+ Object.defineProperty(this, _rawHeaders, {
43
+ writable: true,
44
+ value: null
45
+ });
46
+ Object.defineProperty(this, _url, {
47
+ writable: true,
48
+ value: null
49
+ });
50
+ Object.defineProperty(this, _websocketPort, {
51
+ writable: true,
52
+ value: null
53
+ });
54
+ Object.defineProperty(this, _provider, {
55
+ writable: true,
56
+ value: null
57
+ });
58
+ const {
59
+ httpsProtocol,
60
+ websocketPort
61
+ } = options;
62
+ const {
63
+ rawHeaders,
64
+ url
65
+ } = request;
66
+ _classPrivateFieldLooseBase(this, _connectionId)[_connectionId] = connectionId;
67
+ _classPrivateFieldLooseBase(this, _httpsProtocol)[_httpsProtocol] = httpsProtocol;
68
+ _classPrivateFieldLooseBase(this, _rawHeaders)[_rawHeaders] = rawHeaders;
69
+ _classPrivateFieldLooseBase(this, _url)[_url] = url;
70
+ _classPrivateFieldLooseBase(this, _websocketPort)[_websocketPort] = websocketPort;
71
+ _classPrivateFieldLooseBase(this, _provider)[_provider] = provider;
72
+ }
73
+
74
+ create() {
75
+ const headers = (0, _index.parseHeaders)(_classPrivateFieldLooseBase(this, _rawHeaders)[_rawHeaders]);
76
+ const multiValueHeaders = (0, _index.parseMultiValueHeaders)(_classPrivateFieldLooseBase(this, _rawHeaders)[_rawHeaders]);
77
+ const multiValueQueryStringParameters = (0, _index.parseMultiValueQueryStringParameters)(_classPrivateFieldLooseBase(this, _url)[_url]);
78
+ const queryStringParameters = (0, _index.parseQueryStringParameters)(_classPrivateFieldLooseBase(this, _url)[_url]);
79
+ const requestContext = new _WebSocketRequestContext.default('CONNECT', '$connect', _classPrivateFieldLooseBase(this, _connectionId)[_connectionId]).create();
80
+ return {
81
+ type: 'REQUEST',
82
+ methodArn: `arn:aws:execute-api:${_classPrivateFieldLooseBase(this, _provider)[_provider].region}:${requestContext.accountId}:${requestContext.apiId}/${requestContext.stage}/${requestContext.routeKey}`,
83
+ headers,
84
+ multiValueHeaders,
85
+ // NOTE: multiValueQueryStringParameters and queryStringParameters
86
+ // properties are only defined if they have values
87
+ ...(multiValueQueryStringParameters && {
88
+ multiValueQueryStringParameters
89
+ }),
90
+ ...(queryStringParameters && {
91
+ queryStringParameters
92
+ }),
93
+ requestContext
94
+ };
95
+ }
96
+
97
+ }
98
+
99
+ exports.default = WebSocketAuthorizerEvent;
@@ -3,6 +3,12 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ Object.defineProperty(exports, "WebSocketAuthorizerEvent", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _WebSocketAuthorizerEvent.default;
10
+ }
11
+ });
6
12
  Object.defineProperty(exports, "WebSocketConnectEvent", {
7
13
  enumerable: true,
8
14
  get: function () {
@@ -28,4 +34,6 @@ var _WebSocketDisconnectEvent = _interopRequireDefault(require("./WebSocketDisco
28
34
 
29
35
  var _WebSocketEvent = _interopRequireDefault(require("./WebSocketEvent.js"));
30
36
 
37
+ var _WebSocketAuthorizerEvent = _interopRequireDefault(require("./WebSocketAuthorizerEvent.js"));
38
+
31
39
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
package/dist/index.js CHANGED
@@ -10,10 +10,6 @@ Object.defineProperty(exports, "default", {
10
10
  }
11
11
  });
12
12
 
13
- require("./checkEngine.js");
14
-
15
- require("object.fromentries/auto.js");
16
-
17
13
  var _ServerlessOffline = _interopRequireDefault(require("./ServerlessOffline.js"));
18
14
 
19
15
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -7,6 +7,8 @@ exports.default = void 0;
7
7
 
8
8
  var _hapi = require("@hapi/hapi");
9
9
 
10
+ var _process = require("process");
11
+
10
12
  var _index = require("./routes/index.js");
11
13
 
12
14
  var _serverlessLog = _interopRequireDefault(require("../serverlessLog.js"));
@@ -85,7 +87,7 @@ class HttpServer {
85
87
  console.error(`Unexpected error while starting serverless-offline lambda server on port ${lambdaPort}:`, err);
86
88
  }
87
89
 
88
- process.exit(1);
90
+ (0, _process.exit)(1);
89
91
  }
90
92
 
91
93
  if (this.log) {
@@ -17,6 +17,10 @@ var id = 0;
17
17
 
18
18
  function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; }
19
19
 
20
+ const {
21
+ assign
22
+ } = Object;
23
+
20
24
  var _httpServer = /*#__PURE__*/_classPrivateFieldLooseKey("httpServer");
21
25
 
22
26
  var _lambdas = /*#__PURE__*/_classPrivateFieldLooseKey("lambdas");
@@ -88,7 +92,7 @@ class Lambda {
88
92
  }
89
93
 
90
94
  listFunctionNamePairs() {
91
- const funcNamePairs = Array.from(_classPrivateFieldLooseBase(this, _lambdaFunctionNamesKeys)[_lambdaFunctionNamesKeys]).reduce((obj, [key, value]) => Object.assign(obj, {
95
+ const funcNamePairs = Array.from(_classPrivateFieldLooseBase(this, _lambdaFunctionNamesKeys)[_lambdaFunctionNamesKeys]).reduce((obj, [key, value]) => assign(obj, {
92
96
  [key]: value
93
97
  }), // Be careful! Maps can have non-String keys; object literals can't.
94
98
  {});
@@ -269,7 +269,7 @@ class LambdaFunction {
269
269
  LAMBDA_RUNTIME_DIR: '/var/runtime',
270
270
  LAMBDA_TASK_ROOT: '/var/task',
271
271
  LANG: 'en_US.UTF-8',
272
- LD_LIBRARY_PATH: '/usr/local/lib64/node-v4.3.x/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib',
272
+ LD_LIBRARY_PATH: '/usr/local/lib64/node-v4.3.x/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/opt/lib',
273
273
  NODE_PATH: '/var/runtime:/var/task:/var/runtime/node_modules'
274
274
  };
275
275
  }
@@ -11,8 +11,6 @@ var _serverlessLog = require("../../serverlessLog.js");
11
11
 
12
12
  var _index = require("../../config/index.js");
13
13
 
14
- var _index2 = require("../../utils/index.js");
15
-
16
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
15
 
18
16
  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); }
@@ -129,9 +127,6 @@ class HandlerRunner {
129
127
  }
130
128
 
131
129
  if (useWorkerThreads) {
132
- // worker threads
133
- this._verifyWorkerThreadCompatibility();
134
-
135
130
  const {
136
131
  default: WorkerThreadRunner
137
132
  } = await Promise.resolve().then(() => _interopRequireWildcard(require('./worker-thread-runner/index.js')));
@@ -174,28 +169,6 @@ class HandlerRunner {
174
169
 
175
170
 
176
171
  throw new Error('Unsupported runtime');
177
- }
178
-
179
- _verifyWorkerThreadCompatibility() {
180
- const {
181
- node: currentVersion
182
- } = process.versions;
183
- const requiredVersionRange = '>=11.7.0';
184
- const versionIsSatisfied = (0, _index2.satisfiesVersionRange)(currentVersion, requiredVersionRange); // we're happy
185
-
186
- if (!versionIsSatisfied) {
187
- if (this.log) {
188
- this.log.warning(`"worker threads" require node.js version ${requiredVersionRange}, but found version ${currentVersion}.
189
- To use this feature you have to update node.js to a later version.
190
- `);
191
- } else {
192
- (0, _serverlessLog.logWarning)(`"worker threads" require node.js version ${requiredVersionRange}, but found version ${currentVersion}.
193
- To use this feature you have to update node.js to a later version.
194
- `);
195
- }
196
-
197
- throw new Error('"worker threads" are not supported with this node.js version');
198
- }
199
172
  } // TEMP TODO FIXME
200
173
 
201
174
 
@@ -1,11 +1,17 @@
1
1
  "use strict";
2
2
 
3
+ var _process = _interopRequireWildcard(require("process"));
4
+
3
5
  var _index = _interopRequireDefault(require("../in-process-runner/index.js"));
4
6
 
5
7
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
6
8
 
9
+ 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); }
10
+
11
+ 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; }
12
+
7
13
  // TODO handle this:
8
- process.on('uncaughtException', err => {
14
+ _process.default.on('uncaughtException', err => {
9
15
  const {
10
16
  constructor: {
11
17
  name
@@ -13,7 +19,8 @@ process.on('uncaughtException', err => {
13
19
  message,
14
20
  stack
15
21
  } = err;
16
- process.send({
22
+
23
+ _process.default.send({
17
24
  // process.send() can't serialize an Error object, so we help it out a bit
18
25
  error: {
19
26
  constructor: {
@@ -24,8 +31,10 @@ process.on('uncaughtException', err => {
24
31
  }
25
32
  });
26
33
  });
27
- const [,, functionKey, handlerName, handlerPath] = process.argv;
28
- process.on('message', async messageData => {
34
+
35
+ const [,, functionKey, handlerName, handlerPath] = _process.argv;
36
+
37
+ _process.default.on('message', async messageData => {
29
38
  const {
30
39
  context,
31
40
  event,
@@ -33,8 +42,8 @@ process.on('message', async messageData => {
33
42
  timeout
34
43
  } = messageData; // TODO we could probably cache this in the module scope?
35
44
 
36
- const inProcessRunner = new _index.default(functionKey, handlerPath, handlerName, process.env, timeout, allowCache);
45
+ const inProcessRunner = new _index.default(functionKey, handlerPath, handlerName, _process.default.env, timeout, allowCache);
37
46
  const result = await inProcessRunner.run(event, context); // TODO check serializeability (contains function, symbol etc)
38
47
 
39
- process.send(result);
48
+ _process.default.send(result);
40
49
  });
@@ -43,9 +43,7 @@ const {
43
43
  stringify
44
44
  } = JSON;
45
45
  const {
46
- entries
47
- } = Object;
48
- const {
46
+ entries,
49
47
  keys
50
48
  } = Object;
51
49
 
@@ -244,7 +242,10 @@ class DockerContainer {
244
242
  // Add `host.docker.internal` DNS name to access host from inside the container
245
243
  // https://github.com/docker/for-linux/issues/264
246
244
  const gatewayIp = await this._getBridgeGatewayIp();
247
- dockerArgs.push('--add-host', `host.docker.internal:${gatewayIp}`);
245
+
246
+ if (gatewayIp) {
247
+ dockerArgs.push('--add-host', `host.docker.internal:${gatewayIp}`);
248
+ }
248
249
  }
249
250
 
250
251
  if (_classPrivateFieldLooseBase(this, _dockerOptions)[_dockerOptions].network) {
@@ -502,7 +503,7 @@ class DockerContainer {
502
503
  }
503
504
 
504
505
  _getLayersSha256() {
505
- return _crypto.default.createHash('sha256').update(JSON.stringify(_classPrivateFieldLooseBase(this, _layers)[_layers])).digest('hex');
506
+ return _crypto.default.createHash('sha256').update(stringify(_classPrivateFieldLooseBase(this, _layers)[_layers])).digest('hex');
506
507
  }
507
508
 
508
509
  get isRunning() {