serverless-offline 8.7.0 → 9.0.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 +91 -95
- package/package.json +41 -69
- package/src/ServerlessOffline.js +412 -0
- package/src/config/commandOptions.js +155 -0
- package/src/config/constants.js +22 -0
- package/{dist → src}/config/defaultOptions.js +8 -17
- package/src/config/index.js +4 -0
- package/src/config/supportedRuntimes.js +47 -0
- package/src/events/authCanExecuteResource.js +35 -0
- package/src/events/authFunctionNameExtractor.js +75 -0
- package/src/events/authMatchPolicyResource.js +71 -0
- package/src/events/authValidateContext.js +51 -0
- package/src/events/http/Endpoint.js +135 -0
- package/src/events/http/Http.js +50 -0
- package/src/events/http/HttpEventDefinition.js +20 -0
- package/src/events/http/HttpServer.js +1277 -0
- package/src/events/http/OfflineEndpoint.js +33 -0
- package/src/events/http/authJWTSettingsExtractor.js +70 -0
- package/src/events/http/createAuthScheme.js +176 -0
- package/src/events/http/createJWTAuthScheme.js +106 -0
- package/src/events/http/index.js +1 -0
- package/src/events/http/javaHelpers.js +102 -0
- package/src/events/http/lambda-events/LambdaIntegrationEvent.js +57 -0
- package/src/events/http/lambda-events/LambdaProxyIntegrationEvent.js +233 -0
- package/src/events/http/lambda-events/LambdaProxyIntegrationEventV2.js +190 -0
- package/src/events/http/lambda-events/VelocityContext.js +147 -0
- package/src/events/http/lambda-events/index.js +4 -0
- package/src/events/http/lambda-events/renderVelocityTemplateObject.js +93 -0
- package/{dist → src}/events/http/parseResources.js +73 -78
- package/src/events/http/payloadSchemaValidator.js +13 -0
- package/{dist → src}/events/http/templates/offline-default.req.vm +0 -0
- package/{dist → src}/events/http/templates/offline-default.res.vm +0 -0
- package/src/events/schedule/Schedule.js +131 -0
- package/src/events/schedule/ScheduleEvent.js +18 -0
- package/src/events/schedule/ScheduleEventDefinition.js +21 -0
- package/src/events/schedule/index.js +1 -0
- package/src/events/websocket/HttpServer.js +69 -0
- package/src/events/websocket/WebSocket.js +52 -0
- package/src/events/websocket/WebSocketClients.js +462 -0
- package/src/events/websocket/WebSocketEventDefinition.js +18 -0
- package/src/events/websocket/WebSocketServer.js +73 -0
- package/src/events/websocket/http-routes/_catchAll/catchAllRoute.js +16 -0
- package/src/events/websocket/http-routes/_catchAll/index.js +1 -0
- package/src/events/websocket/http-routes/connections/ConnectionsController.js +28 -0
- package/src/events/websocket/http-routes/connections/connectionsRoutes.js +70 -0
- package/src/events/websocket/http-routes/connections/index.js +1 -0
- package/src/events/websocket/http-routes/index.js +2 -0
- package/src/events/websocket/index.js +1 -0
- package/src/events/websocket/lambda-events/WebSocketAuthorizerEvent.js +65 -0
- package/src/events/websocket/lambda-events/WebSocketConnectEvent.js +68 -0
- package/src/events/websocket/lambda-events/WebSocketDisconnectEvent.js +31 -0
- package/src/events/websocket/lambda-events/WebSocketEvent.js +29 -0
- package/src/events/websocket/lambda-events/WebSocketRequestContext.js +67 -0
- package/src/events/websocket/lambda-events/index.js +4 -0
- package/src/index.js +12 -0
- package/src/lambda/HttpServer.js +108 -0
- package/src/lambda/Lambda.js +68 -0
- package/src/lambda/LambdaContext.js +33 -0
- package/src/lambda/LambdaFunction.js +308 -0
- package/src/lambda/LambdaFunctionPool.js +109 -0
- package/src/lambda/__tests__/LambdaContext.test.js +30 -0
- package/src/lambda/__tests__/LambdaFunction.test.js +196 -0
- package/src/lambda/__tests__/fixtures/Lambda/LambdaFunctionThatReturnsJSONObject.fixture.js +47 -0
- package/src/lambda/__tests__/fixtures/Lambda/LambdaFunctionThatReturnsNativeString.fixture.js +46 -0
- package/src/lambda/__tests__/fixtures/Lambda/package.json +3 -0
- package/src/lambda/__tests__/fixtures/lambdaFunction.fixture.js +145 -0
- package/src/lambda/__tests__/fixtures/package.json +3 -0
- package/src/lambda/__tests__/routes/invocations/InvocationsController.test.js +42 -0
- package/src/lambda/handler-runner/HandlerRunner.js +136 -0
- package/src/lambda/handler-runner/child-process-runner/ChildProcessRunner.js +72 -0
- package/src/lambda/handler-runner/child-process-runner/childProcessHelper.js +42 -0
- package/src/lambda/handler-runner/child-process-runner/index.js +1 -0
- package/src/lambda/handler-runner/docker-runner/DockerContainer.js +417 -0
- package/src/lambda/handler-runner/docker-runner/DockerImage.js +35 -0
- package/src/lambda/handler-runner/docker-runner/DockerRunner.js +63 -0
- package/src/lambda/handler-runner/docker-runner/index.js +1 -0
- package/src/lambda/handler-runner/go-runner/GoRunner.js +166 -0
- package/src/lambda/handler-runner/go-runner/index.js +1 -0
- package/src/lambda/handler-runner/in-process-runner/InProcessRunner.js +125 -0
- package/src/lambda/handler-runner/in-process-runner/index.js +1 -0
- package/src/lambda/handler-runner/index.js +1 -0
- package/src/lambda/handler-runner/java-runner/JavaRunner.js +114 -0
- package/src/lambda/handler-runner/java-runner/index.js +1 -0
- package/src/lambda/handler-runner/python-runner/PythonRunner.js +138 -0
- package/src/lambda/handler-runner/python-runner/index.js +1 -0
- package/{dist → src}/lambda/handler-runner/python-runner/invoke.py +0 -0
- package/src/lambda/handler-runner/ruby-runner/RubyRunner.js +107 -0
- package/src/lambda/handler-runner/ruby-runner/index.js +1 -0
- package/{dist → src}/lambda/handler-runner/ruby-runner/invoke.rb +0 -0
- package/src/lambda/handler-runner/worker-thread-runner/WorkerThreadRunner.js +70 -0
- package/src/lambda/handler-runner/worker-thread-runner/index.js +1 -0
- package/src/lambda/handler-runner/worker-thread-runner/workerThreadHelper.js +29 -0
- package/src/lambda/index.js +1 -0
- package/src/lambda/routes/index.js +2 -0
- package/src/lambda/routes/invocations/InvocationsController.js +102 -0
- package/src/lambda/routes/invocations/index.js +1 -0
- package/src/lambda/routes/invocations/invocationsRoute.js +77 -0
- package/src/lambda/routes/invoke-async/InvokeAsyncController.js +20 -0
- package/src/lambda/routes/invoke-async/index.js +1 -0
- package/src/lambda/routes/invoke-async/invokeAsyncRoute.js +33 -0
- package/src/utils/__tests__/createUniqueId.test.js +18 -0
- package/src/utils/__tests__/formatToClfTime.test.js +14 -0
- package/src/utils/__tests__/generateHapiPath.test.js +46 -0
- package/src/utils/__tests__/lowerCaseKeys.test.js +30 -0
- package/src/utils/__tests__/parseHeaders.test.js +13 -0
- package/src/utils/__tests__/parseMultiValueHeaders.test.js +24 -0
- package/src/utils/__tests__/parseMultiValueQueryStringParameters.test.js +159 -0
- package/src/utils/__tests__/parseQueryStringParameters.test.js +15 -0
- package/src/utils/__tests__/splitHandlerPathAndName.test.js +54 -0
- package/src/utils/__tests__/unflatten.test.js +32 -0
- package/src/utils/checkDockerDaemon.js +19 -0
- package/src/utils/checkGoVersion.js +16 -0
- package/src/utils/createApiKey.js +5 -0
- package/src/utils/createUniqueId.js +5 -0
- package/src/utils/detectExecutable.js +11 -0
- package/{dist → src}/utils/formatToClfTime.js +6 -14
- package/src/utils/generateHapiPath.js +26 -0
- package/src/utils/getHttpApiCorsConfig.js +28 -0
- package/src/utils/index.js +42 -0
- package/src/utils/jsonPath.js +13 -0
- package/src/utils/logRoutes.js +64 -0
- package/src/utils/lowerCaseKeys.js +6 -0
- package/src/utils/parseHeaders.js +14 -0
- package/src/utils/parseMultiValueHeaders.js +27 -0
- package/src/utils/parseMultiValueQueryStringParameters.js +31 -0
- package/src/utils/parseQueryStringParameters.js +15 -0
- package/src/utils/resolveJoins.js +29 -0
- package/src/utils/splitHandlerPathAndName.js +31 -0
- package/src/utils/unflatten.js +11 -0
- package/dist/ServerlessOffline.js +0 -507
- package/dist/checkEngine.js +0 -21
- package/dist/config/commandOptions.js +0 -149
- package/dist/config/constants.js +0 -30
- package/dist/config/index.js +0 -55
- package/dist/config/supportedRuntimes.js +0 -40
- package/dist/debugLog.js +0 -10
- package/dist/events/authCanExecuteResource.js +0 -35
- package/dist/events/authFunctionNameExtractor.js +0 -87
- package/dist/events/authMatchPolicyResource.js +0 -62
- package/dist/events/http/Endpoint.js +0 -171
- package/dist/events/http/Http.js +0 -77
- package/dist/events/http/HttpEventDefinition.js +0 -36
- package/dist/events/http/HttpServer.js +0 -1363
- package/dist/events/http/OfflineEndpoint.js +0 -40
- package/dist/events/http/authJWTSettingsExtractor.js +0 -76
- package/dist/events/http/authValidateContext.js +0 -48
- package/dist/events/http/createAuthScheme.js +0 -184
- package/dist/events/http/createJWTAuthScheme.js +0 -155
- package/dist/events/http/index.js +0 -15
- package/dist/events/http/javaHelpers.js +0 -99
- package/dist/events/http/lambda-events/LambdaIntegrationEvent.js +0 -85
- package/dist/events/http/lambda-events/LambdaProxyIntegrationEvent.js +0 -244
- package/dist/events/http/lambda-events/LambdaProxyIntegrationEventV2.js +0 -221
- package/dist/events/http/lambda-events/VelocityContext.js +0 -168
- package/dist/events/http/lambda-events/index.js +0 -39
- package/dist/events/http/lambda-events/renderVelocityTemplateObject.js +0 -108
- package/dist/events/http/payloadSchemaValidator.js +0 -13
- package/dist/events/schedule/Schedule.js +0 -182
- package/dist/events/schedule/ScheduleEvent.js +0 -27
- package/dist/events/schedule/ScheduleEventDefinition.js +0 -36
- package/dist/events/schedule/index.js +0 -15
- package/dist/events/websocket/HttpServer.js +0 -112
- package/dist/events/websocket/WebSocket.js +0 -78
- package/dist/events/websocket/WebSocketClients.js +0 -550
- package/dist/events/websocket/WebSocketEventDefinition.js +0 -32
- package/dist/events/websocket/WebSocketServer.js +0 -140
- package/dist/events/websocket/http-routes/_catchAll/catchAllRoute.js +0 -33
- package/dist/events/websocket/http-routes/_catchAll/index.js +0 -15
- package/dist/events/websocket/http-routes/connections/ConnectionsController.js +0 -45
- package/dist/events/websocket/http-routes/connections/connectionsRoutes.js +0 -95
- package/dist/events/websocket/http-routes/connections/index.js +0 -15
- package/dist/events/websocket/http-routes/index.js +0 -23
- package/dist/events/websocket/index.js +0 -15
- package/dist/events/websocket/lambda-events/WebSocketAuthorizerEvent.js +0 -99
- package/dist/events/websocket/lambda-events/WebSocketConnectEvent.js +0 -101
- package/dist/events/websocket/lambda-events/WebSocketDisconnectEvent.js +0 -47
- package/dist/events/websocket/lambda-events/WebSocketEvent.js +0 -54
- package/dist/events/websocket/lambda-events/WebSocketRequestContext.js +0 -98
- package/dist/events/websocket/lambda-events/index.js +0 -39
- package/dist/index.js +0 -19
- package/dist/lambda/HttpServer.js +0 -122
- package/dist/lambda/Lambda.js +0 -113
- package/dist/lambda/LambdaContext.js +0 -53
- package/dist/lambda/LambdaFunction.js +0 -391
- package/dist/lambda/LambdaFunctionPool.js +0 -127
- package/dist/lambda/handler-runner/HandlerRunner.js +0 -223
- package/dist/lambda/handler-runner/child-process-runner/ChildProcessRunner.js +0 -132
- package/dist/lambda/handler-runner/child-process-runner/childProcessHelper.js +0 -40
- package/dist/lambda/handler-runner/child-process-runner/index.js +0 -15
- package/dist/lambda/handler-runner/docker-runner/DockerContainer.js +0 -517
- package/dist/lambda/handler-runner/docker-runner/DockerImage.js +0 -67
- package/dist/lambda/handler-runner/docker-runner/DockerRunner.js +0 -74
- package/dist/lambda/handler-runner/docker-runner/index.js +0 -15
- package/dist/lambda/handler-runner/go-runner/GoRunner.js +0 -211
- package/dist/lambda/handler-runner/go-runner/index.js +0 -15
- package/dist/lambda/handler-runner/in-process-runner/InProcessRunner.js +0 -234
- package/dist/lambda/handler-runner/in-process-runner/index.js +0 -15
- package/dist/lambda/handler-runner/index.js +0 -15
- package/dist/lambda/handler-runner/java-runner/JavaRunner.js +0 -151
- package/dist/lambda/handler-runner/java-runner/index.js +0 -15
- package/dist/lambda/handler-runner/python-runner/PythonRunner.js +0 -180
- package/dist/lambda/handler-runner/python-runner/index.js +0 -15
- package/dist/lambda/handler-runner/ruby-runner/RubyRunner.js +0 -148
- package/dist/lambda/handler-runner/ruby-runner/index.js +0 -15
- package/dist/lambda/handler-runner/worker-thread-runner/WorkerThreadRunner.js +0 -94
- package/dist/lambda/handler-runner/worker-thread-runner/index.js +0 -15
- package/dist/lambda/handler-runner/worker-thread-runner/workerThreadHelper.js +0 -30
- package/dist/lambda/index.js +0 -15
- package/dist/lambda/routes/index.js +0 -23
- package/dist/lambda/routes/invocations/InvocationsController.js +0 -142
- package/dist/lambda/routes/invocations/index.js +0 -15
- package/dist/lambda/routes/invocations/invocationsRoute.js +0 -90
- package/dist/lambda/routes/invoke-async/InvokeAsyncController.js +0 -38
- package/dist/lambda/routes/invoke-async/index.js +0 -15
- package/dist/lambda/routes/invoke-async/invokeAsyncRoute.js +0 -43
- package/dist/main.js +0 -11
- package/dist/serverlessLog.js +0 -91
- package/dist/utils/checkDockerDaemon.js +0 -27
- package/dist/utils/checkGoVersion.js +0 -27
- package/dist/utils/createApiKey.js +0 -12
- package/dist/utils/createUniqueId.js +0 -14
- package/dist/utils/detectExecutable.js +0 -21
- package/dist/utils/generateHapiPath.js +0 -28
- package/dist/utils/getHttpApiCorsConfig.js +0 -44
- package/dist/utils/index.js +0 -158
- package/dist/utils/jsonPath.js +0 -21
- package/dist/utils/parseHeaders.js +0 -23
- package/dist/utils/parseMultiValueHeaders.js +0 -36
- package/dist/utils/parseMultiValueQueryStringParameters.js +0 -40
- package/dist/utils/parseQueryStringParameters.js +0 -26
- package/dist/utils/resolveJoins.js +0 -34
- package/dist/utils/satisfiesVersionRange.js +0 -20
- package/dist/utils/splitHandlerPathAndName.js +0 -41
- package/dist/utils/unflatten.js +0 -18
|
@@ -1,46 +1,39 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const {
|
|
8
|
-
entries,
|
|
9
|
-
fromEntries,
|
|
10
|
-
keys
|
|
11
|
-
} = Object;
|
|
12
|
-
const APIGATEWAY_INTEGRATION_TYPE_HTTP_PROXY = 'HTTP_PROXY';
|
|
13
|
-
const APIGATEWAY_ROOT_ID = 'RootResourceId';
|
|
14
|
-
const APIGATEWAY_TYPE_METHOD = 'AWS::ApiGateway::Method';
|
|
15
|
-
const APIGATEWAY_TYPE_RESOURCE = 'AWS::ApiGateway::Resource';
|
|
1
|
+
const { entries, fromEntries, keys } = Object
|
|
2
|
+
|
|
3
|
+
const APIGATEWAY_INTEGRATION_TYPE_HTTP_PROXY = 'HTTP_PROXY'
|
|
4
|
+
const APIGATEWAY_ROOT_ID = 'RootResourceId'
|
|
5
|
+
const APIGATEWAY_TYPE_METHOD = 'AWS::ApiGateway::Method'
|
|
6
|
+
const APIGATEWAY_TYPE_RESOURCE = 'AWS::ApiGateway::Resource'
|
|
16
7
|
|
|
17
8
|
function getApiGatewayTemplateObjects(resources) {
|
|
18
|
-
const Resources = resources && resources.Resources
|
|
9
|
+
const Resources = resources && resources.Resources
|
|
19
10
|
|
|
20
11
|
if (!Resources) {
|
|
21
|
-
return {}
|
|
12
|
+
return {}
|
|
22
13
|
}
|
|
23
14
|
|
|
24
|
-
const methodObjects = []
|
|
25
|
-
const pathObjects = []
|
|
15
|
+
const methodObjects = []
|
|
16
|
+
const pathObjects = []
|
|
17
|
+
|
|
26
18
|
entries(Resources).forEach(([key, value]) => {
|
|
27
|
-
const resourceObj = value || {}
|
|
28
|
-
const keyValuePair = [key, resourceObj]
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
} = resourceObj;
|
|
19
|
+
const resourceObj = value || {}
|
|
20
|
+
const keyValuePair = [key, resourceObj]
|
|
21
|
+
|
|
22
|
+
const { Type } = resourceObj
|
|
32
23
|
|
|
33
24
|
if (Type === APIGATEWAY_TYPE_METHOD) {
|
|
34
|
-
methodObjects.push(keyValuePair)
|
|
25
|
+
methodObjects.push(keyValuePair)
|
|
35
26
|
} else if (Type === APIGATEWAY_TYPE_RESOURCE) {
|
|
36
|
-
pathObjects.push(keyValuePair)
|
|
27
|
+
pathObjects.push(keyValuePair)
|
|
37
28
|
}
|
|
38
|
-
})
|
|
29
|
+
})
|
|
30
|
+
|
|
39
31
|
return {
|
|
40
32
|
methodObjects: fromEntries(methodObjects),
|
|
41
|
-
pathObjects: fromEntries(pathObjects)
|
|
42
|
-
}
|
|
33
|
+
pathObjects: fromEntries(pathObjects),
|
|
34
|
+
}
|
|
43
35
|
}
|
|
36
|
+
|
|
44
37
|
/* Example of a Resource Object
|
|
45
38
|
* "ApiGatewayResourceFavicon": {
|
|
46
39
|
* "Type": "AWS::ApiGateway::Resource",
|
|
@@ -54,52 +47,53 @@ function getApiGatewayTemplateObjects(resources) {
|
|
|
54
47
|
|
|
55
48
|
/* Resource Helpers */
|
|
56
49
|
|
|
57
|
-
|
|
58
50
|
function isRoot(resourceId) {
|
|
59
|
-
return resourceId === APIGATEWAY_ROOT_ID
|
|
51
|
+
return resourceId === APIGATEWAY_ROOT_ID
|
|
60
52
|
}
|
|
61
53
|
|
|
62
54
|
function getPathPart(resourceObj) {
|
|
63
55
|
if (!resourceObj || !resourceObj.Properties) {
|
|
64
|
-
return undefined
|
|
56
|
+
return undefined
|
|
65
57
|
}
|
|
66
58
|
|
|
67
|
-
return resourceObj.Properties.PathPart
|
|
59
|
+
return resourceObj.Properties.PathPart
|
|
68
60
|
}
|
|
69
61
|
|
|
70
62
|
function getParentId(resourceObj) {
|
|
71
63
|
if (!resourceObj || !resourceObj.Properties) {
|
|
72
|
-
return undefined
|
|
64
|
+
return undefined
|
|
73
65
|
}
|
|
66
|
+
const parentIdObj = resourceObj.Properties.ParentId || {}
|
|
67
|
+
|
|
68
|
+
const { Ref } = parentIdObj
|
|
69
|
+
if (Ref) return Ref
|
|
70
|
+
|
|
71
|
+
const getAtt = parentIdObj['Fn::GetAtt'] || []
|
|
74
72
|
|
|
75
|
-
|
|
76
|
-
const {
|
|
77
|
-
Ref
|
|
78
|
-
} = parentIdObj;
|
|
79
|
-
if (Ref) return Ref;
|
|
80
|
-
const getAtt = parentIdObj['Fn::GetAtt'] || [];
|
|
81
|
-
return getAtt[1];
|
|
73
|
+
return getAtt[1]
|
|
82
74
|
}
|
|
83
75
|
|
|
84
76
|
function getFullPath(pathObjects, resourceId) {
|
|
85
|
-
let currentId = resourceId
|
|
86
|
-
let currentObj
|
|
87
|
-
const arrResourceObjects = []
|
|
77
|
+
let currentId = resourceId
|
|
78
|
+
let currentObj
|
|
79
|
+
const arrResourceObjects = []
|
|
88
80
|
|
|
89
81
|
while (currentId && !isRoot(currentId)) {
|
|
90
|
-
currentObj = pathObjects[currentId]
|
|
91
|
-
arrResourceObjects.push(currentObj)
|
|
92
|
-
|
|
82
|
+
currentObj = pathObjects[currentId]
|
|
83
|
+
arrResourceObjects.push(currentObj)
|
|
84
|
+
|
|
85
|
+
currentId = getParentId(currentObj)
|
|
93
86
|
}
|
|
94
87
|
|
|
95
|
-
const arrPath = arrResourceObjects.map(getPathPart).reverse()
|
|
88
|
+
const arrPath = arrResourceObjects.map(getPathPart).reverse()
|
|
96
89
|
|
|
97
|
-
if (arrPath.some(s => !s)) {
|
|
98
|
-
return undefined
|
|
90
|
+
if (arrPath.some((s) => !s)) {
|
|
91
|
+
return undefined
|
|
99
92
|
}
|
|
100
93
|
|
|
101
|
-
return `/${arrPath.join('/')}
|
|
94
|
+
return `/${arrPath.join('/')}`
|
|
102
95
|
}
|
|
96
|
+
|
|
103
97
|
/* Example of an HTTP Proxy Method Object
|
|
104
98
|
* "ApiGatewayResourcePublicAnyProxyMethod": {
|
|
105
99
|
* "Type": "AWS::ApiGateway::Method",
|
|
@@ -124,65 +118,66 @@ function getFullPath(pathObjects, resourceId) {
|
|
|
124
118
|
|
|
125
119
|
/* Method Helpers */
|
|
126
120
|
|
|
127
|
-
|
|
128
121
|
function getResourceId(methodObj) {
|
|
129
122
|
if (!methodObj || !methodObj.Properties) {
|
|
130
|
-
return undefined
|
|
123
|
+
return undefined
|
|
131
124
|
}
|
|
132
|
-
|
|
133
125
|
if (!methodObj.Properties.ResourceId) {
|
|
134
|
-
return undefined
|
|
126
|
+
return undefined
|
|
135
127
|
}
|
|
136
128
|
|
|
137
|
-
return methodObj.Properties.ResourceId.Ref
|
|
129
|
+
return methodObj.Properties.ResourceId.Ref
|
|
138
130
|
}
|
|
139
131
|
|
|
140
132
|
function getHttpMethod(methodObj) {
|
|
141
133
|
if (!methodObj || !methodObj.Properties) {
|
|
142
|
-
return undefined
|
|
134
|
+
return undefined
|
|
143
135
|
}
|
|
144
136
|
|
|
145
|
-
return methodObj.Properties.HttpMethod
|
|
137
|
+
return methodObj.Properties.HttpMethod
|
|
146
138
|
}
|
|
147
139
|
|
|
148
140
|
function getIntegrationObj(methodObj) {
|
|
149
141
|
if (!methodObj || !methodObj.Properties) {
|
|
150
|
-
return undefined
|
|
142
|
+
return undefined
|
|
151
143
|
}
|
|
152
144
|
|
|
153
|
-
return methodObj.Properties.Integration
|
|
145
|
+
return methodObj.Properties.Integration
|
|
154
146
|
}
|
|
155
147
|
|
|
156
148
|
function constructHapiInterface(pathObjects, methodObjects, methodId) {
|
|
157
149
|
// returns all info necessary so that routes can be added in index.js
|
|
158
|
-
const methodObj = methodObjects[methodId]
|
|
159
|
-
const resourceId = getResourceId(methodObj)
|
|
160
|
-
const Integration = getIntegrationObj(methodObj) || {}
|
|
161
|
-
const pathResource = getFullPath(pathObjects, resourceId)
|
|
162
|
-
const method = getHttpMethod(methodObj)
|
|
163
|
-
|
|
164
|
-
let proxyUri
|
|
150
|
+
const methodObj = methodObjects[methodId]
|
|
151
|
+
const resourceId = getResourceId(methodObj)
|
|
152
|
+
const Integration = getIntegrationObj(methodObj) || {}
|
|
153
|
+
const pathResource = getFullPath(pathObjects, resourceId)
|
|
154
|
+
const method = getHttpMethod(methodObj)
|
|
155
|
+
// let integrationType;
|
|
156
|
+
let proxyUri
|
|
165
157
|
|
|
166
158
|
if (!pathResource) {
|
|
167
|
-
return {}
|
|
159
|
+
return {}
|
|
168
160
|
}
|
|
169
161
|
|
|
170
162
|
if (Integration.Type === APIGATEWAY_INTEGRATION_TYPE_HTTP_PROXY) {
|
|
171
|
-
proxyUri = Integration.Uri
|
|
163
|
+
proxyUri = Integration.Uri
|
|
172
164
|
}
|
|
173
165
|
|
|
174
166
|
return {
|
|
175
167
|
isProxy: !!proxyUri,
|
|
176
168
|
method,
|
|
177
169
|
pathResource,
|
|
178
|
-
proxyUri
|
|
179
|
-
}
|
|
170
|
+
proxyUri,
|
|
171
|
+
}
|
|
180
172
|
}
|
|
181
173
|
|
|
182
|
-
function parseResources(resources) {
|
|
183
|
-
const {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
174
|
+
export default function parseResources(resources) {
|
|
175
|
+
const { methodObjects, pathObjects } = getApiGatewayTemplateObjects(resources)
|
|
176
|
+
|
|
177
|
+
return fromEntries(
|
|
178
|
+
keys(methodObjects).map((key) => [
|
|
179
|
+
key,
|
|
180
|
+
constructHapiInterface(pathObjects, methodObjects, key),
|
|
181
|
+
]),
|
|
182
|
+
)
|
|
183
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { validate } from 'jsonschema'
|
|
2
|
+
|
|
3
|
+
export default function payloadSchemaValidator(model, body) {
|
|
4
|
+
const result = validate(body, model)
|
|
5
|
+
|
|
6
|
+
if (result.errors.length > 0) {
|
|
7
|
+
throw new Error(
|
|
8
|
+
`Request body validation failed: ${result.errors
|
|
9
|
+
.map((e) => e.message)
|
|
10
|
+
.join(', ')}`,
|
|
11
|
+
)
|
|
12
|
+
}
|
|
13
|
+
}
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
// based on:
|
|
2
|
+
// https://github.com/ajmath/serverless-offline-scheduler
|
|
3
|
+
|
|
4
|
+
import { log } from '@serverless/utils/log.js'
|
|
5
|
+
import nodeSchedule from 'node-schedule'
|
|
6
|
+
import ScheduleEvent from './ScheduleEvent.js'
|
|
7
|
+
import ScheduleEventDefinition from './ScheduleEventDefinition.js'
|
|
8
|
+
|
|
9
|
+
const CRON_LENGTH_WITH_YEAR = 6
|
|
10
|
+
|
|
11
|
+
const { stringify } = JSON
|
|
12
|
+
|
|
13
|
+
export default class Schedule {
|
|
14
|
+
#lambda = null
|
|
15
|
+
|
|
16
|
+
#region = null
|
|
17
|
+
|
|
18
|
+
constructor(lambda, region) {
|
|
19
|
+
this.#lambda = lambda
|
|
20
|
+
this.#region = region
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
#scheduleEvent(functionKey, scheduleEvent) {
|
|
24
|
+
const { enabled, input, rate } = scheduleEvent
|
|
25
|
+
|
|
26
|
+
if (!enabled) {
|
|
27
|
+
log.notice(`Scheduling [${functionKey}] cron: disabled`)
|
|
28
|
+
|
|
29
|
+
return
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Convert string rate to array to support Serverless v2.57.0 and lower.
|
|
33
|
+
let rates = rate
|
|
34
|
+
if (typeof rate === 'string') {
|
|
35
|
+
rates = [rate]
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
rates.forEach((entry) => {
|
|
39
|
+
const cron = this.#convertExpressionToCron(entry)
|
|
40
|
+
|
|
41
|
+
log.notice(
|
|
42
|
+
`Scheduling [${functionKey}] cron: [${cron}] input: ${stringify(
|
|
43
|
+
input,
|
|
44
|
+
)}`,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
nodeSchedule.scheduleJob(cron, async () => {
|
|
48
|
+
try {
|
|
49
|
+
const lambdaFunction = this.#lambda.get(functionKey)
|
|
50
|
+
|
|
51
|
+
const event = input ?? new ScheduleEvent(this.#region)
|
|
52
|
+
lambdaFunction.setEvent(event)
|
|
53
|
+
|
|
54
|
+
/* const result = */ await lambdaFunction.runHandler()
|
|
55
|
+
|
|
56
|
+
log.notice(
|
|
57
|
+
`Successfully invoked scheduled function: [${functionKey}]`,
|
|
58
|
+
)
|
|
59
|
+
} catch (err) {
|
|
60
|
+
log.error(
|
|
61
|
+
`Failed to execute scheduled function: [${functionKey}] Error: ${err}`,
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
})
|
|
65
|
+
})
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
#convertCronSyntax(cronString) {
|
|
69
|
+
if (cronString.split(' ').length < CRON_LENGTH_WITH_YEAR) {
|
|
70
|
+
return cronString
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return cronString.replace(/\s\S+$/, '')
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
#convertRateToCron(rate) {
|
|
77
|
+
const [number, unit] = rate.split(' ')
|
|
78
|
+
|
|
79
|
+
switch (unit) {
|
|
80
|
+
case 'minute':
|
|
81
|
+
case 'minutes':
|
|
82
|
+
return `*/${number} * * * *`
|
|
83
|
+
|
|
84
|
+
case 'hour':
|
|
85
|
+
case 'hours':
|
|
86
|
+
return `0 */${number} * * *`
|
|
87
|
+
|
|
88
|
+
case 'day':
|
|
89
|
+
case 'days':
|
|
90
|
+
return `0 0 */${number} * *`
|
|
91
|
+
|
|
92
|
+
default:
|
|
93
|
+
log.error(`scheduler: Invalid rate syntax '${rate}', will not schedule`)
|
|
94
|
+
|
|
95
|
+
return null
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
#convertExpressionToCron(scheduleEvent) {
|
|
100
|
+
const params = scheduleEvent
|
|
101
|
+
.replace('rate(', '')
|
|
102
|
+
.replace('cron(', '')
|
|
103
|
+
.replace(')', '')
|
|
104
|
+
|
|
105
|
+
if (scheduleEvent.startsWith('cron(')) {
|
|
106
|
+
return this.#convertCronSyntax(params)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (scheduleEvent.startsWith('rate(')) {
|
|
110
|
+
return this.#convertRateToCron(params)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
log.error('scheduler: invalid, schedule syntax')
|
|
114
|
+
|
|
115
|
+
return undefined
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
#create(functionKey, rawScheduleEventDefinition) {
|
|
119
|
+
const scheduleEvent = new ScheduleEventDefinition(
|
|
120
|
+
rawScheduleEventDefinition,
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
this.#scheduleEvent(functionKey, scheduleEvent)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
create(events) {
|
|
127
|
+
events.forEach(({ functionKey, schedule }) => {
|
|
128
|
+
this.#create(functionKey, schedule)
|
|
129
|
+
})
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createUniqueId } from '../../utils/index.js'
|
|
2
|
+
|
|
3
|
+
export default class ScheduleEvent {
|
|
4
|
+
constructor(region) {
|
|
5
|
+
// format of aws displaying the time, e.g.: 2020-02-09T14:13:57Z
|
|
6
|
+
const time = new Date().toISOString().replace(/\.(.*)(?=Z)/g, '')
|
|
7
|
+
|
|
8
|
+
this.account = createUniqueId()
|
|
9
|
+
this.detail = {}
|
|
10
|
+
this['detail-type'] = 'Scheduled Event'
|
|
11
|
+
this.id = createUniqueId()
|
|
12
|
+
this.region = region
|
|
13
|
+
this.resources = []
|
|
14
|
+
this.source = 'aws.events'
|
|
15
|
+
this.time = time
|
|
16
|
+
this.version = '0'
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const { assign } = Object
|
|
2
|
+
|
|
3
|
+
export default class ScheduleEventDefinition {
|
|
4
|
+
constructor(rawHttpEventDefinition) {
|
|
5
|
+
let enabled
|
|
6
|
+
let rate
|
|
7
|
+
let rest
|
|
8
|
+
|
|
9
|
+
if (typeof rawHttpEventDefinition === 'string') {
|
|
10
|
+
rate = rawHttpEventDefinition
|
|
11
|
+
} else {
|
|
12
|
+
;({ rate, enabled, ...rest } = rawHttpEventDefinition)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// enabled: true (default)
|
|
16
|
+
this.enabled = enabled == null ? true : enabled
|
|
17
|
+
this.rate = rate
|
|
18
|
+
|
|
19
|
+
assign(this, rest)
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './Schedule.js'
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { exit } from 'node:process'
|
|
2
|
+
import { Server } from '@hapi/hapi'
|
|
3
|
+
import { log } from '@serverless/utils/log.js'
|
|
4
|
+
import { catchAllRoute, connectionsRoutes } from './http-routes/index.js'
|
|
5
|
+
|
|
6
|
+
export default class HttpServer {
|
|
7
|
+
#options = null
|
|
8
|
+
|
|
9
|
+
#server = null
|
|
10
|
+
|
|
11
|
+
#webSocketClients = null
|
|
12
|
+
|
|
13
|
+
constructor(options, webSocketClients) {
|
|
14
|
+
this.#options = options
|
|
15
|
+
this.#webSocketClients = webSocketClients
|
|
16
|
+
|
|
17
|
+
const { host, websocketPort } = options
|
|
18
|
+
|
|
19
|
+
const serverOptions = {
|
|
20
|
+
host,
|
|
21
|
+
port: websocketPort,
|
|
22
|
+
router: {
|
|
23
|
+
// allows for paths with trailing slashes to be the same as without
|
|
24
|
+
// e.g. : /my-path is the same as /my-path/
|
|
25
|
+
stripTrailingSlash: true,
|
|
26
|
+
},
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
this.#server = new Server(serverOptions)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async start() {
|
|
33
|
+
// add routes
|
|
34
|
+
const routes = [
|
|
35
|
+
...connectionsRoutes(this.#webSocketClients),
|
|
36
|
+
catchAllRoute(),
|
|
37
|
+
]
|
|
38
|
+
this.#server.route(routes)
|
|
39
|
+
|
|
40
|
+
const { host, httpsProtocol, websocketPort } = this.#options
|
|
41
|
+
|
|
42
|
+
try {
|
|
43
|
+
await this.#server.start()
|
|
44
|
+
} catch (err) {
|
|
45
|
+
log.error(
|
|
46
|
+
`Unexpected error while starting serverless-offline websocket server on port ${websocketPort}:`,
|
|
47
|
+
err,
|
|
48
|
+
)
|
|
49
|
+
exit(1)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
log.notice(
|
|
53
|
+
`Offline [http for websocket] listening on http${
|
|
54
|
+
httpsProtocol ? 's' : ''
|
|
55
|
+
}://${host}:${websocketPort}`,
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// stops the server
|
|
60
|
+
stop(timeout) {
|
|
61
|
+
return this.#server.stop({
|
|
62
|
+
timeout,
|
|
63
|
+
})
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
get server() {
|
|
67
|
+
return this.#server.listener
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import HttpServer from './HttpServer.js'
|
|
2
|
+
import WebSocketEventDefinition from './WebSocketEventDefinition.js'
|
|
3
|
+
import WebSocketClients from './WebSocketClients.js'
|
|
4
|
+
import WebSocketServer from './WebSocketServer.js'
|
|
5
|
+
|
|
6
|
+
export default class WebSocket {
|
|
7
|
+
#httpServer = null
|
|
8
|
+
|
|
9
|
+
#webSocketServer = null
|
|
10
|
+
|
|
11
|
+
constructor(serverless, options, lambda) {
|
|
12
|
+
const webSocketClients = new WebSocketClients(serverless, options, lambda)
|
|
13
|
+
|
|
14
|
+
this.#httpServer = new HttpServer(options, webSocketClients)
|
|
15
|
+
|
|
16
|
+
// share server
|
|
17
|
+
this.#webSocketServer = new WebSocketServer(
|
|
18
|
+
options,
|
|
19
|
+
webSocketClients,
|
|
20
|
+
this.#httpServer.server,
|
|
21
|
+
)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
start() {
|
|
25
|
+
return Promise.all([
|
|
26
|
+
this.#httpServer.start(),
|
|
27
|
+
this.#webSocketServer.start(),
|
|
28
|
+
])
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// stops the server
|
|
32
|
+
stop(timeout) {
|
|
33
|
+
return Promise.all([
|
|
34
|
+
this.#httpServer.stop(timeout),
|
|
35
|
+
this.#webSocketServer.stop(),
|
|
36
|
+
])
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
#createEvent(functionKey, rawWebSocketEventDefinition) {
|
|
40
|
+
const webSocketEvent = new WebSocketEventDefinition(
|
|
41
|
+
rawWebSocketEventDefinition,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
this.#webSocketServer.addRoute(functionKey, webSocketEvent)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
create(events) {
|
|
48
|
+
events.forEach(({ functionKey, websocket }) => {
|
|
49
|
+
this.#createEvent(functionKey, websocket)
|
|
50
|
+
})
|
|
51
|
+
}
|
|
52
|
+
}
|