serverless-offline 8.8.1 → 9.1.1

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 +112 -44
  2. package/package.json +33 -57
  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 +76 -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 +419 -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 +172 -0
  78. package/src/lambda/handler-runner/go-runner/index.js +1 -0
  79. package/src/lambda/handler-runner/in-process-runner/InProcessRunner.js +126 -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/CHANGELOG.md +0 -78
  130. package/dist/ServerlessOffline.js +0 -508
  131. package/dist/config/commandOptions.js +0 -149
  132. package/dist/config/constants.js +0 -30
  133. package/dist/config/index.js +0 -55
  134. package/dist/config/supportedRuntimes.js +0 -40
  135. package/dist/debugLog.js +0 -12
  136. package/dist/events/authCanExecuteResource.js +0 -35
  137. package/dist/events/authFunctionNameExtractor.js +0 -87
  138. package/dist/events/authMatchPolicyResource.js +0 -62
  139. package/dist/events/authValidateContext.js +0 -53
  140. package/dist/events/http/Endpoint.js +0 -173
  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 -1370
  144. package/dist/events/http/OfflineEndpoint.js +0 -38
  145. package/dist/events/http/authJWTSettingsExtractor.js +0 -76
  146. package/dist/events/http/createAuthScheme.js +0 -184
  147. package/dist/events/http/createJWTAuthScheme.js +0 -159
  148. package/dist/events/http/index.js +0 -15
  149. package/dist/events/http/javaHelpers.js +0 -99
  150. package/dist/events/http/lambda-events/LambdaIntegrationEvent.js +0 -87
  151. package/dist/events/http/lambda-events/LambdaProxyIntegrationEvent.js +0 -246
  152. package/dist/events/http/lambda-events/LambdaProxyIntegrationEventV2.js +0 -225
  153. package/dist/events/http/lambda-events/VelocityContext.js +0 -170
  154. package/dist/events/http/lambda-events/index.js +0 -39
  155. package/dist/events/http/lambda-events/renderVelocityTemplateObject.js +0 -111
  156. package/dist/events/http/payloadSchemaValidator.js +0 -13
  157. package/dist/events/schedule/Schedule.js +0 -183
  158. package/dist/events/schedule/ScheduleEvent.js +0 -27
  159. package/dist/events/schedule/ScheduleEventDefinition.js +0 -36
  160. package/dist/events/schedule/index.js +0 -15
  161. package/dist/events/websocket/HttpServer.js +0 -114
  162. package/dist/events/websocket/WebSocket.js +0 -78
  163. package/dist/events/websocket/WebSocketClients.js +0 -577
  164. package/dist/events/websocket/WebSocketEventDefinition.js +0 -32
  165. package/dist/events/websocket/WebSocketServer.js +0 -139
  166. package/dist/events/websocket/http-routes/_catchAll/catchAllRoute.js +0 -33
  167. package/dist/events/websocket/http-routes/_catchAll/index.js +0 -15
  168. package/dist/events/websocket/http-routes/connections/ConnectionsController.js +0 -45
  169. package/dist/events/websocket/http-routes/connections/connectionsRoutes.js +0 -95
  170. package/dist/events/websocket/http-routes/connections/index.js +0 -15
  171. package/dist/events/websocket/http-routes/index.js +0 -23
  172. package/dist/events/websocket/index.js +0 -15
  173. package/dist/events/websocket/lambda-events/WebSocketAuthorizerEvent.js +0 -99
  174. package/dist/events/websocket/lambda-events/WebSocketConnectEvent.js +0 -101
  175. package/dist/events/websocket/lambda-events/WebSocketDisconnectEvent.js +0 -47
  176. package/dist/events/websocket/lambda-events/WebSocketEvent.js +0 -54
  177. package/dist/events/websocket/lambda-events/WebSocketRequestContext.js +0 -98
  178. package/dist/events/websocket/lambda-events/index.js +0 -39
  179. package/dist/index.js +0 -15
  180. package/dist/lambda/HttpServer.js +0 -124
  181. package/dist/lambda/Lambda.js +0 -117
  182. package/dist/lambda/LambdaContext.js +0 -53
  183. package/dist/lambda/LambdaFunction.js +0 -390
  184. package/dist/lambda/LambdaFunctionPool.js +0 -127
  185. package/dist/lambda/handler-runner/HandlerRunner.js +0 -195
  186. package/dist/lambda/handler-runner/child-process-runner/ChildProcessRunner.js +0 -124
  187. package/dist/lambda/handler-runner/child-process-runner/childProcessHelper.js +0 -49
  188. package/dist/lambda/handler-runner/child-process-runner/index.js +0 -15
  189. package/dist/lambda/handler-runner/docker-runner/DockerContainer.js +0 -515
  190. package/dist/lambda/handler-runner/docker-runner/DockerImage.js +0 -67
  191. package/dist/lambda/handler-runner/docker-runner/DockerRunner.js +0 -74
  192. package/dist/lambda/handler-runner/docker-runner/index.js +0 -15
  193. package/dist/lambda/handler-runner/go-runner/GoRunner.js +0 -230
  194. package/dist/lambda/handler-runner/go-runner/index.js +0 -15
  195. package/dist/lambda/handler-runner/in-process-runner/InProcessRunner.js +0 -228
  196. package/dist/lambda/handler-runner/in-process-runner/index.js +0 -15
  197. package/dist/lambda/handler-runner/index.js +0 -15
  198. package/dist/lambda/handler-runner/java-runner/JavaRunner.js +0 -153
  199. package/dist/lambda/handler-runner/java-runner/index.js +0 -15
  200. package/dist/lambda/handler-runner/python-runner/PythonRunner.js +0 -185
  201. package/dist/lambda/handler-runner/python-runner/index.js +0 -15
  202. package/dist/lambda/handler-runner/ruby-runner/RubyRunner.js +0 -147
  203. package/dist/lambda/handler-runner/ruby-runner/index.js +0 -15
  204. package/dist/lambda/handler-runner/worker-thread-runner/WorkerThreadRunner.js +0 -92
  205. package/dist/lambda/handler-runner/worker-thread-runner/index.js +0 -15
  206. package/dist/lambda/handler-runner/worker-thread-runner/workerThreadHelper.js +0 -31
  207. package/dist/lambda/index.js +0 -15
  208. package/dist/lambda/routes/index.js +0 -23
  209. package/dist/lambda/routes/invocations/InvocationsController.js +0 -142
  210. package/dist/lambda/routes/invocations/index.js +0 -15
  211. package/dist/lambda/routes/invocations/invocationsRoute.js +0 -90
  212. package/dist/lambda/routes/invoke-async/InvokeAsyncController.js +0 -38
  213. package/dist/lambda/routes/invoke-async/index.js +0 -15
  214. package/dist/lambda/routes/invoke-async/invokeAsyncRoute.js +0 -43
  215. package/dist/main.js +0 -11
  216. package/dist/serverlessLog.js +0 -91
  217. package/dist/utils/checkDockerDaemon.js +0 -27
  218. package/dist/utils/checkGoVersion.js +0 -27
  219. package/dist/utils/createApiKey.js +0 -12
  220. package/dist/utils/createUniqueId.js +0 -14
  221. package/dist/utils/detectExecutable.js +0 -21
  222. package/dist/utils/generateHapiPath.js +0 -28
  223. package/dist/utils/getHttpApiCorsConfig.js +0 -40
  224. package/dist/utils/index.js +0 -165
  225. package/dist/utils/jsonPath.js +0 -21
  226. package/dist/utils/lowerCaseKeys.js +0 -14
  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 -36
  232. package/dist/utils/satisfiesVersionRange.js +0 -20
  233. package/dist/utils/splitHandlerPathAndName.js +0 -37
  234. 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;