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