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,41 @@
1
+ export type RuleParameters = {
2
+ [key: string]: unknown;
3
+ };
4
+
5
+ export const MOCKTTP_PARAM_REF = Symbol('MOCKTTP_PARAM_REF');
6
+
7
+ /**
8
+ * A reference to a rule parameter defined in the `ruleParameters` admin server
9
+ * option of the corresponding admin server.
10
+ *
11
+ * Rule parameter references are only valid with a remote client. They can be useful in
12
+ * cases where the admin server has access to local state or APIs that are not
13
+ * accessible from the remote client, but which would be useful in rule definitions. This
14
+ * is only supported for some specific parameters where documented explicitly in that rule
15
+ * parameter.
16
+ */
17
+ export type RuleParameterReference<R> = {
18
+ [MOCKTTP_PARAM_REF]: string
19
+ };
20
+
21
+ export function isParamReference(input: any): input is RuleParameterReference<unknown> {
22
+ return input && !!input[MOCKTTP_PARAM_REF];
23
+ };
24
+
25
+ export function dereferenceParam<R>(paramRef: RuleParameterReference<R>, params: RuleParameters): R {
26
+ const paramKey = paramRef[MOCKTTP_PARAM_REF];
27
+ if (paramKey in params) {
28
+ return params[paramKey] as R;
29
+ } else {
30
+ throw new Error(`Invalid reference to undefined rule parameter '${paramKey}'`);
31
+ }
32
+ };
33
+
34
+ export function assertParamDereferenced<R>(maybeParamRef: R | RuleParameterReference<R>): R {
35
+ if (isParamReference(maybeParamRef)) {
36
+ const paramKey = maybeParamRef[MOCKTTP_PARAM_REF];
37
+ throw new Error(`Non-dereferenced rule parameter used unexpectedly: ${paramKey}`);
38
+ } else {
39
+ return maybeParamRef;
40
+ }
41
+ }
@@ -0,0 +1,29 @@
1
+ import { Duplex } from "stream";
2
+
3
+ import { Serialized, serialize } from "../serialization/serialization";
4
+
5
+ import type { RequestRuleData } from "./requests/request-rule";
6
+ import type { WebSocketRuleData } from "./websockets/websocket-rule";
7
+
8
+ export function validateMockRuleData(data: RequestRuleData | WebSocketRuleData): void {
9
+ if (!data.matchers || data.matchers.length === 0) {
10
+ throw new Error('Cannot create a rule without at least one matcher');
11
+ }
12
+ if (!data.handler) {
13
+ throw new Error('Cannot create a rule with no handler');
14
+ }
15
+ }
16
+
17
+ export function serializeRuleData<
18
+ DataFormat extends RequestRuleData | WebSocketRuleData
19
+ >(data: DataFormat, stream: Duplex): Serialized<DataFormat> {
20
+ validateMockRuleData(data);
21
+
22
+ return {
23
+ id: data.id,
24
+ priority: data.priority,
25
+ matchers: data.matchers.map(m => serialize(m, stream)),
26
+ handler: serialize(data.handler, stream),
27
+ completionChecker: data.completionChecker && serialize(data.completionChecker, stream)
28
+ } as Serialized<DataFormat>;
29
+ };
@@ -0,0 +1,196 @@
1
+ import * as _ from 'lodash';
2
+ import * as url from 'url';
3
+ import { stripIndent } from 'common-tags';
4
+
5
+ import {
6
+ ClientServerChannel,
7
+ Serializable,
8
+ SerializedProxyConfig,
9
+ serializeProxyConfig,
10
+ serializeBuffer
11
+ } from "../../serialization/serialization";
12
+
13
+ import { Explainable, Headers } from "../../types";
14
+
15
+ import { ProxyConfig } from '../proxy-config';
16
+ import {
17
+ PassThroughHandlerConnectionOptions,
18
+ ForwardingOptions,
19
+ PassThroughLookupOptions,
20
+ CADefinition
21
+ } from '../passthrough-handling-definitions';
22
+ import {
23
+ CloseConnectionHandlerDefinition,
24
+ ResetConnectionHandlerDefinition,
25
+ TimeoutHandlerDefinition
26
+ } from '../requests/request-handler-definitions';
27
+
28
+ /*
29
+ This file defines websocket handler *definitions*, which includes everything necessary to define
30
+ and serialize a websockt handler's behaviour, but doesn't include the actual handling logic (which
31
+ lives in ./websocket-handlers instead). This is intended to allow tree-shaking in browser usage
32
+ or remote clients to import only the necessary code, with no need to include all the real
33
+ network processing and handling code that is only used at HTTP-runtime, so isn't relevant when
34
+ defining rules.
35
+
36
+ Every WebSocketHandler extends its definition, simply adding a handle() method, which handles
37
+ requests according to the configuration, and adding a deserialize static method that takes
38
+ the serialized output from the serialize() methods defined here and creates a working handler.
39
+ */
40
+
41
+ export interface WebSocketHandlerDefinition extends Explainable, Serializable {
42
+ type: keyof typeof WsHandlerDefinitionLookup;
43
+ }
44
+
45
+ export type PassThroughWebSocketHandlerOptions = PassThroughHandlerConnectionOptions;
46
+
47
+ /**
48
+ * @internal
49
+ */
50
+ export interface SerializedPassThroughWebSocketData {
51
+ type: 'ws-passthrough';
52
+ forwarding?: ForwardingOptions;
53
+ lookupOptions?: PassThroughLookupOptions;
54
+ proxyConfig?: SerializedProxyConfig;
55
+ ignoreHostCertificateErrors?: string[] | boolean; // Doesn't match option name, backward compat
56
+ extraCACertificates?: Array<{ cert: string } | { certPath: string }>;
57
+ clientCertificateHostMap?: { [host: string]: { pfx: string, passphrase?: string } };
58
+ }
59
+
60
+ export class PassThroughWebSocketHandlerDefinition extends Serializable implements WebSocketHandlerDefinition {
61
+ readonly type = 'ws-passthrough';
62
+
63
+ // Same lookup configuration as normal request PassThroughHandler:
64
+ public readonly lookupOptions: PassThroughLookupOptions | undefined;
65
+ public readonly proxyConfig?: ProxyConfig;
66
+
67
+ public readonly forwarding?: ForwardingOptions;
68
+ public readonly ignoreHostHttpsErrors: string[] | boolean = [];
69
+ public readonly clientCertificateHostMap: {
70
+ [host: string]: { pfx: Buffer, passphrase?: string }
71
+ };
72
+
73
+ public readonly extraCACertificates: Array<CADefinition> = [];
74
+
75
+ constructor(options: PassThroughWebSocketHandlerOptions = {}) {
76
+ super();
77
+
78
+ // If a location is provided, and it's not a bare hostname, it must be parseable
79
+ const { forwarding } = options;
80
+ if (forwarding && forwarding.targetHost.includes('/')) {
81
+ const { protocol, hostname, port, path } = url.parse(forwarding.targetHost);
82
+ if (path && path.trim() !== "/") {
83
+ const suggestion = url.format({ protocol, hostname, port }) ||
84
+ forwarding.targetHost.slice(0, forwarding.targetHost.indexOf('/'));
85
+ throw new Error(stripIndent`
86
+ URLs for forwarding cannot include a path, but "${forwarding.targetHost}" does. ${''
87
+ }Did you mean ${suggestion}?
88
+ `);
89
+ }
90
+ }
91
+
92
+ this.forwarding = options.forwarding;
93
+
94
+ this.ignoreHostHttpsErrors = options.ignoreHostHttpsErrors || [];
95
+ if (!Array.isArray(this.ignoreHostHttpsErrors) && typeof this.ignoreHostHttpsErrors !== 'boolean') {
96
+ throw new Error("ignoreHostHttpsErrors must be an array or a boolean");
97
+ }
98
+
99
+ this.lookupOptions = options.lookupOptions;
100
+ this.proxyConfig = options.proxyConfig;
101
+
102
+ this.extraCACertificates =
103
+ options.additionalTrustedCAs ||
104
+ options.trustAdditionalCAs ||
105
+ [];
106
+ this.clientCertificateHostMap = options.clientCertificateHostMap || {};
107
+ }
108
+
109
+ explain() {
110
+ return this.forwarding
111
+ ? `forward the websocket to ${this.forwarding.targetHost}`
112
+ : 'pass the request through to the target host';
113
+ }
114
+
115
+ /**
116
+ * @internal
117
+ */
118
+ serialize(channel: ClientServerChannel): SerializedPassThroughWebSocketData {
119
+ return {
120
+ type: this.type,
121
+ forwarding: this.forwarding,
122
+ lookupOptions: this.lookupOptions,
123
+ proxyConfig: serializeProxyConfig(this.proxyConfig, channel),
124
+ ignoreHostCertificateErrors: this.ignoreHostHttpsErrors,
125
+ extraCACertificates: this.extraCACertificates.map((certObject) => {
126
+ // We use toString to make sure that buffers always end up as
127
+ // as UTF-8 string, to avoid serialization issues. Strings are an
128
+ // easy safe format here, since it's really all just plain-text PEM
129
+ // under the hood.
130
+ if ('cert' in certObject) {
131
+ return { cert: certObject.cert.toString('utf8') }
132
+ } else {
133
+ return certObject;
134
+ }
135
+ }),
136
+ clientCertificateHostMap: _.mapValues(this.clientCertificateHostMap,
137
+ ({ pfx, passphrase }) => ({ pfx: serializeBuffer(pfx), passphrase })
138
+ )
139
+ };
140
+ }
141
+ }
142
+
143
+ export class EchoWebSocketHandlerDefinition extends Serializable implements WebSocketHandlerDefinition {
144
+
145
+ readonly type = 'ws-echo';
146
+
147
+ explain(): string {
148
+ return "echo all websocket messages";
149
+ }
150
+ }
151
+
152
+ export class ListenWebSocketHandlerDefinition extends Serializable implements WebSocketHandlerDefinition {
153
+
154
+ readonly type = 'ws-listen';
155
+
156
+ explain(): string {
157
+ return "silently accept websocket messages without responding";
158
+ }
159
+ }
160
+
161
+ export class RejectWebSocketHandlerDefinition extends Serializable implements WebSocketHandlerDefinition {
162
+
163
+ readonly type = 'ws-reject';
164
+
165
+ constructor(
166
+ public readonly statusCode: number,
167
+ public readonly statusMessage: string = 'WebSocket rejected',
168
+ public readonly headers: Headers = {},
169
+ public readonly body: Buffer | string = ''
170
+ ) {
171
+ super();
172
+ }
173
+
174
+ explain() {
175
+ return `explicitly reject the websocket upgrade with status ${this.statusCode}`;
176
+ }
177
+
178
+ }
179
+
180
+ // These three work equally well for HTTP requests as websockets, but it's
181
+ // useful to reexport there here for consistency.
182
+ export {
183
+ CloseConnectionHandlerDefinition,
184
+ ResetConnectionHandlerDefinition,
185
+ TimeoutHandlerDefinition
186
+ };
187
+
188
+ export const WsHandlerDefinitionLookup = {
189
+ 'ws-passthrough': PassThroughWebSocketHandlerDefinition,
190
+ 'ws-echo': EchoWebSocketHandlerDefinition,
191
+ 'ws-listen': ListenWebSocketHandlerDefinition,
192
+ 'ws-reject': RejectWebSocketHandlerDefinition,
193
+ 'close-connection': CloseConnectionHandlerDefinition,
194
+ 'reset-connection': ResetConnectionHandlerDefinition,
195
+ 'timeout': TimeoutHandlerDefinition
196
+ };