serverless-offline 8.8.1 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/README.md +3 -3
  2. package/package.json +33 -57
  3. package/src/ServerlessOffline.js +412 -0
  4. package/src/config/commandOptions.js +155 -0
  5. package/src/config/constants.js +22 -0
  6. package/{dist → src}/config/defaultOptions.js +8 -17
  7. package/src/config/index.js +4 -0
  8. package/src/config/supportedRuntimes.js +47 -0
  9. package/src/events/authCanExecuteResource.js +35 -0
  10. package/src/events/authFunctionNameExtractor.js +75 -0
  11. package/src/events/authMatchPolicyResource.js +71 -0
  12. package/src/events/authValidateContext.js +51 -0
  13. package/src/events/http/Endpoint.js +135 -0
  14. package/src/events/http/Http.js +50 -0
  15. package/src/events/http/HttpEventDefinition.js +20 -0
  16. package/src/events/http/HttpServer.js +1277 -0
  17. package/src/events/http/OfflineEndpoint.js +33 -0
  18. package/src/events/http/authJWTSettingsExtractor.js +70 -0
  19. package/src/events/http/createAuthScheme.js +176 -0
  20. package/src/events/http/createJWTAuthScheme.js +106 -0
  21. package/src/events/http/index.js +1 -0
  22. package/src/events/http/javaHelpers.js +102 -0
  23. package/src/events/http/lambda-events/LambdaIntegrationEvent.js +57 -0
  24. package/src/events/http/lambda-events/LambdaProxyIntegrationEvent.js +233 -0
  25. package/src/events/http/lambda-events/LambdaProxyIntegrationEventV2.js +190 -0
  26. package/src/events/http/lambda-events/VelocityContext.js +147 -0
  27. package/src/events/http/lambda-events/index.js +4 -0
  28. package/src/events/http/lambda-events/renderVelocityTemplateObject.js +93 -0
  29. package/{dist → src}/events/http/parseResources.js +73 -78
  30. package/src/events/http/payloadSchemaValidator.js +13 -0
  31. package/{dist → src}/events/http/templates/offline-default.req.vm +0 -0
  32. package/{dist → src}/events/http/templates/offline-default.res.vm +0 -0
  33. package/src/events/schedule/Schedule.js +131 -0
  34. package/src/events/schedule/ScheduleEvent.js +18 -0
  35. package/src/events/schedule/ScheduleEventDefinition.js +21 -0
  36. package/src/events/schedule/index.js +1 -0
  37. package/src/events/websocket/HttpServer.js +69 -0
  38. package/src/events/websocket/WebSocket.js +52 -0
  39. package/src/events/websocket/WebSocketClients.js +462 -0
  40. package/src/events/websocket/WebSocketEventDefinition.js +18 -0
  41. package/src/events/websocket/WebSocketServer.js +73 -0
  42. package/src/events/websocket/http-routes/_catchAll/catchAllRoute.js +16 -0
  43. package/src/events/websocket/http-routes/_catchAll/index.js +1 -0
  44. package/src/events/websocket/http-routes/connections/ConnectionsController.js +28 -0
  45. package/src/events/websocket/http-routes/connections/connectionsRoutes.js +70 -0
  46. package/src/events/websocket/http-routes/connections/index.js +1 -0
  47. package/src/events/websocket/http-routes/index.js +2 -0
  48. package/src/events/websocket/index.js +1 -0
  49. package/src/events/websocket/lambda-events/WebSocketAuthorizerEvent.js +65 -0
  50. package/src/events/websocket/lambda-events/WebSocketConnectEvent.js +68 -0
  51. package/src/events/websocket/lambda-events/WebSocketDisconnectEvent.js +31 -0
  52. package/src/events/websocket/lambda-events/WebSocketEvent.js +29 -0
  53. package/src/events/websocket/lambda-events/WebSocketRequestContext.js +67 -0
  54. package/src/events/websocket/lambda-events/index.js +4 -0
  55. package/src/index.js +12 -0
  56. package/src/lambda/HttpServer.js +108 -0
  57. package/src/lambda/Lambda.js +68 -0
  58. package/src/lambda/LambdaContext.js +33 -0
  59. package/src/lambda/LambdaFunction.js +308 -0
  60. package/src/lambda/LambdaFunctionPool.js +109 -0
  61. package/src/lambda/__tests__/LambdaContext.test.js +30 -0
  62. package/src/lambda/__tests__/LambdaFunction.test.js +196 -0
  63. package/src/lambda/__tests__/fixtures/Lambda/LambdaFunctionThatReturnsJSONObject.fixture.js +47 -0
  64. package/src/lambda/__tests__/fixtures/Lambda/LambdaFunctionThatReturnsNativeString.fixture.js +46 -0
  65. package/src/lambda/__tests__/fixtures/Lambda/package.json +3 -0
  66. package/src/lambda/__tests__/fixtures/lambdaFunction.fixture.js +145 -0
  67. package/src/lambda/__tests__/fixtures/package.json +3 -0
  68. package/src/lambda/__tests__/routes/invocations/InvocationsController.test.js +42 -0
  69. package/src/lambda/handler-runner/HandlerRunner.js +136 -0
  70. package/src/lambda/handler-runner/child-process-runner/ChildProcessRunner.js +72 -0
  71. package/src/lambda/handler-runner/child-process-runner/childProcessHelper.js +42 -0
  72. package/src/lambda/handler-runner/child-process-runner/index.js +1 -0
  73. package/src/lambda/handler-runner/docker-runner/DockerContainer.js +417 -0
  74. package/src/lambda/handler-runner/docker-runner/DockerImage.js +35 -0
  75. package/src/lambda/handler-runner/docker-runner/DockerRunner.js +63 -0
  76. package/src/lambda/handler-runner/docker-runner/index.js +1 -0
  77. package/src/lambda/handler-runner/go-runner/GoRunner.js +166 -0
  78. package/src/lambda/handler-runner/go-runner/index.js +1 -0
  79. package/src/lambda/handler-runner/in-process-runner/InProcessRunner.js +125 -0
  80. package/src/lambda/handler-runner/in-process-runner/index.js +1 -0
  81. package/src/lambda/handler-runner/index.js +1 -0
  82. package/src/lambda/handler-runner/java-runner/JavaRunner.js +114 -0
  83. package/src/lambda/handler-runner/java-runner/index.js +1 -0
  84. package/src/lambda/handler-runner/python-runner/PythonRunner.js +138 -0
  85. package/src/lambda/handler-runner/python-runner/index.js +1 -0
  86. package/{dist → src}/lambda/handler-runner/python-runner/invoke.py +0 -0
  87. package/src/lambda/handler-runner/ruby-runner/RubyRunner.js +107 -0
  88. package/src/lambda/handler-runner/ruby-runner/index.js +1 -0
  89. package/{dist → src}/lambda/handler-runner/ruby-runner/invoke.rb +0 -0
  90. package/src/lambda/handler-runner/worker-thread-runner/WorkerThreadRunner.js +70 -0
  91. package/src/lambda/handler-runner/worker-thread-runner/index.js +1 -0
  92. package/src/lambda/handler-runner/worker-thread-runner/workerThreadHelper.js +29 -0
  93. package/src/lambda/index.js +1 -0
  94. package/src/lambda/routes/index.js +2 -0
  95. package/src/lambda/routes/invocations/InvocationsController.js +102 -0
  96. package/src/lambda/routes/invocations/index.js +1 -0
  97. package/src/lambda/routes/invocations/invocationsRoute.js +77 -0
  98. package/src/lambda/routes/invoke-async/InvokeAsyncController.js +20 -0
  99. package/src/lambda/routes/invoke-async/index.js +1 -0
  100. package/src/lambda/routes/invoke-async/invokeAsyncRoute.js +33 -0
  101. package/src/utils/__tests__/createUniqueId.test.js +18 -0
  102. package/src/utils/__tests__/formatToClfTime.test.js +14 -0
  103. package/src/utils/__tests__/generateHapiPath.test.js +46 -0
  104. package/src/utils/__tests__/lowerCaseKeys.test.js +30 -0
  105. package/src/utils/__tests__/parseHeaders.test.js +13 -0
  106. package/src/utils/__tests__/parseMultiValueHeaders.test.js +24 -0
  107. package/src/utils/__tests__/parseMultiValueQueryStringParameters.test.js +159 -0
  108. package/src/utils/__tests__/parseQueryStringParameters.test.js +15 -0
  109. package/src/utils/__tests__/splitHandlerPathAndName.test.js +54 -0
  110. package/src/utils/__tests__/unflatten.test.js +32 -0
  111. package/src/utils/checkDockerDaemon.js +19 -0
  112. package/src/utils/checkGoVersion.js +16 -0
  113. package/src/utils/createApiKey.js +5 -0
  114. package/src/utils/createUniqueId.js +5 -0
  115. package/src/utils/detectExecutable.js +11 -0
  116. package/{dist → src}/utils/formatToClfTime.js +6 -14
  117. package/src/utils/generateHapiPath.js +26 -0
  118. package/src/utils/getHttpApiCorsConfig.js +28 -0
  119. package/src/utils/index.js +42 -0
  120. package/src/utils/jsonPath.js +13 -0
  121. package/src/utils/logRoutes.js +64 -0
  122. package/src/utils/lowerCaseKeys.js +6 -0
  123. package/src/utils/parseHeaders.js +14 -0
  124. package/src/utils/parseMultiValueHeaders.js +27 -0
  125. package/src/utils/parseMultiValueQueryStringParameters.js +31 -0
  126. package/src/utils/parseQueryStringParameters.js +15 -0
  127. package/src/utils/resolveJoins.js +29 -0
  128. package/src/utils/splitHandlerPathAndName.js +31 -0
  129. package/src/utils/unflatten.js +11 -0
  130. package/CHANGELOG.md +0 -78
  131. package/dist/ServerlessOffline.js +0 -508
  132. package/dist/config/commandOptions.js +0 -149
  133. package/dist/config/constants.js +0 -30
  134. package/dist/config/index.js +0 -55
  135. package/dist/config/supportedRuntimes.js +0 -40
  136. package/dist/debugLog.js +0 -12
  137. package/dist/events/authCanExecuteResource.js +0 -35
  138. package/dist/events/authFunctionNameExtractor.js +0 -87
  139. package/dist/events/authMatchPolicyResource.js +0 -62
  140. package/dist/events/authValidateContext.js +0 -53
  141. package/dist/events/http/Endpoint.js +0 -173
  142. package/dist/events/http/Http.js +0 -77
  143. package/dist/events/http/HttpEventDefinition.js +0 -36
  144. package/dist/events/http/HttpServer.js +0 -1370
  145. package/dist/events/http/OfflineEndpoint.js +0 -38
  146. package/dist/events/http/authJWTSettingsExtractor.js +0 -76
  147. package/dist/events/http/createAuthScheme.js +0 -184
  148. package/dist/events/http/createJWTAuthScheme.js +0 -159
  149. package/dist/events/http/index.js +0 -15
  150. package/dist/events/http/javaHelpers.js +0 -99
  151. package/dist/events/http/lambda-events/LambdaIntegrationEvent.js +0 -87
  152. package/dist/events/http/lambda-events/LambdaProxyIntegrationEvent.js +0 -246
  153. package/dist/events/http/lambda-events/LambdaProxyIntegrationEventV2.js +0 -225
  154. package/dist/events/http/lambda-events/VelocityContext.js +0 -170
  155. package/dist/events/http/lambda-events/index.js +0 -39
  156. package/dist/events/http/lambda-events/renderVelocityTemplateObject.js +0 -111
  157. package/dist/events/http/payloadSchemaValidator.js +0 -13
  158. package/dist/events/schedule/Schedule.js +0 -183
  159. package/dist/events/schedule/ScheduleEvent.js +0 -27
  160. package/dist/events/schedule/ScheduleEventDefinition.js +0 -36
  161. package/dist/events/schedule/index.js +0 -15
  162. package/dist/events/websocket/HttpServer.js +0 -114
  163. package/dist/events/websocket/WebSocket.js +0 -78
  164. package/dist/events/websocket/WebSocketClients.js +0 -577
  165. package/dist/events/websocket/WebSocketEventDefinition.js +0 -32
  166. package/dist/events/websocket/WebSocketServer.js +0 -139
  167. package/dist/events/websocket/http-routes/_catchAll/catchAllRoute.js +0 -33
  168. package/dist/events/websocket/http-routes/_catchAll/index.js +0 -15
  169. package/dist/events/websocket/http-routes/connections/ConnectionsController.js +0 -45
  170. package/dist/events/websocket/http-routes/connections/connectionsRoutes.js +0 -95
  171. package/dist/events/websocket/http-routes/connections/index.js +0 -15
  172. package/dist/events/websocket/http-routes/index.js +0 -23
  173. package/dist/events/websocket/index.js +0 -15
  174. package/dist/events/websocket/lambda-events/WebSocketAuthorizerEvent.js +0 -99
  175. package/dist/events/websocket/lambda-events/WebSocketConnectEvent.js +0 -101
  176. package/dist/events/websocket/lambda-events/WebSocketDisconnectEvent.js +0 -47
  177. package/dist/events/websocket/lambda-events/WebSocketEvent.js +0 -54
  178. package/dist/events/websocket/lambda-events/WebSocketRequestContext.js +0 -98
  179. package/dist/events/websocket/lambda-events/index.js +0 -39
  180. package/dist/index.js +0 -15
  181. package/dist/lambda/HttpServer.js +0 -124
  182. package/dist/lambda/Lambda.js +0 -117
  183. package/dist/lambda/LambdaContext.js +0 -53
  184. package/dist/lambda/LambdaFunction.js +0 -390
  185. package/dist/lambda/LambdaFunctionPool.js +0 -127
  186. package/dist/lambda/handler-runner/HandlerRunner.js +0 -195
  187. package/dist/lambda/handler-runner/child-process-runner/ChildProcessRunner.js +0 -124
  188. package/dist/lambda/handler-runner/child-process-runner/childProcessHelper.js +0 -49
  189. package/dist/lambda/handler-runner/child-process-runner/index.js +0 -15
  190. package/dist/lambda/handler-runner/docker-runner/DockerContainer.js +0 -515
  191. package/dist/lambda/handler-runner/docker-runner/DockerImage.js +0 -67
  192. package/dist/lambda/handler-runner/docker-runner/DockerRunner.js +0 -74
  193. package/dist/lambda/handler-runner/docker-runner/index.js +0 -15
  194. package/dist/lambda/handler-runner/go-runner/GoRunner.js +0 -230
  195. package/dist/lambda/handler-runner/go-runner/index.js +0 -15
  196. package/dist/lambda/handler-runner/in-process-runner/InProcessRunner.js +0 -228
  197. package/dist/lambda/handler-runner/in-process-runner/index.js +0 -15
  198. package/dist/lambda/handler-runner/index.js +0 -15
  199. package/dist/lambda/handler-runner/java-runner/JavaRunner.js +0 -153
  200. package/dist/lambda/handler-runner/java-runner/index.js +0 -15
  201. package/dist/lambda/handler-runner/python-runner/PythonRunner.js +0 -185
  202. package/dist/lambda/handler-runner/python-runner/index.js +0 -15
  203. package/dist/lambda/handler-runner/ruby-runner/RubyRunner.js +0 -147
  204. package/dist/lambda/handler-runner/ruby-runner/index.js +0 -15
  205. package/dist/lambda/handler-runner/worker-thread-runner/WorkerThreadRunner.js +0 -92
  206. package/dist/lambda/handler-runner/worker-thread-runner/index.js +0 -15
  207. package/dist/lambda/handler-runner/worker-thread-runner/workerThreadHelper.js +0 -31
  208. package/dist/lambda/index.js +0 -15
  209. package/dist/lambda/routes/index.js +0 -23
  210. package/dist/lambda/routes/invocations/InvocationsController.js +0 -142
  211. package/dist/lambda/routes/invocations/index.js +0 -15
  212. package/dist/lambda/routes/invocations/invocationsRoute.js +0 -90
  213. package/dist/lambda/routes/invoke-async/InvokeAsyncController.js +0 -38
  214. package/dist/lambda/routes/invoke-async/index.js +0 -15
  215. package/dist/lambda/routes/invoke-async/invokeAsyncRoute.js +0 -43
  216. package/dist/main.js +0 -11
  217. package/dist/serverlessLog.js +0 -91
  218. package/dist/utils/checkDockerDaemon.js +0 -27
  219. package/dist/utils/checkGoVersion.js +0 -27
  220. package/dist/utils/createApiKey.js +0 -12
  221. package/dist/utils/createUniqueId.js +0 -14
  222. package/dist/utils/detectExecutable.js +0 -21
  223. package/dist/utils/generateHapiPath.js +0 -28
  224. package/dist/utils/getHttpApiCorsConfig.js +0 -40
  225. package/dist/utils/index.js +0 -165
  226. package/dist/utils/jsonPath.js +0 -21
  227. package/dist/utils/lowerCaseKeys.js +0 -14
  228. package/dist/utils/parseHeaders.js +0 -23
  229. package/dist/utils/parseMultiValueHeaders.js +0 -36
  230. package/dist/utils/parseMultiValueQueryStringParameters.js +0 -40
  231. package/dist/utils/parseQueryStringParameters.js +0 -26
  232. package/dist/utils/resolveJoins.js +0 -36
  233. package/dist/utils/satisfiesVersionRange.js +0 -20
  234. package/dist/utils/splitHandlerPathAndName.js +0 -37
  235. package/dist/utils/unflatten.js +0 -18
@@ -1,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;