serverless-offline 8.6.0 → 8.8.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.
Files changed (43) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/README.md +89 -93
  3. package/dist/ServerlessOffline.js +14 -13
  4. package/dist/config/supportedRuntimes.js +1 -1
  5. package/dist/debugLog.js +3 -1
  6. package/dist/events/authValidateContext.js +53 -0
  7. package/dist/events/http/Endpoint.js +3 -1
  8. package/dist/events/http/HttpServer.js +27 -20
  9. package/dist/events/http/OfflineEndpoint.js +23 -25
  10. package/dist/events/http/createAuthScheme.js +22 -11
  11. package/dist/events/http/createJWTAuthScheme.js +6 -2
  12. package/dist/events/http/lambda-events/LambdaIntegrationEvent.js +26 -0
  13. package/dist/events/http/lambda-events/LambdaProxyIntegrationEvent.js +16 -14
  14. package/dist/events/http/lambda-events/LambdaProxyIntegrationEventV2.js +17 -13
  15. package/dist/events/http/lambda-events/VelocityContext.js +3 -1
  16. package/dist/events/http/lambda-events/renderVelocityTemplateObject.js +4 -1
  17. package/dist/events/schedule/Schedule.js +10 -9
  18. package/dist/events/websocket/HttpServer.js +3 -1
  19. package/dist/events/websocket/WebSocketClients.js +38 -11
  20. package/dist/events/websocket/WebSocketServer.js +5 -6
  21. package/dist/index.js +0 -4
  22. package/dist/lambda/HttpServer.js +3 -1
  23. package/dist/lambda/Lambda.js +5 -1
  24. package/dist/lambda/LambdaFunction.js +1 -2
  25. package/dist/lambda/handler-runner/HandlerRunner.js +1 -29
  26. package/dist/lambda/handler-runner/child-process-runner/ChildProcessRunner.js +1 -9
  27. package/dist/lambda/handler-runner/child-process-runner/childProcessHelper.js +15 -6
  28. package/dist/lambda/handler-runner/docker-runner/DockerContainer.js +2 -4
  29. package/dist/lambda/handler-runner/go-runner/GoRunner.js +34 -15
  30. package/dist/lambda/handler-runner/in-process-runner/InProcessRunner.js +24 -30
  31. package/dist/lambda/handler-runner/java-runner/JavaRunner.js +3 -1
  32. package/dist/lambda/handler-runner/python-runner/PythonRunner.js +15 -10
  33. package/dist/lambda/handler-runner/ruby-runner/RubyRunner.js +3 -4
  34. package/dist/lambda/handler-runner/worker-thread-runner/WorkerThreadRunner.js +0 -2
  35. package/dist/lambda/handler-runner/worker-thread-runner/workerThreadHelper.js +4 -3
  36. package/dist/utils/generateHapiPath.js +1 -1
  37. package/dist/utils/getHttpApiCorsConfig.js +4 -8
  38. package/dist/utils/index.js +11 -4
  39. package/dist/utils/lowerCaseKeys.js +14 -0
  40. package/dist/utils/resolveJoins.js +4 -2
  41. package/dist/utils/splitHandlerPathAndName.js +9 -13
  42. package/package.json +23 -27
  43. 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"));
@@ -21,6 +23,8 @@ var _authFunctionNameExtractor = _interopRequireDefault(require("../authFunction
21
23
 
22
24
  var _authCanExecuteResource = _interopRequireDefault(require("../authCanExecuteResource.js"));
23
25
 
26
+ var _authValidateContext = _interopRequireDefault(require("../authValidateContext.js"));
27
+
24
28
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
29
 
26
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; }
@@ -254,6 +258,9 @@ class WebSocketClients {
254
258
  (0, _serverlessLog.default)(`Authorization function returned a successful response: (λ: ${authFunName})`);
255
259
  }
256
260
 
261
+ const validatedContext = (0, _authValidateContext.default)(policy.context, authorizerFunction);
262
+ if (validatedContext instanceof Error) throw validatedContext;
263
+
257
264
  _classPrivateFieldLooseBase(this, _webSocketAuthorizersCache)[_webSocketAuthorizersCache].set(connectionId, {
258
265
  identity: {
259
266
  apiKey: policy.usageIdentifierKey,
@@ -263,7 +270,7 @@ class WebSocketClients {
263
270
  authorizer: {
264
271
  integrationLatency: '42',
265
272
  principalId: policy.principalId,
266
- ...policy.context
273
+ ...validatedContext
267
274
  }
268
275
  });
269
276
  } catch (err) {
@@ -273,9 +280,19 @@ class WebSocketClients {
273
280
  (0, _debugLog.default)(`Error in route handler '${routeName}' authorizer`, err);
274
281
  }
275
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
+
276
291
  return {
277
292
  verified: false,
278
- statusCode: 500
293
+ statusCode: 500,
294
+ headers,
295
+ message
279
296
  };
280
297
  }
281
298
  }
@@ -283,8 +300,8 @@ class WebSocketClients {
283
300
  const authorizerData = _classPrivateFieldLooseBase(this, _webSocketAuthorizersCache)[_webSocketAuthorizersCache].get(connectionId);
284
301
 
285
302
  if (authorizerData) {
286
- connectEvent.identity = authorizerData.identity;
287
- connectEvent.authorizer = authorizerData.authorizer;
303
+ connectEvent.requestContext.identity = authorizerData.identity;
304
+ connectEvent.requestContext.authorizer = authorizerData.authorizer;
288
305
  }
289
306
 
290
307
  const lambdaFunction = _classPrivateFieldLooseBase(this, _lambda)[_lambda].get(route.functionKey);
@@ -343,9 +360,19 @@ class WebSocketClients {
343
360
  }
344
361
  };
345
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
+
346
373
  const lambdaFunction = _classPrivateFieldLooseBase(this, _lambda)[_lambda].get(route.functionKey);
347
374
 
348
- lambdaFunction.setEvent(event);
375
+ lambdaFunction.setEvent(authorizedEvent || event);
349
376
 
350
377
  try {
351
378
  const {
@@ -410,8 +437,8 @@ class WebSocketClients {
410
437
  const authorizerData = _classPrivateFieldLooseBase(this, _webSocketAuthorizersCache)[_webSocketAuthorizersCache].get(connectionId);
411
438
 
412
439
  if (authorizerData) {
413
- disconnectEvent.identity = authorizerData.identity;
414
- disconnectEvent.authorizer = authorizerData.authorizer;
440
+ disconnectEvent.requestContext.identity = authorizerData.identity;
441
+ disconnectEvent.requestContext.authorizer = authorizerData.authorizer;
415
442
  }
416
443
 
417
444
  this._processEvent(webSocketClient, connectionId, '$disconnect', disconnectEvent).finally(() => _classPrivateFieldLooseBase(this, _webSocketAuthorizersCache)[_webSocketAuthorizersCache].delete(connectionId));
@@ -436,8 +463,8 @@ class WebSocketClients {
436
463
  const authorizerData = _classPrivateFieldLooseBase(this, _webSocketAuthorizersCache)[_webSocketAuthorizersCache].get(connectionId);
437
464
 
438
465
  if (authorizerData) {
439
- event.identity = authorizerData.identity;
440
- event.authorizer = authorizerData.authorizer;
466
+ event.requestContext.identity = authorizerData.identity;
467
+ event.requestContext.authorizer = authorizerData.authorizer;
441
468
  }
442
469
 
443
470
  this._onWebSocketUsed(connectionId);
@@ -515,9 +542,9 @@ class WebSocketClients {
515
542
  }
516
543
 
517
544
  if (this.log) {
518
- this.log.notice(`route '${definition}'`);
545
+ this.log.notice(`route '${definition.route} (λ: ${functionKey})'`);
519
546
  } else {
520
- (0, _serverlessLog.default)(`route '${definition}'`);
547
+ (0, _serverlessLog.default)(`route '${definition.route} (λ: ${functionKey})'`);
521
548
  }
522
549
  }
523
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
 
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
  {});
@@ -177,7 +177,7 @@ class LambdaFunction {
177
177
  name,
178
178
  package: functionPackage = {}
179
179
  } = functionDefinition;
180
- const [handlerPath, handlerName, handlerModuleNesting] = (0, _index3.splitHandlerPathAndName)(handler);
180
+ const [handlerPath, handlerName] = (0, _index3.splitHandlerPathAndName)(handler);
181
181
  const memorySize = functionDefinition.memorySize || provider.memorySize || _index2.DEFAULT_LAMBDA_MEMORY_SIZE;
182
182
  const runtime = functionDefinition.runtime || provider.runtime || _index2.DEFAULT_LAMBDA_RUNTIME;
183
183
  const timeout = (functionDefinition.timeout || provider.timeout || _index2.DEFAULT_LAMBDA_TIMEOUT) * 1000; // this._executionTimeout = null
@@ -212,7 +212,6 @@ class LambdaFunction {
212
212
  functionKey,
213
213
  handler,
214
214
  handlerName,
215
- handlerModuleNesting,
216
215
  codeDir: _classPrivateFieldLooseBase(this, _codeDir)[_codeDir],
217
216
  handlerPath: (0, _path.resolve)(_classPrivateFieldLooseBase(this, _codeDir)[_codeDir], handlerPath),
218
217
  runtime,
@@ -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); }
@@ -75,7 +73,6 @@ class HandlerRunner {
75
73
  functionKey,
76
74
  handlerName,
77
75
  handlerPath,
78
- handlerModuleNesting,
79
76
  runtime,
80
77
  timeout
81
78
  } = _classPrivateFieldLooseBase(this, _funOptions)[_funOptions];
@@ -130,9 +127,6 @@ class HandlerRunner {
130
127
  }
131
128
 
132
129
  if (useWorkerThreads) {
133
- // worker threads
134
- this._verifyWorkerThreadCompatibility();
135
-
136
130
  const {
137
131
  default: WorkerThreadRunner
138
132
  } = await Promise.resolve().then(() => _interopRequireWildcard(require('./worker-thread-runner/index.js')));
@@ -142,7 +136,7 @@ class HandlerRunner {
142
136
  const {
143
137
  default: InProcessRunner
144
138
  } = await Promise.resolve().then(() => _interopRequireWildcard(require('./in-process-runner/index.js')));
145
- return new InProcessRunner(functionKey, handlerPath, handlerName, handlerModuleNesting, _classPrivateFieldLooseBase(this, _env)[_env], timeout, allowCache);
139
+ return new InProcessRunner(functionKey, handlerPath, handlerName, _classPrivateFieldLooseBase(this, _env)[_env], timeout, allowCache);
146
140
  }
147
141
 
148
142
  if (_index.supportedGo.has(runtime)) {
@@ -175,28 +169,6 @@ class HandlerRunner {
175
169
 
176
170
 
177
171
  throw new Error('Unsupported runtime');
178
- }
179
-
180
- _verifyWorkerThreadCompatibility() {
181
- const {
182
- node: currentVersion
183
- } = process.versions;
184
- const requiredVersionRange = '>=11.7.0';
185
- const versionIsSatisfied = (0, _index2.satisfiesVersionRange)(currentVersion, requiredVersionRange); // we're happy
186
-
187
- if (!versionIsSatisfied) {
188
- if (this.log) {
189
- this.log.warning(`"worker threads" require node.js version ${requiredVersionRange}, but found version ${currentVersion}.
190
- To use this feature you have to update node.js to a later version.
191
- `);
192
- } else {
193
- (0, _serverlessLog.logWarning)(`"worker threads" require node.js version ${requiredVersionRange}, but found version ${currentVersion}.
194
- To use this feature you have to update node.js to a later version.
195
- `);
196
- }
197
-
198
- throw new Error('"worker threads" are not supported with this node.js version');
199
- }
200
172
  } // TEMP TODO FIXME
201
173
 
202
174
 
@@ -27,8 +27,6 @@ var _handlerName = /*#__PURE__*/_classPrivateFieldLooseKey("handlerName");
27
27
 
28
28
  var _handlerPath = /*#__PURE__*/_classPrivateFieldLooseKey("handlerPath");
29
29
 
30
- var _handlerModuleNesting = /*#__PURE__*/_classPrivateFieldLooseKey("handlerModuleNesting");
31
-
32
30
  var _timeout = /*#__PURE__*/_classPrivateFieldLooseKey("timeout");
33
31
 
34
32
  var _allowCache = /*#__PURE__*/_classPrivateFieldLooseKey("allowCache");
@@ -51,10 +49,6 @@ class ChildProcessRunner {
51
49
  writable: true,
52
50
  value: null
53
51
  });
54
- Object.defineProperty(this, _handlerModuleNesting, {
55
- writable: true,
56
- value: null
57
- });
58
52
  Object.defineProperty(this, _timeout, {
59
53
  writable: true,
60
54
  value: null
@@ -67,7 +61,6 @@ class ChildProcessRunner {
67
61
  functionKey,
68
62
  handlerName,
69
63
  handlerPath,
70
- handlerModuleNesting,
71
64
  timeout
72
65
  } = funOptions;
73
66
 
@@ -82,7 +75,6 @@ class ChildProcessRunner {
82
75
  _classPrivateFieldLooseBase(this, _functionKey)[_functionKey] = functionKey;
83
76
  _classPrivateFieldLooseBase(this, _handlerName)[_handlerName] = handlerName;
84
77
  _classPrivateFieldLooseBase(this, _handlerPath)[_handlerPath] = handlerPath;
85
- _classPrivateFieldLooseBase(this, _handlerModuleNesting)[_handlerModuleNesting] = handlerModuleNesting;
86
78
  _classPrivateFieldLooseBase(this, _timeout)[_timeout] = timeout;
87
79
  _classPrivateFieldLooseBase(this, _allowCache)[_allowCache] = allowCache;
88
80
  } // no-op
@@ -92,7 +84,7 @@ class ChildProcessRunner {
92
84
  cleanup() {}
93
85
 
94
86
  async run(event, context) {
95
- const childProcess = (0, _execa.node)(childProcessHelperPath, [_classPrivateFieldLooseBase(this, _functionKey)[_functionKey], _classPrivateFieldLooseBase(this, _handlerName)[_handlerName], _classPrivateFieldLooseBase(this, _handlerPath)[_handlerPath], _classPrivateFieldLooseBase(this, _handlerModuleNesting)[_handlerModuleNesting]], {
87
+ const childProcess = (0, _execa.node)(childProcessHelperPath, [_classPrivateFieldLooseBase(this, _functionKey)[_functionKey], _classPrivateFieldLooseBase(this, _handlerName)[_handlerName], _classPrivateFieldLooseBase(this, _handlerPath)[_handlerPath]], {
96
88
  env: _classPrivateFieldLooseBase(this, _env)[_env],
97
89
  stdio: 'inherit'
98
90
  });
@@ -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
 
@@ -505,7 +503,7 @@ class DockerContainer {
505
503
  }
506
504
 
507
505
  _getLayersSha256() {
508
- 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');
509
507
  }
510
508
 
511
509
  get isRunning() {
@@ -5,12 +5,14 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _os = require("os");
9
-
10
8
  var _fs = require("fs");
11
9
 
10
+ var _os = require("os");
11
+
12
12
  var _path = require("path");
13
13
 
14
+ var _process = _interopRequireWildcard(require("process"));
15
+
14
16
  var _execa = _interopRequireWildcard(require("execa"));
15
17
 
16
18
  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); }
@@ -33,9 +35,6 @@ const {
33
35
  parse,
34
36
  stringify
35
37
  } = JSON;
36
- const {
37
- cwd
38
- } = process;
39
38
  const PAYLOAD_IDENTIFIER = 'offline_payload';
40
39
 
41
40
  var _env = /*#__PURE__*/_classPrivateFieldLooseKey("env");
@@ -48,6 +47,8 @@ var _tmpFile = /*#__PURE__*/_classPrivateFieldLooseKey("tmpFile");
48
47
 
49
48
  var _goEnv = /*#__PURE__*/_classPrivateFieldLooseKey("goEnv");
50
49
 
50
+ var _codeDir = /*#__PURE__*/_classPrivateFieldLooseKey("codeDir");
51
+
51
52
  class GoRunner {
52
53
  constructor(funOptions, env, v3Utils) {
53
54
  Object.defineProperty(this, _env, {
@@ -70,21 +71,24 @@ class GoRunner {
70
71
  writable: true,
71
72
  value: null
72
73
  });
74
+ Object.defineProperty(this, _codeDir, {
75
+ writable: true,
76
+ value: null
77
+ });
73
78
  const {
74
- handlerPath
79
+ handlerPath,
80
+ codeDir
75
81
  } = funOptions;
76
82
  _classPrivateFieldLooseBase(this, _env)[_env] = env;
77
83
  _classPrivateFieldLooseBase(this, _handlerPath)[_handlerPath] = handlerPath;
84
+ _classPrivateFieldLooseBase(this, _codeDir)[_codeDir] = codeDir;
78
85
 
79
86
  if (v3Utils) {
80
87
  this.log = v3Utils.log;
81
88
  this.progress = v3Utils.progress;
82
89
  this.writeText = v3Utils.writeText;
83
90
  this.v3Utils = v3Utils;
84
- } // Make sure we have the mock-lambda runner
85
-
86
-
87
- (0, _execa.sync)('go', ['get', 'github.com/icarus-sullivan/mock-lambda@e065469']);
91
+ }
88
92
  }
89
93
 
90
94
  async cleanup() {
@@ -173,11 +177,20 @@ class GoRunner {
173
177
  } // Remove our root, since we want to invoke go relatively
174
178
 
175
179
 
176
- const cwdPath = `${_classPrivateFieldLooseBase(this, _tmpFile)[_tmpFile]}`.replace(`${cwd()}${_path.sep}`, '');
180
+ const cwdPath = `${_classPrivateFieldLooseBase(this, _tmpFile)[_tmpFile]}`.replace(`${(0, _process.cwd)()}${_path.sep}`, '');
181
+
182
+ try {
183
+ (0, _process.chdir)(cwdPath.substring(0, cwdPath.indexOf('main.go'))); // Make sure we have the mock-lambda runner
184
+
185
+ (0, _execa.sync)('go', ['get', 'github.com/icarus-sullivan/mock-lambda@e065469']);
186
+ (0, _execa.sync)('go', ['build']);
187
+ } catch (e) {// @ignore
188
+ }
189
+
177
190
  const {
178
191
  stdout,
179
192
  stderr
180
- } = await (0, _execa.default)(`go`, ['run', cwdPath], {
193
+ } = await (0, _execa.default)(`./tmp`, {
181
194
  stdio: 'pipe',
182
195
  env: { ..._classPrivateFieldLooseBase(this, _env)[_env],
183
196
  ..._classPrivateFieldLooseBase(this, _goEnv)[_goEnv],
@@ -192,17 +205,23 @@ class GoRunner {
192
205
  IS_LAMBDA_AUTHORIZER: event.type === 'REQUEST' || event.type === 'TOKEN',
193
206
  IS_LAMBDA_REQUEST_AUTHORIZER: event.type === 'REQUEST',
194
207
  IS_LAMBDA_TOKEN_AUTHORIZER: event.type === 'TOKEN',
195
- PATH: process.env.PATH
208
+ PATH: _process.default.env.PATH
196
209
  },
197
210
  encoding: 'utf-8'
198
- }); // Clean up after we created the temporary file
199
-
211
+ });
200
212
  await this.cleanup();
201
213
 
202
214
  if (stderr) {
203
215
  return stderr;
204
216
  }
205
217
 
218
+ try {
219
+ // refresh go.mod
220
+ (0, _execa.sync)('go', ['mod', 'tidy']);
221
+ (0, _process.chdir)(_classPrivateFieldLooseBase(this, _codeDir)[_codeDir]);
222
+ } catch (e) {// @ignore
223
+ }
224
+
206
225
  return this._parsePayload(stdout);
207
226
  }
208
227
 
@@ -5,11 +5,15 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
+ var _fs = require("fs");
9
+
10
+ var _path = require("path");
11
+
8
12
  var _perf_hooks = require("perf_hooks");
9
13
 
10
- var path = _interopRequireWildcard(require("path"));
14
+ var _process = _interopRequireDefault(require("process"));
11
15
 
12
- var fs = _interopRequireWildcard(require("fs"));
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
17
 
14
18
  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); }
15
19
 
@@ -21,15 +25,20 @@ var id = 0;
21
25
 
22
26
  function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; }
23
27
 
28
+ const {
29
+ assign,
30
+ keys
31
+ } = Object;
32
+
24
33
  const clearModule = (fP, opts) => {
25
34
  const options = opts !== null && opts !== void 0 ? opts : {};
26
35
  let filePath = fP;
27
36
 
28
37
  if (!require.cache[filePath]) {
29
- const dirname = path.dirname(filePath);
38
+ const dirName = (0, _path.dirname)(filePath);
30
39
 
31
- for (const fn of fs.readdirSync(dirname)) {
32
- const fullPath = path.resolve(dirname, fn);
40
+ for (const fn of (0, _fs.readdirSync)(dirName)) {
41
+ const fullPath = (0, _path.resolve)(dirName, fn);
33
42
 
34
43
  if (fullPath.substr(0, filePath.length + 1) === `${filePath}.` && require.cache[fullPath]) {
35
44
  filePath = fullPath;
@@ -73,7 +82,7 @@ const clearModule = (fP, opts) => {
73
82
  do {
74
83
  cleanup = false;
75
84
 
76
- for (const fn of Object.keys(require.cache)) {
85
+ for (const fn of keys(require.cache)) {
77
86
  if (require.cache[fn] && require.cache[fn].id !== '.' && require.cache[fn].parent && require.cache[fn].parent.id !== '.' && !require.cache[require.cache[fn].parent.id] && !fn.match(/\/node_modules\//i) && !fn.match(/\.node$/i)) {
78
87
  delete require.cache[fn];
79
88
  cleanup = true;
@@ -92,14 +101,12 @@ var _handlerName = /*#__PURE__*/_classPrivateFieldLooseKey("handlerName");
92
101
 
93
102
  var _handlerPath = /*#__PURE__*/_classPrivateFieldLooseKey("handlerPath");
94
103
 
95
- var _handlerModuleNesting = /*#__PURE__*/_classPrivateFieldLooseKey("handlerModuleNesting");
96
-
97
104
  var _timeout = /*#__PURE__*/_classPrivateFieldLooseKey("timeout");
98
105
 
99
106
  var _allowCache = /*#__PURE__*/_classPrivateFieldLooseKey("allowCache");
100
107
 
101
108
  class InProcessRunner {
102
- constructor(functionKey, handlerPath, handlerName, handlerModuleNesting, env, timeout, allowCache) {
109
+ constructor(functionKey, handlerPath, handlerName, env, timeout, allowCache) {
103
110
  Object.defineProperty(this, _env, {
104
111
  writable: true,
105
112
  value: null
@@ -116,10 +123,6 @@ class InProcessRunner {
116
123
  writable: true,
117
124
  value: null
118
125
  });
119
- Object.defineProperty(this, _handlerModuleNesting, {
120
- writable: true,
121
- value: null
122
- });
123
126
  Object.defineProperty(this, _timeout, {
124
127
  writable: true,
125
128
  value: null
@@ -132,7 +135,6 @@ class InProcessRunner {
132
135
  _classPrivateFieldLooseBase(this, _functionKey)[_functionKey] = functionKey;
133
136
  _classPrivateFieldLooseBase(this, _handlerName)[_handlerName] = handlerName;
134
137
  _classPrivateFieldLooseBase(this, _handlerPath)[_handlerPath] = handlerPath;
135
- _classPrivateFieldLooseBase(this, _handlerModuleNesting)[_handlerModuleNesting] = handlerModuleNesting;
136
138
  _classPrivateFieldLooseBase(this, _timeout)[_timeout] = timeout;
137
139
  _classPrivateFieldLooseBase(this, _allowCache)[_allowCache] = allowCache;
138
140
  } // no-op
@@ -151,7 +153,7 @@ class InProcessRunner {
151
153
  // e.g. process.env.foo = 1 should be coerced to '1' (string)
152
154
 
153
155
 
154
- Object.assign(process.env, _classPrivateFieldLooseBase(this, _env)[_env]); // lazy load handler with first usage
156
+ assign(_process.default.env, _classPrivateFieldLooseBase(this, _env)[_env]); // lazy load handler with first usage
155
157
 
156
158
  if (!_classPrivateFieldLooseBase(this, _allowCache)[_allowCache]) {
157
159
  clearModule(_classPrivateFieldLooseBase(this, _handlerPath)[_handlerPath], {
@@ -159,36 +161,28 @@ class InProcessRunner {
159
161
  });
160
162
  }
161
163
 
162
- let handler;
163
-
164
- try {
165
- const handlerPathExport = await Promise.resolve(`${_classPrivateFieldLooseBase(this, _handlerPath)[_handlerPath]}`).then(s => _interopRequireWildcard(require(s))); // this supports handling of nested handler paths like <pathToFile>/<fileName>.object1.object2.object3.handler
166
- // a use case for this, is when the handler is further down the export tree or in nested objects
167
- // NOTE: this feature is supported in AWS Lambda
168
-
169
- handler = _classPrivateFieldLooseBase(this, _handlerModuleNesting)[_handlerModuleNesting].reduce((obj, key) => obj[key], handlerPathExport);
170
- } catch (error) {
171
- throw new Error(`offline: one of the module nesting ${_classPrivateFieldLooseBase(this, _handlerModuleNesting)[_handlerModuleNesting]} for handler ${_classPrivateFieldLooseBase(this, _handlerName)[_handlerName]} is undefined or not exported`);
172
- }
164
+ const {
165
+ [_classPrivateFieldLooseBase(this, _handlerName)[_handlerName]]: handler
166
+ } = await Promise.resolve(`${_classPrivateFieldLooseBase(this, _handlerPath)[_handlerPath]}`).then(s => _interopRequireWildcard(require(s)));
173
167
 
174
168
  if (typeof handler !== 'function') {
175
169
  throw new Error(`offline: handler '${_classPrivateFieldLooseBase(this, _handlerName)[_handlerName]}' in ${_classPrivateFieldLooseBase(this, _handlerPath)[_handlerPath]} is not a function`);
176
170
  }
177
171
 
178
172
  let callback;
179
- const callbackCalled = new Promise((resolve, reject) => {
173
+ const callbackCalled = new Promise((res, rej) => {
180
174
  callback = (err, data) => {
181
175
  if (err === 'Unauthorized') {
182
- resolve('Unauthorized');
176
+ res('Unauthorized');
183
177
  return;
184
178
  }
185
179
 
186
180
  if (err) {
187
- reject(err);
181
+ rej(err);
188
182
  return;
189
183
  }
190
184
 
191
- resolve(data);
185
+ res(data);
192
186
  };
193
187
  });
194
188
 
@@ -7,6 +7,8 @@ exports.default = void 0;
7
7
 
8
8
  var _os = require("os");
9
9
 
10
+ var _process = _interopRequireDefault(require("process"));
11
+
10
12
  var _nodeFetch = _interopRequireDefault(require("node-fetch"));
11
13
 
12
14
  var _javaInvokeLocal = require("java-invoke-local");
@@ -122,7 +124,7 @@ class JavaRunner {
122
124
  method: 'POST',
123
125
  body: data
124
126
  };
125
- const port = process.env.JAVA_OFFLINE_SERVER || 8080;
127
+ const port = _process.default.env.JAVA_OFFLINE_SERVER || 8080;
126
128
  const response = await (0, _nodeFetch.default)(`http://localhost:${port}/invoke`, httpOptions);
127
129
  result = await response.text();
128
130
  } catch (e) {