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,98 @@
1
+ import * as cors from 'cors';
2
+ import { AdminPlugin, PluginConstructorMap, PluginStartParamsMap } from './admin-plugin-types';
3
+ export interface AdminServerOptions<Plugins extends {
4
+ [key: string]: AdminPlugin<any, any>;
5
+ }> {
6
+ /**
7
+ * Should the admin server print extra debug information? This enables admin server debugging
8
+ * only - individual mock session debugging must be enabled separately.
9
+ */
10
+ debug?: boolean;
11
+ /**
12
+ * Set CORS options to limit the sites which can send requests to manage this admin server.
13
+ */
14
+ corsOptions?: cors.CorsOptions & {
15
+ strict?: boolean;
16
+ allowPrivateNetworkAccess?: boolean;
17
+ };
18
+ /**
19
+ * Set a keep alive frequency in milliseconds for the subscription & stream websockets of each
20
+ * session, to ensure they remain connected in long-lived connections, especially in browsers which
21
+ * often close quiet background connections automatically.
22
+ */
23
+ webSocketKeepAlive?: number;
24
+ /**
25
+ * Override the default parameters for sessions started from this admin server. These values will be
26
+ * used for each setting that is not explicitly specified by the client when creating a mock session.
27
+ */
28
+ pluginDefaults?: Partial<PluginStartParamsMap<Plugins>>;
29
+ /**
30
+ * Some rule options can't easily be specified in remote clients, since they need to access
31
+ * server-side state or Node APIs directly. To handle this, referenceable parameters can
32
+ * be provided here, and referenced with a `{ [MOCKTTP_PARAM_REF]: <value> }` value in place
33
+ * of the real parameter in the remote client.
34
+ */
35
+ ruleParameters?: {
36
+ [key: string]: any;
37
+ };
38
+ /**
39
+ * @internal
40
+ *
41
+ * This API is not yet stable, and is intended for internal use only. It may change in future
42
+ * in minor versions without warning.
43
+ *
44
+ * This defines admin plugin modules: remote-controlled types of mocks that should be attached to this
45
+ * admin server, to allow configuring other mocking services through the same HTTP infrastructure.
46
+ *
47
+ * This can be useful when mocking non-HTTP protocols like WebRTC.
48
+ */
49
+ adminPlugins?: PluginConstructorMap<Plugins>;
50
+ }
51
+ export declare class AdminServer<Plugins extends {
52
+ [key: string]: AdminPlugin<any, any>;
53
+ }> {
54
+ private debug;
55
+ private requiredOrigin;
56
+ private webSocketKeepAlive;
57
+ private ruleParams;
58
+ private app;
59
+ private server;
60
+ private eventEmitter;
61
+ private adminPlugins;
62
+ private sessions;
63
+ constructor(options?: AdminServerOptions<Plugins>);
64
+ resetAdminServer(): Promise<void>;
65
+ /**
66
+ * Subscribe to hear when each mock ession is started. The listener is provided the
67
+ * session plugin data, which can be used to log session startup, add side-effects that
68
+ * run elsewhere at startup, or preconfigure every started plugin in addition ways.
69
+ *
70
+ * This is run synchronously when a session is created, after it has fully started
71
+ * but before its been returned to remote clients.
72
+ */
73
+ on(event: 'mock-session-started', listener: (plugins: Plugins, sessionId: string) => void): void;
74
+ /**
75
+ * Subscribe to hear when a mock session is stopped. The listener is provided with
76
+ * the state of all plugins that are about to be stopped. This can be used to log
77
+ * mock session shutdown, add side-effects that run elsewhere at shutdown, or clean
78
+ * up after sessions in other ways.
79
+ *
80
+ * This is run synchronously immediately before the session is shutdown, whilst all
81
+ * its state is still available, and before remote clients have had any response to
82
+ * their request. This is also run before shutdown when the admin server itself is
83
+ * cleanly shutdown with `adminServer.stop()`.
84
+ */
85
+ on(event: 'mock-session-stopping', listener: (plugins: Plugins, sessionId: string) => void): void;
86
+ start(listenOptions?: number | {
87
+ port: number;
88
+ host: string;
89
+ }): Promise<void>;
90
+ private startSessionManagementAPI;
91
+ stop(): Promise<void>;
92
+ private static baseSchema;
93
+ private buildBaseResolvers;
94
+ private resetPluginsForSession;
95
+ private enableDebugForSession;
96
+ get ruleParameterKeys(): string[];
97
+ }
98
+ //# sourceMappingURL=admin-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-server.d.ts","sourceRoot":"","sources":["../../src/admin/admin-server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAuB7B,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAI/F,MAAM,WAAW,kBAAkB,CAAC,OAAO,SAAS;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;CAAE;IACxF;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,WAAW,CAAC,EAAE,IAAI,CAAC,WAAW,GAAG;QAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,yBAAyB,CAAC,EAAE,OAAO,CAAA;KACtC,CAAC;IAEF;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;IAExD;;;;;OAKG;IACH,cAAc,CAAC,EAAE;QACb,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KACrB,CAAA;IAED;;;;;;;;;;OAUG;IACH,YAAY,CAAC,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAA;CAC/C;AAmCD,qBAAa,WAAW,CAAC,OAAO,SAAS;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;CAAE;IAE7E,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,UAAU,CAAiB;IAEnC,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,MAAM,CAA+C;IAC7D,OAAO,CAAC,YAAY,CAAsB;IAE1C,OAAO,CAAC,YAAY,CAAgC;IAEpD,OAAO,CAAC,QAAQ,CAQN;gBAEE,OAAO,GAAE,kBAAkB,CAAC,OAAO,CAAM;IA8J/C,gBAAgB;IAOtB;;;;;;;OAOG;IACH,EAAE,CAAC,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAEhG;;;;;;;;;;OAUG;IACH,EAAE,CAAC,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAK3F,KAAK,CACP,aAAa,GAAE,MAAM,GAAG;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAA;KACa;YA4CnB,yBAAyB;IA4IvC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAYrB,OAAO,CAAC,MAAM,CAAC,UAAU,CAkBvB;IAEF,OAAO,CAAC,kBAAkB;IAmD1B,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,qBAAqB;IAQ7B,IAAI,iBAAiB,aAEpB;CACJ"}
@@ -0,0 +1,426 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AdminServer = void 0;
4
+ const _ = require("lodash");
5
+ const express = require("express");
6
+ const cors = require("cors");
7
+ const corsGate = require("cors-gate");
8
+ const bodyParser = require("body-parser");
9
+ const Ws = require("ws");
10
+ const uuid_1 = require("uuid");
11
+ const express_1 = require("graphql-http/lib/use/express");
12
+ const graphql_1 = require("graphql");
13
+ const graphql_tag_1 = require("graphql-tag");
14
+ const schema_1 = require("@graphql-tools/schema");
15
+ const subscriptions_transport_ws_1 = require("@httptoolkit/subscriptions-transport-ws");
16
+ const stream_1 = require("stream");
17
+ const DuplexPair = require("native-duplexpair");
18
+ const destroyable_server_1 = require("destroyable-server");
19
+ const error_1 = require("../util/error");
20
+ const promise_1 = require("../util/promise");
21
+ const types_1 = require("../types");
22
+ const graphql_utils_1 = require("./graphql-utils");
23
+ async function strictOriginMatch(origin, expectedOrigin) {
24
+ if (!origin)
25
+ return false;
26
+ if (typeof expectedOrigin === 'string') {
27
+ return expectedOrigin === origin;
28
+ }
29
+ if (_.isRegExp(expectedOrigin)) {
30
+ return !!origin.match(expectedOrigin);
31
+ }
32
+ if (_.isArray(expectedOrigin)) {
33
+ return _.some(expectedOrigin, (exp) => strictOriginMatch(origin, exp));
34
+ }
35
+ if (_.isFunction(expectedOrigin)) {
36
+ return new Promise((resolve, reject) => {
37
+ expectedOrigin(origin, (error, result) => {
38
+ if (error)
39
+ reject(error);
40
+ else
41
+ resolve(strictOriginMatch(origin, result));
42
+ });
43
+ });
44
+ }
45
+ // We don't allow boolean or undefined matches
46
+ return false;
47
+ }
48
+ class AdminServer {
49
+ constructor(options = {}) {
50
+ this.app = express();
51
+ this.server = null;
52
+ this.eventEmitter = new stream_1.EventEmitter();
53
+ this.sessions = {};
54
+ this.debug = options.debug || false;
55
+ if (this.debug)
56
+ console.log('Admin server started in debug mode');
57
+ this.webSocketKeepAlive = options.webSocketKeepAlive || undefined;
58
+ this.ruleParams = options.ruleParameters || {};
59
+ this.adminPlugins = options.adminPlugins || {};
60
+ if (options.corsOptions?.allowPrivateNetworkAccess) {
61
+ // Allow web pages on non-local URLs (testsite.example.com, not localhost) to
62
+ // send requests to this admin server too. Without this, those requests will
63
+ // fail after rejected preflights in recent Chrome (from ~v102, ish? Unclear).
64
+ // This is combined with the origin restrictions that may be set, so only
65
+ // accepted origins will be allowed to make these requests.
66
+ this.app.use((req, res, next) => {
67
+ if (req.headers["access-control-request-private-network"]) {
68
+ res.setHeader("access-control-allow-private-network", "true");
69
+ }
70
+ next(null);
71
+ });
72
+ }
73
+ this.app.use(cors(options.corsOptions));
74
+ // If you use strict CORS, and set a specific origin, we'll enforce it:
75
+ this.requiredOrigin = !!options.corsOptions &&
76
+ !!options.corsOptions.strict &&
77
+ !!options.corsOptions.origin &&
78
+ typeof options.corsOptions.origin !== 'boolean' &&
79
+ options.corsOptions.origin;
80
+ if (this.requiredOrigin) {
81
+ this.app.use(corsGate({
82
+ strict: true, // MUST send an allowed origin
83
+ allowSafe: false, // Even for HEAD/GET requests (should be none anyway)
84
+ origin: '' // No base origin - we accept *no* same-origin requests
85
+ }));
86
+ }
87
+ this.app.use(bodyParser.json({ limit: '50mb' }));
88
+ const defaultPluginStartParams = options.pluginDefaults ?? {};
89
+ this.app.post('/start', async (req, res) => {
90
+ try {
91
+ const rawConfig = req.body;
92
+ // New clients send: "{ plugins: { http: {...}, webrtc: {...} } }" etc. Old clients just send
93
+ // the HTTP options bare with no wrapper, so we wrap them for backward compat.
94
+ const isPluginAwareClient = ('plugins' in rawConfig);
95
+ const providedPluginStartParams = (!isPluginAwareClient
96
+ ? {
97
+ http: {
98
+ options: _.cloneDeep(rawConfig),
99
+ port: (typeof req.query.port === 'string')
100
+ ? JSON.parse(req.query.port)
101
+ : undefined
102
+ }
103
+ }
104
+ : rawConfig.plugins);
105
+ // For each plugin that was specified, we pull default params into their start params.
106
+ const pluginStartParams = _.mapValues((providedPluginStartParams), (params, pluginId) => {
107
+ return _.merge({}, defaultPluginStartParams[pluginId], params);
108
+ });
109
+ if (this.debug)
110
+ console.log('Admin server starting mock session with config', pluginStartParams);
111
+ // Backward compat: do an explicit check for HTTP port conflicts
112
+ const httpPort = pluginStartParams.http?.port;
113
+ if (_.isNumber(httpPort) && this.sessions[httpPort] != null) {
114
+ res.status(409).json({
115
+ error: `Cannot start: mock server is already running on port ${httpPort}`
116
+ });
117
+ return;
118
+ }
119
+ const missingPluginId = Object.keys(pluginStartParams).find(pluginId => !(pluginId in this.adminPlugins));
120
+ if (missingPluginId) {
121
+ res.status(400).json({
122
+ error: `Request to mock using unrecognized plugin: ${missingPluginId}`
123
+ });
124
+ return;
125
+ }
126
+ const sessionPlugins = _.mapValues(pluginStartParams, (__, pluginId) => {
127
+ const PluginType = this.adminPlugins[pluginId];
128
+ return new PluginType();
129
+ });
130
+ const pluginStartResults = await (0, promise_1.objectAllPromise)(_.mapValues(sessionPlugins, (plugin, pluginId) => plugin.start(pluginStartParams[pluginId])));
131
+ // More backward compat: old clients assume that the port is also the management id.
132
+ const sessionId = isPluginAwareClient
133
+ ? (0, uuid_1.v4)()
134
+ : sessionPlugins.http.getMockServer().port.toString();
135
+ await this.startSessionManagementAPI(sessionId, sessionPlugins);
136
+ if (isPluginAwareClient) {
137
+ res.json({
138
+ id: sessionId,
139
+ pluginData: _.mapValues(pluginStartResults, (r) => r ?? {} // Always return _something_, even if the plugin returns null/undefined.
140
+ )
141
+ });
142
+ }
143
+ else {
144
+ res.json({
145
+ id: sessionId,
146
+ ...(pluginStartResults['http'])
147
+ });
148
+ }
149
+ }
150
+ catch (e) {
151
+ res.status(500).json({ error: `Failed to start mock session: ${((0, error_1.isErrorLike)(e) && e.message) || e}` });
152
+ }
153
+ });
154
+ this.app.post('/reset', async (req, res) => {
155
+ try {
156
+ await this.resetAdminServer();
157
+ res.json({ success: true });
158
+ }
159
+ catch (e) {
160
+ res.status(500).json({
161
+ error: ((0, error_1.isErrorLike)(e) && e.message) || 'Unknown error'
162
+ });
163
+ }
164
+ });
165
+ // Dynamically route to mock sessions ourselves, so we can easily add/remove
166
+ // sessions as we see fit later on.
167
+ const sessionRequest = (req, res, next) => {
168
+ const sessionId = req.params.id;
169
+ const sessionRouter = this.sessions[sessionId]?.router;
170
+ if (!sessionRouter) {
171
+ res.status(404).send('Unknown mock session');
172
+ console.error(`Request for unknown mock session with id: ${sessionId}`);
173
+ return;
174
+ }
175
+ sessionRouter(req, res, next);
176
+ };
177
+ this.app.use('/session/:id/', sessionRequest);
178
+ this.app.use('/server/:id/', sessionRequest); // Old URL for backward compat
179
+ }
180
+ async resetAdminServer() {
181
+ if (this.debug)
182
+ console.log('Resetting admin server');
183
+ await Promise.all(Object.values(this.sessions).map(({ stop }) => stop()));
184
+ }
185
+ on(event, listener) {
186
+ this.eventEmitter.on(event, listener);
187
+ }
188
+ async start(listenOptions = types_1.DEFAULT_ADMIN_SERVER_PORT) {
189
+ if (this.server)
190
+ throw new Error('Admin server already running');
191
+ await new Promise((resolve, reject) => {
192
+ this.server = (0, destroyable_server_1.makeDestroyable)(this.app.listen(listenOptions, resolve));
193
+ this.server.on('error', reject);
194
+ this.server.on('upgrade', async (req, socket, head) => {
195
+ const reqOrigin = req.headers['origin'];
196
+ if (this.requiredOrigin && !await strictOriginMatch(reqOrigin, this.requiredOrigin)) {
197
+ console.warn(`Websocket request from invalid origin: ${req.headers['origin']}`);
198
+ socket.destroy();
199
+ return;
200
+ }
201
+ const isSubscriptionRequest = req.url.match(/^\/(?:server|session)\/([\w\d\-]+)\/subscription$/);
202
+ const isStreamRequest = req.url.match(/^\/(?:server|session)\/([\w\d\-]+)\/stream$/);
203
+ const isMatch = isSubscriptionRequest || isStreamRequest;
204
+ if (isMatch) {
205
+ const sessionId = isMatch[1];
206
+ let wsServer = isSubscriptionRequest
207
+ ? this.sessions[sessionId]?.subscriptionServer.server
208
+ : this.sessions[sessionId]?.streamServer;
209
+ if (wsServer) {
210
+ wsServer.handleUpgrade(req, socket, head, (ws) => {
211
+ wsServer.emit('connection', ws, req);
212
+ });
213
+ }
214
+ else {
215
+ console.warn(`Websocket request for unrecognized mock session: ${sessionId}`);
216
+ socket.destroy();
217
+ }
218
+ }
219
+ else {
220
+ console.warn(`Unrecognized websocket request for ${req.url}`);
221
+ socket.destroy();
222
+ }
223
+ });
224
+ });
225
+ }
226
+ async startSessionManagementAPI(sessionId, plugins) {
227
+ const mockSessionRouter = express.Router();
228
+ let running = true;
229
+ const stopSession = async () => {
230
+ if (!running)
231
+ return;
232
+ running = false;
233
+ this.eventEmitter.emit('mock-session-stopping', plugins);
234
+ const session = this.sessions[sessionId];
235
+ delete this.sessions[sessionId];
236
+ await Promise.all(Object.values(plugins).map(plugin => plugin.stop()));
237
+ session.subscriptionServer.close();
238
+ // Close with code 1000 (purpose is complete - no more streaming happening)
239
+ session.streamServer.clients.forEach((client) => {
240
+ client.close(1000);
241
+ });
242
+ session.streamServer.close();
243
+ session.streamServer.emit('close');
244
+ };
245
+ mockSessionRouter.post('/stop', async (req, res) => {
246
+ await stopSession();
247
+ res.json({ success: true });
248
+ });
249
+ // A pair of sockets, representing the 2-way connection between the session & WSs.
250
+ // All websocket messages are written to wsSocket, and then read from sessionSocket
251
+ // All session messages are written to sessionSocket, and then read from wsSocket and sent
252
+ const { socket1: wsSocket, socket2: sessionSocket } = new DuplexPair();
253
+ // This receives a lot of listeners! One channel per matcher, handler & completion checker,
254
+ // and each adds listeners for data/error/finish/etc. That's OK, it's not generally a leak,
255
+ // but maybe 100 would be a bit suspicious (unless you have 30+ active rules).
256
+ sessionSocket.setMaxListeners(100);
257
+ if (this.debug) {
258
+ sessionSocket.on('data', (d) => {
259
+ console.log('Streaming data from WS clients:', d.toString());
260
+ });
261
+ wsSocket.on('data', (d) => {
262
+ console.log('Streaming data to WS clients:', d.toString());
263
+ });
264
+ }
265
+ const streamServer = new Ws.Server({ noServer: true });
266
+ streamServer.on('connection', (ws) => {
267
+ let newClientStream = Ws.createWebSocketStream(ws, {});
268
+ wsSocket.pipe(newClientStream).pipe(wsSocket, { end: false });
269
+ const unpipe = () => {
270
+ wsSocket.unpipe(newClientStream);
271
+ newClientStream.unpipe(wsSocket);
272
+ };
273
+ newClientStream.on('error', unpipe);
274
+ wsSocket.on('end', unpipe);
275
+ });
276
+ streamServer.on('close', () => {
277
+ wsSocket.end();
278
+ sessionSocket.end();
279
+ });
280
+ // Handle errors by logging & stopping this session
281
+ const onStreamError = (e) => {
282
+ if (!running)
283
+ return; // We don't care about connection issues during shutdown
284
+ console.error("Error in admin server stream, shutting down mock session");
285
+ console.error(e);
286
+ stopSession();
287
+ };
288
+ wsSocket.on('error', onStreamError);
289
+ sessionSocket.on('error', onStreamError);
290
+ const schema = (0, schema_1.makeExecutableSchema)({
291
+ typeDefs: [
292
+ AdminServer.baseSchema,
293
+ ...Object.values(plugins).map(plugin => plugin.schema)
294
+ ],
295
+ resolvers: [
296
+ this.buildBaseResolvers(sessionId),
297
+ ...Object.values(plugins).map(plugin => plugin.buildResolvers(sessionSocket, this.ruleParams))
298
+ ]
299
+ });
300
+ const subscriptionServer = subscriptions_transport_ws_1.SubscriptionServer.create({
301
+ schema,
302
+ execute: graphql_1.execute,
303
+ subscribe: graphql_1.subscribe,
304
+ keepAlive: this.webSocketKeepAlive
305
+ }, {
306
+ noServer: true
307
+ });
308
+ mockSessionRouter.use((0, express_1.createHandler)({
309
+ schema,
310
+ // Add console logging of all GQL errors:
311
+ formatError: (error) => {
312
+ console.error(error.stack);
313
+ return error;
314
+ }
315
+ }));
316
+ if (this.webSocketKeepAlive) {
317
+ // If we have a keep-alive set, send the client a ping frame every Xms to
318
+ // try and stop closes (especially by browsers) due to inactivity.
319
+ const webSocketKeepAlive = setInterval(() => {
320
+ [
321
+ ...streamServer.clients,
322
+ ...subscriptionServer.server.clients
323
+ ].forEach((client) => {
324
+ if (client.readyState !== Ws.OPEN)
325
+ return;
326
+ client.ping();
327
+ });
328
+ }, this.webSocketKeepAlive);
329
+ // We use the stream server's shutdown as an easy proxy event for full shutdown:
330
+ streamServer.on('close', () => clearInterval(webSocketKeepAlive));
331
+ }
332
+ this.sessions[sessionId] = {
333
+ sessionPlugins: plugins,
334
+ router: mockSessionRouter,
335
+ streamServer,
336
+ subscriptionServer,
337
+ stop: stopSession
338
+ };
339
+ this.eventEmitter.emit('mock-session-started', plugins, sessionId);
340
+ }
341
+ stop() {
342
+ if (!this.server)
343
+ return Promise.resolve();
344
+ return Promise.all([
345
+ this.server.destroy(),
346
+ ].concat(Object.values(this.sessions).map((s) => s.stop()))).then(() => {
347
+ this.server = null;
348
+ });
349
+ }
350
+ buildBaseResolvers(sessionId) {
351
+ return {
352
+ Query: {
353
+ ruleParameterKeys: () => this.ruleParameterKeys
354
+ },
355
+ Mutation: {
356
+ reset: () => this.resetPluginsForSession(sessionId),
357
+ enableDebug: () => this.enableDebugForSession(sessionId)
358
+ },
359
+ Raw: new graphql_1.GraphQLScalarType({
360
+ name: 'Raw',
361
+ description: 'A raw entity, serialized directly (must be JSON-compatible)',
362
+ serialize: (value) => value,
363
+ parseValue: (input) => input,
364
+ parseLiteral: graphql_utils_1.parseAnyAst
365
+ }),
366
+ // Json exists just for API backward compatibility - all new data should be Raw.
367
+ // Converting to JSON is pointless, since bodies all contain JSON anyway.
368
+ Json: new graphql_1.GraphQLScalarType({
369
+ name: 'Json',
370
+ description: 'A JSON entity, serialized as a simple JSON string',
371
+ serialize: (value) => JSON.stringify(value),
372
+ parseValue: (input) => JSON.parse(input),
373
+ parseLiteral: graphql_utils_1.parseAnyAst
374
+ }),
375
+ Void: new graphql_1.GraphQLScalarType({
376
+ name: 'Void',
377
+ description: 'Nothing at all',
378
+ serialize: (value) => null,
379
+ parseValue: (input) => null,
380
+ parseLiteral: () => { throw new Error('Void literals are not supported'); }
381
+ }),
382
+ Buffer: new graphql_1.GraphQLScalarType({
383
+ name: 'Buffer',
384
+ description: 'A buffer',
385
+ serialize: (value) => {
386
+ return value.toString('base64');
387
+ },
388
+ parseValue: (input) => {
389
+ return Buffer.from(input, 'base64');
390
+ },
391
+ parseLiteral: graphql_utils_1.parseAnyAst
392
+ })
393
+ };
394
+ }
395
+ ;
396
+ resetPluginsForSession(sessionId) {
397
+ return Promise.all(Object.values(this.sessions[sessionId].sessionPlugins).map(plugin => plugin.reset?.()));
398
+ }
399
+ enableDebugForSession(sessionId) {
400
+ return Promise.all(Object.values(this.sessions[sessionId].sessionPlugins).map(plugin => plugin.enableDebug?.()));
401
+ }
402
+ get ruleParameterKeys() {
403
+ return Object.keys(this.ruleParams);
404
+ }
405
+ }
406
+ exports.AdminServer = AdminServer;
407
+ AdminServer.baseSchema = (0, graphql_tag_1.default) `
408
+ type Mutation {
409
+ reset: Void
410
+ enableDebug: Void
411
+ }
412
+
413
+ type Query {
414
+ ruleParameterKeys: [String!]!
415
+ }
416
+
417
+ type Subscription {
418
+ _empty_placeholder_: Void # A placeholder so we can define an empty extendable type
419
+ }
420
+
421
+ scalar Void
422
+ scalar Raw
423
+ scalar Json
424
+ scalar Buffer
425
+ `;
426
+ //# sourceMappingURL=admin-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-server.js","sourceRoot":"","sources":["../../src/admin/admin-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ObjectValueNode, ValueNode } from "graphql";
2
+ export declare function astToObject<T>(ast: ObjectValueNode): T;
3
+ export declare function parseAnyAst(ast: ValueNode): any;
4
+ //# sourceMappingURL=graphql-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql-utils.d.ts","sourceRoot":"","sources":["../../src/admin/graphql-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,eAAe,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE3D,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,eAAe,GAAG,CAAC,CAKtD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,GAAG,GAAG,CAiB/C"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.astToObject = astToObject;
4
+ exports.parseAnyAst = parseAnyAst;
5
+ const _ = require("lodash");
6
+ const graphql_1 = require("graphql");
7
+ function astToObject(ast) {
8
+ return _.zipObject(ast.fields.map((f) => f.name.value), ast.fields.map((f) => parseAnyAst(f.value)));
9
+ }
10
+ function parseAnyAst(ast) {
11
+ switch (ast.kind) {
12
+ case graphql_1.Kind.OBJECT:
13
+ return astToObject(ast);
14
+ case graphql_1.Kind.LIST:
15
+ return ast.values.map(parseAnyAst);
16
+ case graphql_1.Kind.BOOLEAN:
17
+ case graphql_1.Kind.ENUM:
18
+ case graphql_1.Kind.FLOAT:
19
+ case graphql_1.Kind.INT:
20
+ case graphql_1.Kind.STRING:
21
+ return ast.value;
22
+ case graphql_1.Kind.NULL:
23
+ return null;
24
+ case graphql_1.Kind.VARIABLE:
25
+ throw new Error("No idea what parsing a 'variable' means");
26
+ }
27
+ }
28
+ //# sourceMappingURL=graphql-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql-utils.js","sourceRoot":"","sources":["../../src/admin/graphql-utils.ts"],"names":[],"mappings":";;AAGA,kCAKC;AAED,kCAiBC;AA3BD,4BAA4B;AAC5B,qCAA2D;AAE3D,SAAgB,WAAW,CAAI,GAAoB;IAC/C,OAAW,CAAC,CAAC,SAAS,CAClB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EACnC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAC9C,CAAC;AACN,CAAC;AAED,SAAgB,WAAW,CAAC,GAAc;IACtC,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,cAAI,CAAC,MAAM;YACZ,OAAO,WAAW,CAAM,GAAG,CAAC,CAAC;QACjC,KAAK,cAAI,CAAC,IAAI;YACV,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACvC,KAAK,cAAI,CAAC,OAAO,CAAC;QAClB,KAAK,cAAI,CAAC,IAAI,CAAC;QACf,KAAK,cAAI,CAAC,KAAK,CAAC;QAChB,KAAK,cAAI,CAAC,GAAG,CAAC;QACd,KAAK,cAAI,CAAC,MAAM;YACZ,OAAO,GAAG,CAAC,KAAK,CAAC;QACrB,KAAK,cAAI,CAAC,IAAI;YACV,OAAO,IAAI,CAAC;QAChB,KAAK,cAAI,CAAC,QAAQ;YACd,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACnE,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { Duplex } from "stream";
2
+ import type { IResolvers } from "@graphql-tools/utils";
3
+ import type { MockttpServer } from "../server/mockttp-server";
4
+ export declare function buildAdminServerModel(mockServer: MockttpServer, stream: Duplex, ruleParameters: {
5
+ [key: string]: any;
6
+ }): IResolvers;
7
+ //# sourceMappingURL=mockttp-admin-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockttp-admin-model.d.ts","sourceRoot":"","sources":["../../src/admin/mockttp-admin-model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAuC9D,wBAAgB,qBAAqB,CACjC,UAAU,EAAE,aAAa,EACzB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GACvC,UAAU,CAsNZ"}