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.
- package/LICENSE +201 -0
- package/README.md +123 -3
- package/custom-typings/Function.d.ts +4 -0
- package/custom-typings/cors-gate.d.ts +13 -0
- package/custom-typings/http-proxy-agent.d.ts +9 -0
- package/custom-typings/node-type-extensions.d.ts +115 -0
- package/custom-typings/proxy-agent-modules.d.ts +5 -0
- package/custom-typings/request-promise-native.d.ts +28 -0
- package/custom-typings/zstd-codec.d.ts +20 -0
- package/dist/admin/admin-bin.d.ts +3 -0
- package/dist/admin/admin-bin.d.ts.map +1 -0
- package/dist/admin/admin-bin.js +61 -0
- package/dist/admin/admin-bin.js.map +1 -0
- package/dist/admin/admin-plugin-types.d.ts +29 -0
- package/dist/admin/admin-plugin-types.d.ts.map +1 -0
- package/dist/admin/admin-plugin-types.js +3 -0
- package/dist/admin/admin-plugin-types.js.map +1 -0
- package/dist/admin/admin-server.d.ts +98 -0
- package/dist/admin/admin-server.d.ts.map +1 -0
- package/dist/admin/admin-server.js +426 -0
- package/dist/admin/admin-server.js.map +1 -0
- package/dist/admin/graphql-utils.d.ts +4 -0
- package/dist/admin/graphql-utils.d.ts.map +1 -0
- package/dist/admin/graphql-utils.js +28 -0
- package/dist/admin/graphql-utils.js.map +1 -0
- package/dist/admin/mockttp-admin-model.d.ts +7 -0
- package/dist/admin/mockttp-admin-model.d.ts.map +1 -0
- package/dist/admin/mockttp-admin-model.js +214 -0
- package/dist/admin/mockttp-admin-model.js.map +1 -0
- package/dist/admin/mockttp-admin-plugin.d.ts +28 -0
- package/dist/admin/mockttp-admin-plugin.d.ts.map +1 -0
- package/dist/admin/mockttp-admin-plugin.js +37 -0
- package/dist/admin/mockttp-admin-plugin.js.map +1 -0
- package/dist/admin/mockttp-admin-server.d.ts +16 -0
- package/dist/admin/mockttp-admin-server.d.ts.map +1 -0
- package/dist/admin/mockttp-admin-server.js +17 -0
- package/dist/admin/mockttp-admin-server.js.map +1 -0
- package/dist/admin/mockttp-schema.d.ts +2 -0
- package/dist/admin/mockttp-schema.d.ts.map +1 -0
- package/dist/admin/mockttp-schema.js +225 -0
- package/dist/admin/mockttp-schema.js.map +1 -0
- package/dist/client/admin-client.d.ts +112 -0
- package/dist/client/admin-client.d.ts.map +1 -0
- package/dist/client/admin-client.js +511 -0
- package/dist/client/admin-client.js.map +1 -0
- package/dist/client/admin-query.d.ts +13 -0
- package/dist/client/admin-query.d.ts.map +1 -0
- package/dist/client/admin-query.js +26 -0
- package/dist/client/admin-query.js.map +1 -0
- package/dist/client/mocked-endpoint-client.d.ts +12 -0
- package/dist/client/mocked-endpoint-client.d.ts.map +1 -0
- package/dist/client/mocked-endpoint-client.js +33 -0
- package/dist/client/mocked-endpoint-client.js.map +1 -0
- package/dist/client/mockttp-admin-request-builder.d.ts +38 -0
- package/dist/client/mockttp-admin-request-builder.d.ts.map +1 -0
- package/dist/client/mockttp-admin-request-builder.js +462 -0
- package/dist/client/mockttp-admin-request-builder.js.map +1 -0
- package/dist/client/mockttp-client.d.ts +56 -0
- package/dist/client/mockttp-client.d.ts.map +1 -0
- package/dist/client/mockttp-client.js +112 -0
- package/dist/client/mockttp-client.js.map +1 -0
- package/dist/client/schema-introspection.d.ts +11 -0
- package/dist/client/schema-introspection.d.ts.map +1 -0
- package/dist/client/schema-introspection.js +128 -0
- package/dist/client/schema-introspection.js.map +1 -0
- package/dist/main.browser.d.ts +49 -0
- package/dist/main.browser.d.ts.map +1 -0
- package/dist/main.browser.js +57 -0
- package/dist/main.browser.js.map +1 -0
- package/dist/main.d.ts +86 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +108 -0
- package/dist/main.js.map +1 -0
- package/dist/mockttp.d.ts +774 -0
- package/dist/mockttp.d.ts.map +1 -0
- package/dist/mockttp.js +81 -0
- package/dist/mockttp.js.map +1 -0
- package/dist/pluggable-admin-api/mockttp-pluggable-admin.browser.d.ts +5 -0
- package/dist/pluggable-admin-api/mockttp-pluggable-admin.browser.d.ts.map +1 -0
- package/dist/pluggable-admin-api/mockttp-pluggable-admin.browser.js +12 -0
- package/dist/pluggable-admin-api/mockttp-pluggable-admin.browser.js.map +1 -0
- package/dist/pluggable-admin-api/mockttp-pluggable-admin.d.ts +8 -0
- package/dist/pluggable-admin-api/mockttp-pluggable-admin.d.ts.map +1 -0
- package/dist/pluggable-admin-api/mockttp-pluggable-admin.js +13 -0
- package/dist/pluggable-admin-api/mockttp-pluggable-admin.js.map +1 -0
- package/dist/pluggable-admin-api/pluggable-admin.browser.d.ts +6 -0
- package/dist/pluggable-admin-api/pluggable-admin.browser.d.ts.map +1 -0
- package/dist/pluggable-admin-api/pluggable-admin.browser.js +13 -0
- package/dist/pluggable-admin-api/pluggable-admin.browser.js.map +1 -0
- package/dist/pluggable-admin-api/pluggable-admin.d.ts +18 -0
- package/dist/pluggable-admin-api/pluggable-admin.d.ts.map +1 -0
- package/dist/pluggable-admin-api/pluggable-admin.js +20 -0
- package/dist/pluggable-admin-api/pluggable-admin.js.map +1 -0
- package/dist/rules/base-rule-builder.d.ts +185 -0
- package/dist/rules/base-rule-builder.d.ts.map +1 -0
- package/dist/rules/base-rule-builder.js +251 -0
- package/dist/rules/base-rule-builder.js.map +1 -0
- package/dist/rules/completion-checkers.d.ts +41 -0
- package/dist/rules/completion-checkers.d.ts.map +1 -0
- package/dist/rules/completion-checkers.js +87 -0
- package/dist/rules/completion-checkers.js.map +1 -0
- package/dist/rules/http-agents.d.ts +11 -0
- package/dist/rules/http-agents.d.ts.map +1 -0
- package/dist/rules/http-agents.js +91 -0
- package/dist/rules/http-agents.js.map +1 -0
- package/dist/rules/matchers.d.ts +214 -0
- package/dist/rules/matchers.d.ts.map +1 -0
- package/dist/rules/matchers.js +515 -0
- package/dist/rules/matchers.js.map +1 -0
- package/dist/rules/passthrough-handling-definitions.d.ts +106 -0
- package/dist/rules/passthrough-handling-definitions.d.ts.map +1 -0
- package/dist/rules/passthrough-handling-definitions.js +3 -0
- package/dist/rules/passthrough-handling-definitions.js.map +1 -0
- package/dist/rules/passthrough-handling.d.ts +33 -0
- package/dist/rules/passthrough-handling.d.ts.map +1 -0
- package/dist/rules/passthrough-handling.js +294 -0
- package/dist/rules/passthrough-handling.js.map +1 -0
- package/dist/rules/proxy-config.d.ts +76 -0
- package/dist/rules/proxy-config.d.ts.map +1 -0
- package/dist/rules/proxy-config.js +48 -0
- package/dist/rules/proxy-config.js.map +1 -0
- package/dist/rules/requests/request-handler-definitions.d.ts +600 -0
- package/dist/rules/requests/request-handler-definitions.d.ts.map +1 -0
- package/dist/rules/requests/request-handler-definitions.js +423 -0
- package/dist/rules/requests/request-handler-definitions.js.map +1 -0
- package/dist/rules/requests/request-handlers.d.ts +65 -0
- package/dist/rules/requests/request-handlers.d.ts.map +1 -0
- package/dist/rules/requests/request-handlers.js +1014 -0
- package/dist/rules/requests/request-handlers.js.map +1 -0
- package/dist/rules/requests/request-rule-builder.d.ts +255 -0
- package/dist/rules/requests/request-rule-builder.d.ts.map +1 -0
- package/dist/rules/requests/request-rule-builder.js +340 -0
- package/dist/rules/requests/request-rule-builder.js.map +1 -0
- package/dist/rules/requests/request-rule.d.ts +36 -0
- package/dist/rules/requests/request-rule.d.ts.map +1 -0
- package/dist/rules/requests/request-rule.js +100 -0
- package/dist/rules/requests/request-rule.js.map +1 -0
- package/dist/rules/rule-deserialization.d.ts +8 -0
- package/dist/rules/rule-deserialization.d.ts.map +1 -0
- package/dist/rules/rule-deserialization.js +27 -0
- package/dist/rules/rule-deserialization.js.map +1 -0
- package/dist/rules/rule-parameters.d.ts +21 -0
- package/dist/rules/rule-parameters.d.ts.map +1 -0
- package/dist/rules/rule-parameters.js +31 -0
- package/dist/rules/rule-parameters.js.map +1 -0
- package/dist/rules/rule-serialization.d.ts +7 -0
- package/dist/rules/rule-serialization.d.ts.map +1 -0
- package/dist/rules/rule-serialization.js +25 -0
- package/dist/rules/rule-serialization.js.map +1 -0
- package/dist/rules/websockets/websocket-handler-definitions.d.ts +78 -0
- package/dist/rules/websockets/websocket-handler-definitions.d.ts.map +1 -0
- package/dist/rules/websockets/websocket-handler-definitions.js +118 -0
- package/dist/rules/websockets/websocket-handler-definitions.js.map +1 -0
- package/dist/rules/websockets/websocket-handlers.d.ts +39 -0
- package/dist/rules/websockets/websocket-handlers.d.ts.map +1 -0
- package/dist/rules/websockets/websocket-handlers.js +356 -0
- package/dist/rules/websockets/websocket-handlers.js.map +1 -0
- package/dist/rules/websockets/websocket-rule-builder.d.ts +173 -0
- package/dist/rules/websockets/websocket-rule-builder.d.ts.map +1 -0
- package/dist/rules/websockets/websocket-rule-builder.js +232 -0
- package/dist/rules/websockets/websocket-rule-builder.js.map +1 -0
- package/dist/rules/websockets/websocket-rule.d.ts +34 -0
- package/dist/rules/websockets/websocket-rule.d.ts.map +1 -0
- package/dist/rules/websockets/websocket-rule.js +87 -0
- package/dist/rules/websockets/websocket-rule.js.map +1 -0
- package/dist/serialization/body-serialization.d.ts +43 -0
- package/dist/serialization/body-serialization.d.ts.map +1 -0
- package/dist/serialization/body-serialization.js +70 -0
- package/dist/serialization/body-serialization.js.map +1 -0
- package/dist/serialization/serialization.d.ts +63 -0
- package/dist/serialization/serialization.d.ts.map +1 -0
- package/dist/serialization/serialization.js +263 -0
- package/dist/serialization/serialization.js.map +1 -0
- package/dist/server/http-combo-server.d.ts +13 -0
- package/dist/server/http-combo-server.d.ts.map +1 -0
- package/dist/server/http-combo-server.js +330 -0
- package/dist/server/http-combo-server.js.map +1 -0
- package/dist/server/mocked-endpoint.d.ts +14 -0
- package/dist/server/mocked-endpoint.d.ts.map +1 -0
- package/dist/server/mocked-endpoint.js +40 -0
- package/dist/server/mocked-endpoint.js.map +1 -0
- package/dist/server/mockttp-server.d.ts +87 -0
- package/dist/server/mockttp-server.d.ts.map +1 -0
- package/dist/server/mockttp-server.js +859 -0
- package/dist/server/mockttp-server.js.map +1 -0
- package/dist/types.d.ts +359 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +20 -0
- package/dist/types.js.map +1 -0
- package/dist/util/buffer-utils.d.ts +13 -0
- package/dist/util/buffer-utils.d.ts.map +1 -0
- package/dist/util/buffer-utils.js +141 -0
- package/dist/util/buffer-utils.js.map +1 -0
- package/dist/util/dns.d.ts +11 -0
- package/dist/util/dns.d.ts.map +1 -0
- package/dist/util/dns.js +47 -0
- package/dist/util/dns.js.map +1 -0
- package/dist/util/error.d.ts +9 -0
- package/dist/util/error.d.ts.map +1 -0
- package/dist/util/error.js +11 -0
- package/dist/util/error.js.map +1 -0
- package/dist/util/header-utils.d.ts +35 -0
- package/dist/util/header-utils.d.ts.map +1 -0
- package/dist/util/header-utils.js +200 -0
- package/dist/util/header-utils.js.map +1 -0
- package/dist/util/openssl-compat.d.ts +2 -0
- package/dist/util/openssl-compat.d.ts.map +1 -0
- package/dist/util/openssl-compat.js +26 -0
- package/dist/util/openssl-compat.js.map +1 -0
- package/dist/util/promise.d.ts +10 -0
- package/dist/util/promise.d.ts.map +1 -0
- package/dist/util/promise.js +25 -0
- package/dist/util/promise.js.map +1 -0
- package/dist/util/request-utils.d.ts +46 -0
- package/dist/util/request-utils.d.ts.map +1 -0
- package/dist/util/request-utils.js +462 -0
- package/dist/util/request-utils.js.map +1 -0
- package/dist/util/server-utils.d.ts +2 -0
- package/dist/util/server-utils.d.ts.map +1 -0
- package/dist/util/server-utils.js +14 -0
- package/dist/util/server-utils.js.map +1 -0
- package/dist/util/socket-util.d.ts +28 -0
- package/dist/util/socket-util.d.ts.map +1 -0
- package/dist/util/socket-util.js +174 -0
- package/dist/util/socket-util.js.map +1 -0
- package/dist/util/tls.d.ts +68 -0
- package/dist/util/tls.d.ts.map +1 -0
- package/dist/util/tls.js +220 -0
- package/dist/util/tls.js.map +1 -0
- package/dist/util/type-utils.d.ts +14 -0
- package/dist/util/type-utils.d.ts.map +1 -0
- package/dist/util/type-utils.js +3 -0
- package/dist/util/type-utils.js.map +1 -0
- package/dist/util/url.d.ts +17 -0
- package/dist/util/url.d.ts.map +1 -0
- package/dist/util/url.js +96 -0
- package/dist/util/url.js.map +1 -0
- package/dist/util/util.d.ts +8 -0
- package/dist/util/util.d.ts.map +1 -0
- package/dist/util/util.js +41 -0
- package/dist/util/util.js.map +1 -0
- package/docs/api-docs-landing-page.md +11 -0
- package/docs/runkitExample.js +16 -0
- package/docs/setup.md +136 -0
- package/nfyb8qx5.cjs +1 -0
- package/package.json +194 -4
- package/src/admin/admin-bin.ts +62 -0
- package/src/admin/admin-plugin-types.ts +29 -0
- package/src/admin/admin-server.ts +619 -0
- package/src/admin/graphql-utils.ts +28 -0
- package/src/admin/mockttp-admin-model.ts +264 -0
- package/src/admin/mockttp-admin-plugin.ts +59 -0
- package/src/admin/mockttp-admin-server.ts +27 -0
- package/src/admin/mockttp-schema.ts +222 -0
- package/src/client/admin-client.ts +652 -0
- package/src/client/admin-query.ts +52 -0
- package/src/client/mocked-endpoint-client.ts +32 -0
- package/src/client/mockttp-admin-request-builder.ts +540 -0
- package/src/client/mockttp-client.ts +178 -0
- package/src/client/schema-introspection.ts +131 -0
- package/src/main.browser.ts +60 -0
- package/src/main.ts +160 -0
- package/src/mockttp.ts +926 -0
- package/src/pluggable-admin-api/mockttp-pluggable-admin.browser.ts +7 -0
- package/src/pluggable-admin-api/mockttp-pluggable-admin.ts +13 -0
- package/src/pluggable-admin-api/pluggable-admin.browser.ts +9 -0
- package/src/pluggable-admin-api/pluggable-admin.ts +36 -0
- package/src/rules/base-rule-builder.ts +312 -0
- package/src/rules/completion-checkers.ts +90 -0
- package/src/rules/http-agents.ts +119 -0
- package/src/rules/matchers.ts +665 -0
- package/src/rules/passthrough-handling-definitions.ts +111 -0
- package/src/rules/passthrough-handling.ts +376 -0
- package/src/rules/proxy-config.ts +136 -0
- package/src/rules/requests/request-handler-definitions.ts +1089 -0
- package/src/rules/requests/request-handlers.ts +1369 -0
- package/src/rules/requests/request-rule-builder.ts +481 -0
- package/src/rules/requests/request-rule.ts +148 -0
- package/src/rules/rule-deserialization.ts +55 -0
- package/src/rules/rule-parameters.ts +41 -0
- package/src/rules/rule-serialization.ts +29 -0
- package/src/rules/websockets/websocket-handler-definitions.ts +196 -0
- package/src/rules/websockets/websocket-handlers.ts +509 -0
- package/src/rules/websockets/websocket-rule-builder.ts +275 -0
- package/src/rules/websockets/websocket-rule.ts +136 -0
- package/src/serialization/body-serialization.ts +84 -0
- package/src/serialization/serialization.ts +373 -0
- package/src/server/http-combo-server.ts +424 -0
- package/src/server/mocked-endpoint.ts +44 -0
- package/src/server/mockttp-server.ts +1110 -0
- package/src/types.ts +433 -0
- package/src/util/buffer-utils.ts +164 -0
- package/src/util/dns.ts +52 -0
- package/src/util/error.ts +18 -0
- package/src/util/header-utils.ts +220 -0
- package/src/util/openssl-compat.ts +26 -0
- package/src/util/promise.ts +31 -0
- package/src/util/request-utils.ts +607 -0
- package/src/util/server-utils.ts +18 -0
- package/src/util/socket-util.ts +193 -0
- package/src/util/tls.ts +348 -0
- package/src/util/type-utils.ts +15 -0
- package/src/util/url.ts +113 -0
- package/src/util/util.ts +39 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { Duplex } from 'stream';
|
|
3
|
+
import { TypedError } from 'typed-error';
|
|
4
|
+
import { AdminPlugin, PluginClientResponsesMap, PluginStartParamsMap } from '../admin/admin-plugin-types';
|
|
5
|
+
import { SchemaIntrospector } from './schema-introspection';
|
|
6
|
+
import { AdminQuery } from './admin-query';
|
|
7
|
+
export declare class ConnectionError extends TypedError {
|
|
8
|
+
}
|
|
9
|
+
declare global {
|
|
10
|
+
interface Response {
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export declare class RequestError extends TypedError {
|
|
14
|
+
response: Response;
|
|
15
|
+
constructor(message: string, response: Response);
|
|
16
|
+
}
|
|
17
|
+
export declare class GraphQLError extends RequestError {
|
|
18
|
+
errors: Array<{
|
|
19
|
+
message: string;
|
|
20
|
+
}>;
|
|
21
|
+
constructor(response: Response, errors: Array<{
|
|
22
|
+
message: string;
|
|
23
|
+
}>);
|
|
24
|
+
}
|
|
25
|
+
export type AdminClientEvent = 'starting' | 'started' | 'start-failed' | 'stopping' | 'stopped' | 'stream-error' | 'stream-reconnecting' | 'stream-reconnected' | 'stream-reconnect-failed' | 'subscription-error' | 'subscription-reconnecting';
|
|
26
|
+
export interface AdminClientOptions {
|
|
27
|
+
/**
|
|
28
|
+
* Should the client print extra debug information?
|
|
29
|
+
*/
|
|
30
|
+
debug?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* The full URL to use to connect to a Mockttp admin server when using a
|
|
33
|
+
* remote (or local but browser) client.
|
|
34
|
+
*
|
|
35
|
+
* When using a local server, this option is ignored.
|
|
36
|
+
*/
|
|
37
|
+
adminServerUrl?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Options to include on all client requests.
|
|
40
|
+
*/
|
|
41
|
+
requestOptions?: {
|
|
42
|
+
headers?: {
|
|
43
|
+
[key: string]: string;
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Reset a remote admin server, shutting down all Mockttp servers controlled by that
|
|
49
|
+
* admin server. This is equivalent to calling `client.stop()` for all remote
|
|
50
|
+
* clients of the target server.
|
|
51
|
+
*
|
|
52
|
+
* This can be useful in some rare cases, where a client might fail to reliably tear down
|
|
53
|
+
* its own server, e.g. in Cypress testing. In this case, it's useful to reset the
|
|
54
|
+
* admin server completely remotely without needing access to any previous client
|
|
55
|
+
* instances, to ensure all servers from previous test runs have been shut down.
|
|
56
|
+
*
|
|
57
|
+
* After this is called, behaviour of any previously connected clients is undefined, and
|
|
58
|
+
* it's likely that they may throw errors or experience other undefined behaviour. Ensure
|
|
59
|
+
* that `client.stop()` has been called on all active clients before calling this method.
|
|
60
|
+
*/
|
|
61
|
+
export declare function resetAdminServer(options?: AdminClientOptions): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* A bare admin server client. This is not intended for general use, but can be useful when
|
|
64
|
+
* building admin server plugins to mock non-HTTP protocols and other advanced use cases.
|
|
65
|
+
*
|
|
66
|
+
* For normal usage of Mockttp, you should use `Mockttp.getRemote()` instead, to get a Mockttp
|
|
67
|
+
* remote client, which wraps this class with the full Mockttp API for mocking HTTP.
|
|
68
|
+
*
|
|
69
|
+
* This is part of Mockttp's experimental 'pluggable admin' API. It may change
|
|
70
|
+
* unpredictably, even in minor releases.
|
|
71
|
+
*/
|
|
72
|
+
export declare class AdminClient<Plugins extends {
|
|
73
|
+
[key: string]: AdminPlugin<any, any>;
|
|
74
|
+
}> extends EventEmitter {
|
|
75
|
+
private adminClientOptions;
|
|
76
|
+
private adminSessionBaseUrl;
|
|
77
|
+
private adminServerStream;
|
|
78
|
+
private subscriptionClient;
|
|
79
|
+
private adminServerSchema;
|
|
80
|
+
private adminServerMetadata;
|
|
81
|
+
private debug;
|
|
82
|
+
private running;
|
|
83
|
+
constructor(options?: AdminClientOptions);
|
|
84
|
+
private attachStreamWebsocket;
|
|
85
|
+
private openStreamToMockServer;
|
|
86
|
+
private prepareSubscriptionClientToAdminServer;
|
|
87
|
+
private requestFromMockServer;
|
|
88
|
+
private queryMockServer;
|
|
89
|
+
start(pluginStartParams: PluginStartParamsMap<Plugins>): Promise<PluginClientResponsesMap<Plugins>>;
|
|
90
|
+
isRunning(): boolean;
|
|
91
|
+
get metadata(): PluginClientResponsesMap<Plugins>;
|
|
92
|
+
get schema(): SchemaIntrospector;
|
|
93
|
+
get adminStream(): Duplex;
|
|
94
|
+
stop(): Promise<void>;
|
|
95
|
+
private requestServerStop;
|
|
96
|
+
enableDebug: () => Promise<void>;
|
|
97
|
+
reset: () => Promise<void>;
|
|
98
|
+
sendQuery<Response, Result = Response>(query: AdminQuery<Response, Result>): Promise<Result>;
|
|
99
|
+
sendQueries<Queries extends Array<AdminQuery<any>>>(...queries: [...Queries]): Promise<{
|
|
100
|
+
[n in keyof Queries]: Queries[n] extends AdminQuery<any, infer R> ? R : never;
|
|
101
|
+
}>;
|
|
102
|
+
subscribe<Response, Result = Response>(query: AdminQuery<Response, Result>, callback: (data: Result) => void): Promise<void>;
|
|
103
|
+
/**
|
|
104
|
+
* List the names of the rule parameters defined by the admin server. This can be
|
|
105
|
+
* used in some advanced use cases to confirm that the parameters a client wishes to
|
|
106
|
+
* reference are available.
|
|
107
|
+
*
|
|
108
|
+
* Only defined for remote clients.
|
|
109
|
+
*/
|
|
110
|
+
getRuleParameterKeys(): Promise<string[]>;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=admin-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-client.d.ts","sourceRoot":"","sources":["../../src/client/admin-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,511 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AdminClient = exports.GraphQLError = exports.RequestError = exports.ConnectionError = void 0;
|
|
4
|
+
exports.resetAdminServer = resetAdminServer;
|
|
5
|
+
const _ = require("lodash");
|
|
6
|
+
const events_1 = require("events");
|
|
7
|
+
const DuplexPair = require("native-duplexpair");
|
|
8
|
+
const typed_error_1 = require("typed-error");
|
|
9
|
+
const CrossFetch = require("cross-fetch");
|
|
10
|
+
const WebSocket = require("isomorphic-ws");
|
|
11
|
+
const connectWebSocketStream = require("@httptoolkit/websocket-stream");
|
|
12
|
+
const subscriptions_transport_ws_1 = require("@httptoolkit/subscriptions-transport-ws");
|
|
13
|
+
const graphql_1 = require("graphql");
|
|
14
|
+
const types_1 = require("../types");
|
|
15
|
+
const util_1 = require("../util/util");
|
|
16
|
+
const error_1 = require("../util/error");
|
|
17
|
+
const promise_1 = require("../util/promise");
|
|
18
|
+
const schema_introspection_1 = require("./schema-introspection");
|
|
19
|
+
const schema_introspection_2 = require("./schema-introspection");
|
|
20
|
+
const admin_query_1 = require("./admin-query");
|
|
21
|
+
const { fetch, Headers } = util_1.isNode || typeof globalThis.fetch === 'undefined'
|
|
22
|
+
? CrossFetch
|
|
23
|
+
: globalThis;
|
|
24
|
+
class ConnectionError extends typed_error_1.TypedError {
|
|
25
|
+
}
|
|
26
|
+
exports.ConnectionError = ConnectionError;
|
|
27
|
+
class RequestError extends typed_error_1.TypedError {
|
|
28
|
+
constructor(message, response) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.response = response;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.RequestError = RequestError;
|
|
34
|
+
class GraphQLError extends RequestError {
|
|
35
|
+
constructor(response, errors) {
|
|
36
|
+
super(errors.length === 0
|
|
37
|
+
? `GraphQL request failed with ${response.status} response`
|
|
38
|
+
: errors.length === 1
|
|
39
|
+
? `GraphQL request failed with: ${errors[0].message}`
|
|
40
|
+
: // >1
|
|
41
|
+
`GraphQL request failed, with errors:\n${errors.map((e) => e.message).join('\n')}`, response);
|
|
42
|
+
this.errors = errors;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.GraphQLError = GraphQLError;
|
|
46
|
+
const mergeClientOptions = (options, defaultOptions) => {
|
|
47
|
+
if (!defaultOptions)
|
|
48
|
+
return options;
|
|
49
|
+
if (!options)
|
|
50
|
+
return defaultOptions;
|
|
51
|
+
if (defaultOptions.headers) {
|
|
52
|
+
if (!options.headers) {
|
|
53
|
+
options.headers = defaultOptions.headers;
|
|
54
|
+
}
|
|
55
|
+
else if (options.headers instanceof Headers) {
|
|
56
|
+
_.forEach(defaultOptions.headers, (value, key) => {
|
|
57
|
+
options.headers.append(key, value);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
else if (_.isObject(options.headers)) {
|
|
61
|
+
Object.assign(options.headers, defaultOptions.headers);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return options;
|
|
65
|
+
};
|
|
66
|
+
async function requestFromAdminServer(serverUrl, path, options) {
|
|
67
|
+
const url = `${serverUrl}${path}`;
|
|
68
|
+
let response;
|
|
69
|
+
try {
|
|
70
|
+
response = await fetch(url, options);
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
if ((0, error_1.isErrorLike)(e) && e.code === 'ECONNREFUSED') {
|
|
74
|
+
throw new ConnectionError(`Failed to connect to admin server at ${serverUrl}`);
|
|
75
|
+
}
|
|
76
|
+
else
|
|
77
|
+
throw e;
|
|
78
|
+
}
|
|
79
|
+
if (response.status >= 400) {
|
|
80
|
+
let body = await response.text();
|
|
81
|
+
let jsonBody = null;
|
|
82
|
+
try {
|
|
83
|
+
jsonBody = JSON.parse(body);
|
|
84
|
+
}
|
|
85
|
+
catch (e) { }
|
|
86
|
+
if (jsonBody && jsonBody.error) {
|
|
87
|
+
throw new RequestError(jsonBody.error, response);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
throw new RequestError(`Request to ${url} failed, with status ${response.status} and response body: ${body}`, response);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
return response.json();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Reset a remote admin server, shutting down all Mockttp servers controlled by that
|
|
99
|
+
* admin server. This is equivalent to calling `client.stop()` for all remote
|
|
100
|
+
* clients of the target server.
|
|
101
|
+
*
|
|
102
|
+
* This can be useful in some rare cases, where a client might fail to reliably tear down
|
|
103
|
+
* its own server, e.g. in Cypress testing. In this case, it's useful to reset the
|
|
104
|
+
* admin server completely remotely without needing access to any previous client
|
|
105
|
+
* instances, to ensure all servers from previous test runs have been shut down.
|
|
106
|
+
*
|
|
107
|
+
* After this is called, behaviour of any previously connected clients is undefined, and
|
|
108
|
+
* it's likely that they may throw errors or experience other undefined behaviour. Ensure
|
|
109
|
+
* that `client.stop()` has been called on all active clients before calling this method.
|
|
110
|
+
*/
|
|
111
|
+
async function resetAdminServer(options = {}) {
|
|
112
|
+
const serverUrl = options.adminServerUrl ||
|
|
113
|
+
`http://localhost:${types_1.DEFAULT_ADMIN_SERVER_PORT}`;
|
|
114
|
+
await requestFromAdminServer(serverUrl, '/reset', {
|
|
115
|
+
...options.requestOptions,
|
|
116
|
+
method: 'POST'
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* A bare admin server client. This is not intended for general use, but can be useful when
|
|
121
|
+
* building admin server plugins to mock non-HTTP protocols and other advanced use cases.
|
|
122
|
+
*
|
|
123
|
+
* For normal usage of Mockttp, you should use `Mockttp.getRemote()` instead, to get a Mockttp
|
|
124
|
+
* remote client, which wraps this class with the full Mockttp API for mocking HTTP.
|
|
125
|
+
*
|
|
126
|
+
* This is part of Mockttp's experimental 'pluggable admin' API. It may change
|
|
127
|
+
* unpredictably, even in minor releases.
|
|
128
|
+
*/
|
|
129
|
+
class AdminClient extends events_1.EventEmitter {
|
|
130
|
+
constructor(options = {}) {
|
|
131
|
+
super();
|
|
132
|
+
this.debug = false;
|
|
133
|
+
// True if server is entirely initialized, false if it's entirely shut down, or a promise
|
|
134
|
+
// that resolves to one or the other if it's currently changing state.
|
|
135
|
+
this.running = false;
|
|
136
|
+
this.enableDebug = async () => {
|
|
137
|
+
this.debug = true;
|
|
138
|
+
return (await this.queryMockServer(`mutation EnableDebug {
|
|
139
|
+
enableDebug
|
|
140
|
+
}`));
|
|
141
|
+
};
|
|
142
|
+
this.reset = async () => {
|
|
143
|
+
return (await this.queryMockServer(`mutation Reset {
|
|
144
|
+
reset
|
|
145
|
+
}`));
|
|
146
|
+
};
|
|
147
|
+
this.debug = !!options.debug;
|
|
148
|
+
this.adminClientOptions = _.defaults(options, {
|
|
149
|
+
adminServerUrl: `http://localhost:${types_1.DEFAULT_ADMIN_SERVER_PORT}`
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
attachStreamWebsocket(adminSessionBaseUrl, targetStream) {
|
|
153
|
+
const adminSessionBaseWSUrl = adminSessionBaseUrl.replace(/^http/, 'ws');
|
|
154
|
+
const wsStream = connectWebSocketStream(`${adminSessionBaseWSUrl}/stream`, {
|
|
155
|
+
headers: this.adminClientOptions?.requestOptions?.headers // Only used in Node.js (via WS)
|
|
156
|
+
});
|
|
157
|
+
let streamConnected = false;
|
|
158
|
+
wsStream.on('connect', () => {
|
|
159
|
+
streamConnected = true;
|
|
160
|
+
targetStream.pipe(wsStream);
|
|
161
|
+
wsStream.pipe(targetStream, { end: false });
|
|
162
|
+
});
|
|
163
|
+
// We ignore errors, but websocket closure eventually results in reconnect or shutdown
|
|
164
|
+
wsStream.on('error', (e) => {
|
|
165
|
+
if (this.debug)
|
|
166
|
+
console.warn('Admin client stream error', e);
|
|
167
|
+
this.emit('stream-error', e);
|
|
168
|
+
});
|
|
169
|
+
// When the websocket closes (after connect, either close frame, error, or socket shutdown):
|
|
170
|
+
wsStream.on('ws-close', async (closeEvent) => {
|
|
171
|
+
targetStream.unpipe(wsStream);
|
|
172
|
+
const serverShutdown = closeEvent.code === 1000;
|
|
173
|
+
if (serverShutdown) {
|
|
174
|
+
// Clean shutdown implies the server is gone, and we need to shutdown & cleanup.
|
|
175
|
+
targetStream.emit('server-shutdown');
|
|
176
|
+
}
|
|
177
|
+
else if (streamConnected && (await this.running) === true) {
|
|
178
|
+
console.warn('Admin client stream unexpectedly disconnected', closeEvent);
|
|
179
|
+
this.emit('stream-reconnecting');
|
|
180
|
+
// Unclean shutdown means something has gone wrong somewhere. Try to reconnect.
|
|
181
|
+
const newStream = this.attachStreamWebsocket(adminSessionBaseUrl, targetStream);
|
|
182
|
+
new Promise((resolve, reject) => {
|
|
183
|
+
newStream.once('connect', resolve);
|
|
184
|
+
newStream.once('error', reject);
|
|
185
|
+
}).then(() => {
|
|
186
|
+
// On a successful connect, business resumes as normal.
|
|
187
|
+
console.warn('Admin client stream reconnected');
|
|
188
|
+
this.emit('stream-reconnected');
|
|
189
|
+
}).catch((err) => {
|
|
190
|
+
// On a failed reconnect, we just shut down completely.
|
|
191
|
+
console.warn('Admin client stream reconnection failed, shutting down:', err.message);
|
|
192
|
+
if (this.debug)
|
|
193
|
+
console.warn(err);
|
|
194
|
+
this.emit('stream-reconnect-failed', err);
|
|
195
|
+
targetStream.emit('server-shutdown');
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
// If never connected successfully, we do nothing.
|
|
199
|
+
});
|
|
200
|
+
targetStream.on('finish', () => {
|
|
201
|
+
// Ignore any further WebSocket events - the websocket stream is no longer useful
|
|
202
|
+
wsStream.removeAllListeners('connect');
|
|
203
|
+
wsStream.removeAllListeners('ws-close');
|
|
204
|
+
wsStream.destroy();
|
|
205
|
+
});
|
|
206
|
+
return wsStream;
|
|
207
|
+
}
|
|
208
|
+
openStreamToMockServer(adminSessionBaseUrl) {
|
|
209
|
+
// To allow reconnects, we need to not end the client stream when an individual web socket ends.
|
|
210
|
+
// To make that work, we return a separate stream, which isn't directly connected to the websocket
|
|
211
|
+
// and doesn't receive WS 'end' events, and then we can swap the WS inputs accordingly.
|
|
212
|
+
const { socket1: wsTarget, socket2: exposedStream } = new DuplexPair();
|
|
213
|
+
const wsStream = this.attachStreamWebsocket(adminSessionBaseUrl, wsTarget);
|
|
214
|
+
wsTarget.on('error', (e) => exposedStream.emit('error', e));
|
|
215
|
+
// When the server stream ends, end the target stream, which will automatically end all websockets.
|
|
216
|
+
exposedStream.on('finish', () => wsTarget.end());
|
|
217
|
+
// Propagate 'server is definitely no longer available' back from the websockets:
|
|
218
|
+
wsTarget.on('server-shutdown', () => exposedStream.emit('server-shutdown'));
|
|
219
|
+
// These receive a lot of listeners! One channel per matcher, handler & completion checker,
|
|
220
|
+
// and each adds listeners for data/error/finish/etc. That's OK, it's not generally a leak,
|
|
221
|
+
// but maybe 100 would be a bit suspicious (unless you have 30+ active rules).
|
|
222
|
+
exposedStream.setMaxListeners(100);
|
|
223
|
+
return new Promise((resolve, reject) => {
|
|
224
|
+
wsStream.once('connect', () => resolve(exposedStream));
|
|
225
|
+
wsStream.once('error', reject);
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
prepareSubscriptionClientToAdminServer(adminSessionBaseUrl) {
|
|
229
|
+
const adminSessionBaseWSUrl = adminSessionBaseUrl.replace(/^http/, 'ws');
|
|
230
|
+
const subscriptionUrl = `${adminSessionBaseWSUrl}/subscription`;
|
|
231
|
+
this.subscriptionClient = new subscriptions_transport_ws_1.SubscriptionClient(subscriptionUrl, {
|
|
232
|
+
lazy: true, // Doesn't actually connect until you use subscriptions
|
|
233
|
+
reconnect: true,
|
|
234
|
+
reconnectionAttempts: 8,
|
|
235
|
+
wsOptionArguments: [this.adminClientOptions.requestOptions]
|
|
236
|
+
}, WebSocket);
|
|
237
|
+
this.subscriptionClient.onError((e) => {
|
|
238
|
+
this.emit('subscription-error', e);
|
|
239
|
+
if (this.debug)
|
|
240
|
+
console.error("Subscription error", e);
|
|
241
|
+
});
|
|
242
|
+
this.subscriptionClient.onReconnecting(() => {
|
|
243
|
+
this.emit('subscription-reconnecting');
|
|
244
|
+
console.warn('Reconnecting Mockttp subscription client');
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
async requestFromMockServer(path, options) {
|
|
248
|
+
// Must check for session URL, not this.running, or we can't send the /stop request during shutdown!
|
|
249
|
+
if (!this.adminSessionBaseUrl)
|
|
250
|
+
throw new Error('Not connected to mock server');
|
|
251
|
+
let url = this.adminSessionBaseUrl + path;
|
|
252
|
+
let response = await fetch(url, mergeClientOptions(options, this.adminClientOptions.requestOptions));
|
|
253
|
+
if (response.status >= 400) {
|
|
254
|
+
if (this.debug)
|
|
255
|
+
console.error(`Remote client server request failed with status ${response.status}`);
|
|
256
|
+
throw new RequestError(`Request to ${url} failed, with status ${response.status}`, response);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
return response;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
async queryMockServer(query, variables) {
|
|
263
|
+
try {
|
|
264
|
+
const response = (await this.requestFromMockServer('/', {
|
|
265
|
+
method: 'POST',
|
|
266
|
+
headers: new Headers({
|
|
267
|
+
'Content-Type': 'application/json'
|
|
268
|
+
}),
|
|
269
|
+
body: JSON.stringify({ query, variables })
|
|
270
|
+
}));
|
|
271
|
+
const { data, errors } = await response.json();
|
|
272
|
+
if (errors && errors.length) {
|
|
273
|
+
throw new GraphQLError(response, errors);
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
return data;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
catch (e) {
|
|
280
|
+
if (this.debug)
|
|
281
|
+
console.error(`Remote client query error: ${e}`);
|
|
282
|
+
if (!(e instanceof RequestError))
|
|
283
|
+
throw e;
|
|
284
|
+
let graphQLErrors = undefined;
|
|
285
|
+
try {
|
|
286
|
+
graphQLErrors = (await e.response.json()).errors;
|
|
287
|
+
}
|
|
288
|
+
catch (e2) { }
|
|
289
|
+
if (graphQLErrors) {
|
|
290
|
+
throw new GraphQLError(e.response, graphQLErrors);
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
throw e;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
async start(pluginStartParams) {
|
|
298
|
+
if (this.adminSessionBaseUrl || await this.running)
|
|
299
|
+
throw new Error('Server is already started');
|
|
300
|
+
if (this.debug)
|
|
301
|
+
console.log(`Starting remote mock server`);
|
|
302
|
+
this.emit('starting');
|
|
303
|
+
const startPromise = (0, promise_1.getDeferred)();
|
|
304
|
+
this.running = startPromise.then((result) => {
|
|
305
|
+
this.emit(result ? 'started' : 'start-failed');
|
|
306
|
+
this.running = result;
|
|
307
|
+
return result;
|
|
308
|
+
});
|
|
309
|
+
try {
|
|
310
|
+
const supportOldServers = 'http' in pluginStartParams;
|
|
311
|
+
const portConfig = supportOldServers
|
|
312
|
+
? pluginStartParams['http'].port
|
|
313
|
+
: undefined;
|
|
314
|
+
const path = portConfig ? `/start?port=${JSON.stringify(portConfig)}` : '/start';
|
|
315
|
+
const adminServerResponse = await requestFromAdminServer(this.adminClientOptions.adminServerUrl, path, mergeClientOptions({
|
|
316
|
+
method: 'POST',
|
|
317
|
+
headers: new Headers({
|
|
318
|
+
'Content-Type': 'application/json'
|
|
319
|
+
}),
|
|
320
|
+
body: JSON.stringify({
|
|
321
|
+
plugins: pluginStartParams,
|
|
322
|
+
// Include all the Mockttp params at the root too, for backward compat with old admin servers:
|
|
323
|
+
...pluginStartParams.http?.options
|
|
324
|
+
})
|
|
325
|
+
}, this.adminClientOptions.requestOptions));
|
|
326
|
+
// Backward compat for old servers
|
|
327
|
+
const isPluginAwareServer = 'id' in adminServerResponse;
|
|
328
|
+
const sessionId = isPluginAwareServer
|
|
329
|
+
? adminServerResponse.id
|
|
330
|
+
: adminServerResponse.port.toString();
|
|
331
|
+
const adminSessionBaseUrl = `${this.adminClientOptions.adminServerUrl}/${isPluginAwareServer ? 'session' : 'server'}/${sessionId}`;
|
|
332
|
+
// Also open a stream connection, for 2-way communication we might need later.
|
|
333
|
+
const adminServerStream = await this.openStreamToMockServer(adminSessionBaseUrl);
|
|
334
|
+
adminServerStream.on('server-shutdown', () => {
|
|
335
|
+
// When the server remotely disconnects the stream, shut down the client iff the client hasn't
|
|
336
|
+
// stopped & restarted in the meantime (can happen, since all shutdown is async).
|
|
337
|
+
if (this.adminServerStream === adminServerStream) {
|
|
338
|
+
console.warn('Client stopping due to admin server shutdown');
|
|
339
|
+
this.stop();
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
this.adminServerStream = adminServerStream;
|
|
343
|
+
// Create a subscription client, preconfigured & ready to connect if on() is called later:
|
|
344
|
+
this.prepareSubscriptionClientToAdminServer(adminSessionBaseUrl);
|
|
345
|
+
// We don't persist the id or resolve the start promise until everything is set up
|
|
346
|
+
this.adminSessionBaseUrl = adminSessionBaseUrl;
|
|
347
|
+
// Load the schema on server start, so we can check for feature support
|
|
348
|
+
this.adminServerSchema = new schema_introspection_2.SchemaIntrospector((await this.queryMockServer(schema_introspection_1.introspectionQuery)).__schema);
|
|
349
|
+
if (this.debug)
|
|
350
|
+
console.log('Started remote mock server');
|
|
351
|
+
const serverMetadata = this.adminServerMetadata = // Set field before we resolve the promise
|
|
352
|
+
'pluginData' in adminServerResponse
|
|
353
|
+
? adminServerResponse.pluginData
|
|
354
|
+
: {
|
|
355
|
+
// Backward compat - convert old always-HTTP data into per-plugin format:
|
|
356
|
+
http: adminServerResponse
|
|
357
|
+
};
|
|
358
|
+
startPromise.resolve(true);
|
|
359
|
+
return serverMetadata;
|
|
360
|
+
}
|
|
361
|
+
catch (e) {
|
|
362
|
+
startPromise.resolve(false);
|
|
363
|
+
throw e;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
isRunning() {
|
|
367
|
+
return this.running === true;
|
|
368
|
+
}
|
|
369
|
+
get metadata() {
|
|
370
|
+
if (!this.isRunning())
|
|
371
|
+
throw new Error("Metadata is not available until the mock server is started");
|
|
372
|
+
return this.adminServerMetadata;
|
|
373
|
+
}
|
|
374
|
+
get schema() {
|
|
375
|
+
if (!this.isRunning())
|
|
376
|
+
throw new Error("Admin schema is not available until the mock server is started");
|
|
377
|
+
return this.adminServerSchema;
|
|
378
|
+
}
|
|
379
|
+
get adminStream() {
|
|
380
|
+
if (!this.isRunning())
|
|
381
|
+
throw new Error("Admin stream is not available until the mock server is started");
|
|
382
|
+
return this.adminServerStream;
|
|
383
|
+
}
|
|
384
|
+
// Call when either we want the server to stop, or it appears that the server has already stopped,
|
|
385
|
+
// and we just want to ensure that's happened and clean everything up.
|
|
386
|
+
async stop() {
|
|
387
|
+
if (await this.running === false)
|
|
388
|
+
return; // If stopped or stopping, do nothing.
|
|
389
|
+
this.emit('stopping');
|
|
390
|
+
const stopPromise = (0, promise_1.getDeferred)();
|
|
391
|
+
this.running = stopPromise.then((result) => {
|
|
392
|
+
this.emit('stopped');
|
|
393
|
+
this.running = result;
|
|
394
|
+
return result;
|
|
395
|
+
});
|
|
396
|
+
try {
|
|
397
|
+
if (this.debug)
|
|
398
|
+
console.log('Stopping remote mock server');
|
|
399
|
+
try {
|
|
400
|
+
this.subscriptionClient?.close();
|
|
401
|
+
}
|
|
402
|
+
catch (e) {
|
|
403
|
+
console.log(e);
|
|
404
|
+
}
|
|
405
|
+
this.subscriptionClient = undefined;
|
|
406
|
+
try {
|
|
407
|
+
this.adminServerStream?.end();
|
|
408
|
+
}
|
|
409
|
+
catch (e) {
|
|
410
|
+
console.log(e);
|
|
411
|
+
}
|
|
412
|
+
this.adminServerStream = undefined;
|
|
413
|
+
await this.requestServerStop();
|
|
414
|
+
}
|
|
415
|
+
finally {
|
|
416
|
+
// The client is always stopped (and so restartable) once stopping completes, in all
|
|
417
|
+
// cases, since it can always be started again to reset it. The promise is just here
|
|
418
|
+
// so that we successfully handle (and always wait for) parallel stops.
|
|
419
|
+
stopPromise.resolve(false);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
requestServerStop() {
|
|
423
|
+
return this.requestFromMockServer('/stop', {
|
|
424
|
+
method: 'POST'
|
|
425
|
+
}).catch((e) => {
|
|
426
|
+
if (e instanceof RequestError && e.response.status === 404) {
|
|
427
|
+
// 404 means it doesn't exist, generally because it was already stopped
|
|
428
|
+
// by some other parallel shutdown process.
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
throw e;
|
|
433
|
+
}
|
|
434
|
+
}).then(() => {
|
|
435
|
+
this.adminSessionBaseUrl = undefined;
|
|
436
|
+
this.adminServerSchema = undefined;
|
|
437
|
+
this.adminServerMetadata = undefined;
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
async sendQuery(query) {
|
|
441
|
+
return (await this.sendQueries(query))[0];
|
|
442
|
+
}
|
|
443
|
+
async sendQueries(...queries) {
|
|
444
|
+
const results = queries.map(async ({ query, variables, transformResponse }) => {
|
|
445
|
+
const result = await this.queryMockServer((0, graphql_1.print)(query), variables);
|
|
446
|
+
return transformResponse
|
|
447
|
+
? transformResponse(result, { adminClient: this })
|
|
448
|
+
: result;
|
|
449
|
+
});
|
|
450
|
+
return Promise.all(results);
|
|
451
|
+
}
|
|
452
|
+
async subscribe(query, callback) {
|
|
453
|
+
if (await this.running === false)
|
|
454
|
+
throw new Error('Not connected to mock server');
|
|
455
|
+
const fieldName = (0, admin_query_1.getSingleSelectedFieldName)(query);
|
|
456
|
+
if (!this.schema.typeHasField('Subscription', fieldName)) {
|
|
457
|
+
console.warn(`Ignoring client subscription for event unrecognized by Mockttp server: ${fieldName}`);
|
|
458
|
+
return Promise.resolve();
|
|
459
|
+
}
|
|
460
|
+
// This isn't 100% correct (you can be WS-connected, but still negotiating some GQL
|
|
461
|
+
// setup) but it's good enough for our purposes (knowing-ish if the connection worked).
|
|
462
|
+
let isConnected = !!this.subscriptionClient.client;
|
|
463
|
+
this.subscriptionClient.request(query).subscribe({
|
|
464
|
+
next: async (value) => {
|
|
465
|
+
if (value.data) {
|
|
466
|
+
const response = value.data[fieldName];
|
|
467
|
+
const result = query.transformResponse
|
|
468
|
+
? await query.transformResponse(response, { adminClient: this })
|
|
469
|
+
: response;
|
|
470
|
+
callback(result);
|
|
471
|
+
}
|
|
472
|
+
else if (value.errors) {
|
|
473
|
+
console.error('Error in subscription', value.errors);
|
|
474
|
+
}
|
|
475
|
+
},
|
|
476
|
+
error: (e) => this.debug && console.warn('Error in remote subscription:', e)
|
|
477
|
+
});
|
|
478
|
+
return new Promise((resolve, reject) => {
|
|
479
|
+
if (isConnected)
|
|
480
|
+
resolve();
|
|
481
|
+
else {
|
|
482
|
+
this.subscriptionClient.onConnected(resolve);
|
|
483
|
+
this.subscriptionClient.onDisconnected(reject);
|
|
484
|
+
this.subscriptionClient.onError(reject);
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* List the names of the rule parameters defined by the admin server. This can be
|
|
490
|
+
* used in some advanced use cases to confirm that the parameters a client wishes to
|
|
491
|
+
* reference are available.
|
|
492
|
+
*
|
|
493
|
+
* Only defined for remote clients.
|
|
494
|
+
*/
|
|
495
|
+
async getRuleParameterKeys() {
|
|
496
|
+
if (await this.running === false) {
|
|
497
|
+
throw new Error('Cannot query rule parameters before the server is started');
|
|
498
|
+
}
|
|
499
|
+
if (!this.schema.queryTypeDefined('ruleParameterKeys')) {
|
|
500
|
+
// If this endpoint isn't supported, that's because parameters aren't supported
|
|
501
|
+
// at all, so we can safely report that immediately.
|
|
502
|
+
return [];
|
|
503
|
+
}
|
|
504
|
+
let result = await this.queryMockServer(`query GetRuleParameterNames {
|
|
505
|
+
ruleParameterKeys
|
|
506
|
+
}`);
|
|
507
|
+
return result.ruleParameterKeys;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
exports.AdminClient = AdminClient;
|
|
511
|
+
//# sourceMappingURL=admin-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-client.js","sourceRoot":"","sources":["../../src/client/admin-client.ts"],"names":[],"mappings":"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"}
|