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,264 @@
1
+ import * as _ from "lodash";
2
+ import { Duplex } from "stream";
3
+
4
+ import { PubSub } from "graphql-subscriptions";
5
+ import type { IResolvers } from "@graphql-tools/utils";
6
+
7
+ import type { MockttpServer } from "../server/mockttp-server";
8
+ import type { ServerMockedEndpoint } from "../server/mocked-endpoint";
9
+ import type {
10
+ MockedEndpoint,
11
+ MockedEndpointData,
12
+ CompletedRequest,
13
+ CompletedResponse,
14
+ ClientError
15
+ } from "../types";
16
+ import type { Serialized } from "../serialization/serialization";
17
+ import type { RequestRuleData } from "../rules/requests/request-rule";
18
+ import type { WebSocketRuleData } from "../rules/websockets/websocket-rule";
19
+
20
+ import { deserializeRuleData, deserializeWebSocketRuleData } from "../rules/rule-deserialization";
21
+
22
+ const REQUEST_INITIATED_TOPIC = 'request-initiated';
23
+ const REQUEST_RECEIVED_TOPIC = 'request-received';
24
+ const RESPONSE_COMPLETED_TOPIC = 'response-completed';
25
+ const WEBSOCKET_REQUEST_TOPIC = 'websocket-request';
26
+ const WEBSOCKET_ACCEPTED_TOPIC = 'websocket-accepted';
27
+ const WEBSOCKET_MESSAGE_RECEIVED_TOPIC = 'websocket-message-received';
28
+ const WEBSOCKET_MESSAGE_SENT_TOPIC = 'websocket-message-sent';
29
+ const WEBSOCKET_CLOSE_TOPIC = 'websocket-close';
30
+ const REQUEST_ABORTED_TOPIC = 'request-aborted';
31
+ const TLS_PASSTHROUGH_OPENED_TOPIC = 'tls-passthrough-opened';
32
+ const TLS_PASSTHROUGH_CLOSED_TOPIC = 'tls-passthrough-closed';
33
+ const TLS_CLIENT_ERROR_TOPIC = 'tls-client-error';
34
+ const CLIENT_ERROR_TOPIC = 'client-error';
35
+ const RULE_EVENT_TOPIC = 'rule-event';
36
+
37
+ async function buildMockedEndpointData(endpoint: ServerMockedEndpoint): Promise<MockedEndpointData> {
38
+ return {
39
+ id: endpoint.id,
40
+ explanation: endpoint.toString(true),
41
+ seenRequests: await endpoint.getSeenRequests(),
42
+ isPending: await endpoint.isPending()
43
+ };
44
+ }
45
+
46
+ export function buildAdminServerModel(
47
+ mockServer: MockttpServer,
48
+ stream: Duplex,
49
+ ruleParameters: { [key: string]: any }
50
+ ): IResolvers {
51
+ const pubsub = new PubSub();
52
+
53
+ mockServer.on('request-initiated', (evt) => {
54
+ pubsub.publish(REQUEST_INITIATED_TOPIC, {
55
+ requestInitiated: evt
56
+ })
57
+ });
58
+
59
+ mockServer.on('request', (evt) => {
60
+ pubsub.publish(REQUEST_RECEIVED_TOPIC, {
61
+ requestReceived: evt
62
+ })
63
+ });
64
+
65
+ mockServer.on('response', (evt) => {
66
+ pubsub.publish(RESPONSE_COMPLETED_TOPIC, {
67
+ responseCompleted: evt
68
+ })
69
+ });
70
+
71
+ mockServer.on('websocket-request', (evt) => {
72
+ pubsub.publish(WEBSOCKET_REQUEST_TOPIC, {
73
+ webSocketRequest: evt
74
+ })
75
+ });
76
+
77
+ mockServer.on('websocket-accepted', (evt) => {
78
+ pubsub.publish(WEBSOCKET_ACCEPTED_TOPIC, {
79
+ webSocketAccepted: evt
80
+ })
81
+ });
82
+
83
+ mockServer.on('websocket-message-received', (evt) => {
84
+ pubsub.publish(WEBSOCKET_MESSAGE_RECEIVED_TOPIC, {
85
+ webSocketMessageReceived: evt
86
+ })
87
+ });
88
+
89
+ mockServer.on('websocket-message-sent', (evt) => {
90
+ pubsub.publish(WEBSOCKET_MESSAGE_SENT_TOPIC, {
91
+ webSocketMessageSent: evt
92
+ })
93
+ });
94
+
95
+ mockServer.on('websocket-close', (evt) => {
96
+ pubsub.publish(WEBSOCKET_CLOSE_TOPIC, {
97
+ webSocketClose: evt
98
+ })
99
+ });
100
+
101
+ mockServer.on('abort', (evt) => {
102
+ pubsub.publish(REQUEST_ABORTED_TOPIC, {
103
+ requestAborted: Object.assign(evt, {
104
+ // Backward compat: old clients expect this to be present. In future this can be
105
+ // removed and abort events can lose the 'body' in the schema.
106
+ body: Buffer.alloc(0)
107
+ })
108
+ })
109
+ });
110
+
111
+ mockServer.on('tls-passthrough-opened', (evt) => {
112
+ pubsub.publish(TLS_PASSTHROUGH_OPENED_TOPIC, {
113
+ tlsPassthroughOpened: evt
114
+ })
115
+ });
116
+
117
+ mockServer.on('tls-passthrough-closed', (evt) => {
118
+ pubsub.publish(TLS_PASSTHROUGH_CLOSED_TOPIC, {
119
+ tlsPassthroughClosed: evt
120
+ })
121
+ });
122
+
123
+ mockServer.on('tls-client-error', (evt) => {
124
+ pubsub.publish(TLS_CLIENT_ERROR_TOPIC, {
125
+ failedTlsRequest: evt
126
+ })
127
+ });
128
+
129
+ mockServer.on('client-error', (evt) => {
130
+ pubsub.publish(CLIENT_ERROR_TOPIC, {
131
+ failedClientRequest: evt
132
+ })
133
+ });
134
+
135
+ mockServer.on('rule-event', (evt) => {
136
+ pubsub.publish(RULE_EVENT_TOPIC, {
137
+ ruleEvent: evt
138
+ })
139
+ });
140
+
141
+ return <any> {
142
+ Query: {
143
+ mockedEndpoints: async (): Promise<MockedEndpointData[]> => {
144
+ return Promise.all((await mockServer.getMockedEndpoints()).map(buildMockedEndpointData));
145
+ },
146
+
147
+ pendingEndpoints: async (): Promise<MockedEndpointData[]> => {
148
+ return Promise.all((await mockServer.getPendingEndpoints()).map(buildMockedEndpointData));
149
+ },
150
+
151
+ mockedEndpoint: async (__: any, { id }: { id: string }): Promise<MockedEndpointData | null> => {
152
+ let endpoint = _.find(await mockServer.getMockedEndpoints(), (endpoint: MockedEndpoint) => {
153
+ return endpoint.id === id;
154
+ });
155
+
156
+ if (!endpoint) return null;
157
+
158
+ return buildMockedEndpointData(endpoint);
159
+ }
160
+ },
161
+
162
+ Mutation: {
163
+ addRule: async (__: any, { input }: { input: Serialized<RequestRuleData> }) => {
164
+ return mockServer.addRequestRule(deserializeRuleData(input, stream, ruleParameters));
165
+ },
166
+ addRules: async (__: any, { input }: { input: Array<Serialized<RequestRuleData>> }) => {
167
+ return mockServer.addRequestRules(...input.map((rule) =>
168
+ deserializeRuleData(rule, stream, ruleParameters)
169
+ ));
170
+ },
171
+ setRules: async (__: any, { input }: { input: Array<Serialized<RequestRuleData>> }) => {
172
+ return mockServer.setRequestRules(...input.map((rule) =>
173
+ deserializeRuleData(rule, stream, ruleParameters)
174
+ ));
175
+ },
176
+ setFallbackRule: async (__: any, { input }: { input: Serialized<RequestRuleData> }) => {
177
+ // Deprecated endpoint, but preserved for API backward compat
178
+ const ruleData = deserializeRuleData(input, stream, ruleParameters);
179
+ return mockServer.addRequestRules({
180
+ ...ruleData,
181
+ priority: 0
182
+ }).then((rules) => rules[0]);
183
+ },
184
+
185
+ addWebSocketRule: async (__: any, { input }: { input: Serialized<WebSocketRuleData> }) => {
186
+ return mockServer.addWebSocketRule(deserializeWebSocketRuleData(input, stream, ruleParameters));
187
+ },
188
+ addWebSocketRules: async (__: any, { input }: { input: Array<Serialized<WebSocketRuleData>> }) => {
189
+ return mockServer.addWebSocketRules(...input.map((rule) =>
190
+ deserializeWebSocketRuleData(rule, stream, ruleParameters)
191
+ ));
192
+ },
193
+ setWebSocketRules: async (__: any, { input }: { input: Array<Serialized<WebSocketRuleData>> }) => {
194
+ return mockServer.setWebSocketRules(...input.map((rule) =>
195
+ deserializeWebSocketRuleData(rule, stream, ruleParameters)
196
+ ));
197
+ }
198
+ },
199
+
200
+ Subscription: {
201
+ requestInitiated: {
202
+ subscribe: () => pubsub.asyncIterator(REQUEST_INITIATED_TOPIC)
203
+ },
204
+ requestReceived: {
205
+ subscribe: () => pubsub.asyncIterator(REQUEST_RECEIVED_TOPIC)
206
+ },
207
+ responseCompleted: {
208
+ subscribe: () => pubsub.asyncIterator(RESPONSE_COMPLETED_TOPIC)
209
+ },
210
+ webSocketRequest: {
211
+ subscribe: () => pubsub.asyncIterator(WEBSOCKET_REQUEST_TOPIC)
212
+ },
213
+ webSocketAccepted: {
214
+ subscribe: () => pubsub.asyncIterator(WEBSOCKET_ACCEPTED_TOPIC)
215
+ },
216
+ webSocketMessageReceived: {
217
+ subscribe: () => pubsub.asyncIterator(WEBSOCKET_MESSAGE_RECEIVED_TOPIC)
218
+ },
219
+ webSocketMessageSent: {
220
+ subscribe: () => pubsub.asyncIterator(WEBSOCKET_MESSAGE_SENT_TOPIC)
221
+ },
222
+ webSocketClose: {
223
+ subscribe: () => pubsub.asyncIterator(WEBSOCKET_CLOSE_TOPIC)
224
+ },
225
+ requestAborted: {
226
+ subscribe: () => pubsub.asyncIterator(REQUEST_ABORTED_TOPIC)
227
+ },
228
+ tlsPassthroughOpened: {
229
+ subscribe: () => pubsub.asyncIterator(TLS_PASSTHROUGH_OPENED_TOPIC)
230
+ },
231
+ tlsPassthroughClosed: {
232
+ subscribe: () => pubsub.asyncIterator(TLS_PASSTHROUGH_CLOSED_TOPIC)
233
+ },
234
+ failedTlsRequest: {
235
+ subscribe: () => pubsub.asyncIterator(TLS_CLIENT_ERROR_TOPIC)
236
+ },
237
+ failedClientRequest: {
238
+ subscribe: () => pubsub.asyncIterator(CLIENT_ERROR_TOPIC)
239
+ },
240
+ ruleEvent: {
241
+ subscribe: () => pubsub.asyncIterator(RULE_EVENT_TOPIC)
242
+ }
243
+ },
244
+
245
+ Request: {
246
+ body: (request: CompletedRequest) => {
247
+ return request.body.buffer;
248
+ }
249
+ },
250
+
251
+ Response: {
252
+ body: (response: CompletedResponse) => {
253
+ return response.body.buffer;
254
+ }
255
+ },
256
+
257
+ ClientError: {
258
+ response: (error: ClientError) => {
259
+ if (error.response === 'aborted') return undefined;
260
+ else return error.response;
261
+ }
262
+ }
263
+ };
264
+ }
@@ -0,0 +1,59 @@
1
+ import * as _ from 'lodash';
2
+ import { Duplex } from 'stream';
3
+
4
+ import type { AdminPlugin } from './admin-plugin-types';
5
+
6
+ import { MockttpOptions, PortRange } from "../mockttp";
7
+ import { MockttpServer } from "../server/mockttp-server";
8
+ import { buildAdminServerModel } from "./mockttp-admin-model";
9
+ import { MockttpSchema } from './mockttp-schema';
10
+
11
+ export interface MockttpPluginOptions {
12
+ options?: Partial<MockttpOptions>;
13
+ port?: number | PortRange;
14
+ }
15
+
16
+ export interface MockttpClientResponse {
17
+ port: number,
18
+ mockRoot: string
19
+ }
20
+
21
+ export class MockttpAdminPlugin implements AdminPlugin<
22
+ MockttpPluginOptions,
23
+ MockttpClientResponse
24
+ > {
25
+
26
+ private mockServer!: MockttpServer;
27
+
28
+ async start({ port, options }: MockttpPluginOptions) {
29
+ this.mockServer = new MockttpServer(options);
30
+ await this.mockServer.start(port);
31
+
32
+ return {
33
+ port: this.mockServer.port,
34
+ mockRoot: this.mockServer.url
35
+ };
36
+ }
37
+
38
+ stop() {
39
+ return this.mockServer.stop();
40
+ }
41
+
42
+ reset() {
43
+ return this.mockServer.reset();
44
+ }
45
+
46
+ getMockServer() {
47
+ return this.mockServer;
48
+ }
49
+
50
+ enableDebug() {
51
+ this.mockServer.enableDebug();
52
+ }
53
+
54
+ schema = MockttpSchema;
55
+
56
+ buildResolvers(stream: Duplex, ruleParameters: { [key: string]: any }) {
57
+ return buildAdminServerModel(this.mockServer, stream, ruleParameters)
58
+ };
59
+ }
@@ -0,0 +1,27 @@
1
+ import * as _ from 'lodash';
2
+ import { AdminServer, AdminServerOptions } from "./admin-server";
3
+
4
+ import { MockttpOptions } from "../mockttp";
5
+ import { MockttpAdminPlugin } from "./mockttp-admin-plugin";
6
+
7
+ export interface MockttpAdminServerOptions extends Omit<AdminServerOptions<{}>,
8
+ 'adminPlugins' | 'pluginDefaults'
9
+ > {
10
+ /**
11
+ * Override the default parameters for servers started from this admin server. These values will be
12
+ * used for each setting that is not explicitly specified by the client when creating a mock server.
13
+ */
14
+ serverDefaults?: MockttpOptions;
15
+ }
16
+
17
+ export class MockttpAdminServer extends AdminServer<{ http: MockttpAdminPlugin }> {
18
+
19
+ constructor(options: MockttpAdminServerOptions) {
20
+ super({
21
+ ..._.omit(options, 'serverDefaults'),
22
+ pluginDefaults: { http: { options: options.serverDefaults } },
23
+ adminPlugins: { http: MockttpAdminPlugin }
24
+ });
25
+ }
26
+
27
+ }
@@ -0,0 +1,222 @@
1
+ import gql from "graphql-tag";
2
+
3
+ export const MockttpSchema = gql`
4
+ extend type Query {
5
+ mockedEndpoints: [MockedEndpoint!]!
6
+ pendingEndpoints: [MockedEndpoint!]!
7
+ mockedEndpoint(id: ID!): MockedEndpoint
8
+ }
9
+
10
+ extend type Mutation {
11
+ addRule(input: MockRule!): MockedEndpoint!
12
+ addRules(input: [MockRule!]!): [MockedEndpoint!]!
13
+ setRules(input: [MockRule!]!): [MockedEndpoint!]!
14
+ setFallbackRule(input: MockRule!): MockedEndpoint!
15
+
16
+ addWebSocketRule(input: WebSocketMockRule!): MockedEndpoint!
17
+ addWebSocketRules(input: [WebSocketMockRule!]!): [MockedEndpoint!]!
18
+ setWebSocketRules(input: [WebSocketMockRule!]!): [MockedEndpoint!]!
19
+ }
20
+
21
+ extend type Subscription {
22
+ requestInitiated: InitiatedRequest!
23
+ requestReceived: Request!
24
+ responseCompleted: Response!
25
+ webSocketRequest: Request!
26
+ webSocketAccepted: Response!
27
+ webSocketMessageReceived: WebSocketMessage!
28
+ webSocketMessageSent: WebSocketMessage!
29
+ webSocketClose: WebSocketClose!
30
+ requestAborted: AbortedRequest!
31
+ tlsPassthroughOpened: TlsPassthroughEvent!
32
+ tlsPassthroughClosed: TlsPassthroughEvent!
33
+ failedTlsRequest: TlsHandshakeFailure!
34
+ failedClientRequest: ClientError!
35
+ ruleEvent: RuleEvent!
36
+ }
37
+
38
+ type MockedEndpoint {
39
+ id: ID!
40
+ explanation: String
41
+ seenRequests: [Request!]!
42
+ isPending: Boolean!
43
+ }
44
+
45
+ input MockRule {
46
+ id: String
47
+ priority: Int
48
+ matchers: [Raw!]!
49
+ handler: Raw!
50
+ completionChecker: Raw
51
+ }
52
+
53
+ input WebSocketMockRule {
54
+ id: String
55
+ priority: Int
56
+ matchers: [Raw!]!
57
+ handler: Raw!
58
+ completionChecker: Raw
59
+ }
60
+
61
+ type TlsPassthroughEvent {
62
+ id: String!
63
+ upstreamPort: Int!
64
+
65
+ hostname: String
66
+ remoteIpAddress: String!
67
+ remotePort: Int!
68
+ tags: [String!]!
69
+ timingEvents: Json!
70
+ tlsMetadata: Json!
71
+ }
72
+
73
+ type TlsHandshakeFailure {
74
+ failureCause: String!
75
+
76
+ hostname: String
77
+ remoteIpAddress: String!
78
+ remotePort: Int!
79
+ tags: [String!]!
80
+ timingEvents: Json!
81
+ tlsMetadata: Json!
82
+ }
83
+
84
+ # Old name for TlsHandshakeFailure, kept for backward compat
85
+ type TlsRequest {
86
+ failureCause: String!
87
+
88
+ hostname: String
89
+ remoteIpAddress: String!
90
+ remotePort: Int!
91
+ tags: [String!]!
92
+ timingEvents: Json!
93
+ }
94
+
95
+ type ClientError {
96
+ errorCode: String
97
+ request: ClientErrorRequest!
98
+ response: Response
99
+ }
100
+
101
+ type ClientErrorRequest {
102
+ id: ID!
103
+ timingEvents: Json!
104
+ tags: [String!]!
105
+
106
+ protocol: String
107
+ httpVersion: String
108
+ method: String
109
+ url: String
110
+ path: String
111
+ headers: Json
112
+ rawHeaders: Json
113
+ remoteIpAddress: String!
114
+ remotePort: Int!
115
+ }
116
+
117
+ type RuleEvent {
118
+ requestId: ID!
119
+ ruleId: ID!
120
+ eventType: String!
121
+ eventData: Raw!
122
+ }
123
+
124
+ type InitiatedRequest {
125
+ id: ID!
126
+ timingEvents: Json!
127
+ tags: [String!]!
128
+ matchedRuleId: ID
129
+
130
+ protocol: String!
131
+ httpVersion: String!
132
+ method: String!
133
+ url: String!
134
+ path: String!
135
+ remoteIpAddress: String!
136
+ remotePort: Int!
137
+ hostname: String
138
+
139
+ headers: Json!
140
+ rawHeaders: Json!
141
+ }
142
+
143
+ type Request {
144
+ id: ID!
145
+ timingEvents: Json!
146
+ tags: [String!]!
147
+ matchedRuleId: ID
148
+
149
+ protocol: String!
150
+ httpVersion: String!
151
+ method: String!
152
+ url: String!
153
+ path: String!
154
+ remoteIpAddress: String!
155
+ remotePort: Int!
156
+ hostname: String
157
+
158
+ headers: Json!
159
+ rawHeaders: Json!
160
+
161
+ body: Buffer!
162
+ rawTrailers: Json!
163
+ }
164
+
165
+ type AbortedRequest {
166
+ id: ID!
167
+ timingEvents: Json!
168
+ tags: [String!]!
169
+ matchedRuleId: ID
170
+
171
+ protocol: String!
172
+ httpVersion: String!
173
+ method: String!
174
+ url: String!
175
+ path: String!
176
+ remoteIpAddress: String!
177
+ remotePort: Int!
178
+ hostname: String
179
+
180
+ headers: Json!
181
+ rawHeaders: Json!
182
+
183
+ body: Buffer!
184
+
185
+ error: Json
186
+ }
187
+
188
+ type Response {
189
+ id: ID!
190
+ timingEvents: Json!
191
+ tags: [String!]!
192
+
193
+ statusCode: Int!
194
+ statusMessage: String!
195
+
196
+ headers: Json!
197
+ rawHeaders: Json!
198
+ body: Buffer!
199
+ rawTrailers: Json!
200
+ }
201
+
202
+ type WebSocketMessage {
203
+ streamId: ID!
204
+ direction: String!
205
+ content: Buffer!
206
+ isBinary: Boolean!
207
+ eventTimestamp: Float!
208
+
209
+ timingEvents: Json!
210
+ tags: [String!]!
211
+ }
212
+
213
+ type WebSocketClose {
214
+ streamId: ID!
215
+
216
+ closeCode: Int
217
+ closeReason: String
218
+
219
+ timingEvents: Json!
220
+ tags: [String!]!
221
+ }
222
+ `;