@milaboratories/pl-client 2.17.7 → 2.17.8
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.
- package/dist/_virtual/_rolldown/runtime.cjs +43 -0
- package/dist/_virtual/_rolldown/runtime.js +18 -0
- package/dist/core/PromiseTracker.cjs +33 -33
- package/dist/core/PromiseTracker.cjs.map +1 -1
- package/dist/core/PromiseTracker.d.ts +10 -7
- package/dist/core/PromiseTracker.js +33 -31
- package/dist/core/PromiseTracker.js.map +1 -1
- package/dist/core/StatefulPromise.cjs +60 -61
- package/dist/core/StatefulPromise.cjs.map +1 -1
- package/dist/core/StatefulPromise.js +60 -60
- package/dist/core/StatefulPromise.js.map +1 -1
- package/dist/core/abstract_stream.d.ts +18 -15
- package/dist/core/advisory_locks.cjs +42 -49
- package/dist/core/advisory_locks.cjs.map +1 -1
- package/dist/core/advisory_locks.js +42 -48
- package/dist/core/advisory_locks.js.map +1 -1
- package/dist/core/auth.cjs +10 -15
- package/dist/core/auth.cjs.map +1 -1
- package/dist/core/auth.d.ts +7 -3
- package/dist/core/auth.js +10 -13
- package/dist/core/auth.js.map +1 -1
- package/dist/core/cache.d.ts +11 -7
- package/dist/core/client.cjs +255 -306
- package/dist/core/client.cjs.map +1 -1
- package/dist/core/client.d.ts +72 -68
- package/dist/core/client.js +253 -285
- package/dist/core/client.js.map +1 -1
- package/dist/core/config.cjs +81 -99
- package/dist/core/config.cjs.map +1 -1
- package/dist/core/config.d.ts +93 -90
- package/dist/core/config.js +81 -98
- package/dist/core/config.js.map +1 -1
- package/dist/core/default_client.cjs +84 -125
- package/dist/core/default_client.cjs.map +1 -1
- package/dist/core/default_client.d.ts +9 -6
- package/dist/core/default_client.js +78 -103
- package/dist/core/default_client.js.map +1 -1
- package/dist/core/driver.cjs +12 -16
- package/dist/core/driver.cjs.map +1 -1
- package/dist/core/driver.d.ts +18 -14
- package/dist/core/driver.js +12 -15
- package/dist/core/driver.js.map +1 -1
- package/dist/core/error_resource.cjs +5 -4
- package/dist/core/error_resource.cjs.map +1 -1
- package/dist/core/error_resource.js +5 -3
- package/dist/core/error_resource.js.map +1 -1
- package/dist/core/errors.cjs +104 -140
- package/dist/core/errors.cjs.map +1 -1
- package/dist/core/errors.d.ts +34 -30
- package/dist/core/errors.js +102 -137
- package/dist/core/errors.js.map +1 -1
- package/dist/core/final.cjs +63 -89
- package/dist/core/final.cjs.map +1 -1
- package/dist/core/final.d.ts +8 -4
- package/dist/core/final.js +63 -87
- package/dist/core/final.js.map +1 -1
- package/dist/core/ll_client.cjs +416 -521
- package/dist/core/ll_client.cjs.map +1 -1
- package/dist/core/ll_client.d.ts +100 -97
- package/dist/core/ll_client.js +415 -519
- package/dist/core/ll_client.js.map +1 -1
- package/dist/core/ll_transaction.cjs +206 -240
- package/dist/core/ll_transaction.cjs.map +1 -1
- package/dist/core/ll_transaction.d.ts +50 -52
- package/dist/core/ll_transaction.js +205 -238
- package/dist/core/ll_transaction.js.map +1 -1
- package/dist/core/stat.cjs +64 -63
- package/dist/core/stat.cjs.map +1 -1
- package/dist/core/stat.d.ts +35 -36
- package/dist/core/stat.js +64 -62
- package/dist/core/stat.js.map +1 -1
- package/dist/core/transaction.cjs +613 -650
- package/dist/core/transaction.cjs.map +1 -1
- package/dist/core/transaction.d.ts +165 -162
- package/dist/core/transaction.js +612 -648
- package/dist/core/transaction.js.map +1 -1
- package/dist/core/type_conversion.cjs +62 -83
- package/dist/core/type_conversion.cjs.map +1 -1
- package/dist/core/type_conversion.js +61 -81
- package/dist/core/type_conversion.js.map +1 -1
- package/dist/core/types.cjs +56 -86
- package/dist/core/types.cjs.map +1 -1
- package/dist/core/types.d.ts +63 -62
- package/dist/core/types.js +54 -83
- package/dist/core/types.js.map +1 -1
- package/dist/core/unauth_client.cjs +35 -41
- package/dist/core/unauth_client.cjs.map +1 -1
- package/dist/core/unauth_client.d.ts +18 -14
- package/dist/core/unauth_client.js +34 -39
- package/dist/core/unauth_client.js.map +1 -1
- package/dist/core/websocket_stream.cjs +277 -349
- package/dist/core/websocket_stream.cjs.map +1 -1
- package/dist/core/websocket_stream.js +275 -347
- package/dist/core/websocket_stream.js.map +1 -1
- package/dist/core/wire.d.ts +21 -17
- package/dist/helpers/pl.cjs +71 -73
- package/dist/helpers/pl.cjs.map +1 -1
- package/dist/helpers/pl.d.ts +40 -41
- package/dist/helpers/pl.js +66 -46
- package/dist/helpers/pl.js.map +1 -1
- package/dist/helpers/poll.cjs +99 -134
- package/dist/helpers/poll.cjs.map +1 -1
- package/dist/helpers/poll.d.ts +37 -34
- package/dist/helpers/poll.js +97 -113
- package/dist/helpers/poll.js.map +1 -1
- package/dist/helpers/retry_strategy.cjs +82 -87
- package/dist/helpers/retry_strategy.cjs.map +1 -1
- package/dist/helpers/retry_strategy.js +83 -86
- package/dist/helpers/retry_strategy.js.map +1 -1
- package/dist/helpers/tx_helpers.cjs +21 -20
- package/dist/helpers/tx_helpers.cjs.map +1 -1
- package/dist/helpers/tx_helpers.d.ts +11 -7
- package/dist/helpers/tx_helpers.js +20 -18
- package/dist/helpers/tx_helpers.js.map +1 -1
- package/dist/index.cjs +117 -106
- package/dist/index.d.ts +17 -17
- package/dist/index.js +17 -19
- package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.cjs +72 -66
- package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.cjs.map +1 -1
- package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.d.ts +35 -37
- package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.js +71 -64
- package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.js.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.cjs +12611 -12866
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.cjs.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.cjs +226 -226
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.cjs.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.d.ts +281 -330
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.js +225 -224
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.js.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.d.ts +2640 -4294
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.js +12608 -12706
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.js.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.cjs +1230 -1089
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.cjs.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.d.ts +393 -420
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.js +1228 -1083
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.js.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.cjs +142 -143
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.cjs.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.d.ts +62 -64
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.js +140 -141
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.js.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.cjs +572 -487
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.cjs.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.d.ts +125 -228
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.js +572 -485
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.js.map +1 -1
- package/dist/proto-grpc/google/protobuf/any.cjs +131 -146
- package/dist/proto-grpc/google/protobuf/any.cjs.map +1 -1
- package/dist/proto-grpc/google/protobuf/any.d.ts +78 -84
- package/dist/proto-grpc/google/protobuf/any.js +130 -144
- package/dist/proto-grpc/google/protobuf/any.js.map +1 -1
- package/dist/proto-grpc/google/protobuf/duration.cjs +92 -100
- package/dist/proto-grpc/google/protobuf/duration.cjs.map +1 -1
- package/dist/proto-grpc/google/protobuf/duration.d.ts +38 -43
- package/dist/proto-grpc/google/protobuf/duration.js +91 -98
- package/dist/proto-grpc/google/protobuf/duration.js.map +1 -1
- package/dist/proto-grpc/google/protobuf/timestamp.cjs +117 -128
- package/dist/proto-grpc/google/protobuf/timestamp.cjs.map +1 -1
- package/dist/proto-grpc/google/protobuf/timestamp.d.ts +50 -55
- package/dist/proto-grpc/google/protobuf/timestamp.js +116 -126
- package/dist/proto-grpc/google/protobuf/timestamp.js.map +1 -1
- package/dist/proto-grpc/google/rpc/code.cjs +223 -238
- package/dist/proto-grpc/google/rpc/code.cjs.map +1 -1
- package/dist/proto-grpc/google/rpc/code.d.ts +209 -206
- package/dist/proto-grpc/google/rpc/code.js +221 -237
- package/dist/proto-grpc/google/rpc/code.js.map +1 -1
- package/dist/proto-rest/index.cjs +67 -66
- package/dist/proto-rest/index.cjs.map +1 -1
- package/dist/proto-rest/index.d.ts +24 -18
- package/dist/proto-rest/index.js +61 -65
- package/dist/proto-rest/index.js.map +1 -1
- package/dist/proto-rest/plapi.d.ts +1400 -1477
- package/dist/test/tcp-proxy.cjs +100 -126
- package/dist/test/tcp-proxy.cjs.map +1 -1
- package/dist/test/tcp-proxy.d.ts +17 -13
- package/dist/test/tcp-proxy.js +97 -104
- package/dist/test/tcp-proxy.js.map +1 -1
- package/dist/test/test_config.cjs +145 -194
- package/dist/test/test_config.cjs.map +1 -1
- package/dist/test/test_config.d.ts +34 -30
- package/dist/test/test_config.js +138 -166
- package/dist/test/test_config.js.map +1 -1
- package/dist/util/pl.cjs +4 -3
- package/dist/util/pl.cjs.map +1 -1
- package/dist/util/pl.js +4 -2
- package/dist/util/pl.js.map +1 -1
- package/dist/util/util.cjs +7 -10
- package/dist/util/util.cjs.map +1 -1
- package/dist/util/util.js +7 -9
- package/dist/util/util.js.map +1 -1
- package/package.json +8 -8
- package/src/core/transaction.ts +123 -133
- package/dist/__external/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.52.4_tslib@2.8.1_typescript@5.6.3/__external/tslib/tslib.es6.cjs +0 -61
- package/dist/__external/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.52.4_tslib@2.8.1_typescript@5.6.3/__external/tslib/tslib.es6.cjs.map +0 -1
- package/dist/__external/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.52.4_tslib@2.8.1_typescript@5.6.3/__external/tslib/tslib.es6.js +0 -58
- package/dist/__external/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.52.4_tslib@2.8.1_typescript@5.6.3/__external/tslib/tslib.es6.js.map +0 -1
- package/dist/core/PromiseTracker.d.ts.map +0 -1
- package/dist/core/StatefulPromise.d.ts +0 -39
- package/dist/core/StatefulPromise.d.ts.map +0 -1
- package/dist/core/abstract_stream.d.ts.map +0 -1
- package/dist/core/advisory_locks.d.ts +0 -10
- package/dist/core/advisory_locks.d.ts.map +0 -1
- package/dist/core/auth.d.ts.map +0 -1
- package/dist/core/cache.d.ts.map +0 -1
- package/dist/core/client.d.ts.map +0 -1
- package/dist/core/config.d.ts.map +0 -1
- package/dist/core/default_client.d.ts.map +0 -1
- package/dist/core/driver.d.ts.map +0 -1
- package/dist/core/error_resource.d.ts +0 -6
- package/dist/core/error_resource.d.ts.map +0 -1
- package/dist/core/errors.d.ts.map +0 -1
- package/dist/core/final.d.ts.map +0 -1
- package/dist/core/ll_client.d.ts.map +0 -1
- package/dist/core/ll_transaction.d.ts.map +0 -1
- package/dist/core/stat.d.ts.map +0 -1
- package/dist/core/transaction.d.ts.map +0 -1
- package/dist/core/type_conversion.d.ts +0 -8
- package/dist/core/type_conversion.d.ts.map +0 -1
- package/dist/core/types.d.ts.map +0 -1
- package/dist/core/unauth_client.d.ts.map +0 -1
- package/dist/core/websocket_stream.d.ts +0 -67
- package/dist/core/websocket_stream.d.ts.map +0 -1
- package/dist/core/wire.d.ts.map +0 -1
- package/dist/helpers/pl.d.ts.map +0 -1
- package/dist/helpers/poll.d.ts.map +0 -1
- package/dist/helpers/retry_strategy.d.ts +0 -24
- package/dist/helpers/retry_strategy.d.ts.map +0 -1
- package/dist/helpers/state_helpers.d.ts +0 -3
- package/dist/helpers/state_helpers.d.ts.map +0 -1
- package/dist/helpers/tx_helpers.d.ts.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.d.ts.map +0 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.d.ts.map +0 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.d.ts.map +0 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.d.ts.map +0 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.d.ts.map +0 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/import.d.ts +0 -106
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/import.d.ts.map +0 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.d.ts.map +0 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/ws-test.d.ts +0 -73
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/ws-test.d.ts.map +0 -1
- package/dist/proto-grpc/google/api/http.d.ts +0 -456
- package/dist/proto-grpc/google/api/http.d.ts.map +0 -1
- package/dist/proto-grpc/google/protobuf/any.d.ts.map +0 -1
- package/dist/proto-grpc/google/protobuf/descriptor.d.ts +0 -2340
- package/dist/proto-grpc/google/protobuf/descriptor.d.ts.map +0 -1
- package/dist/proto-grpc/google/protobuf/duration.d.ts.map +0 -1
- package/dist/proto-grpc/google/protobuf/empty.d.ts +0 -32
- package/dist/proto-grpc/google/protobuf/empty.d.ts.map +0 -1
- package/dist/proto-grpc/google/protobuf/struct.d.ts +0 -187
- package/dist/proto-grpc/google/protobuf/struct.d.ts.map +0 -1
- package/dist/proto-grpc/google/protobuf/timestamp.d.ts.map +0 -1
- package/dist/proto-grpc/google/protobuf/wrappers.d.ts +0 -308
- package/dist/proto-grpc/google/protobuf/wrappers.d.ts.map +0 -1
- package/dist/proto-grpc/google/rpc/code.d.ts.map +0 -1
- package/dist/proto-grpc/google/rpc/error_details.d.ts +0 -654
- package/dist/proto-grpc/google/rpc/error_details.d.ts.map +0 -1
- package/dist/proto-grpc/google/rpc/http.d.ts +0 -121
- package/dist/proto-grpc/google/rpc/http.d.ts.map +0 -1
- package/dist/proto-grpc/google/rpc/status.d.ts +0 -55
- package/dist/proto-grpc/google/rpc/status.d.ts.map +0 -1
- package/dist/proto-rest/index.d.ts.map +0 -1
- package/dist/proto-rest/plapi.d.ts.map +0 -1
- package/dist/test/tcp-proxy.d.ts.map +0 -1
- package/dist/test/test_config.d.ts.map +0 -1
- package/dist/util/branding.d.ts +0 -7
- package/dist/util/branding.d.ts.map +0 -1
- package/dist/util/pl.d.ts +0 -9
- package/dist/util/pl.d.ts.map +0 -1
- package/dist/util/util.d.ts +0 -2
- package/dist/util/util.d.ts.map +0 -1
package/dist/test/tcp-proxy.cjs
CHANGED
|
@@ -1,131 +1,105 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
function _interopNamespaceDefault(e) {
|
|
9
|
-
var n = Object.create(null);
|
|
10
|
-
if (e) {
|
|
11
|
-
Object.keys(e).forEach(function (k) {
|
|
12
|
-
if (k !== 'default') {
|
|
13
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
14
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
15
|
-
enumerable: true,
|
|
16
|
-
get: function () { return e[k]; }
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
n.default = e;
|
|
22
|
-
return Object.freeze(n);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
var net__namespace = /*#__PURE__*/_interopNamespaceDefault(net);
|
|
26
|
-
var tp__namespace = /*#__PURE__*/_interopNamespaceDefault(tp);
|
|
1
|
+
const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
let node_timers_promises = require("node:timers/promises");
|
|
3
|
+
node_timers_promises = require_runtime.__toESM(node_timers_promises);
|
|
4
|
+
let node_net = require("node:net");
|
|
5
|
+
node_net = require_runtime.__toESM(node_net);
|
|
6
|
+
let node_stream = require("node:stream");
|
|
7
|
+
let node_stream_promises = require("node:stream/promises");
|
|
27
8
|
|
|
9
|
+
//#region src/test/tcp-proxy.ts
|
|
28
10
|
async function startTcpProxy(options) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
setLatency,
|
|
120
|
-
getLatency,
|
|
121
|
-
disconnectAll,
|
|
122
|
-
close: async () => {
|
|
123
|
-
await new Promise((resolve) => {
|
|
124
|
-
server.close(() => resolve());
|
|
125
|
-
});
|
|
126
|
-
},
|
|
127
|
-
};
|
|
11
|
+
const { port, targetPort } = options;
|
|
12
|
+
const state = { latency: options.latency };
|
|
13
|
+
const setLatency = (latency) => {
|
|
14
|
+
state.latency = latency;
|
|
15
|
+
};
|
|
16
|
+
const getLatency = () => {
|
|
17
|
+
return state.latency;
|
|
18
|
+
};
|
|
19
|
+
const connections = /* @__PURE__ */ new Set();
|
|
20
|
+
async function disconnectAll(delayMs = void 0) {
|
|
21
|
+
const kill = () => {
|
|
22
|
+
for (const { socket, client } of connections) {
|
|
23
|
+
if (!socket.destroyed) socket.destroy();
|
|
24
|
+
if (!client.destroyed) client.destroy();
|
|
25
|
+
}
|
|
26
|
+
connections.clear();
|
|
27
|
+
};
|
|
28
|
+
if (delayMs !== void 0) await node_timers_promises.setTimeout(delayMs);
|
|
29
|
+
kill();
|
|
30
|
+
}
|
|
31
|
+
const server = node_net.createServer((socket) => {
|
|
32
|
+
const client = node_net.createConnection({ port: targetPort }, () => {
|
|
33
|
+
if (options.verbose) console.log(`connected to ${targetPort}`);
|
|
34
|
+
});
|
|
35
|
+
const pair = {
|
|
36
|
+
socket,
|
|
37
|
+
client
|
|
38
|
+
};
|
|
39
|
+
connections.add(pair);
|
|
40
|
+
const onClose = () => connections.delete(pair);
|
|
41
|
+
socket.on("close", onClose);
|
|
42
|
+
client.on("close", onClose);
|
|
43
|
+
class LatencyTransform extends node_stream.Transform {
|
|
44
|
+
pendingTimer;
|
|
45
|
+
constructor() {
|
|
46
|
+
super();
|
|
47
|
+
}
|
|
48
|
+
_transform(chunk, _enc, callback) {
|
|
49
|
+
this.pendingTimer = setTimeout(() => {
|
|
50
|
+
this.pendingTimer = void 0;
|
|
51
|
+
this.push(chunk);
|
|
52
|
+
callback();
|
|
53
|
+
}, state.latency);
|
|
54
|
+
}
|
|
55
|
+
_destroy(err, cb) {
|
|
56
|
+
if (this.pendingTimer) clearTimeout(this.pendingTimer);
|
|
57
|
+
this.pendingTimer = void 0;
|
|
58
|
+
cb(err);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const toClientLatency = new LatencyTransform();
|
|
62
|
+
(0, node_stream_promises.pipeline)(socket, new LatencyTransform(), client).catch((err) => {
|
|
63
|
+
socket.destroy(err);
|
|
64
|
+
client.destroy(err);
|
|
65
|
+
});
|
|
66
|
+
(0, node_stream_promises.pipeline)(client, toClientLatency, socket).catch((err) => {
|
|
67
|
+
socket.destroy(err);
|
|
68
|
+
client.destroy(err);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
server.listen({ port: port ?? 0 }, () => {
|
|
72
|
+
console.log("Test TCP proxy server started on", server.address());
|
|
73
|
+
});
|
|
74
|
+
await new Promise((resolve, reject) => {
|
|
75
|
+
if (server.listening) return resolve();
|
|
76
|
+
const onError = (err) => {
|
|
77
|
+
server.off("listening", onListening);
|
|
78
|
+
reject(err);
|
|
79
|
+
};
|
|
80
|
+
const onListening = () => {
|
|
81
|
+
server.off("error", onError);
|
|
82
|
+
resolve();
|
|
83
|
+
};
|
|
84
|
+
server.once("error", onError);
|
|
85
|
+
server.once("listening", onListening);
|
|
86
|
+
});
|
|
87
|
+
return {
|
|
88
|
+
server,
|
|
89
|
+
get port() {
|
|
90
|
+
return server.address()?.port;
|
|
91
|
+
},
|
|
92
|
+
setLatency,
|
|
93
|
+
getLatency,
|
|
94
|
+
disconnectAll,
|
|
95
|
+
close: async () => {
|
|
96
|
+
await new Promise((resolve) => {
|
|
97
|
+
server.close(() => resolve());
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
};
|
|
128
101
|
}
|
|
129
102
|
|
|
103
|
+
//#endregion
|
|
130
104
|
exports.startTcpProxy = startTcpProxy;
|
|
131
|
-
//# sourceMappingURL=tcp-proxy.cjs.map
|
|
105
|
+
//# sourceMappingURL=tcp-proxy.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tcp-proxy.cjs","sources":["../../src/test/tcp-proxy.ts"],"sourcesContent":["import * as net from \"node:net\";\nimport type { AddressInfo } from \"node:net\";\nimport { Transform } from \"node:stream\";\nimport type { TransformCallback } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport * as timers from \"node:timers/promises\";\n\nexport type TcpProxyOptions = {\n port?: number;\n targetPort: number;\n latency: number;\n verbose?: boolean;\n};\n\nexport async function startTcpProxy(options: TcpProxyOptions) {\n const { port, targetPort } = options;\n\n const state = {\n latency: options.latency,\n };\n\n const setLatency = (latency: number) => {\n state.latency = latency;\n };\n\n const getLatency = () => {\n return state.latency;\n };\n\n const connections = new Set<{ socket: net.Socket; client: net.Socket }>();\n\n async function disconnectAll(delayMs: number | undefined = undefined) {\n const kill = () => {\n for (const { socket, client } of connections) {\n if (!socket.destroyed) socket.destroy();\n if (!client.destroyed) client.destroy();\n }\n connections.clear();\n };\n if (delayMs !== undefined) await timers.setTimeout(delayMs);\n kill();\n }\n\n const server = net.createServer((socket: net.Socket) => {\n const client = net.createConnection({ port: targetPort }, () => {\n if (options.verbose) console.log(`connected to ${targetPort}`);\n });\n\n const pair = { socket, client };\n connections.add(pair);\n const onClose = () => connections.delete(pair);\n socket.on(\"close\", onClose);\n client.on(\"close\", onClose);\n\n class LatencyTransform extends Transform {\n private pendingTimer?: NodeJS.Timeout;\n constructor() {\n super();\n }\n\n _transform(chunk: Buffer, _enc: BufferEncoding, callback: TransformCallback) {\n // Backpressure is respected by delaying the callback until after push\n this.pendingTimer = setTimeout(() => {\n this.pendingTimer = undefined;\n this.push(chunk);\n callback();\n }, state.latency);\n }\n\n _destroy(err: Error | null, cb: (error?: Error | null) => void) {\n if (this.pendingTimer) clearTimeout(this.pendingTimer);\n this.pendingTimer = undefined;\n cb(err);\n }\n }\n\n const toClientLatency = new LatencyTransform();\n const toTargetLatency = new LatencyTransform();\n\n // Bidirectional pipelines with latency and error propagation\n pipeline(socket, toTargetLatency, client).catch((err) => {\n socket.destroy(err);\n client.destroy(err);\n });\n\n pipeline(client, toClientLatency, socket).catch((err) => {\n socket.destroy(err);\n client.destroy(err);\n });\n });\n\n server.listen({ port: port ?? 0 }, () => {\n console.log(\"Test TCP proxy server started on\", server.address());\n });\n\n // Wait for proxy to be ready\n await new Promise<void>((resolve, reject) => {\n if (server.listening) return resolve();\n const onError = (err: Error) => {\n server.off(\"listening\", onListening);\n reject(err);\n };\n const onListening = () => {\n server.off(\"error\", onError);\n resolve();\n };\n server.once(\"error\", onError);\n server.once(\"listening\", onListening);\n });\n\n return {\n server,\n get port() {\n return (server.address() as AddressInfo)?.port;\n },\n setLatency,\n getLatency,\n disconnectAll,\n close: async () => {\n await new Promise<void>((resolve) => {\n server.close(() => resolve());\n });\n },\n };\n}\n\nexport type TestTcpProxy = Awaited<ReturnType<typeof startTcpProxy>>;\n"],"
|
|
1
|
+
{"version":3,"file":"tcp-proxy.cjs","names":["timers","net","Transform"],"sources":["../../src/test/tcp-proxy.ts"],"sourcesContent":["import * as net from \"node:net\";\nimport type { AddressInfo } from \"node:net\";\nimport { Transform } from \"node:stream\";\nimport type { TransformCallback } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport * as timers from \"node:timers/promises\";\n\nexport type TcpProxyOptions = {\n port?: number;\n targetPort: number;\n latency: number;\n verbose?: boolean;\n};\n\nexport async function startTcpProxy(options: TcpProxyOptions) {\n const { port, targetPort } = options;\n\n const state = {\n latency: options.latency,\n };\n\n const setLatency = (latency: number) => {\n state.latency = latency;\n };\n\n const getLatency = () => {\n return state.latency;\n };\n\n const connections = new Set<{ socket: net.Socket; client: net.Socket }>();\n\n async function disconnectAll(delayMs: number | undefined = undefined) {\n const kill = () => {\n for (const { socket, client } of connections) {\n if (!socket.destroyed) socket.destroy();\n if (!client.destroyed) client.destroy();\n }\n connections.clear();\n };\n if (delayMs !== undefined) await timers.setTimeout(delayMs);\n kill();\n }\n\n const server = net.createServer((socket: net.Socket) => {\n const client = net.createConnection({ port: targetPort }, () => {\n if (options.verbose) console.log(`connected to ${targetPort}`);\n });\n\n const pair = { socket, client };\n connections.add(pair);\n const onClose = () => connections.delete(pair);\n socket.on(\"close\", onClose);\n client.on(\"close\", onClose);\n\n class LatencyTransform extends Transform {\n private pendingTimer?: NodeJS.Timeout;\n constructor() {\n super();\n }\n\n _transform(chunk: Buffer, _enc: BufferEncoding, callback: TransformCallback) {\n // Backpressure is respected by delaying the callback until after push\n this.pendingTimer = setTimeout(() => {\n this.pendingTimer = undefined;\n this.push(chunk);\n callback();\n }, state.latency);\n }\n\n _destroy(err: Error | null, cb: (error?: Error | null) => void) {\n if (this.pendingTimer) clearTimeout(this.pendingTimer);\n this.pendingTimer = undefined;\n cb(err);\n }\n }\n\n const toClientLatency = new LatencyTransform();\n const toTargetLatency = new LatencyTransform();\n\n // Bidirectional pipelines with latency and error propagation\n pipeline(socket, toTargetLatency, client).catch((err) => {\n socket.destroy(err);\n client.destroy(err);\n });\n\n pipeline(client, toClientLatency, socket).catch((err) => {\n socket.destroy(err);\n client.destroy(err);\n });\n });\n\n server.listen({ port: port ?? 0 }, () => {\n console.log(\"Test TCP proxy server started on\", server.address());\n });\n\n // Wait for proxy to be ready\n await new Promise<void>((resolve, reject) => {\n if (server.listening) return resolve();\n const onError = (err: Error) => {\n server.off(\"listening\", onListening);\n reject(err);\n };\n const onListening = () => {\n server.off(\"error\", onError);\n resolve();\n };\n server.once(\"error\", onError);\n server.once(\"listening\", onListening);\n });\n\n return {\n server,\n get port() {\n return (server.address() as AddressInfo)?.port;\n },\n setLatency,\n getLatency,\n disconnectAll,\n close: async () => {\n await new Promise<void>((resolve) => {\n server.close(() => resolve());\n });\n },\n };\n}\n\nexport type TestTcpProxy = Awaited<ReturnType<typeof startTcpProxy>>;\n"],"mappings":";;;;;;;;;AAcA,eAAsB,cAAc,SAA0B;CAC5D,MAAM,EAAE,MAAM,eAAe;CAE7B,MAAM,QAAQ,EACZ,SAAS,QAAQ,SAClB;CAED,MAAM,cAAc,YAAoB;AACtC,QAAM,UAAU;;CAGlB,MAAM,mBAAmB;AACvB,SAAO,MAAM;;CAGf,MAAM,8BAAc,IAAI,KAAiD;CAEzE,eAAe,cAAc,UAA8B,QAAW;EACpE,MAAM,aAAa;AACjB,QAAK,MAAM,EAAE,QAAQ,YAAY,aAAa;AAC5C,QAAI,CAAC,OAAO,UAAW,QAAO,SAAS;AACvC,QAAI,CAAC,OAAO,UAAW,QAAO,SAAS;;AAEzC,eAAY,OAAO;;AAErB,MAAI,YAAY,OAAW,OAAMA,qBAAO,WAAW,QAAQ;AAC3D,QAAM;;CAGR,MAAM,SAASC,SAAI,cAAc,WAAuB;EACtD,MAAM,SAASA,SAAI,iBAAiB,EAAE,MAAM,YAAY,QAAQ;AAC9D,OAAI,QAAQ,QAAS,SAAQ,IAAI,gBAAgB,aAAa;IAC9D;EAEF,MAAM,OAAO;GAAE;GAAQ;GAAQ;AAC/B,cAAY,IAAI,KAAK;EACrB,MAAM,gBAAgB,YAAY,OAAO,KAAK;AAC9C,SAAO,GAAG,SAAS,QAAQ;AAC3B,SAAO,GAAG,SAAS,QAAQ;EAE3B,MAAM,yBAAyBC,sBAAU;GACvC,AAAQ;GACR,cAAc;AACZ,WAAO;;GAGT,WAAW,OAAe,MAAsB,UAA6B;AAE3E,SAAK,eAAe,iBAAiB;AACnC,UAAK,eAAe;AACpB,UAAK,KAAK,MAAM;AAChB,eAAU;OACT,MAAM,QAAQ;;GAGnB,SAAS,KAAmB,IAAoC;AAC9D,QAAI,KAAK,aAAc,cAAa,KAAK,aAAa;AACtD,SAAK,eAAe;AACpB,OAAG,IAAI;;;EAIX,MAAM,kBAAkB,IAAI,kBAAkB;AAI9C,qCAAS,QAHe,IAAI,kBAAkB,EAGZ,OAAO,CAAC,OAAO,QAAQ;AACvD,UAAO,QAAQ,IAAI;AACnB,UAAO,QAAQ,IAAI;IACnB;AAEF,qCAAS,QAAQ,iBAAiB,OAAO,CAAC,OAAO,QAAQ;AACvD,UAAO,QAAQ,IAAI;AACnB,UAAO,QAAQ,IAAI;IACnB;GACF;AAEF,QAAO,OAAO,EAAE,MAAM,QAAQ,GAAG,QAAQ;AACvC,UAAQ,IAAI,oCAAoC,OAAO,SAAS,CAAC;GACjE;AAGF,OAAM,IAAI,SAAe,SAAS,WAAW;AAC3C,MAAI,OAAO,UAAW,QAAO,SAAS;EACtC,MAAM,WAAW,QAAe;AAC9B,UAAO,IAAI,aAAa,YAAY;AACpC,UAAO,IAAI;;EAEb,MAAM,oBAAoB;AACxB,UAAO,IAAI,SAAS,QAAQ;AAC5B,YAAS;;AAEX,SAAO,KAAK,SAAS,QAAQ;AAC7B,SAAO,KAAK,aAAa,YAAY;GACrC;AAEF,QAAO;EACL;EACA,IAAI,OAAO;AACT,UAAQ,OAAO,SAAS,EAAkB;;EAE5C;EACA;EACA;EACA,OAAO,YAAY;AACjB,SAAM,IAAI,SAAe,YAAY;AACnC,WAAO,YAAY,SAAS,CAAC;KAC7B;;EAEL"}
|
package/dist/test/tcp-proxy.d.ts
CHANGED
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
import * as net from "node:net";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
|
|
3
|
+
//#region src/test/tcp-proxy.d.ts
|
|
4
|
+
type TcpProxyOptions = {
|
|
5
|
+
port?: number;
|
|
6
|
+
targetPort: number;
|
|
7
|
+
latency: number;
|
|
8
|
+
verbose?: boolean;
|
|
7
9
|
};
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
declare function startTcpProxy(options: TcpProxyOptions): Promise<{
|
|
11
|
+
server: net.Server;
|
|
12
|
+
readonly port: number;
|
|
13
|
+
setLatency: (latency: number) => void;
|
|
14
|
+
getLatency: () => number;
|
|
15
|
+
disconnectAll: (delayMs?: number | undefined) => Promise<void>;
|
|
16
|
+
close: () => Promise<void>;
|
|
15
17
|
}>;
|
|
16
|
-
|
|
18
|
+
type TestTcpProxy = Awaited<ReturnType<typeof startTcpProxy>>;
|
|
19
|
+
//#endregion
|
|
20
|
+
export { TestTcpProxy, startTcpProxy };
|
|
17
21
|
//# sourceMappingURL=tcp-proxy.d.ts.map
|
package/dist/test/tcp-proxy.js
CHANGED
|
@@ -1,109 +1,102 @@
|
|
|
1
|
-
import * as
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
1
|
+
import * as timers from "node:timers/promises";
|
|
2
|
+
import * as net from "node:net";
|
|
3
|
+
import { Transform } from "node:stream";
|
|
4
|
+
import { pipeline } from "node:stream/promises";
|
|
5
5
|
|
|
6
|
+
//#region src/test/tcp-proxy.ts
|
|
6
7
|
async function startTcpProxy(options) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
setLatency,
|
|
98
|
-
getLatency,
|
|
99
|
-
disconnectAll,
|
|
100
|
-
close: async () => {
|
|
101
|
-
await new Promise((resolve) => {
|
|
102
|
-
server.close(() => resolve());
|
|
103
|
-
});
|
|
104
|
-
},
|
|
105
|
-
};
|
|
8
|
+
const { port, targetPort } = options;
|
|
9
|
+
const state = { latency: options.latency };
|
|
10
|
+
const setLatency = (latency) => {
|
|
11
|
+
state.latency = latency;
|
|
12
|
+
};
|
|
13
|
+
const getLatency = () => {
|
|
14
|
+
return state.latency;
|
|
15
|
+
};
|
|
16
|
+
const connections = /* @__PURE__ */ new Set();
|
|
17
|
+
async function disconnectAll(delayMs = void 0) {
|
|
18
|
+
const kill = () => {
|
|
19
|
+
for (const { socket, client } of connections) {
|
|
20
|
+
if (!socket.destroyed) socket.destroy();
|
|
21
|
+
if (!client.destroyed) client.destroy();
|
|
22
|
+
}
|
|
23
|
+
connections.clear();
|
|
24
|
+
};
|
|
25
|
+
if (delayMs !== void 0) await timers.setTimeout(delayMs);
|
|
26
|
+
kill();
|
|
27
|
+
}
|
|
28
|
+
const server = net.createServer((socket) => {
|
|
29
|
+
const client = net.createConnection({ port: targetPort }, () => {
|
|
30
|
+
if (options.verbose) console.log(`connected to ${targetPort}`);
|
|
31
|
+
});
|
|
32
|
+
const pair = {
|
|
33
|
+
socket,
|
|
34
|
+
client
|
|
35
|
+
};
|
|
36
|
+
connections.add(pair);
|
|
37
|
+
const onClose = () => connections.delete(pair);
|
|
38
|
+
socket.on("close", onClose);
|
|
39
|
+
client.on("close", onClose);
|
|
40
|
+
class LatencyTransform extends Transform {
|
|
41
|
+
pendingTimer;
|
|
42
|
+
constructor() {
|
|
43
|
+
super();
|
|
44
|
+
}
|
|
45
|
+
_transform(chunk, _enc, callback) {
|
|
46
|
+
this.pendingTimer = setTimeout(() => {
|
|
47
|
+
this.pendingTimer = void 0;
|
|
48
|
+
this.push(chunk);
|
|
49
|
+
callback();
|
|
50
|
+
}, state.latency);
|
|
51
|
+
}
|
|
52
|
+
_destroy(err, cb) {
|
|
53
|
+
if (this.pendingTimer) clearTimeout(this.pendingTimer);
|
|
54
|
+
this.pendingTimer = void 0;
|
|
55
|
+
cb(err);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const toClientLatency = new LatencyTransform();
|
|
59
|
+
pipeline(socket, new LatencyTransform(), client).catch((err) => {
|
|
60
|
+
socket.destroy(err);
|
|
61
|
+
client.destroy(err);
|
|
62
|
+
});
|
|
63
|
+
pipeline(client, toClientLatency, socket).catch((err) => {
|
|
64
|
+
socket.destroy(err);
|
|
65
|
+
client.destroy(err);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
server.listen({ port: port ?? 0 }, () => {
|
|
69
|
+
console.log("Test TCP proxy server started on", server.address());
|
|
70
|
+
});
|
|
71
|
+
await new Promise((resolve, reject) => {
|
|
72
|
+
if (server.listening) return resolve();
|
|
73
|
+
const onError = (err) => {
|
|
74
|
+
server.off("listening", onListening);
|
|
75
|
+
reject(err);
|
|
76
|
+
};
|
|
77
|
+
const onListening = () => {
|
|
78
|
+
server.off("error", onError);
|
|
79
|
+
resolve();
|
|
80
|
+
};
|
|
81
|
+
server.once("error", onError);
|
|
82
|
+
server.once("listening", onListening);
|
|
83
|
+
});
|
|
84
|
+
return {
|
|
85
|
+
server,
|
|
86
|
+
get port() {
|
|
87
|
+
return server.address()?.port;
|
|
88
|
+
},
|
|
89
|
+
setLatency,
|
|
90
|
+
getLatency,
|
|
91
|
+
disconnectAll,
|
|
92
|
+
close: async () => {
|
|
93
|
+
await new Promise((resolve) => {
|
|
94
|
+
server.close(() => resolve());
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
};
|
|
106
98
|
}
|
|
107
99
|
|
|
100
|
+
//#endregion
|
|
108
101
|
export { startTcpProxy };
|
|
109
|
-
//# sourceMappingURL=tcp-proxy.js.map
|
|
102
|
+
//# sourceMappingURL=tcp-proxy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tcp-proxy.js","sources":["../../src/test/tcp-proxy.ts"],"sourcesContent":["import * as net from \"node:net\";\nimport type { AddressInfo } from \"node:net\";\nimport { Transform } from \"node:stream\";\nimport type { TransformCallback } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport * as timers from \"node:timers/promises\";\n\nexport type TcpProxyOptions = {\n port?: number;\n targetPort: number;\n latency: number;\n verbose?: boolean;\n};\n\nexport async function startTcpProxy(options: TcpProxyOptions) {\n const { port, targetPort } = options;\n\n const state = {\n latency: options.latency,\n };\n\n const setLatency = (latency: number) => {\n state.latency = latency;\n };\n\n const getLatency = () => {\n return state.latency;\n };\n\n const connections = new Set<{ socket: net.Socket; client: net.Socket }>();\n\n async function disconnectAll(delayMs: number | undefined = undefined) {\n const kill = () => {\n for (const { socket, client } of connections) {\n if (!socket.destroyed) socket.destroy();\n if (!client.destroyed) client.destroy();\n }\n connections.clear();\n };\n if (delayMs !== undefined) await timers.setTimeout(delayMs);\n kill();\n }\n\n const server = net.createServer((socket: net.Socket) => {\n const client = net.createConnection({ port: targetPort }, () => {\n if (options.verbose) console.log(`connected to ${targetPort}`);\n });\n\n const pair = { socket, client };\n connections.add(pair);\n const onClose = () => connections.delete(pair);\n socket.on(\"close\", onClose);\n client.on(\"close\", onClose);\n\n class LatencyTransform extends Transform {\n private pendingTimer?: NodeJS.Timeout;\n constructor() {\n super();\n }\n\n _transform(chunk: Buffer, _enc: BufferEncoding, callback: TransformCallback) {\n // Backpressure is respected by delaying the callback until after push\n this.pendingTimer = setTimeout(() => {\n this.pendingTimer = undefined;\n this.push(chunk);\n callback();\n }, state.latency);\n }\n\n _destroy(err: Error | null, cb: (error?: Error | null) => void) {\n if (this.pendingTimer) clearTimeout(this.pendingTimer);\n this.pendingTimer = undefined;\n cb(err);\n }\n }\n\n const toClientLatency = new LatencyTransform();\n const toTargetLatency = new LatencyTransform();\n\n // Bidirectional pipelines with latency and error propagation\n pipeline(socket, toTargetLatency, client).catch((err) => {\n socket.destroy(err);\n client.destroy(err);\n });\n\n pipeline(client, toClientLatency, socket).catch((err) => {\n socket.destroy(err);\n client.destroy(err);\n });\n });\n\n server.listen({ port: port ?? 0 }, () => {\n console.log(\"Test TCP proxy server started on\", server.address());\n });\n\n // Wait for proxy to be ready\n await new Promise<void>((resolve, reject) => {\n if (server.listening) return resolve();\n const onError = (err: Error) => {\n server.off(\"listening\", onListening);\n reject(err);\n };\n const onListening = () => {\n server.off(\"error\", onError);\n resolve();\n };\n server.once(\"error\", onError);\n server.once(\"listening\", onListening);\n });\n\n return {\n server,\n get port() {\n return (server.address() as AddressInfo)?.port;\n },\n setLatency,\n getLatency,\n disconnectAll,\n close: async () => {\n await new Promise<void>((resolve) => {\n server.close(() => resolve());\n });\n },\n };\n}\n\nexport type TestTcpProxy = Awaited<ReturnType<typeof startTcpProxy>>;\n"],"
|
|
1
|
+
{"version":3,"file":"tcp-proxy.js","names":[],"sources":["../../src/test/tcp-proxy.ts"],"sourcesContent":["import * as net from \"node:net\";\nimport type { AddressInfo } from \"node:net\";\nimport { Transform } from \"node:stream\";\nimport type { TransformCallback } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport * as timers from \"node:timers/promises\";\n\nexport type TcpProxyOptions = {\n port?: number;\n targetPort: number;\n latency: number;\n verbose?: boolean;\n};\n\nexport async function startTcpProxy(options: TcpProxyOptions) {\n const { port, targetPort } = options;\n\n const state = {\n latency: options.latency,\n };\n\n const setLatency = (latency: number) => {\n state.latency = latency;\n };\n\n const getLatency = () => {\n return state.latency;\n };\n\n const connections = new Set<{ socket: net.Socket; client: net.Socket }>();\n\n async function disconnectAll(delayMs: number | undefined = undefined) {\n const kill = () => {\n for (const { socket, client } of connections) {\n if (!socket.destroyed) socket.destroy();\n if (!client.destroyed) client.destroy();\n }\n connections.clear();\n };\n if (delayMs !== undefined) await timers.setTimeout(delayMs);\n kill();\n }\n\n const server = net.createServer((socket: net.Socket) => {\n const client = net.createConnection({ port: targetPort }, () => {\n if (options.verbose) console.log(`connected to ${targetPort}`);\n });\n\n const pair = { socket, client };\n connections.add(pair);\n const onClose = () => connections.delete(pair);\n socket.on(\"close\", onClose);\n client.on(\"close\", onClose);\n\n class LatencyTransform extends Transform {\n private pendingTimer?: NodeJS.Timeout;\n constructor() {\n super();\n }\n\n _transform(chunk: Buffer, _enc: BufferEncoding, callback: TransformCallback) {\n // Backpressure is respected by delaying the callback until after push\n this.pendingTimer = setTimeout(() => {\n this.pendingTimer = undefined;\n this.push(chunk);\n callback();\n }, state.latency);\n }\n\n _destroy(err: Error | null, cb: (error?: Error | null) => void) {\n if (this.pendingTimer) clearTimeout(this.pendingTimer);\n this.pendingTimer = undefined;\n cb(err);\n }\n }\n\n const toClientLatency = new LatencyTransform();\n const toTargetLatency = new LatencyTransform();\n\n // Bidirectional pipelines with latency and error propagation\n pipeline(socket, toTargetLatency, client).catch((err) => {\n socket.destroy(err);\n client.destroy(err);\n });\n\n pipeline(client, toClientLatency, socket).catch((err) => {\n socket.destroy(err);\n client.destroy(err);\n });\n });\n\n server.listen({ port: port ?? 0 }, () => {\n console.log(\"Test TCP proxy server started on\", server.address());\n });\n\n // Wait for proxy to be ready\n await new Promise<void>((resolve, reject) => {\n if (server.listening) return resolve();\n const onError = (err: Error) => {\n server.off(\"listening\", onListening);\n reject(err);\n };\n const onListening = () => {\n server.off(\"error\", onError);\n resolve();\n };\n server.once(\"error\", onError);\n server.once(\"listening\", onListening);\n });\n\n return {\n server,\n get port() {\n return (server.address() as AddressInfo)?.port;\n },\n setLatency,\n getLatency,\n disconnectAll,\n close: async () => {\n await new Promise<void>((resolve) => {\n server.close(() => resolve());\n });\n },\n };\n}\n\nexport type TestTcpProxy = Awaited<ReturnType<typeof startTcpProxy>>;\n"],"mappings":";;;;;;AAcA,eAAsB,cAAc,SAA0B;CAC5D,MAAM,EAAE,MAAM,eAAe;CAE7B,MAAM,QAAQ,EACZ,SAAS,QAAQ,SAClB;CAED,MAAM,cAAc,YAAoB;AACtC,QAAM,UAAU;;CAGlB,MAAM,mBAAmB;AACvB,SAAO,MAAM;;CAGf,MAAM,8BAAc,IAAI,KAAiD;CAEzE,eAAe,cAAc,UAA8B,QAAW;EACpE,MAAM,aAAa;AACjB,QAAK,MAAM,EAAE,QAAQ,YAAY,aAAa;AAC5C,QAAI,CAAC,OAAO,UAAW,QAAO,SAAS;AACvC,QAAI,CAAC,OAAO,UAAW,QAAO,SAAS;;AAEzC,eAAY,OAAO;;AAErB,MAAI,YAAY,OAAW,OAAM,OAAO,WAAW,QAAQ;AAC3D,QAAM;;CAGR,MAAM,SAAS,IAAI,cAAc,WAAuB;EACtD,MAAM,SAAS,IAAI,iBAAiB,EAAE,MAAM,YAAY,QAAQ;AAC9D,OAAI,QAAQ,QAAS,SAAQ,IAAI,gBAAgB,aAAa;IAC9D;EAEF,MAAM,OAAO;GAAE;GAAQ;GAAQ;AAC/B,cAAY,IAAI,KAAK;EACrB,MAAM,gBAAgB,YAAY,OAAO,KAAK;AAC9C,SAAO,GAAG,SAAS,QAAQ;AAC3B,SAAO,GAAG,SAAS,QAAQ;EAE3B,MAAM,yBAAyB,UAAU;GACvC,AAAQ;GACR,cAAc;AACZ,WAAO;;GAGT,WAAW,OAAe,MAAsB,UAA6B;AAE3E,SAAK,eAAe,iBAAiB;AACnC,UAAK,eAAe;AACpB,UAAK,KAAK,MAAM;AAChB,eAAU;OACT,MAAM,QAAQ;;GAGnB,SAAS,KAAmB,IAAoC;AAC9D,QAAI,KAAK,aAAc,cAAa,KAAK,aAAa;AACtD,SAAK,eAAe;AACpB,OAAG,IAAI;;;EAIX,MAAM,kBAAkB,IAAI,kBAAkB;AAI9C,WAAS,QAHe,IAAI,kBAAkB,EAGZ,OAAO,CAAC,OAAO,QAAQ;AACvD,UAAO,QAAQ,IAAI;AACnB,UAAO,QAAQ,IAAI;IACnB;AAEF,WAAS,QAAQ,iBAAiB,OAAO,CAAC,OAAO,QAAQ;AACvD,UAAO,QAAQ,IAAI;AACnB,UAAO,QAAQ,IAAI;IACnB;GACF;AAEF,QAAO,OAAO,EAAE,MAAM,QAAQ,GAAG,QAAQ;AACvC,UAAQ,IAAI,oCAAoC,OAAO,SAAS,CAAC;GACjE;AAGF,OAAM,IAAI,SAAe,SAAS,WAAW;AAC3C,MAAI,OAAO,UAAW,QAAO,SAAS;EACtC,MAAM,WAAW,QAAe;AAC9B,UAAO,IAAI,aAAa,YAAY;AACpC,UAAO,IAAI;;EAEb,MAAM,oBAAoB;AACxB,UAAO,IAAI,SAAS,QAAQ;AAC5B,YAAS;;AAEX,SAAO,KAAK,SAAS,QAAQ;AAC7B,SAAO,KAAK,aAAa,YAAY;GACrC;AAEF,QAAO;EACL;EACA,IAAI,OAAO;AACT,UAAQ,OAAO,SAAS,EAAkB;;EAE5C;EACA;EACA;EACA,OAAO,YAAY;AACjB,SAAM,IAAI,SAAe,YAAY;AACnC,WAAO,YAAY,SAAS,CAAC;KAC7B;;EAEL"}
|