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