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,330 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createComboServer = createComboServer;
|
|
4
|
+
const _ = require("lodash");
|
|
5
|
+
const now = require("performance-now");
|
|
6
|
+
const net = require("net");
|
|
7
|
+
const tls = require("tls");
|
|
8
|
+
const semver = require("semver");
|
|
9
|
+
const destroyable_server_1 = require("destroyable-server");
|
|
10
|
+
const httpolyglot = require("@httptoolkit/httpolyglot");
|
|
11
|
+
const read_tls_client_hello_1 = require("read-tls-client-hello");
|
|
12
|
+
const urlpattern_polyfill_1 = require("urlpattern-polyfill");
|
|
13
|
+
const tls_1 = require("../util/tls");
|
|
14
|
+
const util_1 = require("../util/util");
|
|
15
|
+
const server_utils_1 = require("../util/server-utils");
|
|
16
|
+
const socket_util_1 = require("../util/socket-util");
|
|
17
|
+
// Hardcore monkey-patching: force TLSSocket to link servername & remoteAddress to
|
|
18
|
+
// sockets as soon as they're available, without waiting for the handshake to fully
|
|
19
|
+
// complete, so we can easily access them if the handshake fails.
|
|
20
|
+
const originalSocketInit = tls.TLSSocket.prototype._init;
|
|
21
|
+
tls.TLSSocket.prototype._init = function () {
|
|
22
|
+
originalSocketInit.apply(this, arguments);
|
|
23
|
+
const tlsSocket = this;
|
|
24
|
+
const { _handle } = tlsSocket;
|
|
25
|
+
if (!_handle)
|
|
26
|
+
return;
|
|
27
|
+
const loadSNI = _handle.oncertcb;
|
|
28
|
+
_handle.oncertcb = function (info) {
|
|
29
|
+
tlsSocket.servername = info.servername;
|
|
30
|
+
tlsSocket.initialRemoteAddress = tlsSocket.remoteAddress || // Normal case
|
|
31
|
+
tlsSocket._parent?.remoteAddress || // For early failing sockets
|
|
32
|
+
tlsSocket._handle?._parentWrap?.stream?.remoteAddress; // For HTTP/2 CONNECT
|
|
33
|
+
tlsSocket.initialRemotePort = tlsSocket.remotePort ||
|
|
34
|
+
tlsSocket._parent?.remotePort ||
|
|
35
|
+
tlsSocket._handle?._parentWrap?.stream?.remotePort;
|
|
36
|
+
return loadSNI?.apply(this, arguments);
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
// Takes an established TLS socket, calls the error listener if it's silently closed
|
|
40
|
+
function ifTlsDropped(socket, errorCallback) {
|
|
41
|
+
new Promise((resolve, reject) => {
|
|
42
|
+
// If you send data, you trust the TLS connection
|
|
43
|
+
socket.once('data', resolve);
|
|
44
|
+
// If you silently close it very quicky, you probably don't trust us
|
|
45
|
+
socket.once('error', reject);
|
|
46
|
+
socket.once('close', reject);
|
|
47
|
+
socket.once('end', reject);
|
|
48
|
+
// Some clients open later-unused TLS connections for connection pools, preconnect, etc.
|
|
49
|
+
// Even if these are shut later on, that doesn't mean they're are rejected connections.
|
|
50
|
+
// To differentiate the two cases, we consider connections OK after waiting 10x longer
|
|
51
|
+
// than the initial TLS handshake for an unhappy disconnection.
|
|
52
|
+
const timing = socket.__timingInfo;
|
|
53
|
+
const tlsSetupDuration = timing
|
|
54
|
+
? timing.tlsConnectedTimestamp - (timing.tunnelSetupTimestamp || timing.initialSocketTimestamp)
|
|
55
|
+
: 0;
|
|
56
|
+
const maxTlsRejectionTime = !Object.is(tlsSetupDuration, NaN)
|
|
57
|
+
? Math.max(tlsSetupDuration * 10, 100) // Ensure a sensible minimum
|
|
58
|
+
: 2000;
|
|
59
|
+
(0, util_1.delay)(maxTlsRejectionTime).then(resolve);
|
|
60
|
+
})
|
|
61
|
+
.then(() => {
|
|
62
|
+
// Mark the socket as having completed TLS setup - this ensures that future
|
|
63
|
+
// errors fire as client errors, not TLS setup errors.
|
|
64
|
+
socket.tlsSetupCompleted = true;
|
|
65
|
+
})
|
|
66
|
+
.catch(() => {
|
|
67
|
+
// If TLS setup was confirmed in any way, we know we don't have a TLS error.
|
|
68
|
+
if (socket.tlsSetupCompleted)
|
|
69
|
+
return;
|
|
70
|
+
// To get here, the socket must have connected & done the TLS handshake, but then
|
|
71
|
+
// closed/ended without ever sending any data. We can fairly confidently assume
|
|
72
|
+
// in that case that it's rejected our certificate.
|
|
73
|
+
errorCallback();
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
function getCauseFromError(error) {
|
|
77
|
+
const cause = (/alert certificate/.test(error.message) ||
|
|
78
|
+
/alert bad certificate/.test(error.message) ||
|
|
79
|
+
error.code === 'ERR_SSL_SSLV3_ALERT_BAD_CERTIFICATE' ||
|
|
80
|
+
/alert unknown ca/.test(error.message))
|
|
81
|
+
// The client explicitly told us it doesn't like the certificate
|
|
82
|
+
? 'cert-rejected'
|
|
83
|
+
: /no shared cipher/.test(error.message)
|
|
84
|
+
// The client refused to negotiate a cipher. Probably means it didn't like the
|
|
85
|
+
// cert so refused to continue, but it could genuinely not have a shared cipher.
|
|
86
|
+
? 'no-shared-cipher'
|
|
87
|
+
: (/ECONNRESET/.test(error.message) || error.code === 'ECONNRESET')
|
|
88
|
+
// The client sent no TLS alert, it just hard RST'd the connection
|
|
89
|
+
? 'reset'
|
|
90
|
+
: error.code === 'ERR_TLS_HANDSHAKE_TIMEOUT'
|
|
91
|
+
? 'handshake-timeout'
|
|
92
|
+
: 'unknown'; // Something else.
|
|
93
|
+
if (cause === 'unknown')
|
|
94
|
+
console.log('Unknown TLS error:', error);
|
|
95
|
+
return cause;
|
|
96
|
+
}
|
|
97
|
+
function buildTlsError(socket, cause) {
|
|
98
|
+
const eventData = (0, socket_util_1.buildSocketEventData)(socket);
|
|
99
|
+
eventData.failureCause = cause;
|
|
100
|
+
eventData.timingEvents.failureTimestamp = now();
|
|
101
|
+
return eventData;
|
|
102
|
+
}
|
|
103
|
+
// The low-level server that handles all the sockets & TLS. The server will correctly call the
|
|
104
|
+
// given handler for both HTTP & HTTPS direct connections, or connections when used as an
|
|
105
|
+
// either HTTP or HTTPS proxy, all on the same port.
|
|
106
|
+
async function createComboServer(options, requestListener, tlsClientErrorListener, tlsPassthroughListener) {
|
|
107
|
+
let server;
|
|
108
|
+
if (!options.https) {
|
|
109
|
+
server = httpolyglot.createServer(requestListener);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
const ca = await (0, tls_1.getCA)(options.https);
|
|
113
|
+
const defaultCert = ca.generateCertificate(options.https.defaultDomain ?? 'localhost');
|
|
114
|
+
const serverProtocolPreferences = options.http2 === true
|
|
115
|
+
? ['h2', 'http/1.1', 'http 1.1'] // 'http 1.1' is non-standard, but used by https-proxy-agent
|
|
116
|
+
: options.http2 === 'fallback'
|
|
117
|
+
? ['http/1.1', 'http 1.1', 'h2']
|
|
118
|
+
// options.http2 === false:
|
|
119
|
+
: ['http/1.1', 'http 1.1'];
|
|
120
|
+
const ALPNOption = semver.satisfies(process.version, '>=20.4.0')
|
|
121
|
+
? {
|
|
122
|
+
// In modern Node (20+), ALPNProtocols will reject unknown protocols. To allow those (so we can
|
|
123
|
+
// at least read the request, and hopefully handle HTTP-like cases - not uncommon) we use the new
|
|
124
|
+
// ALPNCallback feature instead, which lets us dynamically accept unrecognized protocols:
|
|
125
|
+
ALPNCallback: ({ protocols: clientProtocols }) => {
|
|
126
|
+
const preferredProtocol = serverProtocolPreferences.find(p => clientProtocols.includes(p));
|
|
127
|
+
// Wherever possible, we tell the client to use our preferred protocol
|
|
128
|
+
if (preferredProtocol)
|
|
129
|
+
return preferredProtocol;
|
|
130
|
+
// If the client only offers protocols that we don't understand, shrug and accept:
|
|
131
|
+
else
|
|
132
|
+
return clientProtocols[1];
|
|
133
|
+
}
|
|
134
|
+
} : {
|
|
135
|
+
// In Node versions without ALPNCallback, we just set preferences directly:
|
|
136
|
+
ALPNProtocols: serverProtocolPreferences
|
|
137
|
+
};
|
|
138
|
+
const tlsServer = tls.createServer({
|
|
139
|
+
key: defaultCert.key,
|
|
140
|
+
cert: defaultCert.cert,
|
|
141
|
+
ca: [defaultCert.ca],
|
|
142
|
+
...ALPNOption,
|
|
143
|
+
SNICallback: (domain, cb) => {
|
|
144
|
+
if (options.debug)
|
|
145
|
+
console.log(`Generating certificate for ${domain}`);
|
|
146
|
+
try {
|
|
147
|
+
const generatedCert = ca.generateCertificate(domain);
|
|
148
|
+
cb(null, tls.createSecureContext({
|
|
149
|
+
key: generatedCert.key,
|
|
150
|
+
cert: generatedCert.cert,
|
|
151
|
+
ca: generatedCert.ca
|
|
152
|
+
}));
|
|
153
|
+
}
|
|
154
|
+
catch (e) {
|
|
155
|
+
console.error('Cert generation error', e);
|
|
156
|
+
cb(e);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
analyzeAndMaybePassThroughTls(tlsServer, options.https.tlsPassthrough, options.https.tlsInterceptOnly, tlsPassthroughListener);
|
|
161
|
+
server = httpolyglot.createServer(tlsServer, requestListener);
|
|
162
|
+
}
|
|
163
|
+
// In Node v20, this option was added, rejecting all requests with no host header. While that's good, in
|
|
164
|
+
// our case, we want to handle the garbage requests too, so we disable it:
|
|
165
|
+
server._httpServer.requireHostHeader = false;
|
|
166
|
+
server.on('connection', (socket) => {
|
|
167
|
+
socket.__timingInfo = socket.__timingInfo || (0, socket_util_1.buildSocketTimingInfo)();
|
|
168
|
+
// All sockets are initially marked as using unencrypted upstream connections.
|
|
169
|
+
// If TLS is used, this is upgraded to 'true' by secureConnection below.
|
|
170
|
+
socket.__lastHopEncrypted = false;
|
|
171
|
+
// For actual sockets, set NODELAY to avoid any buffering whilst streaming. This is
|
|
172
|
+
// off by default in Node HTTP, but likely to be enabled soon & is default in curl.
|
|
173
|
+
if ('setNoDelay' in socket)
|
|
174
|
+
socket.setNoDelay(true);
|
|
175
|
+
});
|
|
176
|
+
server.on('secureConnection', (socket) => {
|
|
177
|
+
const parentSocket = (0, socket_util_1.getParentSocket)(socket);
|
|
178
|
+
if (parentSocket) {
|
|
179
|
+
// Sometimes wrapper TLS sockets created by the HTTP/2 server don't include the
|
|
180
|
+
// underlying socket details, so it's better to make sure we copy them up.
|
|
181
|
+
copyAddressDetails(parentSocket, socket);
|
|
182
|
+
copyTimingDetails(parentSocket, socket);
|
|
183
|
+
// With TLS metadata, we only propagate directly from parent sockets, not through
|
|
184
|
+
// CONNECT etc - we only want it if the final hop is TLS, previous values don't matter.
|
|
185
|
+
socket.__tlsMetadata ?? (socket.__tlsMetadata = parentSocket.__tlsMetadata);
|
|
186
|
+
}
|
|
187
|
+
else if (!socket.__timingInfo) {
|
|
188
|
+
socket.__timingInfo = (0, socket_util_1.buildSocketTimingInfo)();
|
|
189
|
+
}
|
|
190
|
+
socket.__timingInfo.tlsConnectedTimestamp = now();
|
|
191
|
+
socket.__lastHopEncrypted = true;
|
|
192
|
+
ifTlsDropped(socket, () => {
|
|
193
|
+
tlsClientErrorListener(socket, buildTlsError(socket, 'closed'));
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
// Mark HTTP/2 sockets as set up once we receive a first settings frame. This always
|
|
197
|
+
// happens immediately after the connection preface, as long as the connection is OK.
|
|
198
|
+
server.on('session', (session) => {
|
|
199
|
+
session.once('remoteSettings', () => {
|
|
200
|
+
session.socket.tlsSetupCompleted = true;
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
server.on('tlsClientError', (error, socket) => {
|
|
204
|
+
tlsClientErrorListener(socket, buildTlsError(socket, getCauseFromError(error)));
|
|
205
|
+
});
|
|
206
|
+
// If the server receives a HTTP/HTTPS CONNECT request, Pretend to tunnel, then just re-handle:
|
|
207
|
+
server.addListener('connect', function (req, resOrSocket) {
|
|
208
|
+
if (resOrSocket instanceof net.Socket) {
|
|
209
|
+
handleH1Connect(req, resOrSocket);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
handleH2Connect(req, resOrSocket);
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
function handleH1Connect(req, socket) {
|
|
216
|
+
// Clients may disconnect at this point (for all sorts of reasons), but here
|
|
217
|
+
// nothing else is listening, so we need to catch errors on the socket:
|
|
218
|
+
socket.once('error', (e) => {
|
|
219
|
+
if (options.debug) {
|
|
220
|
+
console.log('Error on client socket', e);
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
const connectUrl = req.url || req.headers['host'];
|
|
224
|
+
if (!connectUrl) {
|
|
225
|
+
// If we can't work out where to go, send an error.
|
|
226
|
+
socket.write('HTTP/' + req.httpVersion + ' 400 Bad Request\r\n\r\n', 'utf-8');
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
if (options.debug)
|
|
230
|
+
console.log(`Proxying HTTP/1 CONNECT to ${connectUrl}`);
|
|
231
|
+
socket.write('HTTP/' + req.httpVersion + ' 200 OK\r\n\r\n', 'utf-8', () => {
|
|
232
|
+
socket.__timingInfo.tunnelSetupTimestamp = now();
|
|
233
|
+
socket.__lastHopConnectAddress = connectUrl;
|
|
234
|
+
server.emit('connection', socket);
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
function handleH2Connect(req, res) {
|
|
238
|
+
const connectUrl = req.headers[':authority'];
|
|
239
|
+
if (!connectUrl) {
|
|
240
|
+
// If we can't work out where to go, send an error.
|
|
241
|
+
res.writeHead(400, {});
|
|
242
|
+
res.end();
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
if (options.debug)
|
|
246
|
+
console.log(`Proxying HTTP/2 CONNECT to ${connectUrl}`);
|
|
247
|
+
// Send a 200 OK response, and start the tunnel:
|
|
248
|
+
res.writeHead(200, {});
|
|
249
|
+
copyAddressDetails(res.socket, res.stream);
|
|
250
|
+
copyTimingDetails(res.socket, res.stream);
|
|
251
|
+
res.stream.__lastHopConnectAddress = connectUrl;
|
|
252
|
+
// When layering HTTP/2 on JS streams, we have to make sure the JS stream won't autoclose
|
|
253
|
+
// when the other side does, because the upper HTTP/2 layers want to handle shutdown, so
|
|
254
|
+
// they end up trying to write a GOAWAY at the same time as the lower stream shuts down,
|
|
255
|
+
// and we get assertion errors in Node v16.7+.
|
|
256
|
+
if (res.socket.constructor.name.includes('JSStreamSocket')) {
|
|
257
|
+
res.socket.allowHalfOpen = true;
|
|
258
|
+
}
|
|
259
|
+
server.emit('connection', res.stream);
|
|
260
|
+
}
|
|
261
|
+
return (0, destroyable_server_1.makeDestroyable)(server);
|
|
262
|
+
}
|
|
263
|
+
const SOCKET_ADDRESS_METADATA_FIELDS = [
|
|
264
|
+
'localAddress',
|
|
265
|
+
'localPort',
|
|
266
|
+
'remoteAddress',
|
|
267
|
+
'remotePort',
|
|
268
|
+
'__lastHopConnectAddress'
|
|
269
|
+
];
|
|
270
|
+
// Update the target socket(-ish) with the address details from the source socket,
|
|
271
|
+
// iff the target has no details of its own.
|
|
272
|
+
function copyAddressDetails(source, target) {
|
|
273
|
+
Object.defineProperties(target, _.zipObject(SOCKET_ADDRESS_METADATA_FIELDS, _.range(SOCKET_ADDRESS_METADATA_FIELDS.length).map(() => ({ writable: true }))));
|
|
274
|
+
SOCKET_ADDRESS_METADATA_FIELDS.forEach((fieldName) => {
|
|
275
|
+
if (target[fieldName] === undefined) {
|
|
276
|
+
target[fieldName] = source[fieldName];
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
function copyTimingDetails(source, target) {
|
|
281
|
+
if (!target.__timingInfo) {
|
|
282
|
+
// Clone timing info, don't copy it - child sockets get their own independent timing stats
|
|
283
|
+
target.__timingInfo = Object.assign({}, source.__timingInfo);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Takes tls passthrough configuration (may be empty) and reconfigures a given TLS server so that all
|
|
288
|
+
* client hellos are parsed, matching requests are passed to the given passthrough listener (without
|
|
289
|
+
* continuing setup) and client hello metadata is attached to all sockets.
|
|
290
|
+
*/
|
|
291
|
+
function analyzeAndMaybePassThroughTls(server, passthroughList, interceptOnlyList, passthroughListener) {
|
|
292
|
+
if (passthroughList && interceptOnlyList) {
|
|
293
|
+
throw new Error('Cannot use both tlsPassthrough and tlsInterceptOnly options at the same time.');
|
|
294
|
+
}
|
|
295
|
+
const passThroughPatterns = passthroughList?.map(({ hostname }) => new urlpattern_polyfill_1.URLPattern(`https://${hostname}`)) ?? [];
|
|
296
|
+
const interceptOnlyPatterns = interceptOnlyList?.map(({ hostname }) => new urlpattern_polyfill_1.URLPattern(`https://${hostname}`));
|
|
297
|
+
const tlsConnectionListener = server.listeners('connection')[0];
|
|
298
|
+
server.removeListener('connection', tlsConnectionListener);
|
|
299
|
+
server.on('connection', async (socket) => {
|
|
300
|
+
try {
|
|
301
|
+
const helloData = await (0, read_tls_client_hello_1.readTlsClientHello)(socket);
|
|
302
|
+
const [connectHostname, connectPort] = socket.__lastHopConnectAddress?.split(':') ?? [];
|
|
303
|
+
const sniHostname = helloData.serverName;
|
|
304
|
+
socket.__tlsMetadata = {
|
|
305
|
+
sniHostname,
|
|
306
|
+
connectHostname,
|
|
307
|
+
connectPort,
|
|
308
|
+
clientAlpn: helloData.alpnProtocols,
|
|
309
|
+
ja3Fingerprint: (0, read_tls_client_hello_1.calculateJa3FromFingerprintData)(helloData.fingerprintData)
|
|
310
|
+
};
|
|
311
|
+
if ((0, server_utils_1.shouldPassThrough)(connectHostname, passThroughPatterns, interceptOnlyPatterns)) {
|
|
312
|
+
const upstreamPort = connectPort ? parseInt(connectPort, 10) : undefined;
|
|
313
|
+
passthroughListener(socket, connectHostname, upstreamPort);
|
|
314
|
+
return; // Do not continue with TLS
|
|
315
|
+
}
|
|
316
|
+
else if ((0, server_utils_1.shouldPassThrough)(sniHostname, passThroughPatterns, interceptOnlyPatterns)) {
|
|
317
|
+
passthroughListener(socket, sniHostname); // Can't guess the port - not included in SNI
|
|
318
|
+
return; // Do not continue with TLS
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
catch (e) {
|
|
322
|
+
if (!(e instanceof read_tls_client_hello_1.NonTlsError)) { // Don't even warn for non-TLS traffic
|
|
323
|
+
console.warn(`TLS client hello data not available for TLS connection from ${socket.remoteAddress ?? 'unknown address'}: ${e.message ?? e}`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
// Didn't match a passthrough hostname - continue with TLS setup
|
|
327
|
+
tlsConnectionListener.call(server, socket);
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
//# sourceMappingURL=http-combo-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-combo-server.js","sourceRoot":"","sources":["../../src/server/http-combo-server.ts"],"names":[],"mappings":";;AA6IA,8CA4LC;AAzUD,4BAA6B;AAC7B,uCAAwC;AACxC,2BAA4B;AAC5B,2BAA4B;AAK5B,iCAAiC;AACjC,2DAAwE;AACxE,wDAAyD;AACzD,iEAI+B;AAC/B,6DAAiD;AAGjD,qCAAoC;AACpC,uCAAqC;AACrC,uDAAyD;AACzD,qDAI6B;AAG7B,kFAAkF;AAClF,mFAAmF;AACnF,iEAAiE;AACjE,MAAM,kBAAkB,GAAS,GAAG,CAAC,SAAS,CAAC,SAAU,CAAC,KAAK,CAAC;AAC1D,GAAG,CAAC,SAAS,CAAC,SAAU,CAAC,KAAK,GAAG;IACnC,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAE1C,MAAM,SAAS,GAAkB,IAAI,CAAC;IACtC,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IAC9B,IAAI,CAAC,OAAO;QAAE,OAAO;IAErB,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IACjC,OAAO,CAAC,QAAQ,GAAG,UAAU,IAAS;QAClC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACvC,SAAS,CAAC,oBAAoB,GAAG,SAAS,CAAC,aAAa,IAAI,cAAc;YACtE,SAAS,CAAC,OAAO,EAAE,aAAa,IAAI,4BAA4B;YAChE,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,qBAAqB;QAChF,SAAS,CAAC,iBAAiB,GAAG,SAAS,CAAC,UAAU;YAC9C,SAAS,CAAC,OAAO,EAAE,UAAU;YAC7B,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC;QAEvD,OAAO,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,SAAgB,CAAC,CAAC;IAClD,CAAC,CAAC;AACN,CAAC,CAAC;AAQF,oFAAoF;AACpF,SAAS,YAAY,CAAC,MAAqB,EAAE,aAAyB;IAClE,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC5B,iDAAiD;QACjD,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAE7B,oEAAoE;QACpE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAE3B,wFAAwF;QACxF,uFAAuF;QACvF,sFAAsF;QACtF,+DAA+D;QAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC;QACnC,MAAM,gBAAgB,GAAG,MAAM;YAC3B,CAAC,CAAC,MAAM,CAAC,qBAAsB,GAAG,CAAC,MAAM,CAAC,oBAAqB,IAAI,MAAM,CAAC,sBAAsB,CAAC;YACjG,CAAC,CAAC,CAAC,CAAC;QACR,MAAM,mBAAmB,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,gBAAgB,EAAE,GAAG,CAAC;YACzD,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,4BAA4B;YACnE,CAAC,CAAC,IAAI,CAAC;QAEX,IAAA,YAAK,EAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,EAAE;QACP,2EAA2E;QAC3E,sDAAsD;QACtD,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAC;IACpC,CAAC,CAAC;SACD,KAAK,CAAC,GAAG,EAAE;QACR,4EAA4E;QAC5E,IAAI,MAAM,CAAC,iBAAiB;YAAE,OAAO;QAErC,iFAAiF;QACjF,+EAA+E;QAC/E,mDAAmD;QACnD,aAAa,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAgC;IACvD,MAAM,KAAK,GAAG,CACV,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QACvC,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QAC3C,KAAK,CAAC,IAAI,KAAK,qCAAqC;QACpD,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CACzC;QACG,gEAAgE;QAChE,CAAC,CAAC,eAAe;QACrB,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YACpC,8EAA8E;YAC9E,gFAAgF;YAChF,CAAC,CAAC,kBAAkB;YACxB,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC;gBAC/D,kEAAkE;gBAClE,CAAC,CAAC,OAAO;gBACb,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,2BAA2B;oBACxC,CAAC,CAAC,mBAAmB;oBACzB,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB;IAE/B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;IAElE,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,aAAa,CAClB,MAAqB,EACrB,KAA0C;IAE1C,MAAM,SAAS,GAAG,IAAA,kCAAoB,EAAC,MAAM,CAAwB,CAAC;IAEtE,SAAS,CAAC,YAAY,GAAG,KAAK,CAAC;IAC/B,SAAS,CAAC,YAAY,CAAC,gBAAgB,GAAG,GAAG,EAAE,CAAC;IAEhD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,8FAA8F;AAC9F,yFAAyF;AACzF,oDAAoD;AAC7C,KAAK,UAAU,iBAAiB,CACnC,OAA2B,EAC3B,eAA8E,EAC9E,sBAAiF,EACjF,sBAAoF;IAEpF,IAAI,MAAkB,CAAC;IACvB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACJ,MAAM,EAAE,GAAG,MAAM,IAAA,WAAK,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,IAAI,WAAW,CAAC,CAAC;QAEvF,MAAM,yBAAyB,GAAG,OAAO,CAAC,KAAK,KAAK,IAAI;YACpD,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,4DAA4D;YACzF,CAAC,CAAC,OAAO,CAAC,KAAK,KAAK,UAAU;gBAClC,CAAC,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC;gBAC5B,2BAA2B;gBAC/B,CAAC,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAE/B,MAAM,UAAU,GAAmB,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC;YAC5E,CAAC,CAAC;gBACE,+FAA+F;gBAC/F,iGAAiG;gBACjG,yFAAyF;gBACzF,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,EAAE;oBAC7C,MAAM,iBAAiB,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;oBAE3F,sEAAsE;oBACtE,IAAI,iBAAiB;wBAAE,OAAO,iBAAiB,CAAC;oBAEhD,kFAAkF;;wBAC7E,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC;gBACnC,CAAC;aACJ,CAAC,CAAC,CAAC;YACA,2EAA2E;YAC3E,aAAa,EAAE,yBAAyB;SAC3C,CAAA;QAEL,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC;YAC/B,GAAG,EAAE,WAAW,CAAC,GAAG;YACpB,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;YACpB,GAAG,UAAU;YACb,WAAW,EAAE,CAAC,MAAc,EAAE,EAAY,EAAE,EAAE;gBAC1C,IAAI,OAAO,CAAC,KAAK;oBAAE,OAAO,CAAC,GAAG,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC;gBAEvE,IAAI,CAAC;oBACD,MAAM,aAAa,GAAG,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;oBACrD,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,mBAAmB,CAAC;wBAC7B,GAAG,EAAE,aAAa,CAAC,GAAG;wBACtB,IAAI,EAAE,aAAa,CAAC,IAAI;wBACxB,EAAE,EAAE,aAAa,CAAC,EAAE;qBACvB,CAAC,CAAC,CAAC;gBACR,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACT,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC;oBAC1C,EAAE,CAAC,CAAC,CAAC,CAAC;gBACV,CAAC;YACL,CAAC;SACJ,CAAC,CAAC;QAEH,6BAA6B,CACzB,SAAS,EACT,OAAO,CAAC,KAAK,CAAC,cAAc,EAC5B,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAC9B,sBAAsB,CACzB,CAAC;QAEF,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAClE,CAAC;IAED,wGAAwG;IACxG,0EAA0E;IACzE,MAAc,CAAC,WAAW,CAAC,iBAAiB,GAAG,KAAK,CAAC;IAEtD,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAA4C,EAAE,EAAE;QACrE,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,IAAA,mCAAqB,GAAE,CAAC;QAErE,8EAA8E;QAC9E,wEAAwE;QACxE,MAAM,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAElC,mFAAmF;QACnF,mFAAmF;QACnF,IAAI,YAAY,IAAI,MAAM;YAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,MAAqB,EAAE,EAAE;QACpD,MAAM,YAAY,GAAG,IAAA,6BAAe,EAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,YAAY,EAAE,CAAC;YACf,+EAA+E;YAC/E,0EAA0E;YAC1E,kBAAkB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YACzC,iBAAiB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YACxC,iFAAiF;YACjF,uFAAuF;YACvF,MAAM,CAAC,aAAa,KAApB,MAAM,CAAC,aAAa,GAAK,YAAY,CAAC,aAAa,EAAC;QACxD,CAAC;aAAM,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAC9B,MAAM,CAAC,YAAY,GAAG,IAAA,mCAAqB,GAAE,CAAC;QAClD,CAAC;QAED,MAAM,CAAC,YAAa,CAAC,qBAAqB,GAAG,GAAG,EAAE,CAAC;QAEnD,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE;YACtB,sBAAsB,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,oFAAoF;IACpF,qFAAqF;IACrF,MAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;QAC9B,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE;YAChC,OAAO,CAAC,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC5C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,KAAY,EAAE,MAAqB,EAAE,EAAE;QAChE,sBAAsB,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,+FAA+F;IAC/F,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,UAC1B,GAAoD,EACpD,WAAmD;QAEnD,IAAI,WAAW,YAAY,GAAG,CAAC,MAAM,EAAE,CAAC;YACpC,eAAe,CAAC,GAA2B,EAAE,WAAW,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACJ,eAAe,CAAC,GAA+B,EAAE,WAAW,CAAC,CAAC;QAClE,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS,eAAe,CAAC,GAAyB,EAAE,MAAkB;QAClE,4EAA4E;QAC5E,uEAAuE;QACvE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YACvB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;YAC7C,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,mDAAmD;YACnD,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,WAAW,GAAG,0BAA0B,EAAE,OAAO,CAAC,CAAC;YAC9E,OAAO;QACX,CAAC;QAED,IAAI,OAAO,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;QAE3E,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,WAAW,GAAG,iBAAiB,EAAE,OAAO,EAAE,GAAG,EAAE;YACtE,MAAM,CAAC,YAAa,CAAC,oBAAoB,GAAG,GAAG,EAAE,CAAC;YAClD,MAAM,CAAC,uBAAuB,GAAG,UAAU,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACP,CAAC;IAED,SAAS,eAAe,CAAC,GAA6B,EAAE,GAA8B;QAClF,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAE7C,IAAI,CAAC,UAAU,EAAE,CAAC;YACb,mDAAmD;YACnD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACvB,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;QACZ,CAAC;QAED,IAAI,OAAO,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;QAE3E,gDAAgD;QAChD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACvB,kBAAkB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3C,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,CAAC,uBAAuB,GAAG,UAAU,CAAC;QAEhD,yFAAyF;QACzF,wFAAwF;QACxF,wFAAwF;QACxF,8CAA8C;QAC9C,IAAI,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACzD,GAAG,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;QACpC,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,IAAA,oCAAe,EAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAKD,MAAM,8BAA8B,GAAG;IACnC,cAAc;IACd,WAAW;IACX,eAAe;IACf,YAAY;IACZ,yBAAyB;CACnB,CAAC;AAEX,kFAAkF;AAClF,4CAA4C;AAC5C,SAAS,kBAAkB,CACvB,MAAgE,EAChE,MAAgE;IAEhE,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CACvC,8BAA8B,EAC9B,CAAC,CAAC,KAAK,CAAC,8BAA8B,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CACxD,CAAC,CAAC;IAE5B,8BAA8B,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QACjD,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;YACjC,MAAc,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QACnD,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,iBAAiB,CACtB,MAAiC,EACjC,MAAS;IAET,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACvB,0FAA0F;QAC1F,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IACjE,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAS,6BAA6B,CAClC,MAAkB,EAClB,eAA4E,EAC5E,iBAAgF,EAChF,mBAAiF;IAEjF,IAAI,eAAe,IAAI,iBAAiB,EAAC,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC;IACrG,CAAC;IACD,MAAM,mBAAmB,GAAG,eAAe,EAAE,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,IAAI,gCAAU,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChH,MAAM,qBAAqB,GAAG,iBAAiB,EAAE,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,IAAI,gCAAU,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC,CAAC;IAE9G,MAAM,qBAAqB,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAA+B,CAAC;IAC9F,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;IAC3D,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,MAAkB,EAAE,EAAE;QACjD,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,IAAA,0CAAkB,EAAC,MAAM,CAAC,CAAC;YAEnD,MAAM,CAAC,eAAe,EAAE,WAAW,CAAC,GAAG,MAAM,CAAC,uBAAuB,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACxF,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC;YAEzC,MAAM,CAAC,aAAa,GAAG;gBACnB,WAAW;gBACX,eAAe;gBACf,WAAW;gBACX,UAAU,EAAE,SAAS,CAAC,aAAa;gBACnC,cAAc,EAAE,IAAA,uDAA+B,EAAC,SAAS,CAAC,eAAe,CAAC;aAC7E,CAAC;YAEF,IAAI,IAAA,gCAAiB,EAAC,eAAe,EAAE,mBAAmB,EAAE,qBAAqB,CAAC,EAAE,CAAC;gBACjF,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACzE,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;gBAC3D,OAAO,CAAC,2BAA2B;YACvC,CAAC;iBAAM,IAAI,IAAA,gCAAiB,EAAC,WAAW,EAAE,mBAAmB,EAAE,qBAAqB,CAAC,EAAE,CAAC;gBACpF,mBAAmB,CAAC,MAAM,EAAE,WAAY,CAAC,CAAC,CAAC,6CAA6C;gBACxF,OAAO,CAAC,2BAA2B;YACvC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,CAAC,CAAC,YAAY,mCAAW,CAAC,EAAE,CAAC,CAAC,sCAAsC;gBACrE,OAAO,CAAC,IAAI,CAAC,+DACT,MAAM,CAAC,aAAa,IAAI,iBAC5B,KAAM,CAAW,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;YACtC,CAAC;QACL,CAAC;QAED,gEAAgE;QAChE,qBAAqB,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as util from 'util';
|
|
2
|
+
import type { CompletedRequest, MockedEndpoint } from '../types';
|
|
3
|
+
import type { RequestRule } from '../rules/requests/request-rule';
|
|
4
|
+
import type { WebSocketRule } from '../rules/websockets/websocket-rule';
|
|
5
|
+
export declare class ServerMockedEndpoint implements MockedEndpoint {
|
|
6
|
+
private rule;
|
|
7
|
+
constructor(rule: RequestRule | WebSocketRule);
|
|
8
|
+
get id(): string;
|
|
9
|
+
getSeenRequests(): Promise<CompletedRequest[]>;
|
|
10
|
+
isPending(): Promise<boolean>;
|
|
11
|
+
[util.inspect.custom](): string;
|
|
12
|
+
toString(withoutExactCompletion?: boolean): string;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=mocked-endpoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mocked-endpoint.d.ts","sourceRoot":"","sources":["../../src/server/mocked-endpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAExE,qBAAa,oBAAqB,YAAW,cAAc;IAE3C,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,WAAW,GAAG,aAAa;IAIrD,IAAI,EAAE,WAEL;IAED,eAAe,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAKxC,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAenC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAIrB,QAAQ,CAAC,sBAAsB,UAAQ;CAG1C"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ServerMockedEndpoint = void 0;
|
|
4
|
+
const util = require("util");
|
|
5
|
+
class ServerMockedEndpoint {
|
|
6
|
+
constructor(rule) {
|
|
7
|
+
this.rule = rule;
|
|
8
|
+
this.getSeenRequests.bind(this);
|
|
9
|
+
}
|
|
10
|
+
;
|
|
11
|
+
get id() {
|
|
12
|
+
return this.rule.id;
|
|
13
|
+
}
|
|
14
|
+
getSeenRequests() {
|
|
15
|
+
// Wait for all completed running requests to have all their details available
|
|
16
|
+
return Promise.all(this.rule.requests);
|
|
17
|
+
}
|
|
18
|
+
async isPending() {
|
|
19
|
+
// We don't actually need to wait for rule.requests to complete, because
|
|
20
|
+
// completion rules right now only check requestCount, and that is always
|
|
21
|
+
// updated synchronously when handling starts.
|
|
22
|
+
const ruleCompletion = this.rule.isComplete();
|
|
23
|
+
if (ruleCompletion !== null) {
|
|
24
|
+
// If the rule has a specific completion value, use it
|
|
25
|
+
return !ruleCompletion;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// If not, then it's default "at least one" completion:
|
|
29
|
+
return this.rule.requestCount === 0;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
[util.inspect.custom]() {
|
|
33
|
+
return "Mocked endpoint: " + this.toString();
|
|
34
|
+
}
|
|
35
|
+
toString(withoutExactCompletion = false) {
|
|
36
|
+
return this.rule.explain(withoutExactCompletion);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.ServerMockedEndpoint = ServerMockedEndpoint;
|
|
40
|
+
//# sourceMappingURL=mocked-endpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mocked-endpoint.js","sourceRoot":"","sources":["../../src/server/mocked-endpoint.ts"],"names":[],"mappings":";;;AAAA,6BAA6B;AAM7B,MAAa,oBAAoB;IAE7B,YAAoB,IAAiC;QAAjC,SAAI,GAAJ,IAAI,CAA6B;QACjD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAAA,CAAC;IAEF,IAAI,EAAE;QACF,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACxB,CAAC;IAED,eAAe;QACX,8EAA8E;QAC9E,OAAO,OAAO,CAAC,GAAG,CAAmB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,SAAS;QACX,wEAAwE;QACxE,yEAAyE;QACzE,8CAA8C;QAE9C,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9C,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;YAC1B,sDAAsD;YACtD,OAAO,CAAC,cAAc,CAAC;QAC3B,CAAC;aAAM,CAAC;YACJ,uDAAuD;YACvD,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,CAAC;QACxC,CAAC;IACL,CAAC;IAED,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACjB,OAAO,mBAAmB,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;IACjD,CAAC;IAED,QAAQ,CAAC,sBAAsB,GAAG,KAAK;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACrD,CAAC;CACJ;AArCD,oDAqCC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { InitiatedRequest, CompletedRequest, CompletedResponse, TlsHandshakeFailure, ClientError, WebSocketMessage, WebSocketClose, TlsPassthroughEvent, RuleEvent } from "../types";
|
|
2
|
+
import { Mockttp, AbstractMockttp, MockttpOptions, PortRange } from "../mockttp";
|
|
3
|
+
import { RequestRuleData } from "../rules/requests/request-rule";
|
|
4
|
+
import { ServerMockedEndpoint } from "./mocked-endpoint";
|
|
5
|
+
import { WebSocketRuleData } from "../rules/websockets/websocket-rule";
|
|
6
|
+
/**
|
|
7
|
+
* A in-process Mockttp implementation. This starts servers on the local machine in the
|
|
8
|
+
* current process, and exposes methods to directly manage them.
|
|
9
|
+
*
|
|
10
|
+
* This class does not work in browsers, as it expects to be able to start HTTP servers.
|
|
11
|
+
*/
|
|
12
|
+
export declare class MockttpServer extends AbstractMockttp implements Mockttp {
|
|
13
|
+
private requestRuleSets;
|
|
14
|
+
private webSocketRuleSets;
|
|
15
|
+
private httpsOptions;
|
|
16
|
+
private isHttp2Enabled;
|
|
17
|
+
private maxBodySize;
|
|
18
|
+
private app;
|
|
19
|
+
private server;
|
|
20
|
+
private eventEmitter;
|
|
21
|
+
private readonly initialDebugSetting;
|
|
22
|
+
private readonly defaultWsHandler;
|
|
23
|
+
constructor(options?: MockttpOptions);
|
|
24
|
+
start(portParam?: number | PortRange): Promise<void>;
|
|
25
|
+
stop(): Promise<void>;
|
|
26
|
+
enableDebug(): void;
|
|
27
|
+
reset(): void;
|
|
28
|
+
private get address();
|
|
29
|
+
get url(): string;
|
|
30
|
+
get port(): number;
|
|
31
|
+
private addToRuleSets;
|
|
32
|
+
setRequestRules: (...ruleData: RequestRuleData[]) => Promise<ServerMockedEndpoint[]>;
|
|
33
|
+
addRequestRules: (...ruleData: RequestRuleData[]) => Promise<ServerMockedEndpoint[]>;
|
|
34
|
+
setWebSocketRules: (...ruleData: WebSocketRuleData[]) => Promise<ServerMockedEndpoint[]>;
|
|
35
|
+
addWebSocketRules: (...ruleData: WebSocketRuleData[]) => Promise<ServerMockedEndpoint[]>;
|
|
36
|
+
getMockedEndpoints(): Promise<ServerMockedEndpoint[]>;
|
|
37
|
+
getPendingEndpoints(): Promise<ServerMockedEndpoint[]>;
|
|
38
|
+
getRuleParameterKeys(): Promise<never[]>;
|
|
39
|
+
on(event: 'request-initiated', callback: (req: InitiatedRequest) => void): Promise<void>;
|
|
40
|
+
on(event: 'request', callback: (req: CompletedRequest) => void): Promise<void>;
|
|
41
|
+
on(event: 'response', callback: (req: CompletedResponse) => void): Promise<void>;
|
|
42
|
+
on(event: 'abort', callback: (req: InitiatedRequest) => void): Promise<void>;
|
|
43
|
+
on(event: 'websocket-request', callback: (req: CompletedRequest) => void): Promise<void>;
|
|
44
|
+
on(event: 'websocket-accepted', callback: (req: CompletedResponse) => void): Promise<void>;
|
|
45
|
+
on(event: 'websocket-message-received', callback: (req: WebSocketMessage) => void): Promise<void>;
|
|
46
|
+
on(event: 'websocket-message-sent', callback: (req: WebSocketMessage) => void): Promise<void>;
|
|
47
|
+
on(event: 'websocket-close', callback: (close: WebSocketClose) => void): Promise<void>;
|
|
48
|
+
on(event: 'tls-passthrough-opened', callback: (req: TlsPassthroughEvent) => void): Promise<void>;
|
|
49
|
+
on(event: 'tls-passthrough-closed', callback: (req: TlsPassthroughEvent) => void): Promise<void>;
|
|
50
|
+
on(event: 'tls-client-error', callback: (req: TlsHandshakeFailure) => void): Promise<void>;
|
|
51
|
+
on(event: 'client-error', callback: (error: ClientError) => void): Promise<void>;
|
|
52
|
+
on<T = unknown>(event: 'rule-event', callback: (event: RuleEvent<T>) => void): Promise<void>;
|
|
53
|
+
private announceInitialRequestAsync;
|
|
54
|
+
private announceCompletedRequestAsync;
|
|
55
|
+
private announceResponseAsync;
|
|
56
|
+
private announceWebSocketRequestAsync;
|
|
57
|
+
private announceWebSocketUpgradeAsync;
|
|
58
|
+
private announceWebSocketMessageAsync;
|
|
59
|
+
private announceWebSocketCloseAsync;
|
|
60
|
+
private trackWebSocketEvents;
|
|
61
|
+
private announceAbortAsync;
|
|
62
|
+
private announceTlsErrorAsync;
|
|
63
|
+
private announceClientErrorAsync;
|
|
64
|
+
private announceRuleEventAsync;
|
|
65
|
+
private preprocessRequest;
|
|
66
|
+
private handleRequest;
|
|
67
|
+
private handleWebSocket;
|
|
68
|
+
/**
|
|
69
|
+
* To match rules, we find the first rule (by priority then by set order) which matches and which is
|
|
70
|
+
* either not complete (has a completion check that's false) or which has no completion check defined
|
|
71
|
+
* and is the last option at that priority (i.e. by the last option at each priority repeats indefinitely.
|
|
72
|
+
*
|
|
73
|
+
* We move down the priority list only when either no rules match at all, or when all matching rules
|
|
74
|
+
* have explicit completion checks defined that are completed.
|
|
75
|
+
*/
|
|
76
|
+
private findMatchingRule;
|
|
77
|
+
private getUnmatchedRequestExplanation;
|
|
78
|
+
private sendUnmatchedRequestError;
|
|
79
|
+
private sendWebSocketErrorResponse;
|
|
80
|
+
private explainRequest;
|
|
81
|
+
private suggestRule;
|
|
82
|
+
private handleInvalidHttp1Request;
|
|
83
|
+
private handleInvalidHttp2Request;
|
|
84
|
+
private outgoingPassthroughSockets;
|
|
85
|
+
private passthroughSocket;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=mockttp-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockttp-server.d.ts","sourceRoot":"","sources":["../../src/server/mockttp-server.ts"],"names":[],"mappings":"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"}
|