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,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
|
+
`;
|