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,550 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _ws = require("ws");
9
-
10
- var _index = require("./lambda-events/index.js");
11
-
12
- var _debugLog = _interopRequireDefault(require("../../debugLog.js"));
13
-
14
- var _serverlessLog = _interopRequireDefault(require("../../serverlessLog.js"));
15
-
16
- var _index2 = require("../../config/index.js");
17
-
18
- var _index3 = require("../../utils/index.js");
19
-
20
- var _authFunctionNameExtractor = _interopRequireDefault(require("../authFunctionNameExtractor.js"));
21
-
22
- var _authCanExecuteResource = _interopRequireDefault(require("../authCanExecuteResource.js"));
23
-
24
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
-
26
- function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; }
27
-
28
- var id = 0;
29
-
30
- function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; }
31
-
32
- const {
33
- parse,
34
- stringify
35
- } = JSON;
36
-
37
- var _clients = /*#__PURE__*/_classPrivateFieldLooseKey("clients");
38
-
39
- var _lambda = /*#__PURE__*/_classPrivateFieldLooseKey("lambda");
40
-
41
- var _options = /*#__PURE__*/_classPrivateFieldLooseKey("options");
42
-
43
- var _serverless = /*#__PURE__*/_classPrivateFieldLooseKey("serverless");
44
-
45
- var _webSocketRoutes = /*#__PURE__*/_classPrivateFieldLooseKey("webSocketRoutes");
46
-
47
- var _webSocketAuthorizers = /*#__PURE__*/_classPrivateFieldLooseKey("webSocketAuthorizers");
48
-
49
- var _webSocketAuthorizersCache = /*#__PURE__*/_classPrivateFieldLooseKey("webSocketAuthorizersCache");
50
-
51
- var _websocketsApiRouteSelectionExpression = /*#__PURE__*/_classPrivateFieldLooseKey("websocketsApiRouteSelectionExpression");
52
-
53
- var _idleTimeouts = /*#__PURE__*/_classPrivateFieldLooseKey("idleTimeouts");
54
-
55
- var _hardTimeouts = /*#__PURE__*/_classPrivateFieldLooseKey("hardTimeouts");
56
-
57
- class WebSocketClients {
58
- constructor(serverless, options, lambda, v3Utils) {
59
- Object.defineProperty(this, _clients, {
60
- writable: true,
61
- value: new Map()
62
- });
63
- Object.defineProperty(this, _lambda, {
64
- writable: true,
65
- value: null
66
- });
67
- Object.defineProperty(this, _options, {
68
- writable: true,
69
- value: null
70
- });
71
- Object.defineProperty(this, _serverless, {
72
- writable: true,
73
- value: null
74
- });
75
- Object.defineProperty(this, _webSocketRoutes, {
76
- writable: true,
77
- value: new Map()
78
- });
79
- Object.defineProperty(this, _webSocketAuthorizers, {
80
- writable: true,
81
- value: new Map()
82
- });
83
- Object.defineProperty(this, _webSocketAuthorizersCache, {
84
- writable: true,
85
- value: new Map()
86
- });
87
- Object.defineProperty(this, _websocketsApiRouteSelectionExpression, {
88
- writable: true,
89
- value: null
90
- });
91
- Object.defineProperty(this, _idleTimeouts, {
92
- writable: true,
93
- value: new WeakMap()
94
- });
95
- Object.defineProperty(this, _hardTimeouts, {
96
- writable: true,
97
- value: new WeakMap()
98
- });
99
- _classPrivateFieldLooseBase(this, _lambda)[_lambda] = lambda;
100
- _classPrivateFieldLooseBase(this, _options)[_options] = options;
101
- _classPrivateFieldLooseBase(this, _serverless)[_serverless] = serverless;
102
- _classPrivateFieldLooseBase(this, _websocketsApiRouteSelectionExpression)[_websocketsApiRouteSelectionExpression] = serverless.service.provider.websocketsApiRouteSelectionExpression || _index2.DEFAULT_WEBSOCKETS_API_ROUTE_SELECTION_EXPRESSION;
103
-
104
- if (v3Utils) {
105
- this.log = v3Utils.log;
106
- this.progress = v3Utils.progress;
107
- this.writeText = v3Utils.writeText;
108
- this.v3Utils = v3Utils;
109
- }
110
- }
111
-
112
- _addWebSocketClient(client, connectionId) {
113
- _classPrivateFieldLooseBase(this, _clients)[_clients].set(client, connectionId);
114
-
115
- _classPrivateFieldLooseBase(this, _clients)[_clients].set(connectionId, client);
116
-
117
- this._onWebSocketUsed(connectionId);
118
-
119
- this._addHardTimeout(client, connectionId);
120
- }
121
-
122
- _removeWebSocketClient(client) {
123
- const connectionId = _classPrivateFieldLooseBase(this, _clients)[_clients].get(client);
124
-
125
- _classPrivateFieldLooseBase(this, _clients)[_clients].delete(client);
126
-
127
- _classPrivateFieldLooseBase(this, _clients)[_clients].delete(connectionId);
128
-
129
- return connectionId;
130
- }
131
-
132
- _getWebSocketClient(connectionId) {
133
- return _classPrivateFieldLooseBase(this, _clients)[_clients].get(connectionId);
134
- }
135
-
136
- _addHardTimeout(client, connectionId) {
137
- const timeoutId = setTimeout(() => {
138
- if (this.log) {
139
- this.log.debug(`timeout:hard:${connectionId}`);
140
- } else {
141
- (0, _debugLog.default)(`timeout:hard:${connectionId}`);
142
- }
143
-
144
- client.close(1001, 'Going away');
145
- }, _classPrivateFieldLooseBase(this, _options)[_options].webSocketHardTimeout * 1000);
146
-
147
- _classPrivateFieldLooseBase(this, _hardTimeouts)[_hardTimeouts].set(client, timeoutId);
148
- }
149
-
150
- _clearHardTimeout(client) {
151
- const timeoutId = _classPrivateFieldLooseBase(this, _hardTimeouts)[_hardTimeouts].get(client);
152
-
153
- clearTimeout(timeoutId);
154
- }
155
-
156
- _onWebSocketUsed(connectionId) {
157
- const client = this._getWebSocketClient(connectionId);
158
-
159
- this._clearIdleTimeout(client);
160
-
161
- if (this.log) {
162
- this.log.debug(`timeout:idle:${connectionId}:reset`);
163
- } else {
164
- (0, _debugLog.default)(`timeout:idle:${connectionId}:reset`);
165
- }
166
-
167
- const timeoutId = setTimeout(() => {
168
- if (this.log) {
169
- this.log.debug(`timeout:idle:${connectionId}:trigger`);
170
- } else {
171
- (0, _debugLog.default)(`timeout:idle:${connectionId}:trigger`);
172
- }
173
-
174
- client.close(1001, 'Going away');
175
- }, _classPrivateFieldLooseBase(this, _options)[_options].webSocketIdleTimeout * 1000);
176
-
177
- _classPrivateFieldLooseBase(this, _idleTimeouts)[_idleTimeouts].set(client, timeoutId);
178
- }
179
-
180
- _clearIdleTimeout(client) {
181
- const timeoutId = _classPrivateFieldLooseBase(this, _idleTimeouts)[_idleTimeouts].get(client);
182
-
183
- clearTimeout(timeoutId);
184
- }
185
-
186
- async verifyClient(connectionId, request) {
187
- const routeName = '$connect';
188
-
189
- const route = _classPrivateFieldLooseBase(this, _webSocketRoutes)[_webSocketRoutes].get(routeName);
190
-
191
- if (!route) {
192
- return {
193
- verified: false,
194
- statusCode: 502
195
- };
196
- }
197
-
198
- const connectEvent = new _index.WebSocketConnectEvent(connectionId, request, _classPrivateFieldLooseBase(this, _options)[_options]).create();
199
-
200
- const authFunName = _classPrivateFieldLooseBase(this, _webSocketAuthorizers)[_webSocketAuthorizers].get(routeName);
201
-
202
- if (authFunName) {
203
- const authorizerFunction = _classPrivateFieldLooseBase(this, _lambda)[_lambda].get(authFunName);
204
-
205
- const authorizeEvent = new _index.WebSocketAuthorizerEvent(connectionId, request, _classPrivateFieldLooseBase(this, _serverless)[_serverless].service.provider, _classPrivateFieldLooseBase(this, _options)[_options]).create();
206
- authorizerFunction.setEvent(authorizeEvent);
207
-
208
- if (this.log) {
209
- this.log.notice();
210
- this.log.notice(`Running Authorization function for ${routeName} (λ: ${authFunName})`);
211
- } else {
212
- console.log(''); // Just to make things a little pretty
213
-
214
- (0, _serverlessLog.default)(`Running Authorization function for ${routeName} (λ: ${authFunName})`);
215
- }
216
-
217
- try {
218
- const result = await authorizerFunction.runHandler();
219
- if (result === 'Unauthorized') return {
220
- verified: false,
221
- statusCode: 401
222
- };
223
- const policy = result; // Validate that the policy document has the principalId set
224
-
225
- if (!policy.principalId) {
226
- if (this.log) {
227
- this.log.notice(`Authorization response did not include a principalId: (λ: ${authFunName})`);
228
- } else {
229
- (0, _serverlessLog.default)(`Authorization response did not include a principalId: (λ: ${authFunName})`);
230
- }
231
-
232
- return {
233
- verified: false,
234
- statusCode: 403
235
- };
236
- }
237
-
238
- if (!(0, _authCanExecuteResource.default)(policy.policyDocument, authorizeEvent.methodArn)) {
239
- if (this.log) {
240
- this.log.notice(`Authorization response didn't authorize user to access resource: (λ: ${authFunName})`);
241
- } else {
242
- (0, _serverlessLog.default)(`Authorization response didn't authorize user to access resource: (λ: ${authFunName})`);
243
- }
244
-
245
- return {
246
- verified: false,
247
- statusCode: 403
248
- };
249
- }
250
-
251
- if (this.log) {
252
- this.log.notice(`Authorization function returned a successful response: (λ: ${authFunName})`);
253
- } else {
254
- (0, _serverlessLog.default)(`Authorization function returned a successful response: (λ: ${authFunName})`);
255
- }
256
-
257
- _classPrivateFieldLooseBase(this, _webSocketAuthorizersCache)[_webSocketAuthorizersCache].set(connectionId, {
258
- identity: {
259
- apiKey: policy.usageIdentifierKey,
260
- sourceIp: authorizeEvent.requestContext.sourceIp,
261
- userAgent: authorizeEvent.headers['user-agent'] || ''
262
- },
263
- authorizer: {
264
- integrationLatency: '42',
265
- principalId: policy.principalId,
266
- ...policy.context
267
- }
268
- });
269
- } catch (err) {
270
- if (this.log) {
271
- this.log.debug(`Error in route handler '${routeName}' authorizer`, err);
272
- } else {
273
- (0, _debugLog.default)(`Error in route handler '${routeName}' authorizer`, err);
274
- }
275
-
276
- return {
277
- verified: false,
278
- statusCode: 500
279
- };
280
- }
281
- }
282
-
283
- const authorizerData = _classPrivateFieldLooseBase(this, _webSocketAuthorizersCache)[_webSocketAuthorizersCache].get(connectionId);
284
-
285
- if (authorizerData) {
286
- connectEvent.identity = authorizerData.identity;
287
- connectEvent.authorizer = authorizerData.authorizer;
288
- }
289
-
290
- const lambdaFunction = _classPrivateFieldLooseBase(this, _lambda)[_lambda].get(route.functionKey);
291
-
292
- lambdaFunction.setEvent(connectEvent);
293
-
294
- try {
295
- const {
296
- statusCode
297
- } = await lambdaFunction.runHandler();
298
- const verified = statusCode >= 200 && statusCode < 300;
299
- return {
300
- verified,
301
- statusCode
302
- };
303
- } catch (err) {
304
- _classPrivateFieldLooseBase(this, _webSocketAuthorizersCache)[_webSocketAuthorizersCache].delete(connectionId);
305
-
306
- if (this.log) {
307
- this.log.debug(`Error in route handler '${route.functionKey}'`, err);
308
- } else {
309
- (0, _debugLog.default)(`Error in route handler '${route.functionKey}'`, err);
310
- }
311
-
312
- return {
313
- verified: false,
314
- statusCode: 502
315
- };
316
- }
317
- }
318
-
319
- async _processEvent(websocketClient, connectionId, routeKey, event) {
320
- let route = _classPrivateFieldLooseBase(this, _webSocketRoutes)[_webSocketRoutes].get(routeKey);
321
-
322
- if (!route && routeKey !== '$disconnect') {
323
- route = _classPrivateFieldLooseBase(this, _webSocketRoutes)[_webSocketRoutes].get('$default');
324
- }
325
-
326
- if (!route) {
327
- return;
328
- }
329
-
330
- const sendError = err => {
331
- if (websocketClient.readyState === _ws.OPEN) {
332
- websocketClient.send(stringify({
333
- connectionId,
334
- message: 'Internal server error',
335
- requestId: '1234567890'
336
- }));
337
- }
338
-
339
- if (this.log) {
340
- this.log.debug(`Error in route handler '${route.functionKey}'`, err);
341
- } else {
342
- (0, _debugLog.default)(`Error in route handler '${route.functionKey}'`, err);
343
- }
344
- };
345
-
346
- const lambdaFunction = _classPrivateFieldLooseBase(this, _lambda)[_lambda].get(route.functionKey);
347
-
348
- lambdaFunction.setEvent(event);
349
-
350
- try {
351
- const {
352
- body
353
- } = await lambdaFunction.runHandler();
354
-
355
- if (body && routeKey !== '$disconnect' && route.definition.routeResponseSelectionExpression === '$default') {
356
- // https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-selection-expressions.html#apigateway-websocket-api-route-response-selection-expressions
357
- // TODO: Once API gateway supports RouteResponses, this will need to change to support that functionality
358
- // For now, send body back to the client
359
- this.send(connectionId, body);
360
- }
361
- } catch (err) {
362
- if (this.log) {
363
- this.log.error(err);
364
- } else {
365
- console.log(err);
366
- }
367
-
368
- sendError(err);
369
- }
370
- }
371
-
372
- _getRoute(value) {
373
- let json;
374
-
375
- try {
376
- json = parse(value);
377
- } catch (err) {
378
- return _index2.DEFAULT_WEBSOCKETS_ROUTE;
379
- }
380
-
381
- const routeSelectionExpression = _classPrivateFieldLooseBase(this, _websocketsApiRouteSelectionExpression)[_websocketsApiRouteSelectionExpression].replace('request.body', '');
382
-
383
- const route = (0, _index3.jsonPath)(json, routeSelectionExpression);
384
-
385
- if (typeof route !== 'string') {
386
- return _index2.DEFAULT_WEBSOCKETS_ROUTE;
387
- }
388
-
389
- return route || _index2.DEFAULT_WEBSOCKETS_ROUTE;
390
- }
391
-
392
- addClient(webSocketClient, connectionId) {
393
- this._addWebSocketClient(webSocketClient, connectionId);
394
-
395
- webSocketClient.on('close', () => {
396
- if (this.log) {
397
- this.log.debug(`disconnect:${connectionId}`);
398
- } else {
399
- (0, _debugLog.default)(`disconnect:${connectionId}`);
400
- }
401
-
402
- this._removeWebSocketClient(webSocketClient);
403
-
404
- const disconnectEvent = new _index.WebSocketDisconnectEvent(connectionId).create();
405
-
406
- this._clearHardTimeout(webSocketClient);
407
-
408
- this._clearIdleTimeout(webSocketClient);
409
-
410
- const authorizerData = _classPrivateFieldLooseBase(this, _webSocketAuthorizersCache)[_webSocketAuthorizersCache].get(connectionId);
411
-
412
- if (authorizerData) {
413
- disconnectEvent.identity = authorizerData.identity;
414
- disconnectEvent.authorizer = authorizerData.authorizer;
415
- }
416
-
417
- this._processEvent(webSocketClient, connectionId, '$disconnect', disconnectEvent).finally(() => _classPrivateFieldLooseBase(this, _webSocketAuthorizersCache)[_webSocketAuthorizersCache].delete(connectionId));
418
- });
419
- webSocketClient.on('message', message => {
420
- if (this.log) {
421
- this.log.debug(`message:${message}`);
422
- } else {
423
- (0, _debugLog.default)(`message:${message}`);
424
- }
425
-
426
- const route = this._getRoute(message);
427
-
428
- if (this.log) {
429
- this.log.debug(`route:${route} on connection=${connectionId}`);
430
- } else {
431
- (0, _debugLog.default)(`route:${route} on connection=${connectionId}`);
432
- }
433
-
434
- const event = new _index.WebSocketEvent(connectionId, route, message).create();
435
-
436
- const authorizerData = _classPrivateFieldLooseBase(this, _webSocketAuthorizersCache)[_webSocketAuthorizersCache].get(connectionId);
437
-
438
- if (authorizerData) {
439
- event.identity = authorizerData.identity;
440
- event.authorizer = authorizerData.authorizer;
441
- }
442
-
443
- this._onWebSocketUsed(connectionId);
444
-
445
- this._processEvent(webSocketClient, connectionId, route, event);
446
- });
447
- }
448
-
449
- _extractAuthFunctionName(endpoint) {
450
- if (typeof endpoint.authorizer === 'object' && endpoint.authorizer.type && endpoint.authorizer.type.toUpperCase() === 'TOKEN') {
451
- if (this.log) {
452
- this.log.debug(`Websockets does not support the TOKEN authorization type`);
453
- } else {
454
- (0, _debugLog.default)(`WARNING: Websockets does not support the TOKEN authorization type`);
455
- }
456
-
457
- return null;
458
- }
459
-
460
- const result = (0, _authFunctionNameExtractor.default)(endpoint, null, this);
461
- return result.unsupportedAuth ? null : result.authorizerName;
462
- }
463
-
464
- _configureAuthorization(endpoint, functionKey) {
465
- if (!endpoint.authorizer) {
466
- return;
467
- }
468
-
469
- if (endpoint.route === '$connect') {
470
- const authFunctionName = this._extractAuthFunctionName(endpoint);
471
-
472
- if (!authFunctionName) {
473
- return;
474
- }
475
-
476
- if (this.log) {
477
- this.log.notice(`Configuring Authorization: ${functionKey} ${authFunctionName}`);
478
- } else {
479
- (0, _serverlessLog.default)(`Configuring Authorization: ${functionKey} ${authFunctionName}`);
480
- }
481
-
482
- const authFunction = _classPrivateFieldLooseBase(this, _serverless)[_serverless].service.getFunction(authFunctionName);
483
-
484
- if (!authFunction) {
485
- if (this.log) {
486
- this.log.error(`Authorization function ${authFunctionName} does not exist`);
487
- } else {
488
- (0, _serverlessLog.default)(`WARNING: Authorization function ${authFunctionName} does not exist`);
489
- }
490
-
491
- return;
492
- }
493
-
494
- _classPrivateFieldLooseBase(this, _webSocketAuthorizers)[_webSocketAuthorizers].set(endpoint.route, authFunctionName);
495
-
496
- return;
497
- }
498
-
499
- if (this.log) {
500
- this.log.notice(`Configuring Authorization is supported only on $connect route`);
501
- } else {
502
- (0, _serverlessLog.default)(`Configuring Authorization is supported only on $connect route`);
503
- }
504
- }
505
-
506
- addRoute(functionKey, definition) {
507
- // set the route name
508
- _classPrivateFieldLooseBase(this, _webSocketRoutes)[_webSocketRoutes].set(definition.route, {
509
- functionKey,
510
- definition
511
- });
512
-
513
- if (!_classPrivateFieldLooseBase(this, _options)[_options].noAuth) {
514
- this._configureAuthorization(definition, functionKey);
515
- }
516
-
517
- if (this.log) {
518
- this.log.notice(`route '${definition}'`);
519
- } else {
520
- (0, _serverlessLog.default)(`route '${definition}'`);
521
- }
522
- }
523
-
524
- close(connectionId) {
525
- const client = this._getWebSocketClient(connectionId);
526
-
527
- if (client) {
528
- client.close();
529
- return true;
530
- }
531
-
532
- return false;
533
- }
534
-
535
- send(connectionId, payload) {
536
- const client = this._getWebSocketClient(connectionId);
537
-
538
- if (client) {
539
- this._onWebSocketUsed(connectionId);
540
-
541
- client.send(payload);
542
- return true;
543
- }
544
-
545
- return false;
546
- }
547
-
548
- }
549
-
550
- exports.default = WebSocketClients;
@@ -1,32 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- const {
8
- assign
9
- } = Object;
10
-
11
- class WebSocketEventDefinition {
12
- constructor(rawWebSocketEventDefinition) {
13
- let rest;
14
- let route;
15
-
16
- if (typeof rawWebSocketEventDefinition === 'string') {
17
- route = rawWebSocketEventDefinition;
18
- } else {
19
- ;
20
- ({
21
- route,
22
- ...rest
23
- } = rawWebSocketEventDefinition);
24
- }
25
-
26
- this.route = route;
27
- assign(this, rest);
28
- }
29
-
30
- }
31
-
32
- exports.default = WebSocketEventDefinition;