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,180 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _os = require("os");
9
-
10
- var _path = require("path");
11
-
12
- var _child_process = require("child_process");
13
-
14
- var _extend = _interopRequireDefault(require("extend"));
15
-
16
- var _readline = _interopRequireDefault(require("readline"));
17
-
18
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
-
20
- function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; }
21
-
22
- var id = 0;
23
-
24
- function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; }
25
-
26
- const {
27
- parse,
28
- stringify
29
- } = JSON;
30
- const {
31
- cwd
32
- } = process;
33
- const {
34
- has
35
- } = Reflect;
36
-
37
- var _env = /*#__PURE__*/_classPrivateFieldLooseKey("env");
38
-
39
- var _handlerName = /*#__PURE__*/_classPrivateFieldLooseKey("handlerName");
40
-
41
- var _handlerPath = /*#__PURE__*/_classPrivateFieldLooseKey("handlerPath");
42
-
43
- var _runtime = /*#__PURE__*/_classPrivateFieldLooseKey("runtime");
44
-
45
- var _allowCache = /*#__PURE__*/_classPrivateFieldLooseKey("allowCache");
46
-
47
- class PythonRunner {
48
- constructor(funOptions, env, allowCache, v3Utils) {
49
- Object.defineProperty(this, _env, {
50
- writable: true,
51
- value: null
52
- });
53
- Object.defineProperty(this, _handlerName, {
54
- writable: true,
55
- value: null
56
- });
57
- Object.defineProperty(this, _handlerPath, {
58
- writable: true,
59
- value: null
60
- });
61
- Object.defineProperty(this, _runtime, {
62
- writable: true,
63
- value: null
64
- });
65
- Object.defineProperty(this, _allowCache, {
66
- writable: true,
67
- value: false
68
- });
69
- const {
70
- handlerName,
71
- handlerPath,
72
- runtime
73
- } = funOptions;
74
- _classPrivateFieldLooseBase(this, _env)[_env] = env;
75
- _classPrivateFieldLooseBase(this, _handlerName)[_handlerName] = handlerName;
76
- _classPrivateFieldLooseBase(this, _handlerPath)[_handlerPath] = handlerPath;
77
- _classPrivateFieldLooseBase(this, _runtime)[_runtime] = (0, _os.platform)() === 'win32' ? 'python.exe' : runtime;
78
- _classPrivateFieldLooseBase(this, _allowCache)[_allowCache] = allowCache;
79
-
80
- if (v3Utils) {
81
- this.log = v3Utils.log;
82
- this.progress = v3Utils.progress;
83
- this.writeText = v3Utils.writeText;
84
- this.v3Utils = v3Utils;
85
- }
86
-
87
- if (process.env.VIRTUAL_ENV) {
88
- const runtimeDir = (0, _os.platform)() === 'win32' ? 'Scripts' : 'bin';
89
- process.env.PATH = [(0, _path.join)(process.env.VIRTUAL_ENV, runtimeDir), _path.delimiter, process.env.PATH].join('');
90
- }
91
-
92
- const [pythonExecutable] = _classPrivateFieldLooseBase(this, _runtime)[_runtime].split('.');
93
-
94
- this.handlerProcess = (0, _child_process.spawn)(pythonExecutable, ['-u', (0, _path.resolve)(__dirname, 'invoke.py'), (0, _path.relative)(cwd(), _classPrivateFieldLooseBase(this, _handlerPath)[_handlerPath]), _classPrivateFieldLooseBase(this, _handlerName)[_handlerName]], {
95
- env: (0, _extend.default)(process.env, _classPrivateFieldLooseBase(this, _env)[_env]),
96
- shell: true
97
- });
98
- this.handlerProcess.stdout.readline = _readline.default.createInterface({
99
- input: this.handlerProcess.stdout
100
- });
101
- } // () => void
102
-
103
-
104
- cleanup() {
105
- this.handlerProcess.kill();
106
- }
107
-
108
- _parsePayload(value) {
109
- let payload;
110
-
111
- for (const item of value.split(_os.EOL)) {
112
- let json; // first check if it's JSON
113
-
114
- try {
115
- json = parse(item); // nope, it's not JSON
116
- } catch (err) {// no-op
117
- } // now let's see if we have a property __offline_payload__
118
-
119
-
120
- if (json && typeof json === 'object' && has(json, '__offline_payload__')) {
121
- payload = json.__offline_payload__; // everything else is print(), logging, ...
122
- } else if (this.log) {
123
- this.log.notice(item);
124
- } else {
125
- console.log(item);
126
- }
127
- }
128
-
129
- return payload;
130
- } // invokeLocalPython, loosely based on:
131
- // https://github.com/serverless/serverless/blob/v1.50.0/lib/plugins/aws/invokeLocal/index.js#L410
132
- // invoke.py, based on:
133
- // https://github.com/serverless/serverless/blob/v1.50.0/lib/plugins/aws/invokeLocal/invoke.py
134
-
135
-
136
- async run(event, context) {
137
- return new Promise((accept, reject) => {
138
- const input = stringify({
139
- context,
140
- event,
141
- allowCache: _classPrivateFieldLooseBase(this, _allowCache)[_allowCache]
142
- });
143
-
144
- const onErr = data => {
145
- // TODO
146
- if (this.log) {
147
- this.log.notice(data.toString());
148
- } else {
149
- console.log(data.toString());
150
- }
151
- };
152
-
153
- const onLine = line => {
154
- try {
155
- const parsed = this._parsePayload(line.toString());
156
-
157
- if (parsed) {
158
- this.handlerProcess.stdout.readline.removeListener('line', onLine);
159
- this.handlerProcess.stderr.removeListener('data', onErr);
160
- return accept(parsed);
161
- }
162
-
163
- return null;
164
- } catch (err) {
165
- return reject(err);
166
- }
167
- };
168
-
169
- this.handlerProcess.stdout.readline.on('line', onLine);
170
- this.handlerProcess.stderr.on('data', onErr);
171
- process.nextTick(() => {
172
- this.handlerProcess.stdin.write(input);
173
- this.handlerProcess.stdin.write('\n');
174
- });
175
- });
176
- }
177
-
178
- }
179
-
180
- exports.default = PythonRunner;
@@ -1,15 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "default", {
7
- enumerable: true,
8
- get: function () {
9
- return _PythonRunner.default;
10
- }
11
- });
12
-
13
- var _PythonRunner = _interopRequireDefault(require("./PythonRunner.js"));
14
-
15
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -1,148 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _os = require("os");
9
-
10
- var _path = require("path");
11
-
12
- var _execa = _interopRequireDefault(require("execa"));
13
-
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
- function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; }
17
-
18
- var id = 0;
19
-
20
- function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; }
21
-
22
- const {
23
- parse,
24
- stringify
25
- } = JSON;
26
- const {
27
- cwd
28
- } = process;
29
- const {
30
- has
31
- } = Reflect;
32
-
33
- var _env = /*#__PURE__*/_classPrivateFieldLooseKey("env");
34
-
35
- var _handlerName = /*#__PURE__*/_classPrivateFieldLooseKey("handlerName");
36
-
37
- var _handlerPath = /*#__PURE__*/_classPrivateFieldLooseKey("handlerPath");
38
-
39
- var _allowCache = /*#__PURE__*/_classPrivateFieldLooseKey("allowCache");
40
-
41
- class RubyRunner {
42
- constructor(funOptions, env, allowCache, v3Utils) {
43
- Object.defineProperty(this, _env, {
44
- writable: true,
45
- value: null
46
- });
47
- Object.defineProperty(this, _handlerName, {
48
- writable: true,
49
- value: null
50
- });
51
- Object.defineProperty(this, _handlerPath, {
52
- writable: true,
53
- value: null
54
- });
55
- Object.defineProperty(this, _allowCache, {
56
- writable: true,
57
- value: false
58
- });
59
- const {
60
- handlerName,
61
- handlerPath
62
- } = funOptions;
63
- _classPrivateFieldLooseBase(this, _env)[_env] = env;
64
- _classPrivateFieldLooseBase(this, _handlerName)[_handlerName] = handlerName;
65
- _classPrivateFieldLooseBase(this, _handlerPath)[_handlerPath] = handlerPath;
66
- _classPrivateFieldLooseBase(this, _allowCache)[_allowCache] = allowCache;
67
-
68
- if (v3Utils) {
69
- this.log = v3Utils.log;
70
- this.progress = v3Utils.progress;
71
- this.writeText = v3Utils.writeText;
72
- this.v3Utils = v3Utils;
73
- }
74
- } // no-op
75
- // () => void
76
-
77
-
78
- cleanup() {}
79
-
80
- _parsePayload(value) {
81
- let payload;
82
-
83
- for (const item of value.split(_os.EOL)) {
84
- let json; // first check if it's JSON
85
-
86
- try {
87
- json = parse(item); // nope, it's not JSON
88
- } catch (err) {// no-op
89
- } // now let's see if we have a property __offline_payload__
90
-
91
-
92
- if (json && typeof json === 'object' && has(json, '__offline_payload__')) {
93
- payload = json.__offline_payload__;
94
- } else if (this.log) {
95
- this.log.notice(item);
96
- } else {
97
- console.log(item); // log non-JSON stdout to console (puts, p, logger.info, ...)
98
- }
99
- }
100
-
101
- return payload;
102
- } // invokeLocalRuby, loosely based on:
103
- // https://github.com/serverless/serverless/blob/v1.50.0/lib/plugins/aws/invokeLocal/index.js#L556
104
- // invoke.rb, copy/pasted entirely as is:
105
- // https://github.com/serverless/serverless/blob/v1.50.0/lib/plugins/aws/invokeLocal/invoke.rb
106
-
107
-
108
- async run(event, context) {
109
- const runtime = (0, _os.platform)() === 'win32' ? 'ruby.exe' : 'ruby'; // https://docs.aws.amazon.com/lambda/latest/dg/ruby-context.html
110
- // https://docs.aws.amazon.com/lambda/latest/dg/ruby-context.html
111
- // exclude callbackWaitsForEmptyEventLoop, don't mutate context
112
-
113
- const {
114
- callbackWaitsForEmptyEventLoop,
115
- ..._context
116
- } = context;
117
- const input = stringify({
118
- context: _context,
119
- event,
120
- allowCache: _classPrivateFieldLooseBase(this, _allowCache)[_allowCache]
121
- }); // console.log(input)
122
-
123
- const ruby = (0, _execa.default)(runtime, [(0, _path.resolve)(__dirname, 'invoke.rb'), (0, _path.relative)(cwd(), _classPrivateFieldLooseBase(this, _handlerPath)[_handlerPath]), _classPrivateFieldLooseBase(this, _handlerName)[_handlerName]], {
124
- env: _classPrivateFieldLooseBase(this, _env)[_env],
125
- input // shell: true,
126
-
127
- });
128
- const result = await ruby;
129
- const {
130
- stderr,
131
- stdout
132
- } = result;
133
-
134
- if (stderr) {
135
- // TODO
136
- if (this.log) {
137
- this.log.notice(stderr);
138
- } else {
139
- console.log(stderr);
140
- }
141
- }
142
-
143
- return this._parsePayload(stdout);
144
- }
145
-
146
- }
147
-
148
- exports.default = RubyRunner;
@@ -1,15 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "default", {
7
- enumerable: true,
8
- get: function () {
9
- return _RubyRunner.default;
10
- }
11
- });
12
-
13
- var _RubyRunner = _interopRequireDefault(require("./RubyRunner.js"));
14
-
15
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -1,94 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _path = require("path");
9
-
10
- var _worker_threads = require("worker_threads");
11
-
12
- function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; }
13
-
14
- var id = 0;
15
-
16
- function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; }
17
-
18
- // eslint-disable-line import/no-unresolved
19
- const workerThreadHelperPath = (0, _path.resolve)(__dirname, './workerThreadHelper.js');
20
-
21
- var _workerThread = /*#__PURE__*/_classPrivateFieldLooseKey("workerThread");
22
-
23
- var _allowCache = /*#__PURE__*/_classPrivateFieldLooseKey("allowCache");
24
-
25
- class WorkerThreadRunner {
26
- constructor(funOptions
27
- /* options */
28
- , env, allowCache) {
29
- Object.defineProperty(this, _workerThread, {
30
- writable: true,
31
- value: null
32
- });
33
- Object.defineProperty(this, _allowCache, {
34
- writable: true,
35
- value: false
36
- });
37
- // this._options = options
38
- const {
39
- functionKey,
40
- handlerName,
41
- handlerPath,
42
- handlerModuleNesting,
43
- timeout
44
- } = funOptions;
45
- _classPrivateFieldLooseBase(this, _allowCache)[_allowCache] = allowCache;
46
- _classPrivateFieldLooseBase(this, _workerThread)[_workerThread] = new _worker_threads.Worker(workerThreadHelperPath, {
47
- // don't pass process.env from the main process!
48
- env,
49
- workerData: {
50
- functionKey,
51
- handlerName,
52
- handlerPath,
53
- handlerModuleNesting,
54
- timeout
55
- }
56
- });
57
- } // () => Promise<number>
58
-
59
-
60
- cleanup() {
61
- // TODO console.log('worker thread cleanup')
62
- // NOTE: terminate returns a Promise with exit code in node.js v12.5+
63
- return _classPrivateFieldLooseBase(this, _workerThread)[_workerThread].terminate();
64
- }
65
-
66
- run(event, context) {
67
- return new Promise((_resolve, reject) => {
68
- const {
69
- port1,
70
- port2
71
- } = new _worker_threads.MessageChannel();
72
- port1.on('message', _resolve) // emitted if the worker thread throws an uncaught exception.
73
- // In that case, the worker will be terminated.
74
- .on('error', reject) // TODO
75
- .on('exit', code => {
76
- if (code !== 0) {
77
- reject(new Error(`Worker stopped with exit code ${code}`));
78
- }
79
- });
80
-
81
- _classPrivateFieldLooseBase(this, _workerThread)[_workerThread].postMessage({
82
- context,
83
- event,
84
- allowCache: _classPrivateFieldLooseBase(this, _allowCache)[_allowCache],
85
- // port2 is part of the payload, for the other side to answer messages
86
- port: port2
87
- }, // port2 is also required to be part of the transfer list
88
- [port2]);
89
- });
90
- }
91
-
92
- }
93
-
94
- exports.default = WorkerThreadRunner;
@@ -1,15 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "default", {
7
- enumerable: true,
8
- get: function () {
9
- return _WorkerThreadRunner.default;
10
- }
11
- });
12
-
13
- var _WorkerThreadRunner = _interopRequireDefault(require("./WorkerThreadRunner.js"));
14
-
15
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -1,30 +0,0 @@
1
- "use strict";
2
-
3
- var _worker_threads = require("worker_threads");
4
-
5
- var _index = _interopRequireDefault(require("../in-process-runner/index.js"));
6
-
7
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
-
9
- // eslint-disable-line import/no-unresolved
10
- const {
11
- functionKey,
12
- handlerName,
13
- handlerPath,
14
- handlerModuleNesting
15
- } = _worker_threads.workerData;
16
-
17
- _worker_threads.parentPort.on('message', async messageData => {
18
- const {
19
- context,
20
- event,
21
- port,
22
- timeout,
23
- allowCache
24
- } = messageData; // TODO we could probably cache this in the module scope?
25
-
26
- const inProcessRunner = new _index.default(functionKey, handlerPath, handlerName, handlerModuleNesting, process.env, timeout, allowCache);
27
- const result = await inProcessRunner.run(event, context); // TODO check serializeability (contains function, symbol etc)
28
-
29
- port.postMessage(result);
30
- });
@@ -1,15 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "default", {
7
- enumerable: true,
8
- get: function () {
9
- return _Lambda.default;
10
- }
11
- });
12
-
13
- var _Lambda = _interopRequireDefault(require("./Lambda.js"));
14
-
15
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -1,23 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "invocationsRoute", {
7
- enumerable: true,
8
- get: function () {
9
- return _index.default;
10
- }
11
- });
12
- Object.defineProperty(exports, "invokeAsyncRoute", {
13
- enumerable: true,
14
- get: function () {
15
- return _index2.default;
16
- }
17
- });
18
-
19
- var _index = _interopRequireDefault(require("./invocations/index.js"));
20
-
21
- var _index2 = _interopRequireDefault(require("./invoke-async/index.js"));
22
-
23
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -1,142 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _serverlessLog = _interopRequireDefault(require("../../../serverlessLog.js"));
9
-
10
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
-
12
- function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; }
13
-
14
- var id = 0;
15
-
16
- function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; }
17
-
18
- var _lambda = /*#__PURE__*/_classPrivateFieldLooseKey("lambda");
19
-
20
- class InvocationsController {
21
- constructor(lambda, v3Utils) {
22
- Object.defineProperty(this, _lambda, {
23
- writable: true,
24
- value: null
25
- });
26
- _classPrivateFieldLooseBase(this, _lambda)[_lambda] = lambda;
27
-
28
- if (v3Utils) {
29
- this.log = v3Utils.log;
30
- this.progress = v3Utils.progress;
31
- this.writeText = v3Utils.writeText;
32
- this.v3Utils = v3Utils;
33
- }
34
- }
35
-
36
- async invoke(functionName, invocationType, event, clientContext) {
37
- // Reject gracefully if functionName does not exist
38
- const functionNames = _classPrivateFieldLooseBase(this, _lambda)[_lambda].listFunctionNames();
39
-
40
- if (functionNames.length === 0 || !functionNames.includes(functionName)) {
41
- if (this.log) {
42
- this.log.error(`Attempt to invoke function '${functionName}' failed. Function does not exists.`);
43
- } else {
44
- (0, _serverlessLog.default)(`Attempt to invoke function '${functionName}' failed. Function does not exists.`);
45
- } // Conforms to the actual response from AWS Lambda when invoking a non-existent
46
- // function. Details on the error are provided in the Payload.Message key
47
-
48
-
49
- return {
50
- FunctionError: 'ResourceNotFoundException',
51
- Payload: {
52
- Message: `Function not found: ${functionName}`,
53
- Type: 'User'
54
- },
55
- StatusCode: 404
56
- };
57
- }
58
-
59
- const lambdaFunction = _classPrivateFieldLooseBase(this, _lambda)[_lambda].getByFunctionName(functionName);
60
-
61
- lambdaFunction.setClientContext(clientContext);
62
- lambdaFunction.setEvent(event);
63
-
64
- if (invocationType === 'Event') {
65
- // don't await result!
66
- lambdaFunction.runHandler();
67
- return {
68
- Payload: '',
69
- StatusCode: 202
70
- };
71
- }
72
-
73
- if (!invocationType || invocationType === 'RequestResponse') {
74
- let result;
75
-
76
- try {
77
- result = await lambdaFunction.runHandler();
78
- } catch (err) {
79
- if (this.log) {
80
- this.log.error(`Unhandled Lambda Error during invoke of '${functionName}': ${err}`);
81
- } else {
82
- (0, _serverlessLog.default)(`Unhandled Lambda Error during invoke of '${functionName}'`);
83
- console.log(err);
84
- } // In most circumstances this is the correct error type/structure.
85
- // The API returns a StreamingBody with status code of 200
86
- // that eventually spits out the error and stack trace.
87
- // When the request is synchronous, aws-sdk should buffer
88
- // the whole error stream, however this has not been validated.
89
-
90
-
91
- return {
92
- Payload: {
93
- errorType: 'Error',
94
- errorMessage: err.message,
95
- trace: err.stack.split('\n')
96
- },
97
- UnhandledError: true,
98
- StatusCode: 200
99
- }; // TODO: Additional pre and post-handler validation can expose
100
- // the following error types:
101
- // RequestTooLargeException, InvalidParameterValueException,
102
- // and whatever response is thrown when the response is too large.
103
- } // Checking if the result of the Lambda Invoke is a primitive string to wrap it. this is for future post-processing such as Step Functions Tasks
104
-
105
-
106
- if (result) {
107
- if (typeof result === 'string') {
108
- result = `"${result}"`;
109
- }
110
- } // result is actually the Payload.
111
- // So return in a standard structure so Hapi can
112
- // respond with the correct status codes
113
-
114
-
115
- return {
116
- Payload: result,
117
- StatusCode: 200
118
- };
119
- } // TODO FIXME
120
-
121
-
122
- const errMsg = `invocationType: '${invocationType}' not supported by serverless-offline`;
123
-
124
- if (this.log) {
125
- this.log.error(errMsg);
126
- } else {
127
- console.log(errMsg);
128
- }
129
-
130
- return {
131
- FunctionError: 'InvalidParameterValueException',
132
- Payload: {
133
- Message: errMsg,
134
- Type: 'User'
135
- },
136
- StatusCode: 400
137
- };
138
- }
139
-
140
- }
141
-
142
- exports.default = InvocationsController;
@@ -1,15 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "default", {
7
- enumerable: true,
8
- get: function () {
9
- return _invocationsRoute.default;
10
- }
11
- });
12
-
13
- var _invocationsRoute = _interopRequireDefault(require("./invocationsRoute.js"));
14
-
15
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }