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.
- package/README.md +118 -77
- package/dist/ServerlessOffline.js +27 -8
- package/dist/config/supportedRuntimes.js +1 -1
- package/dist/debugLog.js +3 -1
- package/dist/events/{http/authCanExecuteResource.js → authCanExecuteResource.js} +0 -0
- package/dist/events/{http/authFunctionNameExtractor.js → authFunctionNameExtractor.js} +1 -1
- package/dist/events/{http/authMatchPolicyResource.js → authMatchPolicyResource.js} +0 -0
- package/dist/events/authValidateContext.js +53 -0
- package/dist/events/http/Endpoint.js +3 -1
- package/dist/events/http/HttpServer.js +28 -21
- package/dist/events/http/OfflineEndpoint.js +23 -25
- package/dist/events/http/createAuthScheme.js +23 -12
- 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 +22 -12
- 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 +224 -5
- package/dist/events/websocket/WebSocketServer.js +5 -6
- package/dist/events/websocket/lambda-events/WebSocketAuthorizerEvent.js +99 -0
- package/dist/events/websocket/lambda-events/index.js +8 -0
- 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 -1
- package/dist/lambda/handler-runner/HandlerRunner.js +0 -27
- package/dist/lambda/handler-runner/child-process-runner/childProcessHelper.js +15 -6
- package/dist/lambda/handler-runner/docker-runner/DockerContainer.js +6 -5
- package/dist/lambda/handler-runner/go-runner/GoRunner.js +34 -15
- package/dist/lambda/handler-runner/in-process-runner/InProcessRunner.js +23 -14
- package/dist/lambda/handler-runner/java-runner/JavaRunner.js +4 -3
- package/dist/lambda/handler-runner/python-runner/PythonRunner.js +15 -10
- package/dist/lambda/handler-runner/ruby-runner/RubyRunner.js +3 -6
- package/dist/lambda/handler-runner/worker-thread-runner/workerThreadHelper.js +3 -1
- 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/package.json +26 -29
- 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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
{});
|
|
@@ -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
|
-
|
|
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
|
|
|
@@ -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
|
-
|
|
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(
|
|
506
|
+
return _crypto.default.createHash('sha256').update(stringify(_classPrivateFieldLooseBase(this, _layers)[_layers])).digest('hex');
|
|
506
507
|
}
|
|
507
508
|
|
|
508
509
|
get isRunning() {
|