serverless-offline 8.8.0 → 9.1.0

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