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,507 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _updateNotifier = _interopRequireDefault(require("update-notifier"));
9
-
10
- var _chalk = _interopRequireDefault(require("chalk"));
11
-
12
- var _semver = require("semver");
13
-
14
- var _debugLog = _interopRequireDefault(require("./debugLog.js"));
15
-
16
- var _serverlessLog = _interopRequireWildcard(require("./serverlessLog.js"));
17
-
18
- var _index = require("./utils/index.js");
19
-
20
- var _index2 = require("./config/index.js");
21
-
22
- var _package = _interopRequireDefault(require("../package.json"));
23
-
24
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
-
26
- 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); }
27
-
28
- 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; }
29
-
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; }
31
-
32
- var id = 0;
33
-
34
- function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; }
35
-
36
- var _cliOptions = /*#__PURE__*/_classPrivateFieldLooseKey("cliOptions");
37
-
38
- var _http = /*#__PURE__*/_classPrivateFieldLooseKey("http");
39
-
40
- var _options = /*#__PURE__*/_classPrivateFieldLooseKey("options");
41
-
42
- var _schedule = /*#__PURE__*/_classPrivateFieldLooseKey("schedule");
43
-
44
- var _webSocket = /*#__PURE__*/_classPrivateFieldLooseKey("webSocket");
45
-
46
- var _lambda = /*#__PURE__*/_classPrivateFieldLooseKey("lambda");
47
-
48
- var _serverless = /*#__PURE__*/_classPrivateFieldLooseKey("serverless");
49
-
50
- class ServerlessOffline {
51
- constructor(serverless, cliOptions, v3Utils) {
52
- Object.defineProperty(this, _cliOptions, {
53
- writable: true,
54
- value: null
55
- });
56
- Object.defineProperty(this, _http, {
57
- writable: true,
58
- value: null
59
- });
60
- Object.defineProperty(this, _options, {
61
- writable: true,
62
- value: null
63
- });
64
- Object.defineProperty(this, _schedule, {
65
- writable: true,
66
- value: null
67
- });
68
- Object.defineProperty(this, _webSocket, {
69
- writable: true,
70
- value: null
71
- });
72
- Object.defineProperty(this, _lambda, {
73
- writable: true,
74
- value: null
75
- });
76
- Object.defineProperty(this, _serverless, {
77
- writable: true,
78
- value: null
79
- });
80
- _classPrivateFieldLooseBase(this, _cliOptions)[_cliOptions] = cliOptions;
81
- _classPrivateFieldLooseBase(this, _serverless)[_serverless] = serverless;
82
-
83
- if (v3Utils) {
84
- this.log = v3Utils.log;
85
- this.progress = v3Utils.progress;
86
- this.writeText = v3Utils.writeText;
87
- this.v3Utils = v3Utils;
88
- }
89
-
90
- (0, _serverlessLog.setLog)((...args) => serverless.cli.log(...args));
91
- this.commands = {
92
- offline: {
93
- // add start nested options
94
- commands: {
95
- start: {
96
- lifecycleEvents: ['init', 'ready', 'end'],
97
- options: _index2.commandOptions,
98
- usage: 'Simulates API Gateway to call your lambda functions offline using backward compatible initialization.'
99
- },
100
- functionsUpdated: {
101
- type: 'entrypoint',
102
- lifecycleEvents: ['cleanup']
103
- }
104
- },
105
- lifecycleEvents: ['start'],
106
- options: _index2.commandOptions,
107
- usage: 'Simulates API Gateway to call your lambda functions offline.'
108
- }
109
- };
110
- this.hooks = {
111
- 'offline:start:init': this.start.bind(this),
112
- 'offline:start:ready': this.ready.bind(this),
113
- 'offline:functionsUpdated:cleanup': this.cleanupFunctions.bind(this),
114
- 'offline:start': this._startWithExplicitEnd.bind(this),
115
- 'offline:start:end': this.end.bind(this)
116
- };
117
- }
118
-
119
- _printBlankLine() {
120
- if (process.env.NODE_ENV !== 'test') {
121
- if (this.log) {
122
- this.log.notice();
123
- } else {
124
- console.log();
125
- }
126
- }
127
- } // Entry point for the plugin (sls offline) when running 'sls offline start'
128
-
129
-
130
- async start() {
131
- // Put here so available everywhere, not just in handlers
132
- process.env.IS_OFFLINE = true; // check if update is available
133
-
134
- (0, _updateNotifier.default)({
135
- pkg: _package.default
136
- }).notify();
137
-
138
- this._verifyServerlessVersionCompatibility();
139
-
140
- this._mergeOptions();
141
-
142
- const {
143
- httpEvents,
144
- lambdas,
145
- scheduleEvents,
146
- webSocketEvents
147
- } = this._getEvents(); // if (lambdas.length > 0) {
148
-
149
-
150
- await this._createLambda(lambdas); // }
151
-
152
- const eventModules = [];
153
-
154
- if (httpEvents.length > 0) {
155
- eventModules.push(this._createHttp(httpEvents));
156
- }
157
-
158
- if (!_classPrivateFieldLooseBase(this, _options)[_options].disableScheduledEvents && scheduleEvents.length > 0) {
159
- eventModules.push(this._createSchedule(scheduleEvents));
160
- }
161
-
162
- if (webSocketEvents.length > 0) {
163
- eventModules.push(this._createWebSocket(webSocketEvents));
164
- }
165
-
166
- await Promise.all(eventModules);
167
- }
168
-
169
- async ready() {
170
- if (process.env.NODE_ENV !== 'test') {
171
- await this._listenForTermination();
172
- }
173
- }
174
-
175
- async end(skipExit) {
176
- // TEMP FIXME
177
- if (process.env.NODE_ENV === 'test' && skipExit === undefined) {
178
- return;
179
- }
180
-
181
- if (this.log) {
182
- this.log.info('Halting offline server');
183
- } else {
184
- (0, _serverlessLog.default)('Halting offline server');
185
- }
186
-
187
- const eventModules = [];
188
-
189
- if (_classPrivateFieldLooseBase(this, _lambda)[_lambda]) {
190
- eventModules.push(_classPrivateFieldLooseBase(this, _lambda)[_lambda].cleanup());
191
- eventModules.push(_classPrivateFieldLooseBase(this, _lambda)[_lambda].stop(_index2.SERVER_SHUTDOWN_TIMEOUT));
192
- }
193
-
194
- if (_classPrivateFieldLooseBase(this, _http)[_http]) {
195
- eventModules.push(_classPrivateFieldLooseBase(this, _http)[_http].stop(_index2.SERVER_SHUTDOWN_TIMEOUT));
196
- } // if (this.#schedule) {
197
- // eventModules.push(this.#schedule.stop())
198
- // }
199
-
200
-
201
- if (_classPrivateFieldLooseBase(this, _webSocket)[_webSocket]) {
202
- eventModules.push(_classPrivateFieldLooseBase(this, _webSocket)[_webSocket].stop(_index2.SERVER_SHUTDOWN_TIMEOUT));
203
- }
204
-
205
- await Promise.all(eventModules);
206
-
207
- if (!skipExit) {
208
- process.exit(0);
209
- }
210
- }
211
-
212
- async cleanupFunctions() {
213
- if (_classPrivateFieldLooseBase(this, _lambda)[_lambda]) {
214
- (0, _serverlessLog.default)('Forcing cleanup of Lambda functions');
215
- await _classPrivateFieldLooseBase(this, _lambda)[_lambda].cleanup();
216
- }
217
- }
218
- /**
219
- * Entry point for the plugin (sls offline) when running 'sls offline'
220
- * The call to this.end() would terminate the process before 'offline:start:end' could be consumed
221
- * by downstream plugins. When running sls offline that can be expected, but docs say that
222
- * 'sls offline start' will provide the init and end hooks for other plugins to consume
223
- * */
224
-
225
-
226
- async _startWithExplicitEnd() {
227
- await this.start();
228
- await this.ready();
229
- this.end();
230
- }
231
-
232
- async _listenForTermination() {
233
- const command = await new Promise(resolve => {
234
- process // SIGINT will be usually sent when user presses ctrl+c
235
- .on('SIGINT', () => resolve('SIGINT')) // SIGTERM is a default termination signal in many cases,
236
- // for example when "killing" a subprocess spawned in node
237
- // with child_process methods
238
- .on('SIGTERM', () => resolve('SIGTERM'));
239
- });
240
-
241
- if (this.log) {
242
- this.log.info(`Got ${command} signal. Offline Halting...`);
243
- } else {
244
- (0, _serverlessLog.default)(`Got ${command} signal. Offline Halting...`);
245
- }
246
- }
247
-
248
- async _createLambda(lambdas, skipStart) {
249
- const {
250
- default: Lambda
251
- } = await Promise.resolve().then(() => _interopRequireWildcard(require('./lambda/index.js')));
252
- _classPrivateFieldLooseBase(this, _lambda)[_lambda] = new Lambda(_classPrivateFieldLooseBase(this, _serverless)[_serverless], _classPrivateFieldLooseBase(this, _options)[_options], this.v3Utils);
253
-
254
- _classPrivateFieldLooseBase(this, _lambda)[_lambda].create(lambdas);
255
-
256
- if (!skipStart) {
257
- await _classPrivateFieldLooseBase(this, _lambda)[_lambda].start();
258
- }
259
- }
260
-
261
- async _createHttp(events, skipStart) {
262
- const {
263
- default: Http
264
- } = await Promise.resolve().then(() => _interopRequireWildcard(require('./events/http/index.js')));
265
- _classPrivateFieldLooseBase(this, _http)[_http] = new Http(_classPrivateFieldLooseBase(this, _serverless)[_serverless], _classPrivateFieldLooseBase(this, _options)[_options], _classPrivateFieldLooseBase(this, _lambda)[_lambda], this.v3Utils);
266
- await _classPrivateFieldLooseBase(this, _http)[_http].registerPlugins();
267
-
268
- _classPrivateFieldLooseBase(this, _http)[_http].create(events); // HTTP Proxy defined in Resource
269
-
270
-
271
- _classPrivateFieldLooseBase(this, _http)[_http].createResourceRoutes(); // Not found handling
272
- // we have to create the 404 routes last, otherwise we could have
273
- // collisions with catch all routes, e.g. any (proxy+}
274
-
275
-
276
- _classPrivateFieldLooseBase(this, _http)[_http].create404Route();
277
-
278
- if (!skipStart) {
279
- await _classPrivateFieldLooseBase(this, _http)[_http].start();
280
- }
281
- }
282
-
283
- async _createSchedule(events) {
284
- const {
285
- default: Schedule
286
- } = await Promise.resolve().then(() => _interopRequireWildcard(require('./events/schedule/index.js')));
287
- _classPrivateFieldLooseBase(this, _schedule)[_schedule] = new Schedule(_classPrivateFieldLooseBase(this, _lambda)[_lambda], _classPrivateFieldLooseBase(this, _serverless)[_serverless].service.provider.region, this.v3Utils);
288
-
289
- _classPrivateFieldLooseBase(this, _schedule)[_schedule].create(events);
290
- }
291
-
292
- async _createWebSocket(events) {
293
- const {
294
- default: WebSocket
295
- } = await Promise.resolve().then(() => _interopRequireWildcard(require('./events/websocket/index.js')));
296
- _classPrivateFieldLooseBase(this, _webSocket)[_webSocket] = new WebSocket(_classPrivateFieldLooseBase(this, _serverless)[_serverless], _classPrivateFieldLooseBase(this, _options)[_options], _classPrivateFieldLooseBase(this, _lambda)[_lambda], this.v3Utils);
297
-
298
- _classPrivateFieldLooseBase(this, _webSocket)[_webSocket].create(events);
299
-
300
- return _classPrivateFieldLooseBase(this, _webSocket)[_webSocket].start();
301
- }
302
-
303
- _mergeOptions() {
304
- const {
305
- service: {
306
- custom = {},
307
- provider
308
- }
309
- } = _classPrivateFieldLooseBase(this, _serverless)[_serverless];
310
-
311
- const customOptions = custom[_index2.CUSTOM_OPTION]; // merge options
312
- // order of Precedence: command line options, custom options, defaults.
313
-
314
- _classPrivateFieldLooseBase(this, _options)[_options] = { ..._index2.defaultOptions,
315
- ...customOptions,
316
- ..._classPrivateFieldLooseBase(this, _cliOptions)[_cliOptions]
317
- }; // Parse CORS options
318
-
319
- _classPrivateFieldLooseBase(this, _options)[_options].corsAllowHeaders = _classPrivateFieldLooseBase(this, _options)[_options].corsAllowHeaders.replace(/\s/g, '').split(',');
320
- _classPrivateFieldLooseBase(this, _options)[_options].corsAllowOrigin = _classPrivateFieldLooseBase(this, _options)[_options].corsAllowOrigin.replace(/\s/g, '').split(',');
321
- _classPrivateFieldLooseBase(this, _options)[_options].corsExposedHeaders = _classPrivateFieldLooseBase(this, _options)[_options].corsExposedHeaders.replace(/\s/g, '').split(',');
322
-
323
- if (_classPrivateFieldLooseBase(this, _options)[_options].corsDisallowCredentials) {
324
- _classPrivateFieldLooseBase(this, _options)[_options].corsAllowCredentials = false;
325
- }
326
-
327
- _classPrivateFieldLooseBase(this, _options)[_options].corsConfig = {
328
- credentials: _classPrivateFieldLooseBase(this, _options)[_options].corsAllowCredentials,
329
- exposedHeaders: _classPrivateFieldLooseBase(this, _options)[_options].corsExposedHeaders,
330
- headers: _classPrivateFieldLooseBase(this, _options)[_options].corsAllowHeaders,
331
- origin: _classPrivateFieldLooseBase(this, _options)[_options].corsAllowOrigin
332
- };
333
-
334
- if (this.log) {
335
- this.log.notice();
336
- this.log.notice(`Starting Offline at stage ${provider.stage} ${_chalk.default.gray(`(${provider.region})`)}`);
337
- this.log.notice();
338
- this.log.debug('options:', _classPrivateFieldLooseBase(this, _options)[_options]);
339
- } else {
340
- (0, _serverlessLog.default)(`Starting Offline: ${provider.stage} ${provider.region}.`);
341
- (0, _debugLog.default)('options:', _classPrivateFieldLooseBase(this, _options)[_options]);
342
- }
343
- }
344
-
345
- _getEvents() {
346
- const {
347
- service
348
- } = _classPrivateFieldLooseBase(this, _serverless)[_serverless];
349
-
350
- const httpEvents = [];
351
- const lambdas = [];
352
- const scheduleEvents = [];
353
- const webSocketEvents = [];
354
- const functionKeys = service.getAllFunctions();
355
- let hasPrivateHttpEvent = false;
356
- functionKeys.forEach(functionKey => {
357
- const functionDefinition = service.getFunction(functionKey);
358
- lambdas.push({
359
- functionKey,
360
- functionDefinition
361
- });
362
- const events = service.getAllEventsInFunction(functionKey) || [];
363
- events.forEach(event => {
364
- const {
365
- http,
366
- httpApi,
367
- schedule,
368
- websocket
369
- } = event;
370
-
371
- if ((http || httpApi) && functionDefinition.handler) {
372
- const httpEvent = {
373
- functionKey,
374
- handler: functionDefinition.handler,
375
- http: http || httpApi
376
- };
377
-
378
- if (httpApi) {
379
- // Ensure definitions for 'httpApi' events are objects so that they can be marked
380
- // with an 'isHttpApi' property (they are handled differently to 'http' events)
381
- if (typeof httpEvent.http === 'string') {
382
- httpEvent.http = {
383
- routeKey: httpEvent.http === '*' ? '$default' : httpEvent.http
384
- };
385
- } else if (typeof httpEvent.http === 'object') {
386
- if (!httpEvent.http.method) {
387
- if (this.log) {
388
- this.log.warning(`Event definition is missing a method for function "${functionKey}"`);
389
- } else {
390
- (0, _serverlessLog.logWarning)(`Event definition is missing a method for function "${functionKey}"`);
391
- }
392
-
393
- httpEvent.http.method = '';
394
- }
395
-
396
- const resolvedMethod = httpEvent.http.method === '*' ? 'ANY' : httpEvent.http.method.toUpperCase();
397
- httpEvent.http.routeKey = `${resolvedMethod} ${httpEvent.http.path}`; // Clear these properties to avoid confusion (they will be derived from the routeKey
398
- // when needed later)
399
-
400
- delete httpEvent.http.method;
401
- delete httpEvent.http.path;
402
- } else {
403
- if (this.log) {
404
- this.log.warning(`Event definition must be a string or object but received ${typeof httpEvent.http} for function "${functionKey}"`);
405
- } else {
406
- (0, _serverlessLog.logWarning)(`Event definition must be a string or object but received ${typeof httpEvent.http} for function "${functionKey}"`);
407
- }
408
-
409
- httpEvent.http.routeKey = '';
410
- }
411
-
412
- httpEvent.http.isHttpApi = true;
413
-
414
- if (functionDefinition.httpApi && functionDefinition.httpApi.payload) {
415
- httpEvent.http.payload = functionDefinition.httpApi.payload;
416
- } else {
417
- httpEvent.http.payload = service.provider.httpApi && service.provider.httpApi.payload ? service.provider.httpApi.payload : '2.0';
418
- }
419
- }
420
-
421
- if (http && http.private) {
422
- hasPrivateHttpEvent = true;
423
- }
424
-
425
- httpEvents.push(httpEvent);
426
- }
427
-
428
- if (schedule) {
429
- scheduleEvents.push({
430
- functionKey,
431
- schedule
432
- });
433
- }
434
-
435
- if (websocket) {
436
- webSocketEvents.push({
437
- functionKey,
438
- websocket
439
- });
440
- }
441
- });
442
- }); // for simple API Key authentication model
443
-
444
- if (hasPrivateHttpEvent) {
445
- if (this.log) {
446
- this.log.notice(`Key with token: ${_classPrivateFieldLooseBase(this, _options)[_options].apiKey}`);
447
- } else {
448
- (0, _serverlessLog.default)(`Key with token: ${_classPrivateFieldLooseBase(this, _options)[_options].apiKey}`);
449
- }
450
-
451
- if (_classPrivateFieldLooseBase(this, _options)[_options].noAuth) {
452
- if (this.log) {
453
- this.log.notice('Authorizers are turned off. You do not need to use x-api-key header.');
454
- } else {
455
- (0, _serverlessLog.default)('Authorizers are turned off. You do not need to use x-api-key header.');
456
- }
457
- } else if (this.log) {
458
- this.log.notice('Remember to use x-api-key on the request headers');
459
- } else {
460
- (0, _serverlessLog.default)('Remember to use x-api-key on the request headers');
461
- }
462
- }
463
-
464
- return {
465
- httpEvents,
466
- lambdas,
467
- scheduleEvents,
468
- webSocketEvents
469
- };
470
- } // TEMP FIXME quick fix to expose gateway server for testing, look for better solution
471
-
472
-
473
- getApiGatewayServer() {
474
- return _classPrivateFieldLooseBase(this, _http)[_http].getServer();
475
- } // TODO: missing tests
476
-
477
-
478
- _verifyServerlessVersionCompatibility() {
479
- const currentVersion = _classPrivateFieldLooseBase(this, _serverless)[_serverless].version;
480
-
481
- const requiredVersionRange = _package.default.peerDependencies.serverless;
482
-
483
- if ((0, _semver.parse)(currentVersion).prerelease.length) {
484
- // Do not validate, if run against serverless pre-release
485
- return;
486
- }
487
-
488
- const versionIsSatisfied = (0, _index.satisfiesVersionRange)(currentVersion, requiredVersionRange);
489
-
490
- if (!versionIsSatisfied) {
491
- if (this.log) {
492
- this.log.warning(`serverless-offline requires serverless version ${requiredVersionRange} but found version ${currentVersion}.
493
- Be aware that functionality might be limited or contains bugs.
494
- To avoid any issues update serverless to a later version.
495
- `);
496
- } else {
497
- (0, _serverlessLog.logWarning)(`serverless-offline requires serverless version ${requiredVersionRange} but found version ${currentVersion}.
498
- Be aware that functionality might be limited or contains bugs.
499
- To avoid any issues update serverless to a later version.
500
- `);
501
- }
502
- }
503
- }
504
-
505
- }
506
-
507
- exports.default = ServerlessOffline;
@@ -1,21 +0,0 @@
1
- "use strict";
2
-
3
- var _pleaseUpgradeNode = _interopRequireDefault(require("please-upgrade-node"));
4
-
5
- var _package = _interopRequireDefault(require("../package.json"));
6
-
7
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
-
9
- // NOTE: important, don't use any new javascript language features in this file!
10
- // (other than es6 modules, which are transpiled)
11
- const currentNodeVersion = process.versions.node;
12
-
13
- const requiredNodeVersion = _package.default.engines.node.replace('>=', '');
14
-
15
- (0, _pleaseUpgradeNode.default)(_package.default, {
16
- message: function message() {
17
- return (// eslint-disable-next-line prefer-template
18
- 'serverless-offline requires node.js version ' + requiredNodeVersion + ' or higher, but found version ' + currentNodeVersion + '. Please upgrade!'
19
- );
20
- }
21
- });
@@ -1,149 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _default = {
8
- apiKey: {
9
- usage: 'Defines the API key value to be used for endpoints marked as private. Defaults to a random hash.',
10
- type: 'string'
11
- },
12
- corsAllowHeaders: {
13
- usage: 'Used to build the Access-Control-Allow-Headers header for CORS support.',
14
- type: 'string'
15
- },
16
- corsAllowOrigin: {
17
- usage: 'Used to build the Access-Control-Allow-Origin header for CORS support.',
18
- type: 'string'
19
- },
20
- corsDisallowCredentials: {
21
- usage: 'Used to override the Access-Control-Allow-Credentials default (which is true) to false.',
22
- type: 'boolean'
23
- },
24
- corsExposedHeaders: {
25
- usage: 'Used to build the Access-Control-Exposed-Headers response header for CORS support',
26
- type: 'string'
27
- },
28
- disableCookieValidation: {
29
- usage: 'Used to disable cookie-validation on hapi.js-server',
30
- type: 'boolean'
31
- },
32
- disableScheduledEvents: {
33
- usage: 'Disables all scheduled events. Overrides configurations in serverless.yml. Default: false',
34
- type: 'boolean'
35
- },
36
- enforceSecureCookies: {
37
- usage: 'Enforce secure cookies',
38
- type: 'boolean'
39
- },
40
- hideStackTraces: {
41
- usage: 'Hide the stack trace on lambda failure. Default: false',
42
- type: 'boolean'
43
- },
44
- host: {
45
- shortcut: 'o',
46
- usage: 'The host name to listen on. Default: localhost',
47
- type: 'string'
48
- },
49
- httpPort: {
50
- usage: 'HTTP port to listen on. Default: 3000',
51
- type: 'string'
52
- },
53
- httpsProtocol: {
54
- shortcut: 'H',
55
- usage: 'To enable HTTPS, specify directory (relative to your cwd, typically your project dir) for both cert.pem and key.pem files.',
56
- type: 'string'
57
- },
58
- lambdaPort: {
59
- usage: 'Lambda http port to listen on. Default: 3002',
60
- type: 'string'
61
- },
62
- noPrependStageInUrl: {
63
- usage: "Don't prepend http routes with the stage.",
64
- type: 'boolean'
65
- },
66
- noStripTrailingSlashInUrl: {
67
- usage: "Don't strip trailing slash from http routes.",
68
- type: 'boolean'
69
- },
70
- noAuth: {
71
- usage: 'Turns off all authorizers',
72
- type: 'boolean'
73
- },
74
- ignoreJWTSignature: {
75
- usage: "When using HttpApi with a JWT authorizer, don't check the signature of the JWT token. This should only be used for local development.",
76
- type: 'boolean'
77
- },
78
- noTimeout: {
79
- shortcut: 't',
80
- usage: 'Disables the timeout feature.',
81
- type: 'boolean'
82
- },
83
- prefix: {
84
- shortcut: 'p',
85
- usage: 'Adds a prefix to every path, to send your requests to http://localhost:3000/prefix/[your_path] instead.',
86
- type: 'string'
87
- },
88
- printOutput: {
89
- usage: 'Outputs your lambda response to the terminal.',
90
- type: 'boolean'
91
- },
92
- resourceRoutes: {
93
- usage: 'Turns on loading of your HTTP proxy settings from serverless.yml.',
94
- type: 'boolean'
95
- },
96
- useChildProcesses: {
97
- usage: 'Uses separate node processes for handlers',
98
- type: 'boolean'
99
- },
100
- useWorkerThreads: {
101
- usage: 'Uses worker threads for handlers. Requires node.js v11.7.0 or higher',
102
- type: 'boolean'
103
- },
104
- websocketPort: {
105
- usage: 'Websocket port to listen on. Default: 3001',
106
- type: 'string'
107
- },
108
- webSocketHardTimeout: {
109
- usage: 'Set WebSocket hard timeout in seconds to reproduce AWS limits (https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html#apigateway-execution-service-websocket-limits-table). Default: 7200 (2 hours)',
110
- type: 'string'
111
- },
112
- webSocketIdleTimeout: {
113
- usage: 'Set WebSocket idle timeout in seconds to reproduce AWS limits (https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html#apigateway-execution-service-websocket-limits-table). Default: 600 (10 minutes)',
114
- type: 'string'
115
- },
116
- useDocker: {
117
- usage: 'Uses docker for node/python/ruby/provided',
118
- type: 'boolean'
119
- },
120
- layersDir: {
121
- usage: 'The directory layers should be stored in. Default: {codeDir}/.serverless-offline/layers',
122
- type: 'string'
123
- },
124
- dockerReadOnly: {
125
- usage: 'Marks if the docker code layer should be read only. Default: true',
126
- type: 'boolean'
127
- },
128
- functionCleanupIdleTimeSeconds: {
129
- usage: 'Number of seconds until an idle function is eligible for cleanup',
130
- type: 'string'
131
- },
132
- allowCache: {
133
- usage: 'Allows the code of lambda functions to cache if supported',
134
- type: 'boolean'
135
- },
136
- dockerHost: {
137
- usage: 'The host name of Docker. Default: localhost',
138
- type: 'string'
139
- },
140
- dockerHostServicePath: {
141
- usage: 'Defines service path which is used by SLS running inside Docker container',
142
- type: 'string'
143
- },
144
- dockerNetwork: {
145
- usage: 'The network that the Docker container will connect to',
146
- type: 'string'
147
- }
148
- };
149
- exports.default = _default;