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,517 +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 _execa = _interopRequireDefault(require("execa"));
11
-
12
- var _nodeFetch = _interopRequireDefault(require("node-fetch"));
13
-
14
- var _pRetry = _interopRequireDefault(require("p-retry"));
15
-
16
- var _awsSdk = require("aws-sdk");
17
-
18
- var _jszip = _interopRequireDefault(require("jszip"));
19
-
20
- var _fs = require("fs");
21
-
22
- var _fsExtra = require("fs-extra");
23
-
24
- var _path = require("path");
25
-
26
- var _crypto = _interopRequireDefault(require("crypto"));
27
-
28
- var _DockerImage = _interopRequireDefault(require("./DockerImage.js"));
29
-
30
- var _debugLog = _interopRequireDefault(require("../../../debugLog.js"));
31
-
32
- var _serverlessLog = require("../../../serverlessLog.js");
33
-
34
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
35
-
36
- function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; }
37
-
38
- var id = 0;
39
-
40
- function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; }
41
-
42
- const {
43
- stringify
44
- } = JSON;
45
- const {
46
- entries
47
- } = Object;
48
- const {
49
- keys
50
- } = Object;
51
-
52
- var _containerId = /*#__PURE__*/_classPrivateFieldLooseKey("containerId");
53
-
54
- var _dockerOptions = /*#__PURE__*/_classPrivateFieldLooseKey("dockerOptions");
55
-
56
- var _env = /*#__PURE__*/_classPrivateFieldLooseKey("env");
57
-
58
- var _functionKey = /*#__PURE__*/_classPrivateFieldLooseKey("functionKey");
59
-
60
- var _handler = /*#__PURE__*/_classPrivateFieldLooseKey("handler");
61
-
62
- var _image = /*#__PURE__*/_classPrivateFieldLooseKey("image");
63
-
64
- var _imageNameTag = /*#__PURE__*/_classPrivateFieldLooseKey("imageNameTag");
65
-
66
- var _lambda = /*#__PURE__*/_classPrivateFieldLooseKey("lambda");
67
-
68
- var _layers = /*#__PURE__*/_classPrivateFieldLooseKey("layers");
69
-
70
- var _port = /*#__PURE__*/_classPrivateFieldLooseKey("port");
71
-
72
- var _provider = /*#__PURE__*/_classPrivateFieldLooseKey("provider");
73
-
74
- var _runtime = /*#__PURE__*/_classPrivateFieldLooseKey("runtime");
75
-
76
- var _servicePath = /*#__PURE__*/_classPrivateFieldLooseKey("servicePath");
77
-
78
- class DockerContainer {
79
- constructor(env, functionKey, handler, runtime, layers, provider, servicePath, dockerOptions, v3Utils) {
80
- Object.defineProperty(this, _containerId, {
81
- writable: true,
82
- value: null
83
- });
84
- Object.defineProperty(this, _dockerOptions, {
85
- writable: true,
86
- value: null
87
- });
88
- Object.defineProperty(this, _env, {
89
- writable: true,
90
- value: null
91
- });
92
- Object.defineProperty(this, _functionKey, {
93
- writable: true,
94
- value: null
95
- });
96
- Object.defineProperty(this, _handler, {
97
- writable: true,
98
- value: null
99
- });
100
- Object.defineProperty(this, _image, {
101
- writable: true,
102
- value: null
103
- });
104
- Object.defineProperty(this, _imageNameTag, {
105
- writable: true,
106
- value: null
107
- });
108
- Object.defineProperty(this, _lambda, {
109
- writable: true,
110
- value: null
111
- });
112
- Object.defineProperty(this, _layers, {
113
- writable: true,
114
- value: null
115
- });
116
- Object.defineProperty(this, _port, {
117
- writable: true,
118
- value: null
119
- });
120
- Object.defineProperty(this, _provider, {
121
- writable: true,
122
- value: null
123
- });
124
- Object.defineProperty(this, _runtime, {
125
- writable: true,
126
- value: null
127
- });
128
- Object.defineProperty(this, _servicePath, {
129
- writable: true,
130
- value: null
131
- });
132
- _classPrivateFieldLooseBase(this, _env)[_env] = env;
133
- _classPrivateFieldLooseBase(this, _functionKey)[_functionKey] = functionKey;
134
- _classPrivateFieldLooseBase(this, _handler)[_handler] = handler;
135
- _classPrivateFieldLooseBase(this, _imageNameTag)[_imageNameTag] = this._baseImage(runtime);
136
- _classPrivateFieldLooseBase(this, _image)[_image] = new _DockerImage.default(_classPrivateFieldLooseBase(this, _imageNameTag)[_imageNameTag], v3Utils);
137
- _classPrivateFieldLooseBase(this, _runtime)[_runtime] = runtime;
138
- _classPrivateFieldLooseBase(this, _layers)[_layers] = layers;
139
- _classPrivateFieldLooseBase(this, _provider)[_provider] = provider;
140
- _classPrivateFieldLooseBase(this, _servicePath)[_servicePath] = servicePath;
141
- _classPrivateFieldLooseBase(this, _dockerOptions)[_dockerOptions] = dockerOptions;
142
-
143
- if (v3Utils) {
144
- this.log = v3Utils.log;
145
- this.progress = v3Utils.progress;
146
- this.writeText = v3Utils.writeText;
147
- this.v3Utils = v3Utils;
148
- }
149
- }
150
-
151
- _baseImage(runtime) {
152
- return `lambci/lambda:${runtime}`;
153
- }
154
-
155
- async start(codeDir) {
156
- await _classPrivateFieldLooseBase(this, _image)[_image].pull();
157
-
158
- if (this.log) {
159
- this.log.debug('Run Docker container...');
160
- } else {
161
- (0, _debugLog.default)('Run Docker container...');
162
- }
163
-
164
- let permissions = 'ro';
165
-
166
- if (!_classPrivateFieldLooseBase(this, _dockerOptions)[_dockerOptions].readOnly) {
167
- permissions = 'rw';
168
- } // https://github.com/serverless/serverless/blob/v1.57.0/lib/plugins/aws/invokeLocal/index.js#L291-L293
169
-
170
-
171
- const dockerArgs = ['-v', `${codeDir}:/var/task:${permissions},delegated`, '-p', 9001, '-e', 'DOCKER_LAMBDA_STAY_OPEN=1', // API mode
172
- '-e', 'DOCKER_LAMBDA_WATCH=1' // Watch mode
173
- ];
174
-
175
- if (_classPrivateFieldLooseBase(this, _layers)[_layers].length > 0) {
176
- if (this.log) {
177
- this.log.verbose(`Found layers, checking provider type`);
178
- } else {
179
- (0, _serverlessLog.logLayers)(`Found layers, checking provider type`);
180
- }
181
-
182
- if (_classPrivateFieldLooseBase(this, _provider)[_provider].name.toLowerCase() !== 'aws') {
183
- if (this.log) {
184
- this.log.warning(`Provider ${_classPrivateFieldLooseBase(this, _provider)[_provider].name} is Unsupported. Layers are only supported on aws.`);
185
- } else {
186
- (0, _serverlessLog.logLayers)(`Provider ${_classPrivateFieldLooseBase(this, _provider)[_provider].name} is Unsupported. Layers are only supported on aws.`);
187
- }
188
- } else {
189
- let layerDir = _classPrivateFieldLooseBase(this, _dockerOptions)[_dockerOptions].layersDir;
190
-
191
- if (!layerDir) {
192
- layerDir = (0, _path.join)(_classPrivateFieldLooseBase(this, _servicePath)[_servicePath], '.serverless-offline', 'layers');
193
- }
194
-
195
- layerDir = (0, _path.join)(layerDir, this._getLayersSha256());
196
-
197
- if (await (0, _fsExtra.pathExists)(layerDir)) {
198
- if (this.log) {
199
- this.log.verbose(`Layers already exist for this function. Skipping download.`);
200
- } else {
201
- (0, _serverlessLog.logLayers)(`Layers already exist for this function. Skipping download.`);
202
- }
203
- } else {
204
- const layers = [];
205
-
206
- if (this.log) {
207
- this.log.verbose(`Storing layers at ${layerDir}`);
208
- } else {
209
- (0, _serverlessLog.logLayers)(`Storing layers at ${layerDir}`);
210
- } // Only initialise if we have layers, we're using AWS, and they don't already exist
211
-
212
-
213
- _classPrivateFieldLooseBase(this, _lambda)[_lambda] = new _awsSdk.Lambda({
214
- apiVersion: '2015-03-31',
215
- region: _classPrivateFieldLooseBase(this, _provider)[_provider].region
216
- });
217
-
218
- if (this.log) {
219
- this.log.verbose(`Getting layers`);
220
- } else {
221
- (0, _serverlessLog.logLayers)(`Getting layers`);
222
- }
223
-
224
- for (const layerArn of _classPrivateFieldLooseBase(this, _layers)[_layers]) {
225
- layers.push(this._downloadLayer(layerArn, layerDir));
226
- }
227
-
228
- await Promise.all(layers);
229
- }
230
-
231
- if (_classPrivateFieldLooseBase(this, _dockerOptions)[_dockerOptions].hostServicePath && layerDir.startsWith(_classPrivateFieldLooseBase(this, _servicePath)[_servicePath])) {
232
- layerDir = layerDir.replace(_classPrivateFieldLooseBase(this, _servicePath)[_servicePath], _classPrivateFieldLooseBase(this, _dockerOptions)[_dockerOptions].hostServicePath);
233
- }
234
-
235
- dockerArgs.push('-v', `${layerDir}:/opt:ro,delegated`);
236
- }
237
- }
238
-
239
- entries(_classPrivateFieldLooseBase(this, _env)[_env]).forEach(([key, value]) => {
240
- dockerArgs.push('-e', `${key}=${value}`);
241
- });
242
-
243
- if ((0, _os.platform)() === 'linux') {
244
- // Add `host.docker.internal` DNS name to access host from inside the container
245
- // https://github.com/docker/for-linux/issues/264
246
- const gatewayIp = await this._getBridgeGatewayIp();
247
-
248
- if (gatewayIp) {
249
- dockerArgs.push('--add-host', `host.docker.internal:${gatewayIp}`);
250
- }
251
- }
252
-
253
- if (_classPrivateFieldLooseBase(this, _dockerOptions)[_dockerOptions].network) {
254
- dockerArgs.push('--network', _classPrivateFieldLooseBase(this, _dockerOptions)[_dockerOptions].network);
255
- }
256
-
257
- const {
258
- stdout: containerId
259
- } = await (0, _execa.default)('docker', ['create', ...dockerArgs, _classPrivateFieldLooseBase(this, _imageNameTag)[_imageNameTag], _classPrivateFieldLooseBase(this, _handler)[_handler]]);
260
- const dockerStart = (0, _execa.default)('docker', ['start', '-a', containerId], {
261
- all: true
262
- });
263
- await new Promise((resolve, reject) => {
264
- dockerStart.all.on('data', data => {
265
- const str = data.toString();
266
- console.log(str);
267
-
268
- if (str.includes('Lambda API listening on port')) {
269
- resolve();
270
- }
271
- });
272
- dockerStart.on('error', err => {
273
- reject(err);
274
- });
275
- }); // parse `docker port` output and get the container port
276
-
277
- let containerPort;
278
- const {
279
- stdout: dockerPortOutput
280
- } = await (0, _execa.default)('docker', ['port', containerId]); // NOTE: `docker port` may output multiple lines.
281
- //
282
- // e.g.:
283
- // 9001/tcp -> 0.0.0.0:49153
284
- // 9001/tcp -> :::49153
285
- //
286
- // Parse each line until it finds the mapped port.
287
-
288
- for (const line of dockerPortOutput.split('\n')) {
289
- const result = line.match(/^9001\/tcp -> (.*):(\d+)$/);
290
-
291
- if (result && result.length > 2) {
292
- ;
293
- [,, containerPort] = result;
294
- break;
295
- }
296
- }
297
-
298
- if (!containerPort) {
299
- throw new Error('Failed to get container port');
300
- }
301
-
302
- _classPrivateFieldLooseBase(this, _containerId)[_containerId] = containerId;
303
- _classPrivateFieldLooseBase(this, _port)[_port] = containerPort;
304
- await (0, _pRetry.default)(() => this._ping(), {
305
- // default,
306
- factor: 2,
307
- // milliseconds
308
- minTimeout: 10,
309
- // default
310
- retries: 10
311
- });
312
- }
313
-
314
- async _downloadLayer(layerArn, layerDir) {
315
- const layerName = layerArn.split(':layer:')[1];
316
- const layerZipFile = `${layerDir}/${layerName}.zip`;
317
- const layerProgress = this.log && this.progress.get(`layer-${layerName}`);
318
-
319
- if (this.log) {
320
- this.log.verbose(`[${layerName}] ARN: ${layerArn}`);
321
- } else {
322
- (0, _serverlessLog.logLayers)(`[${layerName}] ARN: ${layerArn}`);
323
- }
324
-
325
- const params = {
326
- Arn: layerArn
327
- };
328
-
329
- if (this.log) {
330
- this.log.verbose(`[${layerName}] Getting Info`);
331
- layerProgress.notice(`Retrieving "${layerName}": Getting info`);
332
- } else {
333
- (0, _serverlessLog.logLayers)(`[${layerName}] Getting Info`);
334
- }
335
-
336
- try {
337
- let layer = null;
338
-
339
- try {
340
- layer = await _classPrivateFieldLooseBase(this, _lambda)[_lambda].getLayerVersionByArn(params).promise();
341
- } catch (e) {
342
- if (this.log) {
343
- this.log.warning(`[${layerName}] ${e.code}: ${e.message}`);
344
- } else {
345
- (0, _serverlessLog.logWarning)(`[${layerName}] ${e.code}: ${e.message}`);
346
- }
347
-
348
- return;
349
- }
350
-
351
- if (Object.prototype.hasOwnProperty.call(layer, 'CompatibleRuntimes') && !layer.CompatibleRuntimes.includes(_classPrivateFieldLooseBase(this, _runtime)[_runtime])) {
352
- if (this.log) {
353
- this.log.warning(`[${layerName}] Layer is not compatible with ${_classPrivateFieldLooseBase(this, _runtime)[_runtime]} runtime`);
354
- } else {
355
- (0, _serverlessLog.logWarning)(`[${layerName}] Layer is not compatible with ${_classPrivateFieldLooseBase(this, _runtime)[_runtime]} runtime`);
356
- }
357
-
358
- return;
359
- }
360
-
361
- const layerUrl = layer.Content.Location; // const layerSha = layer.Content.CodeSha256
362
-
363
- const layerSize = layer.Content.CodeSize;
364
- await (0, _fsExtra.ensureDir)(layerDir);
365
-
366
- if (this.log) {
367
- this.log.verbose(`Retrieving "${layerName}": Downloading ${this._formatBytes(layerSize)}...`);
368
- layerProgress.notice(`Retrieving "${layerName}": Downloading ${this._formatBytes(layerSize)}`);
369
- } else {
370
- (0, _serverlessLog.logLayers)(`[${layerName}] Downloading ${this._formatBytes(layerSize)}...`);
371
- }
372
-
373
- const res = await (0, _nodeFetch.default)(layerUrl, {
374
- method: 'get'
375
- });
376
-
377
- if (!res.ok) {
378
- if (this.log) {
379
- this.log.warning(`[${layerName}] Failed to fetch from ${layerUrl} with ${res.statusText}`);
380
- } else {
381
- (0, _serverlessLog.logWarning)(`[${layerName}] Failed to fetch from ${layerUrl} with ${res.statusText}`);
382
- }
383
-
384
- return;
385
- }
386
-
387
- const fileStream = (0, _fs.createWriteStream)(`${layerZipFile}`);
388
- await new Promise((resolve, reject) => {
389
- res.body.pipe(fileStream);
390
- res.body.on('error', err => {
391
- reject(err);
392
- });
393
- fileStream.on('finish', () => {
394
- resolve();
395
- });
396
- });
397
-
398
- if (this.log) {
399
- this.log.verbose(`Retrieving "${layerName}": Unzipping to .layers directory`);
400
- layerProgress.notice(`Retrieving "${layerName}": Unzipping to .layers directory`);
401
- } else {
402
- (0, _serverlessLog.logLayers)(`[${layerName}] Unzipping to .layers directory`);
403
- }
404
-
405
- const data = await (0, _fsExtra.readFile)(`${layerZipFile}`);
406
- const zip = await _jszip.default.loadAsync(data);
407
- await Promise.all(keys(zip.files).map(async filename => {
408
- const fileData = await zip.files[filename].async('nodebuffer');
409
-
410
- if (filename.endsWith(_path.sep)) {
411
- return Promise.resolve();
412
- }
413
-
414
- await (0, _fsExtra.ensureDir)((0, _path.join)(layerDir, (0, _path.dirname)(filename)));
415
- return (0, _fsExtra.writeFile)((0, _path.join)(layerDir, filename), fileData, {
416
- mode: zip.files[filename].unixPermissions
417
- });
418
- }));
419
-
420
- if (this.log) {
421
- this.log.verbose(`[${layerName}] Removing zip file`);
422
- } else {
423
- (0, _serverlessLog.logLayers)(`[${layerName}] Removing zip file`);
424
- }
425
-
426
- (0, _fs.unlinkSync)(`${layerZipFile}`);
427
- } finally {
428
- if (this.log) layerProgress.remove();
429
- }
430
- }
431
-
432
- async _getBridgeGatewayIp() {
433
- let gateway;
434
-
435
- try {
436
- ;
437
- ({
438
- stdout: gateway
439
- } = await (0, _execa.default)('docker', ['network', 'inspect', 'bridge', '--format', '{{(index .IPAM.Config 0).Gateway}}']));
440
- } catch (err) {
441
- if (this.log) {
442
- this.log.error(err.stderr);
443
- } else {
444
- console.error(err.stderr);
445
- }
446
-
447
- throw err;
448
- }
449
-
450
- return gateway.split('/')[0];
451
- }
452
-
453
- async _ping() {
454
- const url = `http://${_classPrivateFieldLooseBase(this, _dockerOptions)[_dockerOptions].host}:${_classPrivateFieldLooseBase(this, _port)[_port]}/2018-06-01/ping`;
455
- const res = await (0, _nodeFetch.default)(url);
456
-
457
- if (!res.ok) {
458
- throw new Error(`Failed to fetch from ${url} with ${res.statusText}`);
459
- }
460
-
461
- return res.text();
462
- }
463
-
464
- async request(event) {
465
- const url = `http://${_classPrivateFieldLooseBase(this, _dockerOptions)[_dockerOptions].host}:${_classPrivateFieldLooseBase(this, _port)[_port]}/2015-03-31/functions/${_classPrivateFieldLooseBase(this, _functionKey)[_functionKey]}/invocations`;
466
- const res = await (0, _nodeFetch.default)(url, {
467
- body: stringify(event),
468
- headers: {
469
- 'Content-Type': 'application/json'
470
- },
471
- method: 'post'
472
- });
473
-
474
- if (!res.ok) {
475
- throw new Error(`Failed to fetch from ${url} with ${res.statusText}`);
476
- }
477
-
478
- return res.json();
479
- }
480
-
481
- async stop() {
482
- if (_classPrivateFieldLooseBase(this, _containerId)[_containerId]) {
483
- try {
484
- await (0, _execa.default)('docker', ['stop', _classPrivateFieldLooseBase(this, _containerId)[_containerId]]);
485
- await (0, _execa.default)('docker', ['rm', _classPrivateFieldLooseBase(this, _containerId)[_containerId]]);
486
- } catch (err) {
487
- if (this.log) {
488
- this.log.error(err.stderr);
489
- } else {
490
- console.error(err.stderr);
491
- }
492
-
493
- throw err;
494
- }
495
- }
496
- }
497
-
498
- _formatBytes(bytes, decimals = 2) {
499
- if (bytes === 0) return '0 Bytes';
500
- const k = 1024;
501
- const dm = decimals < 0 ? 0 : decimals;
502
- const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
503
- const i = Math.floor(Math.log(bytes) / Math.log(k));
504
- return `${parseFloat((bytes / k ** i).toFixed(dm))} ${sizes[i]}`;
505
- }
506
-
507
- _getLayersSha256() {
508
- return _crypto.default.createHash('sha256').update(JSON.stringify(_classPrivateFieldLooseBase(this, _layers)[_layers])).digest('hex');
509
- }
510
-
511
- get isRunning() {
512
- return _classPrivateFieldLooseBase(this, _containerId)[_containerId] !== null && _classPrivateFieldLooseBase(this, _port)[_port] !== null;
513
- }
514
-
515
- }
516
-
517
- exports.default = DockerContainer;
@@ -1,67 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _execa = _interopRequireDefault(require("execa"));
9
-
10
- var _pMemoize = _interopRequireDefault(require("p-memoize"));
11
-
12
- var _debugLog = _interopRequireDefault(require("../../../debugLog.js"));
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
- var _imageNameTag = /*#__PURE__*/_classPrivateFieldLooseKey("imageNameTag");
23
-
24
- class DockerImage {
25
- constructor(imageNameTag, v3Utils) {
26
- Object.defineProperty(this, _imageNameTag, {
27
- writable: true,
28
- value: null
29
- });
30
- _classPrivateFieldLooseBase(this, _imageNameTag)[_imageNameTag] = imageNameTag;
31
-
32
- if (v3Utils) {
33
- this.log = v3Utils.log;
34
- this.progress = v3Utils.progress;
35
- this.writeText = v3Utils.writeText;
36
- this.v3Utils = v3Utils;
37
- }
38
- }
39
-
40
- static async _pullImage(imageNameTag) {
41
- if (this.log) {
42
- this.log.debug(`Downloading base Docker image... (${imageNameTag})`);
43
- } else {
44
- (0, _debugLog.default)(`Downloading base Docker image... (${imageNameTag})`);
45
- }
46
-
47
- try {
48
- await (0, _execa.default)('docker', ['pull', '--disable-content-trust=false', imageNameTag]);
49
- } catch (err) {
50
- if (this.log) {
51
- this.log.error(err.stderr);
52
- } else {
53
- console.error(err.stderr);
54
- }
55
-
56
- throw err;
57
- }
58
- }
59
-
60
- async pull() {
61
- return DockerImage._memoizedPull(_classPrivateFieldLooseBase(this, _imageNameTag)[_imageNameTag], this.v3Utils);
62
- }
63
-
64
- }
65
-
66
- exports.default = DockerImage;
67
- DockerImage._memoizedPull = (0, _pMemoize.default)(DockerImage._pullImage);
@@ -1,74 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _DockerContainer = _interopRequireDefault(require("./DockerContainer.js"));
9
-
10
- var _index = require("../../../utils/index.js");
11
-
12
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
-
14
- function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; }
15
-
16
- var id = 0;
17
-
18
- function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; }
19
-
20
- var _codeDir = /*#__PURE__*/_classPrivateFieldLooseKey("codeDir");
21
-
22
- var _container = /*#__PURE__*/_classPrivateFieldLooseKey("container");
23
-
24
- class DockerRunner {
25
- constructor(funOptions, env, dockerOptions, v3Utils) {
26
- Object.defineProperty(this, _codeDir, {
27
- writable: true,
28
- value: null
29
- });
30
- Object.defineProperty(this, _container, {
31
- writable: true,
32
- value: null
33
- });
34
- const {
35
- codeDir,
36
- functionKey,
37
- handler,
38
- runtime,
39
- layers,
40
- provider,
41
- servicePath
42
- } = funOptions;
43
- _classPrivateFieldLooseBase(this, _codeDir)[_codeDir] = codeDir;
44
-
45
- if (dockerOptions.hostServicePath && _classPrivateFieldLooseBase(this, _codeDir)[_codeDir].startsWith(servicePath)) {
46
- _classPrivateFieldLooseBase(this, _codeDir)[_codeDir] = _classPrivateFieldLooseBase(this, _codeDir)[_codeDir].replace(servicePath, dockerOptions.hostServicePath);
47
- }
48
-
49
- _classPrivateFieldLooseBase(this, _container)[_container] = new _DockerContainer.default(env, functionKey, handler, runtime, layers, provider, servicePath, dockerOptions, v3Utils);
50
- }
51
-
52
- cleanup() {
53
- if (_classPrivateFieldLooseBase(this, _container)[_container]) {
54
- return _classPrivateFieldLooseBase(this, _container)[_container].stop();
55
- }
56
-
57
- return undefined;
58
- } // context will be generated in container
59
-
60
-
61
- async run(event) {
62
- // FIXME TODO this should run only once -> static private
63
- await (0, _index.checkDockerDaemon)();
64
-
65
- if (!_classPrivateFieldLooseBase(this, _container)[_container].isRunning) {
66
- await _classPrivateFieldLooseBase(this, _container)[_container].start(_classPrivateFieldLooseBase(this, _codeDir)[_codeDir]);
67
- }
68
-
69
- return _classPrivateFieldLooseBase(this, _container)[_container].request(event);
70
- }
71
-
72
- }
73
-
74
- exports.default = DockerRunner;
@@ -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 _DockerRunner.default;
10
- }
11
- });
12
-
13
- var _DockerRunner = _interopRequireDefault(require("./DockerRunner.js"));
14
-
15
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }