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.
Files changed (234) hide show
  1. package/README.md +91 -95
  2. package/package.json +41 -69
  3. package/src/ServerlessOffline.js +412 -0
  4. package/src/config/commandOptions.js +155 -0
  5. package/src/config/constants.js +22 -0
  6. package/{dist → src}/config/defaultOptions.js +8 -17
  7. package/src/config/index.js +4 -0
  8. package/src/config/supportedRuntimes.js +47 -0
  9. package/src/events/authCanExecuteResource.js +35 -0
  10. package/src/events/authFunctionNameExtractor.js +75 -0
  11. package/src/events/authMatchPolicyResource.js +71 -0
  12. package/src/events/authValidateContext.js +51 -0
  13. package/src/events/http/Endpoint.js +135 -0
  14. package/src/events/http/Http.js +50 -0
  15. package/src/events/http/HttpEventDefinition.js +20 -0
  16. package/src/events/http/HttpServer.js +1277 -0
  17. package/src/events/http/OfflineEndpoint.js +33 -0
  18. package/src/events/http/authJWTSettingsExtractor.js +70 -0
  19. package/src/events/http/createAuthScheme.js +176 -0
  20. package/src/events/http/createJWTAuthScheme.js +106 -0
  21. package/src/events/http/index.js +1 -0
  22. package/src/events/http/javaHelpers.js +102 -0
  23. package/src/events/http/lambda-events/LambdaIntegrationEvent.js +57 -0
  24. package/src/events/http/lambda-events/LambdaProxyIntegrationEvent.js +233 -0
  25. package/src/events/http/lambda-events/LambdaProxyIntegrationEventV2.js +190 -0
  26. package/src/events/http/lambda-events/VelocityContext.js +147 -0
  27. package/src/events/http/lambda-events/index.js +4 -0
  28. package/src/events/http/lambda-events/renderVelocityTemplateObject.js +93 -0
  29. package/{dist → src}/events/http/parseResources.js +73 -78
  30. package/src/events/http/payloadSchemaValidator.js +13 -0
  31. package/{dist → src}/events/http/templates/offline-default.req.vm +0 -0
  32. package/{dist → src}/events/http/templates/offline-default.res.vm +0 -0
  33. package/src/events/schedule/Schedule.js +131 -0
  34. package/src/events/schedule/ScheduleEvent.js +18 -0
  35. package/src/events/schedule/ScheduleEventDefinition.js +21 -0
  36. package/src/events/schedule/index.js +1 -0
  37. package/src/events/websocket/HttpServer.js +69 -0
  38. package/src/events/websocket/WebSocket.js +52 -0
  39. package/src/events/websocket/WebSocketClients.js +462 -0
  40. package/src/events/websocket/WebSocketEventDefinition.js +18 -0
  41. package/src/events/websocket/WebSocketServer.js +73 -0
  42. package/src/events/websocket/http-routes/_catchAll/catchAllRoute.js +16 -0
  43. package/src/events/websocket/http-routes/_catchAll/index.js +1 -0
  44. package/src/events/websocket/http-routes/connections/ConnectionsController.js +28 -0
  45. package/src/events/websocket/http-routes/connections/connectionsRoutes.js +70 -0
  46. package/src/events/websocket/http-routes/connections/index.js +1 -0
  47. package/src/events/websocket/http-routes/index.js +2 -0
  48. package/src/events/websocket/index.js +1 -0
  49. package/src/events/websocket/lambda-events/WebSocketAuthorizerEvent.js +65 -0
  50. package/src/events/websocket/lambda-events/WebSocketConnectEvent.js +68 -0
  51. package/src/events/websocket/lambda-events/WebSocketDisconnectEvent.js +31 -0
  52. package/src/events/websocket/lambda-events/WebSocketEvent.js +29 -0
  53. package/src/events/websocket/lambda-events/WebSocketRequestContext.js +67 -0
  54. package/src/events/websocket/lambda-events/index.js +4 -0
  55. package/src/index.js +12 -0
  56. package/src/lambda/HttpServer.js +108 -0
  57. package/src/lambda/Lambda.js +68 -0
  58. package/src/lambda/LambdaContext.js +33 -0
  59. package/src/lambda/LambdaFunction.js +308 -0
  60. package/src/lambda/LambdaFunctionPool.js +109 -0
  61. package/src/lambda/__tests__/LambdaContext.test.js +30 -0
  62. package/src/lambda/__tests__/LambdaFunction.test.js +196 -0
  63. package/src/lambda/__tests__/fixtures/Lambda/LambdaFunctionThatReturnsJSONObject.fixture.js +47 -0
  64. package/src/lambda/__tests__/fixtures/Lambda/LambdaFunctionThatReturnsNativeString.fixture.js +46 -0
  65. package/src/lambda/__tests__/fixtures/Lambda/package.json +3 -0
  66. package/src/lambda/__tests__/fixtures/lambdaFunction.fixture.js +145 -0
  67. package/src/lambda/__tests__/fixtures/package.json +3 -0
  68. package/src/lambda/__tests__/routes/invocations/InvocationsController.test.js +42 -0
  69. package/src/lambda/handler-runner/HandlerRunner.js +136 -0
  70. package/src/lambda/handler-runner/child-process-runner/ChildProcessRunner.js +72 -0
  71. package/src/lambda/handler-runner/child-process-runner/childProcessHelper.js +42 -0
  72. package/src/lambda/handler-runner/child-process-runner/index.js +1 -0
  73. package/src/lambda/handler-runner/docker-runner/DockerContainer.js +417 -0
  74. package/src/lambda/handler-runner/docker-runner/DockerImage.js +35 -0
  75. package/src/lambda/handler-runner/docker-runner/DockerRunner.js +63 -0
  76. package/src/lambda/handler-runner/docker-runner/index.js +1 -0
  77. package/src/lambda/handler-runner/go-runner/GoRunner.js +166 -0
  78. package/src/lambda/handler-runner/go-runner/index.js +1 -0
  79. package/src/lambda/handler-runner/in-process-runner/InProcessRunner.js +125 -0
  80. package/src/lambda/handler-runner/in-process-runner/index.js +1 -0
  81. package/src/lambda/handler-runner/index.js +1 -0
  82. package/src/lambda/handler-runner/java-runner/JavaRunner.js +114 -0
  83. package/src/lambda/handler-runner/java-runner/index.js +1 -0
  84. package/src/lambda/handler-runner/python-runner/PythonRunner.js +138 -0
  85. package/src/lambda/handler-runner/python-runner/index.js +1 -0
  86. package/{dist → src}/lambda/handler-runner/python-runner/invoke.py +0 -0
  87. package/src/lambda/handler-runner/ruby-runner/RubyRunner.js +107 -0
  88. package/src/lambda/handler-runner/ruby-runner/index.js +1 -0
  89. package/{dist → src}/lambda/handler-runner/ruby-runner/invoke.rb +0 -0
  90. package/src/lambda/handler-runner/worker-thread-runner/WorkerThreadRunner.js +70 -0
  91. package/src/lambda/handler-runner/worker-thread-runner/index.js +1 -0
  92. package/src/lambda/handler-runner/worker-thread-runner/workerThreadHelper.js +29 -0
  93. package/src/lambda/index.js +1 -0
  94. package/src/lambda/routes/index.js +2 -0
  95. package/src/lambda/routes/invocations/InvocationsController.js +102 -0
  96. package/src/lambda/routes/invocations/index.js +1 -0
  97. package/src/lambda/routes/invocations/invocationsRoute.js +77 -0
  98. package/src/lambda/routes/invoke-async/InvokeAsyncController.js +20 -0
  99. package/src/lambda/routes/invoke-async/index.js +1 -0
  100. package/src/lambda/routes/invoke-async/invokeAsyncRoute.js +33 -0
  101. package/src/utils/__tests__/createUniqueId.test.js +18 -0
  102. package/src/utils/__tests__/formatToClfTime.test.js +14 -0
  103. package/src/utils/__tests__/generateHapiPath.test.js +46 -0
  104. package/src/utils/__tests__/lowerCaseKeys.test.js +30 -0
  105. package/src/utils/__tests__/parseHeaders.test.js +13 -0
  106. package/src/utils/__tests__/parseMultiValueHeaders.test.js +24 -0
  107. package/src/utils/__tests__/parseMultiValueQueryStringParameters.test.js +159 -0
  108. package/src/utils/__tests__/parseQueryStringParameters.test.js +15 -0
  109. package/src/utils/__tests__/splitHandlerPathAndName.test.js +54 -0
  110. package/src/utils/__tests__/unflatten.test.js +32 -0
  111. package/src/utils/checkDockerDaemon.js +19 -0
  112. package/src/utils/checkGoVersion.js +16 -0
  113. package/src/utils/createApiKey.js +5 -0
  114. package/src/utils/createUniqueId.js +5 -0
  115. package/src/utils/detectExecutable.js +11 -0
  116. package/{dist → src}/utils/formatToClfTime.js +6 -14
  117. package/src/utils/generateHapiPath.js +26 -0
  118. package/src/utils/getHttpApiCorsConfig.js +28 -0
  119. package/src/utils/index.js +42 -0
  120. package/src/utils/jsonPath.js +13 -0
  121. package/src/utils/logRoutes.js +64 -0
  122. package/src/utils/lowerCaseKeys.js +6 -0
  123. package/src/utils/parseHeaders.js +14 -0
  124. package/src/utils/parseMultiValueHeaders.js +27 -0
  125. package/src/utils/parseMultiValueQueryStringParameters.js +31 -0
  126. package/src/utils/parseQueryStringParameters.js +15 -0
  127. package/src/utils/resolveJoins.js +29 -0
  128. package/src/utils/splitHandlerPathAndName.js +31 -0
  129. package/src/utils/unflatten.js +11 -0
  130. package/dist/ServerlessOffline.js +0 -507
  131. package/dist/checkEngine.js +0 -21
  132. package/dist/config/commandOptions.js +0 -149
  133. package/dist/config/constants.js +0 -30
  134. package/dist/config/index.js +0 -55
  135. package/dist/config/supportedRuntimes.js +0 -40
  136. package/dist/debugLog.js +0 -10
  137. package/dist/events/authCanExecuteResource.js +0 -35
  138. package/dist/events/authFunctionNameExtractor.js +0 -87
  139. package/dist/events/authMatchPolicyResource.js +0 -62
  140. package/dist/events/http/Endpoint.js +0 -171
  141. package/dist/events/http/Http.js +0 -77
  142. package/dist/events/http/HttpEventDefinition.js +0 -36
  143. package/dist/events/http/HttpServer.js +0 -1363
  144. package/dist/events/http/OfflineEndpoint.js +0 -40
  145. package/dist/events/http/authJWTSettingsExtractor.js +0 -76
  146. package/dist/events/http/authValidateContext.js +0 -48
  147. package/dist/events/http/createAuthScheme.js +0 -184
  148. package/dist/events/http/createJWTAuthScheme.js +0 -155
  149. package/dist/events/http/index.js +0 -15
  150. package/dist/events/http/javaHelpers.js +0 -99
  151. package/dist/events/http/lambda-events/LambdaIntegrationEvent.js +0 -85
  152. package/dist/events/http/lambda-events/LambdaProxyIntegrationEvent.js +0 -244
  153. package/dist/events/http/lambda-events/LambdaProxyIntegrationEventV2.js +0 -221
  154. package/dist/events/http/lambda-events/VelocityContext.js +0 -168
  155. package/dist/events/http/lambda-events/index.js +0 -39
  156. package/dist/events/http/lambda-events/renderVelocityTemplateObject.js +0 -108
  157. package/dist/events/http/payloadSchemaValidator.js +0 -13
  158. package/dist/events/schedule/Schedule.js +0 -182
  159. package/dist/events/schedule/ScheduleEvent.js +0 -27
  160. package/dist/events/schedule/ScheduleEventDefinition.js +0 -36
  161. package/dist/events/schedule/index.js +0 -15
  162. package/dist/events/websocket/HttpServer.js +0 -112
  163. package/dist/events/websocket/WebSocket.js +0 -78
  164. package/dist/events/websocket/WebSocketClients.js +0 -550
  165. package/dist/events/websocket/WebSocketEventDefinition.js +0 -32
  166. package/dist/events/websocket/WebSocketServer.js +0 -140
  167. package/dist/events/websocket/http-routes/_catchAll/catchAllRoute.js +0 -33
  168. package/dist/events/websocket/http-routes/_catchAll/index.js +0 -15
  169. package/dist/events/websocket/http-routes/connections/ConnectionsController.js +0 -45
  170. package/dist/events/websocket/http-routes/connections/connectionsRoutes.js +0 -95
  171. package/dist/events/websocket/http-routes/connections/index.js +0 -15
  172. package/dist/events/websocket/http-routes/index.js +0 -23
  173. package/dist/events/websocket/index.js +0 -15
  174. package/dist/events/websocket/lambda-events/WebSocketAuthorizerEvent.js +0 -99
  175. package/dist/events/websocket/lambda-events/WebSocketConnectEvent.js +0 -101
  176. package/dist/events/websocket/lambda-events/WebSocketDisconnectEvent.js +0 -47
  177. package/dist/events/websocket/lambda-events/WebSocketEvent.js +0 -54
  178. package/dist/events/websocket/lambda-events/WebSocketRequestContext.js +0 -98
  179. package/dist/events/websocket/lambda-events/index.js +0 -39
  180. package/dist/index.js +0 -19
  181. package/dist/lambda/HttpServer.js +0 -122
  182. package/dist/lambda/Lambda.js +0 -113
  183. package/dist/lambda/LambdaContext.js +0 -53
  184. package/dist/lambda/LambdaFunction.js +0 -391
  185. package/dist/lambda/LambdaFunctionPool.js +0 -127
  186. package/dist/lambda/handler-runner/HandlerRunner.js +0 -223
  187. package/dist/lambda/handler-runner/child-process-runner/ChildProcessRunner.js +0 -132
  188. package/dist/lambda/handler-runner/child-process-runner/childProcessHelper.js +0 -40
  189. package/dist/lambda/handler-runner/child-process-runner/index.js +0 -15
  190. package/dist/lambda/handler-runner/docker-runner/DockerContainer.js +0 -517
  191. package/dist/lambda/handler-runner/docker-runner/DockerImage.js +0 -67
  192. package/dist/lambda/handler-runner/docker-runner/DockerRunner.js +0 -74
  193. package/dist/lambda/handler-runner/docker-runner/index.js +0 -15
  194. package/dist/lambda/handler-runner/go-runner/GoRunner.js +0 -211
  195. package/dist/lambda/handler-runner/go-runner/index.js +0 -15
  196. package/dist/lambda/handler-runner/in-process-runner/InProcessRunner.js +0 -234
  197. package/dist/lambda/handler-runner/in-process-runner/index.js +0 -15
  198. package/dist/lambda/handler-runner/index.js +0 -15
  199. package/dist/lambda/handler-runner/java-runner/JavaRunner.js +0 -151
  200. package/dist/lambda/handler-runner/java-runner/index.js +0 -15
  201. package/dist/lambda/handler-runner/python-runner/PythonRunner.js +0 -180
  202. package/dist/lambda/handler-runner/python-runner/index.js +0 -15
  203. package/dist/lambda/handler-runner/ruby-runner/RubyRunner.js +0 -148
  204. package/dist/lambda/handler-runner/ruby-runner/index.js +0 -15
  205. package/dist/lambda/handler-runner/worker-thread-runner/WorkerThreadRunner.js +0 -94
  206. package/dist/lambda/handler-runner/worker-thread-runner/index.js +0 -15
  207. package/dist/lambda/handler-runner/worker-thread-runner/workerThreadHelper.js +0 -30
  208. package/dist/lambda/index.js +0 -15
  209. package/dist/lambda/routes/index.js +0 -23
  210. package/dist/lambda/routes/invocations/InvocationsController.js +0 -142
  211. package/dist/lambda/routes/invocations/index.js +0 -15
  212. package/dist/lambda/routes/invocations/invocationsRoute.js +0 -90
  213. package/dist/lambda/routes/invoke-async/InvokeAsyncController.js +0 -38
  214. package/dist/lambda/routes/invoke-async/index.js +0 -15
  215. package/dist/lambda/routes/invoke-async/invokeAsyncRoute.js +0 -43
  216. package/dist/main.js +0 -11
  217. package/dist/serverlessLog.js +0 -91
  218. package/dist/utils/checkDockerDaemon.js +0 -27
  219. package/dist/utils/checkGoVersion.js +0 -27
  220. package/dist/utils/createApiKey.js +0 -12
  221. package/dist/utils/createUniqueId.js +0 -14
  222. package/dist/utils/detectExecutable.js +0 -21
  223. package/dist/utils/generateHapiPath.js +0 -28
  224. package/dist/utils/getHttpApiCorsConfig.js +0 -44
  225. package/dist/utils/index.js +0 -158
  226. package/dist/utils/jsonPath.js +0 -21
  227. package/dist/utils/parseHeaders.js +0 -23
  228. package/dist/utils/parseMultiValueHeaders.js +0 -36
  229. package/dist/utils/parseMultiValueQueryStringParameters.js +0 -40
  230. package/dist/utils/parseQueryStringParameters.js +0 -26
  231. package/dist/utils/resolveJoins.js +0 -34
  232. package/dist/utils/satisfiesVersionRange.js +0 -20
  233. package/dist/utils/splitHandlerPathAndName.js +0 -41
  234. package/dist/utils/unflatten.js +0 -18
@@ -1,46 +1,39 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = parseResources;
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
- const {
30
- Type
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
- const parentIdObj = resourceObj.Properties.ParentId || {};
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
- currentId = getParentId(currentObj);
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); // let integrationType;
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
- methodObjects,
185
- pathObjects
186
- } = getApiGatewayTemplateObjects(resources);
187
- return fromEntries(keys(methodObjects).map(key => [key, constructHapiInterface(pathObjects, methodObjects, key)]));
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
+ }
@@ -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
+ }