serverless-offline 8.8.0 → 9.1.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 (233) hide show
  1. package/README.md +12 -11
  2. package/package.json +33 -58
  3. package/src/ServerlessOffline.js +409 -0
  4. package/src/config/commandOptions.js +159 -0
  5. package/src/config/constants.js +22 -0
  6. package/{dist → src}/config/defaultOptions.js +9 -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 +1242 -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 +309 -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 +167 -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/splitHandlerPathAndName.js +31 -0
  128. package/src/utils/unflatten.js +11 -0
  129. package/dist/ServerlessOffline.js +0 -514
  130. package/dist/config/commandOptions.js +0 -149
  131. package/dist/config/constants.js +0 -30
  132. package/dist/config/index.js +0 -55
  133. package/dist/config/supportedRuntimes.js +0 -40
  134. package/dist/debugLog.js +0 -12
  135. package/dist/events/authCanExecuteResource.js +0 -35
  136. package/dist/events/authFunctionNameExtractor.js +0 -87
  137. package/dist/events/authMatchPolicyResource.js +0 -62
  138. package/dist/events/authValidateContext.js +0 -53
  139. package/dist/events/http/Endpoint.js +0 -173
  140. package/dist/events/http/Http.js +0 -77
  141. package/dist/events/http/HttpEventDefinition.js +0 -36
  142. package/dist/events/http/HttpServer.js +0 -1370
  143. package/dist/events/http/OfflineEndpoint.js +0 -38
  144. package/dist/events/http/authJWTSettingsExtractor.js +0 -76
  145. package/dist/events/http/createAuthScheme.js +0 -184
  146. package/dist/events/http/createJWTAuthScheme.js +0 -159
  147. package/dist/events/http/index.js +0 -15
  148. package/dist/events/http/javaHelpers.js +0 -99
  149. package/dist/events/http/lambda-events/LambdaIntegrationEvent.js +0 -87
  150. package/dist/events/http/lambda-events/LambdaProxyIntegrationEvent.js +0 -246
  151. package/dist/events/http/lambda-events/LambdaProxyIntegrationEventV2.js +0 -225
  152. package/dist/events/http/lambda-events/VelocityContext.js +0 -170
  153. package/dist/events/http/lambda-events/index.js +0 -39
  154. package/dist/events/http/lambda-events/renderVelocityTemplateObject.js +0 -111
  155. package/dist/events/http/payloadSchemaValidator.js +0 -13
  156. package/dist/events/schedule/Schedule.js +0 -183
  157. package/dist/events/schedule/ScheduleEvent.js +0 -27
  158. package/dist/events/schedule/ScheduleEventDefinition.js +0 -36
  159. package/dist/events/schedule/index.js +0 -15
  160. package/dist/events/websocket/HttpServer.js +0 -114
  161. package/dist/events/websocket/WebSocket.js +0 -78
  162. package/dist/events/websocket/WebSocketClients.js +0 -577
  163. package/dist/events/websocket/WebSocketEventDefinition.js +0 -32
  164. package/dist/events/websocket/WebSocketServer.js +0 -139
  165. package/dist/events/websocket/http-routes/_catchAll/catchAllRoute.js +0 -33
  166. package/dist/events/websocket/http-routes/_catchAll/index.js +0 -15
  167. package/dist/events/websocket/http-routes/connections/ConnectionsController.js +0 -45
  168. package/dist/events/websocket/http-routes/connections/connectionsRoutes.js +0 -95
  169. package/dist/events/websocket/http-routes/connections/index.js +0 -15
  170. package/dist/events/websocket/http-routes/index.js +0 -23
  171. package/dist/events/websocket/index.js +0 -15
  172. package/dist/events/websocket/lambda-events/WebSocketAuthorizerEvent.js +0 -99
  173. package/dist/events/websocket/lambda-events/WebSocketConnectEvent.js +0 -101
  174. package/dist/events/websocket/lambda-events/WebSocketDisconnectEvent.js +0 -47
  175. package/dist/events/websocket/lambda-events/WebSocketEvent.js +0 -54
  176. package/dist/events/websocket/lambda-events/WebSocketRequestContext.js +0 -98
  177. package/dist/events/websocket/lambda-events/index.js +0 -39
  178. package/dist/index.js +0 -15
  179. package/dist/lambda/HttpServer.js +0 -124
  180. package/dist/lambda/Lambda.js +0 -117
  181. package/dist/lambda/LambdaContext.js +0 -53
  182. package/dist/lambda/LambdaFunction.js +0 -390
  183. package/dist/lambda/LambdaFunctionPool.js +0 -127
  184. package/dist/lambda/handler-runner/HandlerRunner.js +0 -195
  185. package/dist/lambda/handler-runner/child-process-runner/ChildProcessRunner.js +0 -124
  186. package/dist/lambda/handler-runner/child-process-runner/childProcessHelper.js +0 -49
  187. package/dist/lambda/handler-runner/child-process-runner/index.js +0 -15
  188. package/dist/lambda/handler-runner/docker-runner/DockerContainer.js +0 -515
  189. package/dist/lambda/handler-runner/docker-runner/DockerImage.js +0 -67
  190. package/dist/lambda/handler-runner/docker-runner/DockerRunner.js +0 -74
  191. package/dist/lambda/handler-runner/docker-runner/index.js +0 -15
  192. package/dist/lambda/handler-runner/go-runner/GoRunner.js +0 -230
  193. package/dist/lambda/handler-runner/go-runner/index.js +0 -15
  194. package/dist/lambda/handler-runner/in-process-runner/InProcessRunner.js +0 -228
  195. package/dist/lambda/handler-runner/in-process-runner/index.js +0 -15
  196. package/dist/lambda/handler-runner/index.js +0 -15
  197. package/dist/lambda/handler-runner/java-runner/JavaRunner.js +0 -153
  198. package/dist/lambda/handler-runner/java-runner/index.js +0 -15
  199. package/dist/lambda/handler-runner/python-runner/PythonRunner.js +0 -185
  200. package/dist/lambda/handler-runner/python-runner/index.js +0 -15
  201. package/dist/lambda/handler-runner/ruby-runner/RubyRunner.js +0 -147
  202. package/dist/lambda/handler-runner/ruby-runner/index.js +0 -15
  203. package/dist/lambda/handler-runner/worker-thread-runner/WorkerThreadRunner.js +0 -92
  204. package/dist/lambda/handler-runner/worker-thread-runner/index.js +0 -15
  205. package/dist/lambda/handler-runner/worker-thread-runner/workerThreadHelper.js +0 -31
  206. package/dist/lambda/index.js +0 -15
  207. package/dist/lambda/routes/index.js +0 -23
  208. package/dist/lambda/routes/invocations/InvocationsController.js +0 -142
  209. package/dist/lambda/routes/invocations/index.js +0 -15
  210. package/dist/lambda/routes/invocations/invocationsRoute.js +0 -90
  211. package/dist/lambda/routes/invoke-async/InvokeAsyncController.js +0 -38
  212. package/dist/lambda/routes/invoke-async/index.js +0 -15
  213. package/dist/lambda/routes/invoke-async/invokeAsyncRoute.js +0 -43
  214. package/dist/main.js +0 -11
  215. package/dist/serverlessLog.js +0 -91
  216. package/dist/utils/checkDockerDaemon.js +0 -27
  217. package/dist/utils/checkGoVersion.js +0 -27
  218. package/dist/utils/createApiKey.js +0 -12
  219. package/dist/utils/createUniqueId.js +0 -14
  220. package/dist/utils/detectExecutable.js +0 -21
  221. package/dist/utils/generateHapiPath.js +0 -28
  222. package/dist/utils/getHttpApiCorsConfig.js +0 -40
  223. package/dist/utils/index.js +0 -165
  224. package/dist/utils/jsonPath.js +0 -21
  225. package/dist/utils/lowerCaseKeys.js +0 -14
  226. package/dist/utils/parseHeaders.js +0 -23
  227. package/dist/utils/parseMultiValueHeaders.js +0 -36
  228. package/dist/utils/parseMultiValueQueryStringParameters.js +0 -40
  229. package/dist/utils/parseQueryStringParameters.js +0 -26
  230. package/dist/utils/resolveJoins.js +0 -36
  231. package/dist/utils/satisfiesVersionRange.js +0 -20
  232. package/dist/utils/splitHandlerPathAndName.js +0 -37
  233. package/dist/utils/unflatten.js +0 -18
@@ -1,185 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _child_process = require("child_process");
9
-
10
- var _os = require("os");
11
-
12
- var _path = require("path");
13
-
14
- var _process = _interopRequireWildcard(require("process"));
15
-
16
- var _readline = _interopRequireDefault(require("readline"));
17
-
18
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
-
20
- 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); }
21
-
22
- 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; }
23
-
24
- function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; }
25
-
26
- var id = 0;
27
-
28
- function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; }
29
-
30
- const {
31
- parse,
32
- stringify
33
- } = JSON;
34
- const {
35
- assign
36
- } = Object;
37
- const {
38
- has
39
- } = Reflect;
40
-
41
- var _env = /*#__PURE__*/_classPrivateFieldLooseKey("env");
42
-
43
- var _handlerName = /*#__PURE__*/_classPrivateFieldLooseKey("handlerName");
44
-
45
- var _handlerPath = /*#__PURE__*/_classPrivateFieldLooseKey("handlerPath");
46
-
47
- var _runtime = /*#__PURE__*/_classPrivateFieldLooseKey("runtime");
48
-
49
- var _allowCache = /*#__PURE__*/_classPrivateFieldLooseKey("allowCache");
50
-
51
- class PythonRunner {
52
- constructor(funOptions, env, allowCache, v3Utils) {
53
- Object.defineProperty(this, _env, {
54
- writable: true,
55
- value: null
56
- });
57
- Object.defineProperty(this, _handlerName, {
58
- writable: true,
59
- value: null
60
- });
61
- Object.defineProperty(this, _handlerPath, {
62
- writable: true,
63
- value: null
64
- });
65
- Object.defineProperty(this, _runtime, {
66
- writable: true,
67
- value: null
68
- });
69
- Object.defineProperty(this, _allowCache, {
70
- writable: true,
71
- value: false
72
- });
73
- const {
74
- handlerName,
75
- handlerPath,
76
- runtime
77
- } = funOptions;
78
- _classPrivateFieldLooseBase(this, _env)[_env] = env;
79
- _classPrivateFieldLooseBase(this, _handlerName)[_handlerName] = handlerName;
80
- _classPrivateFieldLooseBase(this, _handlerPath)[_handlerPath] = handlerPath;
81
- _classPrivateFieldLooseBase(this, _runtime)[_runtime] = (0, _os.platform)() === 'win32' ? 'python.exe' : runtime;
82
- _classPrivateFieldLooseBase(this, _allowCache)[_allowCache] = allowCache;
83
-
84
- if (v3Utils) {
85
- this.log = v3Utils.log;
86
- this.progress = v3Utils.progress;
87
- this.writeText = v3Utils.writeText;
88
- this.v3Utils = v3Utils;
89
- }
90
-
91
- if (_process.default.env.VIRTUAL_ENV) {
92
- const runtimeDir = (0, _os.platform)() === 'win32' ? 'Scripts' : 'bin';
93
- _process.default.env.PATH = [(0, _path.join)(_process.default.env.VIRTUAL_ENV, runtimeDir), _path.delimiter, _process.default.env.PATH].join('');
94
- }
95
-
96
- const [pythonExecutable] = _classPrivateFieldLooseBase(this, _runtime)[_runtime].split('.');
97
-
98
- this.handlerProcess = (0, _child_process.spawn)(pythonExecutable, ['-u', (0, _path.resolve)(__dirname, 'invoke.py'), (0, _path.relative)((0, _process.cwd)(), _classPrivateFieldLooseBase(this, _handlerPath)[_handlerPath]), _classPrivateFieldLooseBase(this, _handlerName)[_handlerName]], {
99
- env: assign(_process.default.env, _classPrivateFieldLooseBase(this, _env)[_env]),
100
- shell: true
101
- });
102
- this.handlerProcess.stdout.readline = _readline.default.createInterface({
103
- input: this.handlerProcess.stdout
104
- });
105
- } // () => void
106
-
107
-
108
- cleanup() {
109
- this.handlerProcess.kill();
110
- }
111
-
112
- _parsePayload(value) {
113
- let payload;
114
-
115
- for (const item of value.split(_os.EOL)) {
116
- let json; // first check if it's JSON
117
-
118
- try {
119
- json = parse(item); // nope, it's not JSON
120
- } catch (err) {// no-op
121
- } // now let's see if we have a property __offline_payload__
122
-
123
-
124
- if (json && typeof json === 'object' && has(json, '__offline_payload__')) {
125
- payload = json.__offline_payload__; // everything else is print(), logging, ...
126
- } else if (this.log) {
127
- this.log.notice(item);
128
- } else {
129
- console.log(item);
130
- }
131
- }
132
-
133
- return payload;
134
- } // invokeLocalPython, loosely based on:
135
- // https://github.com/serverless/serverless/blob/v1.50.0/lib/plugins/aws/invokeLocal/index.js#L410
136
- // invoke.py, based on:
137
- // https://github.com/serverless/serverless/blob/v1.50.0/lib/plugins/aws/invokeLocal/invoke.py
138
-
139
-
140
- async run(event, context) {
141
- return new Promise((accept, reject) => {
142
- const input = stringify({
143
- context,
144
- event,
145
- allowCache: _classPrivateFieldLooseBase(this, _allowCache)[_allowCache]
146
- });
147
-
148
- const onErr = data => {
149
- // TODO
150
- if (this.log) {
151
- this.log.notice(data.toString());
152
- } else {
153
- console.log(data.toString());
154
- }
155
- };
156
-
157
- const onLine = line => {
158
- try {
159
- const parsed = this._parsePayload(line.toString());
160
-
161
- if (parsed) {
162
- this.handlerProcess.stdout.readline.removeListener('line', onLine);
163
- this.handlerProcess.stderr.removeListener('data', onErr);
164
- return accept(parsed);
165
- }
166
-
167
- return null;
168
- } catch (err) {
169
- return reject(err);
170
- }
171
- };
172
-
173
- this.handlerProcess.stdout.readline.on('line', onLine);
174
- this.handlerProcess.stderr.on('data', onErr);
175
-
176
- _process.default.nextTick(() => {
177
- this.handlerProcess.stdin.write(input);
178
- this.handlerProcess.stdin.write('\n');
179
- });
180
- });
181
- }
182
-
183
- }
184
-
185
- 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,147 +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 _process = require("process");
13
-
14
- var _execa = _interopRequireDefault(require("execa"));
15
-
16
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
-
18
- function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; }
19
-
20
- var id = 0;
21
-
22
- function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; }
23
-
24
- const {
25
- parse,
26
- stringify
27
- } = JSON;
28
- const {
29
- has
30
- } = Reflect;
31
-
32
- var _env = /*#__PURE__*/_classPrivateFieldLooseKey("env");
33
-
34
- var _handlerName = /*#__PURE__*/_classPrivateFieldLooseKey("handlerName");
35
-
36
- var _handlerPath = /*#__PURE__*/_classPrivateFieldLooseKey("handlerPath");
37
-
38
- var _allowCache = /*#__PURE__*/_classPrivateFieldLooseKey("allowCache");
39
-
40
- class RubyRunner {
41
- constructor(funOptions, env, allowCache, v3Utils) {
42
- Object.defineProperty(this, _env, {
43
- writable: true,
44
- value: null
45
- });
46
- Object.defineProperty(this, _handlerName, {
47
- writable: true,
48
- value: null
49
- });
50
- Object.defineProperty(this, _handlerPath, {
51
- writable: true,
52
- value: null
53
- });
54
- Object.defineProperty(this, _allowCache, {
55
- writable: true,
56
- value: false
57
- });
58
- const {
59
- handlerName,
60
- handlerPath
61
- } = funOptions;
62
- _classPrivateFieldLooseBase(this, _env)[_env] = env;
63
- _classPrivateFieldLooseBase(this, _handlerName)[_handlerName] = handlerName;
64
- _classPrivateFieldLooseBase(this, _handlerPath)[_handlerPath] = handlerPath;
65
- _classPrivateFieldLooseBase(this, _allowCache)[_allowCache] = allowCache;
66
-
67
- if (v3Utils) {
68
- this.log = v3Utils.log;
69
- this.progress = v3Utils.progress;
70
- this.writeText = v3Utils.writeText;
71
- this.v3Utils = v3Utils;
72
- }
73
- } // no-op
74
- // () => void
75
-
76
-
77
- cleanup() {}
78
-
79
- _parsePayload(value) {
80
- let payload;
81
-
82
- for (const item of value.split(_os.EOL)) {
83
- let json; // first check if it's JSON
84
-
85
- try {
86
- json = parse(item); // nope, it's not JSON
87
- } catch (err) {// no-op
88
- } // now let's see if we have a property __offline_payload__
89
-
90
-
91
- if (json && typeof json === 'object' && has(json, '__offline_payload__')) {
92
- payload = json.__offline_payload__;
93
- } else if (this.log) {
94
- this.log.notice(item);
95
- } else {
96
- console.log(item); // log non-JSON stdout to console (puts, p, logger.info, ...)
97
- }
98
- }
99
-
100
- return payload;
101
- } // invokeLocalRuby, loosely based on:
102
- // https://github.com/serverless/serverless/blob/v1.50.0/lib/plugins/aws/invokeLocal/index.js#L556
103
- // invoke.rb, copy/pasted entirely as is:
104
- // https://github.com/serverless/serverless/blob/v1.50.0/lib/plugins/aws/invokeLocal/invoke.rb
105
-
106
-
107
- async run(event, context) {
108
- const runtime = (0, _os.platform)() === 'win32' ? 'ruby.exe' : 'ruby'; // https://docs.aws.amazon.com/lambda/latest/dg/ruby-context.html
109
- // https://docs.aws.amazon.com/lambda/latest/dg/ruby-context.html
110
- // exclude callbackWaitsForEmptyEventLoop, don't mutate context
111
-
112
- const {
113
- callbackWaitsForEmptyEventLoop,
114
- ..._context
115
- } = context;
116
- const input = stringify({
117
- context: _context,
118
- event,
119
- allowCache: _classPrivateFieldLooseBase(this, _allowCache)[_allowCache]
120
- }); // console.log(input)
121
-
122
- const ruby = (0, _execa.default)(runtime, [(0, _path.resolve)(__dirname, 'invoke.rb'), (0, _path.relative)((0, _process.cwd)(), _classPrivateFieldLooseBase(this, _handlerPath)[_handlerPath]), _classPrivateFieldLooseBase(this, _handlerName)[_handlerName]], {
123
- env: _classPrivateFieldLooseBase(this, _env)[_env],
124
- input // shell: true,
125
-
126
- });
127
- const result = await ruby;
128
- const {
129
- stderr,
130
- stdout
131
- } = result;
132
-
133
- if (stderr) {
134
- // TODO
135
- if (this.log) {
136
- this.log.notice(stderr);
137
- } else {
138
- console.log(stderr);
139
- }
140
- }
141
-
142
- return this._parsePayload(stdout);
143
- }
144
-
145
- }
146
-
147
- 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,92 +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
- timeout
43
- } = funOptions;
44
- _classPrivateFieldLooseBase(this, _allowCache)[_allowCache] = allowCache;
45
- _classPrivateFieldLooseBase(this, _workerThread)[_workerThread] = new _worker_threads.Worker(workerThreadHelperPath, {
46
- // don't pass process.env from the main process!
47
- env,
48
- workerData: {
49
- functionKey,
50
- handlerName,
51
- handlerPath,
52
- timeout
53
- }
54
- });
55
- } // () => Promise<number>
56
-
57
-
58
- cleanup() {
59
- // TODO console.log('worker thread cleanup')
60
- // NOTE: terminate returns a Promise with exit code in node.js v12.5+
61
- return _classPrivateFieldLooseBase(this, _workerThread)[_workerThread].terminate();
62
- }
63
-
64
- run(event, context) {
65
- return new Promise((_resolve, reject) => {
66
- const {
67
- port1,
68
- port2
69
- } = new _worker_threads.MessageChannel();
70
- port1.on('message', _resolve) // emitted if the worker thread throws an uncaught exception.
71
- // In that case, the worker will be terminated.
72
- .on('error', reject) // TODO
73
- .on('exit', code => {
74
- if (code !== 0) {
75
- reject(new Error(`Worker stopped with exit code ${code}`));
76
- }
77
- });
78
-
79
- _classPrivateFieldLooseBase(this, _workerThread)[_workerThread].postMessage({
80
- context,
81
- event,
82
- allowCache: _classPrivateFieldLooseBase(this, _allowCache)[_allowCache],
83
- // port2 is part of the payload, for the other side to answer messages
84
- port: port2
85
- }, // port2 is also required to be part of the transfer list
86
- [port2]);
87
- });
88
- }
89
-
90
- }
91
-
92
- 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,31 +0,0 @@
1
- "use strict";
2
-
3
- var _process = require("process");
4
-
5
- var _worker_threads = require("worker_threads");
6
-
7
- var _index = _interopRequireDefault(require("../in-process-runner/index.js"));
8
-
9
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
-
11
- // eslint-disable-line import/no-unresolved
12
- const {
13
- functionKey,
14
- handlerName,
15
- handlerPath
16
- } = _worker_threads.workerData;
17
-
18
- _worker_threads.parentPort.on('message', async messageData => {
19
- const {
20
- context,
21
- event,
22
- port,
23
- timeout,
24
- allowCache
25
- } = messageData; // TODO we could probably cache this in the module scope?
26
-
27
- const inProcessRunner = new _index.default(functionKey, handlerPath, handlerName, _process.env, timeout, allowCache);
28
- const result = await inProcessRunner.run(event, context); // TODO check serializeability (contains function, symbol etc)
29
-
30
- port.postMessage(result);
31
- });
@@ -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;