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.
- package/CHANGELOG.md +78 -0
- package/README.md +89 -93
- package/dist/ServerlessOffline.js +14 -13
- package/dist/config/supportedRuntimes.js +1 -1
- package/dist/debugLog.js +3 -1
- package/dist/events/authValidateContext.js +53 -0
- package/dist/events/http/Endpoint.js +3 -1
- package/dist/events/http/HttpServer.js +27 -20
- package/dist/events/http/OfflineEndpoint.js +23 -25
- package/dist/events/http/createAuthScheme.js +22 -11
- package/dist/events/http/createJWTAuthScheme.js +6 -2
- package/dist/events/http/lambda-events/LambdaIntegrationEvent.js +26 -0
- package/dist/events/http/lambda-events/LambdaProxyIntegrationEvent.js +16 -14
- package/dist/events/http/lambda-events/LambdaProxyIntegrationEventV2.js +17 -13
- package/dist/events/http/lambda-events/VelocityContext.js +3 -1
- package/dist/events/http/lambda-events/renderVelocityTemplateObject.js +4 -1
- package/dist/events/schedule/Schedule.js +10 -9
- package/dist/events/websocket/HttpServer.js +3 -1
- package/dist/events/websocket/WebSocketClients.js +38 -11
- package/dist/events/websocket/WebSocketServer.js +5 -6
- package/dist/index.js +0 -4
- package/dist/lambda/HttpServer.js +3 -1
- package/dist/lambda/Lambda.js +5 -1
- package/dist/lambda/LambdaFunction.js +1 -2
- package/dist/lambda/handler-runner/HandlerRunner.js +1 -29
- package/dist/lambda/handler-runner/child-process-runner/ChildProcessRunner.js +1 -9
- package/dist/lambda/handler-runner/child-process-runner/childProcessHelper.js +15 -6
- package/dist/lambda/handler-runner/docker-runner/DockerContainer.js +2 -4
- package/dist/lambda/handler-runner/go-runner/GoRunner.js +34 -15
- package/dist/lambda/handler-runner/in-process-runner/InProcessRunner.js +24 -30
- package/dist/lambda/handler-runner/java-runner/JavaRunner.js +3 -1
- package/dist/lambda/handler-runner/python-runner/PythonRunner.js +15 -10
- package/dist/lambda/handler-runner/ruby-runner/RubyRunner.js +3 -4
- package/dist/lambda/handler-runner/worker-thread-runner/WorkerThreadRunner.js +0 -2
- package/dist/lambda/handler-runner/worker-thread-runner/workerThreadHelper.js +4 -3
- package/dist/utils/generateHapiPath.js +1 -1
- package/dist/utils/getHttpApiCorsConfig.js +4 -8
- package/dist/utils/index.js +11 -4
- package/dist/utils/lowerCaseKeys.js +14 -0
- package/dist/utils/resolveJoins.js +4 -2
- package/dist/utils/splitHandlerPathAndName.js +9 -13
- package/package.json +23 -27
- 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
|
-
...
|
|
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
|
-
|
|
90
|
+
(0, _process.exit)(1);
|
|
89
91
|
}
|
|
90
92
|
|
|
91
93
|
if (this.log) {
|
package/dist/lambda/Lambda.js
CHANGED
|
@@ -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]) =>
|
|
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
|
|
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,
|
|
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]
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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,
|
|
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
|
-
|
|
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(
|
|
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
|
-
}
|
|
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)(
|
|
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:
|
|
208
|
+
PATH: _process.default.env.PATH
|
|
196
209
|
},
|
|
197
210
|
encoding: 'utf-8'
|
|
198
|
-
});
|
|
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
|
|
14
|
+
var _process = _interopRequireDefault(require("process"));
|
|
11
15
|
|
|
12
|
-
|
|
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
|
|
38
|
+
const dirName = (0, _path.dirname)(filePath);
|
|
30
39
|
|
|
31
|
-
for (const fn of
|
|
32
|
-
const fullPath =
|
|
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
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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((
|
|
173
|
+
const callbackCalled = new Promise((res, rej) => {
|
|
180
174
|
callback = (err, data) => {
|
|
181
175
|
if (err === 'Unauthorized') {
|
|
182
|
-
|
|
176
|
+
res('Unauthorized');
|
|
183
177
|
return;
|
|
184
178
|
}
|
|
185
179
|
|
|
186
180
|
if (err) {
|
|
187
|
-
|
|
181
|
+
rej(err);
|
|
188
182
|
return;
|
|
189
183
|
}
|
|
190
184
|
|
|
191
|
-
|
|
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 =
|
|
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) {
|