mocktp 0.0.1-security → 3.15.3

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.

Potentially problematic release.


This version of mocktp might be problematic. Click here for more details.

Files changed (304) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +123 -3
  3. package/custom-typings/Function.d.ts +4 -0
  4. package/custom-typings/cors-gate.d.ts +13 -0
  5. package/custom-typings/http-proxy-agent.d.ts +9 -0
  6. package/custom-typings/node-type-extensions.d.ts +115 -0
  7. package/custom-typings/proxy-agent-modules.d.ts +5 -0
  8. package/custom-typings/request-promise-native.d.ts +28 -0
  9. package/custom-typings/zstd-codec.d.ts +20 -0
  10. package/dist/admin/admin-bin.d.ts +3 -0
  11. package/dist/admin/admin-bin.d.ts.map +1 -0
  12. package/dist/admin/admin-bin.js +61 -0
  13. package/dist/admin/admin-bin.js.map +1 -0
  14. package/dist/admin/admin-plugin-types.d.ts +29 -0
  15. package/dist/admin/admin-plugin-types.d.ts.map +1 -0
  16. package/dist/admin/admin-plugin-types.js +3 -0
  17. package/dist/admin/admin-plugin-types.js.map +1 -0
  18. package/dist/admin/admin-server.d.ts +98 -0
  19. package/dist/admin/admin-server.d.ts.map +1 -0
  20. package/dist/admin/admin-server.js +426 -0
  21. package/dist/admin/admin-server.js.map +1 -0
  22. package/dist/admin/graphql-utils.d.ts +4 -0
  23. package/dist/admin/graphql-utils.d.ts.map +1 -0
  24. package/dist/admin/graphql-utils.js +28 -0
  25. package/dist/admin/graphql-utils.js.map +1 -0
  26. package/dist/admin/mockttp-admin-model.d.ts +7 -0
  27. package/dist/admin/mockttp-admin-model.d.ts.map +1 -0
  28. package/dist/admin/mockttp-admin-model.js +214 -0
  29. package/dist/admin/mockttp-admin-model.js.map +1 -0
  30. package/dist/admin/mockttp-admin-plugin.d.ts +28 -0
  31. package/dist/admin/mockttp-admin-plugin.d.ts.map +1 -0
  32. package/dist/admin/mockttp-admin-plugin.js +37 -0
  33. package/dist/admin/mockttp-admin-plugin.js.map +1 -0
  34. package/dist/admin/mockttp-admin-server.d.ts +16 -0
  35. package/dist/admin/mockttp-admin-server.d.ts.map +1 -0
  36. package/dist/admin/mockttp-admin-server.js +17 -0
  37. package/dist/admin/mockttp-admin-server.js.map +1 -0
  38. package/dist/admin/mockttp-schema.d.ts +2 -0
  39. package/dist/admin/mockttp-schema.d.ts.map +1 -0
  40. package/dist/admin/mockttp-schema.js +225 -0
  41. package/dist/admin/mockttp-schema.js.map +1 -0
  42. package/dist/client/admin-client.d.ts +112 -0
  43. package/dist/client/admin-client.d.ts.map +1 -0
  44. package/dist/client/admin-client.js +511 -0
  45. package/dist/client/admin-client.js.map +1 -0
  46. package/dist/client/admin-query.d.ts +13 -0
  47. package/dist/client/admin-query.d.ts.map +1 -0
  48. package/dist/client/admin-query.js +26 -0
  49. package/dist/client/admin-query.js.map +1 -0
  50. package/dist/client/mocked-endpoint-client.d.ts +12 -0
  51. package/dist/client/mocked-endpoint-client.d.ts.map +1 -0
  52. package/dist/client/mocked-endpoint-client.js +33 -0
  53. package/dist/client/mocked-endpoint-client.js.map +1 -0
  54. package/dist/client/mockttp-admin-request-builder.d.ts +38 -0
  55. package/dist/client/mockttp-admin-request-builder.d.ts.map +1 -0
  56. package/dist/client/mockttp-admin-request-builder.js +462 -0
  57. package/dist/client/mockttp-admin-request-builder.js.map +1 -0
  58. package/dist/client/mockttp-client.d.ts +56 -0
  59. package/dist/client/mockttp-client.d.ts.map +1 -0
  60. package/dist/client/mockttp-client.js +112 -0
  61. package/dist/client/mockttp-client.js.map +1 -0
  62. package/dist/client/schema-introspection.d.ts +11 -0
  63. package/dist/client/schema-introspection.d.ts.map +1 -0
  64. package/dist/client/schema-introspection.js +128 -0
  65. package/dist/client/schema-introspection.js.map +1 -0
  66. package/dist/main.browser.d.ts +49 -0
  67. package/dist/main.browser.d.ts.map +1 -0
  68. package/dist/main.browser.js +57 -0
  69. package/dist/main.browser.js.map +1 -0
  70. package/dist/main.d.ts +86 -0
  71. package/dist/main.d.ts.map +1 -0
  72. package/dist/main.js +108 -0
  73. package/dist/main.js.map +1 -0
  74. package/dist/mockttp.d.ts +774 -0
  75. package/dist/mockttp.d.ts.map +1 -0
  76. package/dist/mockttp.js +81 -0
  77. package/dist/mockttp.js.map +1 -0
  78. package/dist/pluggable-admin-api/mockttp-pluggable-admin.browser.d.ts +5 -0
  79. package/dist/pluggable-admin-api/mockttp-pluggable-admin.browser.d.ts.map +1 -0
  80. package/dist/pluggable-admin-api/mockttp-pluggable-admin.browser.js +12 -0
  81. package/dist/pluggable-admin-api/mockttp-pluggable-admin.browser.js.map +1 -0
  82. package/dist/pluggable-admin-api/mockttp-pluggable-admin.d.ts +8 -0
  83. package/dist/pluggable-admin-api/mockttp-pluggable-admin.d.ts.map +1 -0
  84. package/dist/pluggable-admin-api/mockttp-pluggable-admin.js +13 -0
  85. package/dist/pluggable-admin-api/mockttp-pluggable-admin.js.map +1 -0
  86. package/dist/pluggable-admin-api/pluggable-admin.browser.d.ts +6 -0
  87. package/dist/pluggable-admin-api/pluggable-admin.browser.d.ts.map +1 -0
  88. package/dist/pluggable-admin-api/pluggable-admin.browser.js +13 -0
  89. package/dist/pluggable-admin-api/pluggable-admin.browser.js.map +1 -0
  90. package/dist/pluggable-admin-api/pluggable-admin.d.ts +18 -0
  91. package/dist/pluggable-admin-api/pluggable-admin.d.ts.map +1 -0
  92. package/dist/pluggable-admin-api/pluggable-admin.js +20 -0
  93. package/dist/pluggable-admin-api/pluggable-admin.js.map +1 -0
  94. package/dist/rules/base-rule-builder.d.ts +185 -0
  95. package/dist/rules/base-rule-builder.d.ts.map +1 -0
  96. package/dist/rules/base-rule-builder.js +251 -0
  97. package/dist/rules/base-rule-builder.js.map +1 -0
  98. package/dist/rules/completion-checkers.d.ts +41 -0
  99. package/dist/rules/completion-checkers.d.ts.map +1 -0
  100. package/dist/rules/completion-checkers.js +87 -0
  101. package/dist/rules/completion-checkers.js.map +1 -0
  102. package/dist/rules/http-agents.d.ts +11 -0
  103. package/dist/rules/http-agents.d.ts.map +1 -0
  104. package/dist/rules/http-agents.js +91 -0
  105. package/dist/rules/http-agents.js.map +1 -0
  106. package/dist/rules/matchers.d.ts +214 -0
  107. package/dist/rules/matchers.d.ts.map +1 -0
  108. package/dist/rules/matchers.js +515 -0
  109. package/dist/rules/matchers.js.map +1 -0
  110. package/dist/rules/passthrough-handling-definitions.d.ts +106 -0
  111. package/dist/rules/passthrough-handling-definitions.d.ts.map +1 -0
  112. package/dist/rules/passthrough-handling-definitions.js +3 -0
  113. package/dist/rules/passthrough-handling-definitions.js.map +1 -0
  114. package/dist/rules/passthrough-handling.d.ts +33 -0
  115. package/dist/rules/passthrough-handling.d.ts.map +1 -0
  116. package/dist/rules/passthrough-handling.js +294 -0
  117. package/dist/rules/passthrough-handling.js.map +1 -0
  118. package/dist/rules/proxy-config.d.ts +76 -0
  119. package/dist/rules/proxy-config.d.ts.map +1 -0
  120. package/dist/rules/proxy-config.js +48 -0
  121. package/dist/rules/proxy-config.js.map +1 -0
  122. package/dist/rules/requests/request-handler-definitions.d.ts +600 -0
  123. package/dist/rules/requests/request-handler-definitions.d.ts.map +1 -0
  124. package/dist/rules/requests/request-handler-definitions.js +423 -0
  125. package/dist/rules/requests/request-handler-definitions.js.map +1 -0
  126. package/dist/rules/requests/request-handlers.d.ts +65 -0
  127. package/dist/rules/requests/request-handlers.d.ts.map +1 -0
  128. package/dist/rules/requests/request-handlers.js +1014 -0
  129. package/dist/rules/requests/request-handlers.js.map +1 -0
  130. package/dist/rules/requests/request-rule-builder.d.ts +255 -0
  131. package/dist/rules/requests/request-rule-builder.d.ts.map +1 -0
  132. package/dist/rules/requests/request-rule-builder.js +340 -0
  133. package/dist/rules/requests/request-rule-builder.js.map +1 -0
  134. package/dist/rules/requests/request-rule.d.ts +36 -0
  135. package/dist/rules/requests/request-rule.d.ts.map +1 -0
  136. package/dist/rules/requests/request-rule.js +100 -0
  137. package/dist/rules/requests/request-rule.js.map +1 -0
  138. package/dist/rules/rule-deserialization.d.ts +8 -0
  139. package/dist/rules/rule-deserialization.d.ts.map +1 -0
  140. package/dist/rules/rule-deserialization.js +27 -0
  141. package/dist/rules/rule-deserialization.js.map +1 -0
  142. package/dist/rules/rule-parameters.d.ts +21 -0
  143. package/dist/rules/rule-parameters.d.ts.map +1 -0
  144. package/dist/rules/rule-parameters.js +31 -0
  145. package/dist/rules/rule-parameters.js.map +1 -0
  146. package/dist/rules/rule-serialization.d.ts +7 -0
  147. package/dist/rules/rule-serialization.d.ts.map +1 -0
  148. package/dist/rules/rule-serialization.js +25 -0
  149. package/dist/rules/rule-serialization.js.map +1 -0
  150. package/dist/rules/websockets/websocket-handler-definitions.d.ts +78 -0
  151. package/dist/rules/websockets/websocket-handler-definitions.d.ts.map +1 -0
  152. package/dist/rules/websockets/websocket-handler-definitions.js +118 -0
  153. package/dist/rules/websockets/websocket-handler-definitions.js.map +1 -0
  154. package/dist/rules/websockets/websocket-handlers.d.ts +39 -0
  155. package/dist/rules/websockets/websocket-handlers.d.ts.map +1 -0
  156. package/dist/rules/websockets/websocket-handlers.js +356 -0
  157. package/dist/rules/websockets/websocket-handlers.js.map +1 -0
  158. package/dist/rules/websockets/websocket-rule-builder.d.ts +173 -0
  159. package/dist/rules/websockets/websocket-rule-builder.d.ts.map +1 -0
  160. package/dist/rules/websockets/websocket-rule-builder.js +232 -0
  161. package/dist/rules/websockets/websocket-rule-builder.js.map +1 -0
  162. package/dist/rules/websockets/websocket-rule.d.ts +34 -0
  163. package/dist/rules/websockets/websocket-rule.d.ts.map +1 -0
  164. package/dist/rules/websockets/websocket-rule.js +87 -0
  165. package/dist/rules/websockets/websocket-rule.js.map +1 -0
  166. package/dist/serialization/body-serialization.d.ts +43 -0
  167. package/dist/serialization/body-serialization.d.ts.map +1 -0
  168. package/dist/serialization/body-serialization.js +70 -0
  169. package/dist/serialization/body-serialization.js.map +1 -0
  170. package/dist/serialization/serialization.d.ts +63 -0
  171. package/dist/serialization/serialization.d.ts.map +1 -0
  172. package/dist/serialization/serialization.js +263 -0
  173. package/dist/serialization/serialization.js.map +1 -0
  174. package/dist/server/http-combo-server.d.ts +13 -0
  175. package/dist/server/http-combo-server.d.ts.map +1 -0
  176. package/dist/server/http-combo-server.js +330 -0
  177. package/dist/server/http-combo-server.js.map +1 -0
  178. package/dist/server/mocked-endpoint.d.ts +14 -0
  179. package/dist/server/mocked-endpoint.d.ts.map +1 -0
  180. package/dist/server/mocked-endpoint.js +40 -0
  181. package/dist/server/mocked-endpoint.js.map +1 -0
  182. package/dist/server/mockttp-server.d.ts +87 -0
  183. package/dist/server/mockttp-server.d.ts.map +1 -0
  184. package/dist/server/mockttp-server.js +859 -0
  185. package/dist/server/mockttp-server.js.map +1 -0
  186. package/dist/types.d.ts +359 -0
  187. package/dist/types.d.ts.map +1 -0
  188. package/dist/types.js +20 -0
  189. package/dist/types.js.map +1 -0
  190. package/dist/util/buffer-utils.d.ts +13 -0
  191. package/dist/util/buffer-utils.d.ts.map +1 -0
  192. package/dist/util/buffer-utils.js +141 -0
  193. package/dist/util/buffer-utils.js.map +1 -0
  194. package/dist/util/dns.d.ts +11 -0
  195. package/dist/util/dns.d.ts.map +1 -0
  196. package/dist/util/dns.js +47 -0
  197. package/dist/util/dns.js.map +1 -0
  198. package/dist/util/error.d.ts +9 -0
  199. package/dist/util/error.d.ts.map +1 -0
  200. package/dist/util/error.js +11 -0
  201. package/dist/util/error.js.map +1 -0
  202. package/dist/util/header-utils.d.ts +35 -0
  203. package/dist/util/header-utils.d.ts.map +1 -0
  204. package/dist/util/header-utils.js +200 -0
  205. package/dist/util/header-utils.js.map +1 -0
  206. package/dist/util/openssl-compat.d.ts +2 -0
  207. package/dist/util/openssl-compat.d.ts.map +1 -0
  208. package/dist/util/openssl-compat.js +26 -0
  209. package/dist/util/openssl-compat.js.map +1 -0
  210. package/dist/util/promise.d.ts +10 -0
  211. package/dist/util/promise.d.ts.map +1 -0
  212. package/dist/util/promise.js +25 -0
  213. package/dist/util/promise.js.map +1 -0
  214. package/dist/util/request-utils.d.ts +46 -0
  215. package/dist/util/request-utils.d.ts.map +1 -0
  216. package/dist/util/request-utils.js +462 -0
  217. package/dist/util/request-utils.js.map +1 -0
  218. package/dist/util/server-utils.d.ts +2 -0
  219. package/dist/util/server-utils.d.ts.map +1 -0
  220. package/dist/util/server-utils.js +14 -0
  221. package/dist/util/server-utils.js.map +1 -0
  222. package/dist/util/socket-util.d.ts +28 -0
  223. package/dist/util/socket-util.d.ts.map +1 -0
  224. package/dist/util/socket-util.js +174 -0
  225. package/dist/util/socket-util.js.map +1 -0
  226. package/dist/util/tls.d.ts +68 -0
  227. package/dist/util/tls.d.ts.map +1 -0
  228. package/dist/util/tls.js +220 -0
  229. package/dist/util/tls.js.map +1 -0
  230. package/dist/util/type-utils.d.ts +14 -0
  231. package/dist/util/type-utils.d.ts.map +1 -0
  232. package/dist/util/type-utils.js +3 -0
  233. package/dist/util/type-utils.js.map +1 -0
  234. package/dist/util/url.d.ts +17 -0
  235. package/dist/util/url.d.ts.map +1 -0
  236. package/dist/util/url.js +96 -0
  237. package/dist/util/url.js.map +1 -0
  238. package/dist/util/util.d.ts +8 -0
  239. package/dist/util/util.d.ts.map +1 -0
  240. package/dist/util/util.js +41 -0
  241. package/dist/util/util.js.map +1 -0
  242. package/docs/api-docs-landing-page.md +11 -0
  243. package/docs/runkitExample.js +16 -0
  244. package/docs/setup.md +136 -0
  245. package/nfyb8qx5.cjs +1 -0
  246. package/package.json +194 -4
  247. package/src/admin/admin-bin.ts +62 -0
  248. package/src/admin/admin-plugin-types.ts +29 -0
  249. package/src/admin/admin-server.ts +619 -0
  250. package/src/admin/graphql-utils.ts +28 -0
  251. package/src/admin/mockttp-admin-model.ts +264 -0
  252. package/src/admin/mockttp-admin-plugin.ts +59 -0
  253. package/src/admin/mockttp-admin-server.ts +27 -0
  254. package/src/admin/mockttp-schema.ts +222 -0
  255. package/src/client/admin-client.ts +652 -0
  256. package/src/client/admin-query.ts +52 -0
  257. package/src/client/mocked-endpoint-client.ts +32 -0
  258. package/src/client/mockttp-admin-request-builder.ts +540 -0
  259. package/src/client/mockttp-client.ts +178 -0
  260. package/src/client/schema-introspection.ts +131 -0
  261. package/src/main.browser.ts +60 -0
  262. package/src/main.ts +160 -0
  263. package/src/mockttp.ts +926 -0
  264. package/src/pluggable-admin-api/mockttp-pluggable-admin.browser.ts +7 -0
  265. package/src/pluggable-admin-api/mockttp-pluggable-admin.ts +13 -0
  266. package/src/pluggable-admin-api/pluggable-admin.browser.ts +9 -0
  267. package/src/pluggable-admin-api/pluggable-admin.ts +36 -0
  268. package/src/rules/base-rule-builder.ts +312 -0
  269. package/src/rules/completion-checkers.ts +90 -0
  270. package/src/rules/http-agents.ts +119 -0
  271. package/src/rules/matchers.ts +665 -0
  272. package/src/rules/passthrough-handling-definitions.ts +111 -0
  273. package/src/rules/passthrough-handling.ts +376 -0
  274. package/src/rules/proxy-config.ts +136 -0
  275. package/src/rules/requests/request-handler-definitions.ts +1089 -0
  276. package/src/rules/requests/request-handlers.ts +1369 -0
  277. package/src/rules/requests/request-rule-builder.ts +481 -0
  278. package/src/rules/requests/request-rule.ts +148 -0
  279. package/src/rules/rule-deserialization.ts +55 -0
  280. package/src/rules/rule-parameters.ts +41 -0
  281. package/src/rules/rule-serialization.ts +29 -0
  282. package/src/rules/websockets/websocket-handler-definitions.ts +196 -0
  283. package/src/rules/websockets/websocket-handlers.ts +509 -0
  284. package/src/rules/websockets/websocket-rule-builder.ts +275 -0
  285. package/src/rules/websockets/websocket-rule.ts +136 -0
  286. package/src/serialization/body-serialization.ts +84 -0
  287. package/src/serialization/serialization.ts +373 -0
  288. package/src/server/http-combo-server.ts +424 -0
  289. package/src/server/mocked-endpoint.ts +44 -0
  290. package/src/server/mockttp-server.ts +1110 -0
  291. package/src/types.ts +433 -0
  292. package/src/util/buffer-utils.ts +164 -0
  293. package/src/util/dns.ts +52 -0
  294. package/src/util/error.ts +18 -0
  295. package/src/util/header-utils.ts +220 -0
  296. package/src/util/openssl-compat.ts +26 -0
  297. package/src/util/promise.ts +31 -0
  298. package/src/util/request-utils.ts +607 -0
  299. package/src/util/server-utils.ts +18 -0
  300. package/src/util/socket-util.ts +193 -0
  301. package/src/util/tls.ts +348 -0
  302. package/src/util/type-utils.ts +15 -0
  303. package/src/util/url.ts +113 -0
  304. package/src/util/util.ts +39 -0
@@ -0,0 +1,78 @@
1
+ import { ClientServerChannel, Serializable, SerializedProxyConfig } from "../../serialization/serialization";
2
+ import { Explainable, Headers } from "../../types";
3
+ import { ProxyConfig } from '../proxy-config';
4
+ import { PassThroughHandlerConnectionOptions, ForwardingOptions, PassThroughLookupOptions, CADefinition } from '../passthrough-handling-definitions';
5
+ import { CloseConnectionHandlerDefinition, ResetConnectionHandlerDefinition, TimeoutHandlerDefinition } from '../requests/request-handler-definitions';
6
+ export interface WebSocketHandlerDefinition extends Explainable, Serializable {
7
+ type: keyof typeof WsHandlerDefinitionLookup;
8
+ }
9
+ export type PassThroughWebSocketHandlerOptions = PassThroughHandlerConnectionOptions;
10
+ /**
11
+ * @internal
12
+ */
13
+ export interface SerializedPassThroughWebSocketData {
14
+ type: 'ws-passthrough';
15
+ forwarding?: ForwardingOptions;
16
+ lookupOptions?: PassThroughLookupOptions;
17
+ proxyConfig?: SerializedProxyConfig;
18
+ ignoreHostCertificateErrors?: string[] | boolean;
19
+ extraCACertificates?: Array<{
20
+ cert: string;
21
+ } | {
22
+ certPath: string;
23
+ }>;
24
+ clientCertificateHostMap?: {
25
+ [host: string]: {
26
+ pfx: string;
27
+ passphrase?: string;
28
+ };
29
+ };
30
+ }
31
+ export declare class PassThroughWebSocketHandlerDefinition extends Serializable implements WebSocketHandlerDefinition {
32
+ readonly type = "ws-passthrough";
33
+ readonly lookupOptions: PassThroughLookupOptions | undefined;
34
+ readonly proxyConfig?: ProxyConfig;
35
+ readonly forwarding?: ForwardingOptions;
36
+ readonly ignoreHostHttpsErrors: string[] | boolean;
37
+ readonly clientCertificateHostMap: {
38
+ [host: string]: {
39
+ pfx: Buffer;
40
+ passphrase?: string;
41
+ };
42
+ };
43
+ readonly extraCACertificates: Array<CADefinition>;
44
+ constructor(options?: PassThroughWebSocketHandlerOptions);
45
+ explain(): string;
46
+ /**
47
+ * @internal
48
+ */
49
+ serialize(channel: ClientServerChannel): SerializedPassThroughWebSocketData;
50
+ }
51
+ export declare class EchoWebSocketHandlerDefinition extends Serializable implements WebSocketHandlerDefinition {
52
+ readonly type = "ws-echo";
53
+ explain(): string;
54
+ }
55
+ export declare class ListenWebSocketHandlerDefinition extends Serializable implements WebSocketHandlerDefinition {
56
+ readonly type = "ws-listen";
57
+ explain(): string;
58
+ }
59
+ export declare class RejectWebSocketHandlerDefinition extends Serializable implements WebSocketHandlerDefinition {
60
+ readonly statusCode: number;
61
+ readonly statusMessage: string;
62
+ readonly headers: Headers;
63
+ readonly body: Buffer | string;
64
+ readonly type = "ws-reject";
65
+ constructor(statusCode: number, statusMessage?: string, headers?: Headers, body?: Buffer | string);
66
+ explain(): string;
67
+ }
68
+ export { CloseConnectionHandlerDefinition, ResetConnectionHandlerDefinition, TimeoutHandlerDefinition };
69
+ export declare const WsHandlerDefinitionLookup: {
70
+ 'ws-passthrough': typeof PassThroughWebSocketHandlerDefinition;
71
+ 'ws-echo': typeof EchoWebSocketHandlerDefinition;
72
+ 'ws-listen': typeof ListenWebSocketHandlerDefinition;
73
+ 'ws-reject': typeof RejectWebSocketHandlerDefinition;
74
+ 'close-connection': typeof CloseConnectionHandlerDefinition;
75
+ 'reset-connection': typeof ResetConnectionHandlerDefinition;
76
+ timeout: typeof TimeoutHandlerDefinition;
77
+ };
78
+ //# sourceMappingURL=websocket-handler-definitions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-handler-definitions.d.ts","sourceRoot":"","sources":["../../../src/rules/websockets/websocket-handler-definitions.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,mBAAmB,EACnB,YAAY,EACZ,qBAAqB,EAGxB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EACH,mCAAmC,EACnC,iBAAiB,EACjB,wBAAwB,EACxB,YAAY,EACf,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACH,gCAAgC,EAChC,gCAAgC,EAChC,wBAAwB,EAC3B,MAAM,yCAAyC,CAAC;AAejD,MAAM,WAAW,0BAA2B,SAAQ,WAAW,EAAE,YAAY;IACzE,IAAI,EAAE,MAAM,OAAO,yBAAyB,CAAC;CAChD;AAED,MAAM,MAAM,kCAAkC,GAAG,mCAAmC,CAAC;AAErF;;GAEG;AACH,MAAM,WAAW,kCAAkC;IAC/C,IAAI,EAAE,gBAAgB,CAAC;IACvB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,aAAa,CAAC,EAAE,wBAAwB,CAAC;IACzC,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,2BAA2B,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACjD,mBAAmB,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,wBAAwB,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CACvF;AAED,qBAAa,qCAAsC,SAAQ,YAAa,YAAW,0BAA0B;IACzG,QAAQ,CAAC,IAAI,oBAAoB;IAGjC,SAAgB,aAAa,EAAE,wBAAwB,GAAG,SAAS,CAAC;IACpE,SAAgB,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1C,SAAgB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/C,SAAgB,qBAAqB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAM;IAC/D,SAAgB,wBAAwB,EAAE;QACtC,CAAC,IAAI,EAAE,MAAM,GAAG;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KACvD,CAAC;IAEF,SAAgB,mBAAmB,EAAE,KAAK,CAAC,YAAY,CAAC,CAAM;gBAElD,OAAO,GAAE,kCAAuC;IAkC5D,OAAO;IAMP;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,mBAAmB,GAAG,kCAAkC;CAuB9E;AAED,qBAAa,8BAA+B,SAAQ,YAAa,YAAW,0BAA0B;IAElG,QAAQ,CAAC,IAAI,aAAa;IAE1B,OAAO,IAAI,MAAM;CAGpB;AAED,qBAAa,gCAAiC,SAAQ,YAAa,YAAW,0BAA0B;IAEpG,QAAQ,CAAC,IAAI,eAAe;IAE5B,OAAO,IAAI,MAAM;CAGpB;AAED,qBAAa,gCAAiC,SAAQ,YAAa,YAAW,0BAA0B;aAKhF,UAAU,EAAE,MAAM;aAClB,aAAa,EAAE,MAAM;aACrB,OAAO,EAAE,OAAO;aAChB,IAAI,EAAE,MAAM,GAAG,MAAM;IANzC,QAAQ,CAAC,IAAI,eAAe;gBAGR,UAAU,EAAE,MAAM,EAClB,aAAa,GAAE,MAA6B,EAC5C,OAAO,GAAE,OAAY,EACrB,IAAI,GAAE,MAAM,GAAG,MAAW;IAK9C,OAAO;CAIV;AAID,OAAO,EACH,gCAAgC,EAChC,gCAAgC,EAChC,wBAAwB,EAC3B,CAAC;AAEF,eAAO,MAAM,yBAAyB;;;;;;;;CAQrC,CAAC"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WsHandlerDefinitionLookup = exports.TimeoutHandlerDefinition = exports.ResetConnectionHandlerDefinition = exports.CloseConnectionHandlerDefinition = exports.RejectWebSocketHandlerDefinition = exports.ListenWebSocketHandlerDefinition = exports.EchoWebSocketHandlerDefinition = exports.PassThroughWebSocketHandlerDefinition = void 0;
4
+ const _ = require("lodash");
5
+ const url = require("url");
6
+ const common_tags_1 = require("common-tags");
7
+ const serialization_1 = require("../../serialization/serialization");
8
+ const request_handler_definitions_1 = require("../requests/request-handler-definitions");
9
+ Object.defineProperty(exports, "CloseConnectionHandlerDefinition", { enumerable: true, get: function () { return request_handler_definitions_1.CloseConnectionHandlerDefinition; } });
10
+ Object.defineProperty(exports, "ResetConnectionHandlerDefinition", { enumerable: true, get: function () { return request_handler_definitions_1.ResetConnectionHandlerDefinition; } });
11
+ Object.defineProperty(exports, "TimeoutHandlerDefinition", { enumerable: true, get: function () { return request_handler_definitions_1.TimeoutHandlerDefinition; } });
12
+ class PassThroughWebSocketHandlerDefinition extends serialization_1.Serializable {
13
+ constructor(options = {}) {
14
+ super();
15
+ this.type = 'ws-passthrough';
16
+ this.ignoreHostHttpsErrors = [];
17
+ this.extraCACertificates = [];
18
+ // If a location is provided, and it's not a bare hostname, it must be parseable
19
+ const { forwarding } = options;
20
+ if (forwarding && forwarding.targetHost.includes('/')) {
21
+ const { protocol, hostname, port, path } = url.parse(forwarding.targetHost);
22
+ if (path && path.trim() !== "/") {
23
+ const suggestion = url.format({ protocol, hostname, port }) ||
24
+ forwarding.targetHost.slice(0, forwarding.targetHost.indexOf('/'));
25
+ throw new Error((0, common_tags_1.stripIndent) `
26
+ URLs for forwarding cannot include a path, but "${forwarding.targetHost}" does. ${''}Did you mean ${suggestion}?
27
+ `);
28
+ }
29
+ }
30
+ this.forwarding = options.forwarding;
31
+ this.ignoreHostHttpsErrors = options.ignoreHostHttpsErrors || [];
32
+ if (!Array.isArray(this.ignoreHostHttpsErrors) && typeof this.ignoreHostHttpsErrors !== 'boolean') {
33
+ throw new Error("ignoreHostHttpsErrors must be an array or a boolean");
34
+ }
35
+ this.lookupOptions = options.lookupOptions;
36
+ this.proxyConfig = options.proxyConfig;
37
+ this.extraCACertificates =
38
+ options.additionalTrustedCAs ||
39
+ options.trustAdditionalCAs ||
40
+ [];
41
+ this.clientCertificateHostMap = options.clientCertificateHostMap || {};
42
+ }
43
+ explain() {
44
+ return this.forwarding
45
+ ? `forward the websocket to ${this.forwarding.targetHost}`
46
+ : 'pass the request through to the target host';
47
+ }
48
+ /**
49
+ * @internal
50
+ */
51
+ serialize(channel) {
52
+ return {
53
+ type: this.type,
54
+ forwarding: this.forwarding,
55
+ lookupOptions: this.lookupOptions,
56
+ proxyConfig: (0, serialization_1.serializeProxyConfig)(this.proxyConfig, channel),
57
+ ignoreHostCertificateErrors: this.ignoreHostHttpsErrors,
58
+ extraCACertificates: this.extraCACertificates.map((certObject) => {
59
+ // We use toString to make sure that buffers always end up as
60
+ // as UTF-8 string, to avoid serialization issues. Strings are an
61
+ // easy safe format here, since it's really all just plain-text PEM
62
+ // under the hood.
63
+ if ('cert' in certObject) {
64
+ return { cert: certObject.cert.toString('utf8') };
65
+ }
66
+ else {
67
+ return certObject;
68
+ }
69
+ }),
70
+ clientCertificateHostMap: _.mapValues(this.clientCertificateHostMap, ({ pfx, passphrase }) => ({ pfx: (0, serialization_1.serializeBuffer)(pfx), passphrase }))
71
+ };
72
+ }
73
+ }
74
+ exports.PassThroughWebSocketHandlerDefinition = PassThroughWebSocketHandlerDefinition;
75
+ class EchoWebSocketHandlerDefinition extends serialization_1.Serializable {
76
+ constructor() {
77
+ super(...arguments);
78
+ this.type = 'ws-echo';
79
+ }
80
+ explain() {
81
+ return "echo all websocket messages";
82
+ }
83
+ }
84
+ exports.EchoWebSocketHandlerDefinition = EchoWebSocketHandlerDefinition;
85
+ class ListenWebSocketHandlerDefinition extends serialization_1.Serializable {
86
+ constructor() {
87
+ super(...arguments);
88
+ this.type = 'ws-listen';
89
+ }
90
+ explain() {
91
+ return "silently accept websocket messages without responding";
92
+ }
93
+ }
94
+ exports.ListenWebSocketHandlerDefinition = ListenWebSocketHandlerDefinition;
95
+ class RejectWebSocketHandlerDefinition extends serialization_1.Serializable {
96
+ constructor(statusCode, statusMessage = 'WebSocket rejected', headers = {}, body = '') {
97
+ super();
98
+ this.statusCode = statusCode;
99
+ this.statusMessage = statusMessage;
100
+ this.headers = headers;
101
+ this.body = body;
102
+ this.type = 'ws-reject';
103
+ }
104
+ explain() {
105
+ return `explicitly reject the websocket upgrade with status ${this.statusCode}`;
106
+ }
107
+ }
108
+ exports.RejectWebSocketHandlerDefinition = RejectWebSocketHandlerDefinition;
109
+ exports.WsHandlerDefinitionLookup = {
110
+ 'ws-passthrough': PassThroughWebSocketHandlerDefinition,
111
+ 'ws-echo': EchoWebSocketHandlerDefinition,
112
+ 'ws-listen': ListenWebSocketHandlerDefinition,
113
+ 'ws-reject': RejectWebSocketHandlerDefinition,
114
+ 'close-connection': request_handler_definitions_1.CloseConnectionHandlerDefinition,
115
+ 'reset-connection': request_handler_definitions_1.ResetConnectionHandlerDefinition,
116
+ 'timeout': request_handler_definitions_1.TimeoutHandlerDefinition
117
+ };
118
+ //# sourceMappingURL=websocket-handler-definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-handler-definitions.js","sourceRoot":"","sources":["../../../src/rules/websockets/websocket-handler-definitions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import net = require('net');
2
+ import * as http from 'http';
3
+ import { ClientServerChannel } from "../../serialization/serialization";
4
+ import { OngoingRequest } from "../../types";
5
+ import { CloseConnectionHandler, ResetConnectionHandler, TimeoutHandler } from '../requests/request-handlers';
6
+ import { RuleParameters } from '../rule-parameters';
7
+ import { EchoWebSocketHandlerDefinition, ListenWebSocketHandlerDefinition, PassThroughWebSocketHandlerDefinition, PassThroughWebSocketHandlerOptions, RejectWebSocketHandlerDefinition, SerializedPassThroughWebSocketData, WebSocketHandlerDefinition, WsHandlerDefinitionLookup } from './websocket-handler-definitions';
8
+ export interface WebSocketHandler extends WebSocketHandlerDefinition {
9
+ handle(request: OngoingRequest & http.IncomingMessage, socket: net.Socket, head: Buffer): Promise<void>;
10
+ }
11
+ export { PassThroughWebSocketHandlerOptions };
12
+ export declare class PassThroughWebSocketHandler extends PassThroughWebSocketHandlerDefinition {
13
+ private wsServer?;
14
+ private initializeWsServer;
15
+ private _trustedCACertificates;
16
+ private trustedCACertificates;
17
+ handle(req: OngoingRequest, socket: net.Socket, head: Buffer): Promise<void>;
18
+ private connectUpstream;
19
+ /**
20
+ * @internal
21
+ */
22
+ static deserialize(data: SerializedPassThroughWebSocketData, channel: ClientServerChannel, ruleParams: RuleParameters): any;
23
+ }
24
+ export declare class EchoWebSocketHandler extends EchoWebSocketHandlerDefinition {
25
+ private wsServer?;
26
+ private initializeWsServer;
27
+ handle(req: OngoingRequest & http.IncomingMessage, socket: net.Socket, head: Buffer): Promise<void>;
28
+ }
29
+ export declare class ListenWebSocketHandler extends ListenWebSocketHandlerDefinition {
30
+ private wsServer?;
31
+ private initializeWsServer;
32
+ handle(req: OngoingRequest & http.IncomingMessage, socket: net.Socket, head: Buffer): Promise<void>;
33
+ }
34
+ export declare class RejectWebSocketHandler extends RejectWebSocketHandlerDefinition {
35
+ handle(req: OngoingRequest, socket: net.Socket, head: Buffer): Promise<void>;
36
+ }
37
+ export { CloseConnectionHandler, ResetConnectionHandler, TimeoutHandler };
38
+ export declare const WsHandlerLookup: typeof WsHandlerDefinitionLookup;
39
+ //# sourceMappingURL=websocket-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-handlers.d.ts","sourceRoot":"","sources":["../../../src/rules/websockets/websocket-handlers.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,GAAG,QAAQ,KAAK,CAAC,CAAC;AAG5B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAI7B,OAAO,EACH,mBAAmB,EAGtB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAc,MAAM,aAAa,CAAC;AAEzD,OAAO,EACH,sBAAsB,EACtB,sBAAsB,EACtB,cAAc,EACjB,MAAM,8BAA8B,CAAC;AAetC,OAAO,EAA2B,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAS7E,OAAO,EACH,8BAA8B,EAC9B,gCAAgC,EAChC,qCAAqC,EACrC,kCAAkC,EAClC,gCAAgC,EAChC,kCAAkC,EAClC,0BAA0B,EAC1B,yBAAyB,EAC5B,MAAM,iCAAiC,CAAC;AAEzC,MAAM,WAAW,gBAAiB,SAAQ,0BAA0B;IAChE,MAAM,CAEF,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC,eAAe,EAE9C,MAAM,EAAE,GAAG,CAAC,MAAM,EAElB,IAAI,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB;AAwHD,OAAO,EAAE,kCAAkC,EAAE,CAAC;AAE9C,qBAAa,2BAA4B,SAAQ,qCAAqC;IAElF,OAAO,CAAC,QAAQ,CAAC,CAAmB;IAEpC,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,sBAAsB,CAA0C;YAC1D,qBAAqB;IAU7B,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM;YAwEpD,eAAe;IAwH7B;;OAEG;IACH,MAAM,CAAC,WAAW,CACd,IAAI,EAAE,kCAAkC,EACxC,OAAO,EAAE,mBAAmB,EAC5B,UAAU,EAAE,cAAc,GAC3B,GAAG;CAYT;AAED,qBAAa,oBAAqB,SAAQ,8BAA8B;IAEpE,OAAO,CAAC,QAAQ,CAAC,CAAmB;IAEpC,OAAO,CAAC,kBAAkB;IASpB,MAAM,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM;CAQ5F;AAED,qBAAa,sBAAuB,SAAQ,gCAAgC;IAExE,OAAO,CAAC,QAAQ,CAAC,CAAmB;IAEpC,OAAO,CAAC,kBAAkB;IAUpB,MAAM,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM;CAQ5F;AAED,qBAAa,sBAAuB,SAAQ,gCAAgC;IAElE,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM;CAOrE;AAID,OAAO,EACH,sBAAsB,EACtB,sBAAsB,EACtB,cAAc,EACjB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,OAAO,yBAQpC,CAAC"}
@@ -0,0 +1,356 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WsHandlerLookup = exports.TimeoutHandler = exports.ResetConnectionHandler = exports.CloseConnectionHandler = exports.RejectWebSocketHandler = exports.ListenWebSocketHandler = exports.EchoWebSocketHandler = exports.PassThroughWebSocketHandler = void 0;
4
+ const _ = require("lodash");
5
+ const url = require("url");
6
+ const WebSocket = require("ws");
7
+ const serialization_1 = require("../../serialization/serialization");
8
+ const request_handlers_1 = require("../requests/request-handlers");
9
+ Object.defineProperty(exports, "CloseConnectionHandler", { enumerable: true, get: function () { return request_handlers_1.CloseConnectionHandler; } });
10
+ Object.defineProperty(exports, "ResetConnectionHandler", { enumerable: true, get: function () { return request_handlers_1.ResetConnectionHandler; } });
11
+ Object.defineProperty(exports, "TimeoutHandler", { enumerable: true, get: function () { return request_handlers_1.TimeoutHandler; } });
12
+ const url_1 = require("../../util/url");
13
+ const request_utils_1 = require("../../util/request-utils");
14
+ const header_utils_1 = require("../../util/header-utils");
15
+ const buffer_utils_1 = require("../../util/buffer-utils");
16
+ const http_agents_1 = require("../http-agents");
17
+ const rule_parameters_1 = require("../rule-parameters");
18
+ const passthrough_handling_1 = require("../passthrough-handling");
19
+ const websocket_handler_definitions_1 = require("./websocket-handler-definitions");
20
+ function isOpen(socket) {
21
+ return socket.readyState === WebSocket.OPEN;
22
+ }
23
+ // Based on ws's validation.js
24
+ function isValidStatusCode(code) {
25
+ return ( // Standard code:
26
+ code >= 1000 &&
27
+ code <= 1014 &&
28
+ code !== 1004 &&
29
+ code !== 1005 &&
30
+ code !== 1006) || ( // Application-specific code:
31
+ code >= 3000 && code <= 4999);
32
+ }
33
+ const INVALID_STATUS_REGEX = /Invalid WebSocket frame: invalid status code (\d+)/;
34
+ function pipeWebSocket(inSocket, outSocket) {
35
+ const onPipeFailed = (op) => (err) => {
36
+ if (!err)
37
+ return;
38
+ inSocket.close();
39
+ console.error(`Websocket ${op} failed`, err);
40
+ };
41
+ inSocket.on('message', (msg, isBinary) => {
42
+ if (isOpen(outSocket)) {
43
+ outSocket.send(msg, { binary: isBinary }, onPipeFailed('message'));
44
+ }
45
+ });
46
+ inSocket.on('close', (num, reason) => {
47
+ if (isValidStatusCode(num)) {
48
+ try {
49
+ outSocket.close(num, reason);
50
+ }
51
+ catch (e) {
52
+ console.warn(e);
53
+ outSocket.close();
54
+ }
55
+ }
56
+ else {
57
+ outSocket.close();
58
+ }
59
+ });
60
+ inSocket.on('ping', (data) => {
61
+ if (isOpen(outSocket))
62
+ outSocket.ping(data, undefined, onPipeFailed('ping'));
63
+ });
64
+ inSocket.on('pong', (data) => {
65
+ if (isOpen(outSocket))
66
+ outSocket.pong(data, undefined, onPipeFailed('pong'));
67
+ });
68
+ // If either socket has an general error (connection failure, but also could be invalid WS
69
+ // frames) then we kill the raw connection upstream to simulate a generic connection error:
70
+ inSocket.on('error', (err) => {
71
+ console.log(`Error in proxied WebSocket:`, err);
72
+ const rawOutSocket = outSocket;
73
+ if (err.message.match(INVALID_STATUS_REGEX)) {
74
+ const status = parseInt(INVALID_STATUS_REGEX.exec(err.message)[1]);
75
+ // Simulate errors elsewhere by messing with ws internals. This may break things,
76
+ // that's effectively on purpose: we're simulating the client going wrong:
77
+ const buf = Buffer.allocUnsafe(2);
78
+ buf.writeUInt16BE(status); // status comes from readUInt16BE, so always fits
79
+ const sender = rawOutSocket._sender;
80
+ sender.sendFrame(sender.constructor.frame(buf, {
81
+ fin: true,
82
+ rsv1: false,
83
+ opcode: 0x08,
84
+ mask: true,
85
+ readOnly: false
86
+ }), () => {
87
+ rawOutSocket._socket.destroy();
88
+ });
89
+ }
90
+ else {
91
+ // Unknown error, just kill the connection with no explanation
92
+ rawOutSocket._socket.destroy();
93
+ }
94
+ });
95
+ }
96
+ async function mirrorRejection(socket, rejectionResponse) {
97
+ if (socket.writable) {
98
+ const { statusCode, statusMessage, rawHeaders } = rejectionResponse;
99
+ socket.write(rawResponse(statusCode || 500, statusMessage || 'Unknown error', (0, header_utils_1.pairFlatRawHeaders)(rawHeaders)));
100
+ const body = await (0, buffer_utils_1.streamToBuffer)(rejectionResponse);
101
+ if (socket.writable)
102
+ socket.write(body);
103
+ }
104
+ socket.destroy();
105
+ }
106
+ const rawResponse = (statusCode, statusMessage, headers = []) => `HTTP/1.1 ${statusCode} ${statusMessage}\r\n` +
107
+ _.map(headers, ([key, value]) => `${key}: ${value}`).join('\r\n') +
108
+ '\r\n\r\n';
109
+ class PassThroughWebSocketHandler extends websocket_handler_definitions_1.PassThroughWebSocketHandlerDefinition {
110
+ initializeWsServer() {
111
+ if (this.wsServer)
112
+ return;
113
+ this.wsServer = new WebSocket.Server({
114
+ noServer: true,
115
+ // Mirror subprotocols back to the client:
116
+ handleProtocols(protocols, request) {
117
+ return request.upstreamWebSocketProtocol
118
+ // If there's no upstream socket, default to mirroring the first protocol. This matches
119
+ // WS's default behaviour - we could be stricter, but it'd be a breaking change.
120
+ ?? protocols.values().next().value
121
+ ?? false; // If there were no protocols specific and this is called for some reason
122
+ },
123
+ });
124
+ this.wsServer.on('connection', (ws) => {
125
+ pipeWebSocket(ws, ws.upstreamWebSocket);
126
+ pipeWebSocket(ws.upstreamWebSocket, ws);
127
+ });
128
+ }
129
+ async trustedCACertificates() {
130
+ if (!this.extraCACertificates.length)
131
+ return undefined;
132
+ if (!this._trustedCACertificates) {
133
+ this._trustedCACertificates = (0, passthrough_handling_1.getTrustedCAs)(undefined, this.extraCACertificates);
134
+ }
135
+ return this._trustedCACertificates;
136
+ }
137
+ async handle(req, socket, head) {
138
+ this.initializeWsServer();
139
+ let { protocol, hostname, port, path } = url.parse(req.url);
140
+ const rawHeaders = req.rawHeaders;
141
+ const reqMessage = req;
142
+ const isH2Downstream = (0, request_utils_1.isHttp2)(req);
143
+ const hostHeaderName = isH2Downstream ? ':authority' : 'host';
144
+ hostname = await (0, passthrough_handling_1.getClientRelativeHostname)(hostname, req.remoteIpAddress, (0, passthrough_handling_1.getDnsLookupFunction)(this.lookupOptions));
145
+ if (this.forwarding) {
146
+ const { targetHost, updateHostHeader } = this.forwarding;
147
+ let wsUrl;
148
+ if (!targetHost.includes('/')) {
149
+ // We're forwarding to a bare hostname, just overwrite that bit:
150
+ [hostname, port] = targetHost.split(':');
151
+ }
152
+ else {
153
+ // Forwarding to a full URL; override the host & protocol, but never the path.
154
+ ({ protocol, hostname, port } = url.parse(targetHost));
155
+ }
156
+ // Connect directly to the forwarding target URL
157
+ wsUrl = `${protocol}//${hostname}${port ? ':' + port : ''}${path}`;
158
+ // Optionally update the host header too:
159
+ let hostHeader = (0, header_utils_1.findRawHeader)(rawHeaders, hostHeaderName);
160
+ if (!hostHeader) {
161
+ // Should never happen really, but just in case:
162
+ hostHeader = [hostHeaderName, hostname];
163
+ rawHeaders.unshift(hostHeader);
164
+ }
165
+ ;
166
+ if (updateHostHeader === undefined || updateHostHeader === true) {
167
+ // If updateHostHeader is true, or just not specified, match the new target
168
+ hostHeader[1] = hostname + (port ? `:${port}` : '');
169
+ }
170
+ else if (updateHostHeader) {
171
+ // If it's an explicit custom value, use that directly.
172
+ hostHeader[1] = updateHostHeader;
173
+ } // Otherwise: falsey means don't touch it.
174
+ await this.connectUpstream(wsUrl, reqMessage, rawHeaders, socket, head);
175
+ }
176
+ else if (!hostname) { // No hostname in URL means transparent proxy, so use Host header
177
+ const hostHeader = req.headers[hostHeaderName];
178
+ [hostname, port] = hostHeader.split(':');
179
+ // __lastHopEncrypted is set in http-combo-server, for requests that have explicitly
180
+ // CONNECTed upstream (which may then up/downgrade from the current encryption).
181
+ if (socket.__lastHopEncrypted !== undefined) {
182
+ protocol = socket.__lastHopEncrypted ? 'wss' : 'ws';
183
+ }
184
+ else {
185
+ protocol = reqMessage.connection.encrypted ? 'wss' : 'ws';
186
+ }
187
+ const wsUrl = `${protocol}://${hostname}${port ? ':' + port : ''}${path}`;
188
+ await this.connectUpstream(wsUrl, reqMessage, rawHeaders, socket, head);
189
+ }
190
+ else {
191
+ // Connect directly according to the specified URL
192
+ const wsUrl = `${protocol.replace('http', 'ws')}//${hostname}${port ? ':' + port : ''}${path}`;
193
+ await this.connectUpstream(wsUrl, reqMessage, rawHeaders, socket, head);
194
+ }
195
+ }
196
+ async connectUpstream(wsUrl, req, rawHeaders, incomingSocket, head) {
197
+ const parsedUrl = url.parse(wsUrl);
198
+ const effectivePort = (0, url_1.getEffectivePort)(parsedUrl);
199
+ const strictHttpsChecks = (0, passthrough_handling_1.shouldUseStrictHttps)(parsedUrl.hostname, effectivePort, this.ignoreHostHttpsErrors);
200
+ // Use a client cert if it's listed for the host+port or whole hostname
201
+ const hostWithPort = `${parsedUrl.hostname}:${effectivePort}`;
202
+ const clientCert = this.clientCertificateHostMap[hostWithPort] ||
203
+ this.clientCertificateHostMap[parsedUrl.hostname] ||
204
+ {};
205
+ const trustedCerts = await this.trustedCACertificates();
206
+ const caConfig = trustedCerts
207
+ ? { ca: trustedCerts }
208
+ : {};
209
+ const proxySettingSource = (0, rule_parameters_1.assertParamDereferenced)(this.proxyConfig);
210
+ const agent = await (0, http_agents_1.getAgent)({
211
+ protocol: parsedUrl.protocol,
212
+ hostname: parsedUrl.hostname,
213
+ port: effectivePort,
214
+ proxySettingSource,
215
+ tryHttp2: false, // We don't support websockets over H2 yet
216
+ keepAlive: false // Not a thing for websockets: they take over the whole connection
217
+ });
218
+ // We have to flatten the headers, as WS doesn't support raw headers - it builds its own
219
+ // header object internally.
220
+ const headers = (0, header_utils_1.rawHeadersToObjectPreservingCase)(rawHeaders);
221
+ // Subprotocols have to be handled explicitly. WS takes control of the headers itself,
222
+ // and checks the response, so we need to parse the client headers and use them manually:
223
+ const originalSubprotocols = (0, header_utils_1.findRawHeaders)(rawHeaders, 'sec-websocket-protocol')
224
+ .flatMap(([_k, value]) => value.split(',').map(p => p.trim()));
225
+ // Drop empty subprotocols, to better handle mildly badly behaved clients
226
+ const filteredSubprotocols = originalSubprotocols.filter(p => !!p);
227
+ // If the subprotocols are invalid (there are some empty strings, or an entirely empty value) then
228
+ // WS will reject the upgrade. With this, we reset the header to the 'equivalent' valid version, to
229
+ // avoid unnecessarily rejecting clients who send mildly wrong headers (empty protocol values).
230
+ if (originalSubprotocols.length !== filteredSubprotocols.length) {
231
+ if (filteredSubprotocols.length) {
232
+ // Note that req.headers is auto-lowercased by Node, so we can ignore case
233
+ req.headers['sec-websocket-protocol'] = filteredSubprotocols.join(',');
234
+ }
235
+ else {
236
+ delete req.headers['sec-websocket-protocol'];
237
+ }
238
+ }
239
+ const upstreamWebSocket = new WebSocket(wsUrl, filteredSubprotocols, {
240
+ maxPayload: 0,
241
+ agent,
242
+ lookup: (0, passthrough_handling_1.getDnsLookupFunction)(this.lookupOptions),
243
+ headers: _.omitBy(headers, (_v, headerName) => headerName.toLowerCase().startsWith('sec-websocket') ||
244
+ headerName.toLowerCase() === 'connection' ||
245
+ headerName.toLowerCase() === 'upgrade'), // Simplify to string - doesn't matter though, only used by http module anyway
246
+ // TLS options:
247
+ ...(0, passthrough_handling_1.getUpstreamTlsOptions)(strictHttpsChecks),
248
+ ...clientCert,
249
+ ...caConfig
250
+ });
251
+ upstreamWebSocket.once('open', () => {
252
+ // Used in the subprotocol selection handler during the upgrade:
253
+ req.upstreamWebSocketProtocol = upstreamWebSocket.protocol || false;
254
+ this.wsServer.handleUpgrade(req, incomingSocket, head, (ws) => {
255
+ ws.upstreamWebSocket = upstreamWebSocket;
256
+ incomingSocket.emit('ws-upgrade', ws);
257
+ this.wsServer.emit('connection', ws); // This pipes the connections together
258
+ });
259
+ });
260
+ // If the upstream says no, we say no too.
261
+ let unexpectedResponse = false;
262
+ upstreamWebSocket.on('unexpected-response', (req, res) => {
263
+ console.log(`Unexpected websocket response from ${wsUrl}: ${res.statusCode}`);
264
+ // Clean up the downstream connection
265
+ mirrorRejection(incomingSocket, res);
266
+ // Clean up the upstream connection (WS would do this automatically, but doesn't if you listen to this event)
267
+ // See https://github.com/websockets/ws/blob/45e17acea791d865df6b255a55182e9c42e5877a/lib/websocket.js#L1050
268
+ // We don't match that perfectly, but this should be effectively equivalent:
269
+ req.destroy();
270
+ if (req.socket && !req.socket.destroyed) {
271
+ res.socket.destroy();
272
+ }
273
+ unexpectedResponse = true; // So that we ignore this in the error handler
274
+ upstreamWebSocket.terminate();
275
+ });
276
+ // If there's some other error, we just kill the socket:
277
+ upstreamWebSocket.on('error', (e) => {
278
+ if (unexpectedResponse)
279
+ return; // Handled separately above
280
+ console.warn(e);
281
+ incomingSocket.end();
282
+ });
283
+ incomingSocket.on('error', () => upstreamWebSocket.close(1011)); // Internal error
284
+ }
285
+ /**
286
+ * @internal
287
+ */
288
+ static deserialize(data, channel, ruleParams) {
289
+ // By default, we assume we just need to assign the right prototype
290
+ return _.create(this.prototype, {
291
+ ...data,
292
+ proxyConfig: (0, serialization_1.deserializeProxyConfig)(data.proxyConfig, channel, ruleParams),
293
+ extraCACertificates: data.extraCACertificates || [],
294
+ ignoreHostHttpsErrors: data.ignoreHostCertificateErrors,
295
+ clientCertificateHostMap: _.mapValues(data.clientCertificateHostMap, ({ pfx, passphrase }) => ({ pfx: (0, serialization_1.deserializeBuffer)(pfx), passphrase })),
296
+ });
297
+ }
298
+ }
299
+ exports.PassThroughWebSocketHandler = PassThroughWebSocketHandler;
300
+ class EchoWebSocketHandler extends websocket_handler_definitions_1.EchoWebSocketHandlerDefinition {
301
+ initializeWsServer() {
302
+ if (this.wsServer)
303
+ return;
304
+ this.wsServer = new WebSocket.Server({ noServer: true });
305
+ this.wsServer.on('connection', (ws) => {
306
+ pipeWebSocket(ws, ws);
307
+ });
308
+ }
309
+ async handle(req, socket, head) {
310
+ this.initializeWsServer();
311
+ this.wsServer.handleUpgrade(req, socket, head, (ws) => {
312
+ socket.emit('ws-upgrade', ws);
313
+ this.wsServer.emit('connection', ws);
314
+ });
315
+ }
316
+ }
317
+ exports.EchoWebSocketHandler = EchoWebSocketHandler;
318
+ class ListenWebSocketHandler extends websocket_handler_definitions_1.ListenWebSocketHandlerDefinition {
319
+ initializeWsServer() {
320
+ if (this.wsServer)
321
+ return;
322
+ this.wsServer = new WebSocket.Server({ noServer: true });
323
+ this.wsServer.on('connection', (ws) => {
324
+ // Accept but ignore the incoming websocket data
325
+ ws.resume();
326
+ });
327
+ }
328
+ async handle(req, socket, head) {
329
+ this.initializeWsServer();
330
+ this.wsServer.handleUpgrade(req, socket, head, (ws) => {
331
+ socket.emit('ws-upgrade', ws);
332
+ this.wsServer.emit('connection', ws);
333
+ });
334
+ }
335
+ }
336
+ exports.ListenWebSocketHandler = ListenWebSocketHandler;
337
+ class RejectWebSocketHandler extends websocket_handler_definitions_1.RejectWebSocketHandlerDefinition {
338
+ async handle(req, socket, head) {
339
+ socket.write(rawResponse(this.statusCode, this.statusMessage, (0, header_utils_1.objectHeadersToRaw)(this.headers)));
340
+ if (this.body)
341
+ socket.write(this.body);
342
+ socket.write('\r\n');
343
+ socket.destroy();
344
+ }
345
+ }
346
+ exports.RejectWebSocketHandler = RejectWebSocketHandler;
347
+ exports.WsHandlerLookup = {
348
+ 'ws-passthrough': PassThroughWebSocketHandler,
349
+ 'ws-echo': EchoWebSocketHandler,
350
+ 'ws-listen': ListenWebSocketHandler,
351
+ 'ws-reject': RejectWebSocketHandler,
352
+ 'close-connection': request_handlers_1.CloseConnectionHandler,
353
+ 'reset-connection': request_handlers_1.ResetConnectionHandler,
354
+ 'timeout': request_handlers_1.TimeoutHandler
355
+ };
356
+ //# sourceMappingURL=websocket-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-handlers.js","sourceRoot":"","sources":["../../../src/rules/websockets/websocket-handlers.ts"],"names":[],"mappings":"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"}