@milaboratories/pl-client 2.17.7 → 2.17.9

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.
Files changed (276) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +43 -0
  2. package/dist/_virtual/_rolldown/runtime.js +18 -0
  3. package/dist/core/PromiseTracker.cjs +33 -33
  4. package/dist/core/PromiseTracker.cjs.map +1 -1
  5. package/dist/core/PromiseTracker.d.ts +10 -7
  6. package/dist/core/PromiseTracker.js +33 -31
  7. package/dist/core/PromiseTracker.js.map +1 -1
  8. package/dist/core/StatefulPromise.cjs +60 -61
  9. package/dist/core/StatefulPromise.cjs.map +1 -1
  10. package/dist/core/StatefulPromise.js +60 -60
  11. package/dist/core/StatefulPromise.js.map +1 -1
  12. package/dist/core/abstract_stream.d.ts +18 -15
  13. package/dist/core/advisory_locks.cjs +42 -49
  14. package/dist/core/advisory_locks.cjs.map +1 -1
  15. package/dist/core/advisory_locks.js +42 -48
  16. package/dist/core/advisory_locks.js.map +1 -1
  17. package/dist/core/auth.cjs +10 -15
  18. package/dist/core/auth.cjs.map +1 -1
  19. package/dist/core/auth.d.ts +7 -3
  20. package/dist/core/auth.js +10 -13
  21. package/dist/core/auth.js.map +1 -1
  22. package/dist/core/cache.d.ts +11 -7
  23. package/dist/core/client.cjs +255 -306
  24. package/dist/core/client.cjs.map +1 -1
  25. package/dist/core/client.d.ts +72 -68
  26. package/dist/core/client.js +253 -285
  27. package/dist/core/client.js.map +1 -1
  28. package/dist/core/config.cjs +81 -99
  29. package/dist/core/config.cjs.map +1 -1
  30. package/dist/core/config.d.ts +93 -90
  31. package/dist/core/config.js +81 -98
  32. package/dist/core/config.js.map +1 -1
  33. package/dist/core/default_client.cjs +84 -125
  34. package/dist/core/default_client.cjs.map +1 -1
  35. package/dist/core/default_client.d.ts +9 -6
  36. package/dist/core/default_client.js +78 -103
  37. package/dist/core/default_client.js.map +1 -1
  38. package/dist/core/driver.cjs +12 -16
  39. package/dist/core/driver.cjs.map +1 -1
  40. package/dist/core/driver.d.ts +18 -14
  41. package/dist/core/driver.js +12 -15
  42. package/dist/core/driver.js.map +1 -1
  43. package/dist/core/error_resource.cjs +5 -4
  44. package/dist/core/error_resource.cjs.map +1 -1
  45. package/dist/core/error_resource.js +5 -3
  46. package/dist/core/error_resource.js.map +1 -1
  47. package/dist/core/errors.cjs +104 -140
  48. package/dist/core/errors.cjs.map +1 -1
  49. package/dist/core/errors.d.ts +34 -30
  50. package/dist/core/errors.js +102 -137
  51. package/dist/core/errors.js.map +1 -1
  52. package/dist/core/final.cjs +63 -89
  53. package/dist/core/final.cjs.map +1 -1
  54. package/dist/core/final.d.ts +8 -4
  55. package/dist/core/final.js +63 -87
  56. package/dist/core/final.js.map +1 -1
  57. package/dist/core/ll_client.cjs +416 -521
  58. package/dist/core/ll_client.cjs.map +1 -1
  59. package/dist/core/ll_client.d.ts +100 -97
  60. package/dist/core/ll_client.js +415 -519
  61. package/dist/core/ll_client.js.map +1 -1
  62. package/dist/core/ll_transaction.cjs +206 -240
  63. package/dist/core/ll_transaction.cjs.map +1 -1
  64. package/dist/core/ll_transaction.d.ts +50 -52
  65. package/dist/core/ll_transaction.js +205 -238
  66. package/dist/core/ll_transaction.js.map +1 -1
  67. package/dist/core/stat.cjs +64 -63
  68. package/dist/core/stat.cjs.map +1 -1
  69. package/dist/core/stat.d.ts +35 -36
  70. package/dist/core/stat.js +64 -62
  71. package/dist/core/stat.js.map +1 -1
  72. package/dist/core/transaction.cjs +613 -650
  73. package/dist/core/transaction.cjs.map +1 -1
  74. package/dist/core/transaction.d.ts +165 -162
  75. package/dist/core/transaction.js +612 -648
  76. package/dist/core/transaction.js.map +1 -1
  77. package/dist/core/type_conversion.cjs +62 -83
  78. package/dist/core/type_conversion.cjs.map +1 -1
  79. package/dist/core/type_conversion.js +61 -81
  80. package/dist/core/type_conversion.js.map +1 -1
  81. package/dist/core/types.cjs +56 -86
  82. package/dist/core/types.cjs.map +1 -1
  83. package/dist/core/types.d.ts +63 -62
  84. package/dist/core/types.js +54 -83
  85. package/dist/core/types.js.map +1 -1
  86. package/dist/core/unauth_client.cjs +35 -41
  87. package/dist/core/unauth_client.cjs.map +1 -1
  88. package/dist/core/unauth_client.d.ts +18 -14
  89. package/dist/core/unauth_client.js +34 -39
  90. package/dist/core/unauth_client.js.map +1 -1
  91. package/dist/core/websocket_stream.cjs +280 -349
  92. package/dist/core/websocket_stream.cjs.map +1 -1
  93. package/dist/core/websocket_stream.js +278 -347
  94. package/dist/core/websocket_stream.js.map +1 -1
  95. package/dist/core/wire.d.ts +21 -17
  96. package/dist/helpers/pl.cjs +71 -73
  97. package/dist/helpers/pl.cjs.map +1 -1
  98. package/dist/helpers/pl.d.ts +40 -41
  99. package/dist/helpers/pl.js +66 -46
  100. package/dist/helpers/pl.js.map +1 -1
  101. package/dist/helpers/poll.cjs +99 -134
  102. package/dist/helpers/poll.cjs.map +1 -1
  103. package/dist/helpers/poll.d.ts +37 -34
  104. package/dist/helpers/poll.js +97 -113
  105. package/dist/helpers/poll.js.map +1 -1
  106. package/dist/helpers/retry_strategy.cjs +82 -87
  107. package/dist/helpers/retry_strategy.cjs.map +1 -1
  108. package/dist/helpers/retry_strategy.js +83 -86
  109. package/dist/helpers/retry_strategy.js.map +1 -1
  110. package/dist/helpers/tx_helpers.cjs +21 -20
  111. package/dist/helpers/tx_helpers.cjs.map +1 -1
  112. package/dist/helpers/tx_helpers.d.ts +11 -7
  113. package/dist/helpers/tx_helpers.js +20 -18
  114. package/dist/helpers/tx_helpers.js.map +1 -1
  115. package/dist/index.cjs +117 -106
  116. package/dist/index.d.ts +17 -17
  117. package/dist/index.js +17 -19
  118. package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.cjs +72 -66
  119. package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.cjs.map +1 -1
  120. package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.d.ts +35 -37
  121. package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.js +71 -64
  122. package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.js.map +1 -1
  123. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.cjs +12611 -12866
  124. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.cjs.map +1 -1
  125. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.cjs +226 -226
  126. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.cjs.map +1 -1
  127. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.d.ts +281 -330
  128. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.js +225 -224
  129. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.js.map +1 -1
  130. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.d.ts +2640 -4294
  131. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.js +12608 -12706
  132. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.js.map +1 -1
  133. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.cjs +1230 -1089
  134. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.cjs.map +1 -1
  135. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.d.ts +393 -420
  136. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.js +1228 -1083
  137. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.js.map +1 -1
  138. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.cjs +142 -143
  139. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.cjs.map +1 -1
  140. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.d.ts +62 -64
  141. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.js +140 -141
  142. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.js.map +1 -1
  143. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.cjs +572 -487
  144. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.cjs.map +1 -1
  145. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.d.ts +125 -228
  146. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.js +572 -485
  147. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.js.map +1 -1
  148. package/dist/proto-grpc/google/protobuf/any.cjs +131 -146
  149. package/dist/proto-grpc/google/protobuf/any.cjs.map +1 -1
  150. package/dist/proto-grpc/google/protobuf/any.d.ts +78 -84
  151. package/dist/proto-grpc/google/protobuf/any.js +130 -144
  152. package/dist/proto-grpc/google/protobuf/any.js.map +1 -1
  153. package/dist/proto-grpc/google/protobuf/duration.cjs +92 -100
  154. package/dist/proto-grpc/google/protobuf/duration.cjs.map +1 -1
  155. package/dist/proto-grpc/google/protobuf/duration.d.ts +38 -43
  156. package/dist/proto-grpc/google/protobuf/duration.js +91 -98
  157. package/dist/proto-grpc/google/protobuf/duration.js.map +1 -1
  158. package/dist/proto-grpc/google/protobuf/timestamp.cjs +117 -128
  159. package/dist/proto-grpc/google/protobuf/timestamp.cjs.map +1 -1
  160. package/dist/proto-grpc/google/protobuf/timestamp.d.ts +50 -55
  161. package/dist/proto-grpc/google/protobuf/timestamp.js +116 -126
  162. package/dist/proto-grpc/google/protobuf/timestamp.js.map +1 -1
  163. package/dist/proto-grpc/google/rpc/code.cjs +223 -238
  164. package/dist/proto-grpc/google/rpc/code.cjs.map +1 -1
  165. package/dist/proto-grpc/google/rpc/code.d.ts +209 -206
  166. package/dist/proto-grpc/google/rpc/code.js +221 -237
  167. package/dist/proto-grpc/google/rpc/code.js.map +1 -1
  168. package/dist/proto-rest/index.cjs +67 -66
  169. package/dist/proto-rest/index.cjs.map +1 -1
  170. package/dist/proto-rest/index.d.ts +24 -18
  171. package/dist/proto-rest/index.js +61 -65
  172. package/dist/proto-rest/index.js.map +1 -1
  173. package/dist/proto-rest/plapi.d.ts +1400 -1477
  174. package/dist/test/tcp-proxy.cjs +100 -126
  175. package/dist/test/tcp-proxy.cjs.map +1 -1
  176. package/dist/test/tcp-proxy.d.ts +17 -13
  177. package/dist/test/tcp-proxy.js +97 -104
  178. package/dist/test/tcp-proxy.js.map +1 -1
  179. package/dist/test/test_config.cjs +145 -194
  180. package/dist/test/test_config.cjs.map +1 -1
  181. package/dist/test/test_config.d.ts +34 -30
  182. package/dist/test/test_config.js +138 -166
  183. package/dist/test/test_config.js.map +1 -1
  184. package/dist/util/pl.cjs +4 -3
  185. package/dist/util/pl.cjs.map +1 -1
  186. package/dist/util/pl.js +4 -2
  187. package/dist/util/pl.js.map +1 -1
  188. package/dist/util/util.cjs +7 -10
  189. package/dist/util/util.cjs.map +1 -1
  190. package/dist/util/util.js +7 -9
  191. package/dist/util/util.js.map +1 -1
  192. package/package.json +8 -8
  193. package/src/core/errors.ts +1 -1
  194. package/src/core/transaction.ts +123 -133
  195. package/src/core/websocket_stream.ts +10 -1
  196. 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
  197. 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
  198. 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
  199. 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
  200. package/dist/core/PromiseTracker.d.ts.map +0 -1
  201. package/dist/core/StatefulPromise.d.ts +0 -39
  202. package/dist/core/StatefulPromise.d.ts.map +0 -1
  203. package/dist/core/abstract_stream.d.ts.map +0 -1
  204. package/dist/core/advisory_locks.d.ts +0 -10
  205. package/dist/core/advisory_locks.d.ts.map +0 -1
  206. package/dist/core/auth.d.ts.map +0 -1
  207. package/dist/core/cache.d.ts.map +0 -1
  208. package/dist/core/client.d.ts.map +0 -1
  209. package/dist/core/config.d.ts.map +0 -1
  210. package/dist/core/default_client.d.ts.map +0 -1
  211. package/dist/core/driver.d.ts.map +0 -1
  212. package/dist/core/error_resource.d.ts +0 -6
  213. package/dist/core/error_resource.d.ts.map +0 -1
  214. package/dist/core/errors.d.ts.map +0 -1
  215. package/dist/core/final.d.ts.map +0 -1
  216. package/dist/core/ll_client.d.ts.map +0 -1
  217. package/dist/core/ll_transaction.d.ts.map +0 -1
  218. package/dist/core/stat.d.ts.map +0 -1
  219. package/dist/core/transaction.d.ts.map +0 -1
  220. package/dist/core/type_conversion.d.ts +0 -8
  221. package/dist/core/type_conversion.d.ts.map +0 -1
  222. package/dist/core/types.d.ts.map +0 -1
  223. package/dist/core/unauth_client.d.ts.map +0 -1
  224. package/dist/core/websocket_stream.d.ts +0 -67
  225. package/dist/core/websocket_stream.d.ts.map +0 -1
  226. package/dist/core/wire.d.ts.map +0 -1
  227. package/dist/helpers/pl.d.ts.map +0 -1
  228. package/dist/helpers/poll.d.ts.map +0 -1
  229. package/dist/helpers/retry_strategy.d.ts +0 -24
  230. package/dist/helpers/retry_strategy.d.ts.map +0 -1
  231. package/dist/helpers/state_helpers.d.ts +0 -3
  232. package/dist/helpers/state_helpers.d.ts.map +0 -1
  233. package/dist/helpers/tx_helpers.d.ts.map +0 -1
  234. package/dist/index.cjs.map +0 -1
  235. package/dist/index.d.ts.map +0 -1
  236. package/dist/index.js.map +0 -1
  237. package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.d.ts.map +0 -1
  238. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.d.ts.map +0 -1
  239. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.d.ts.map +0 -1
  240. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.d.ts.map +0 -1
  241. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.d.ts.map +0 -1
  242. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/import.d.ts +0 -106
  243. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/import.d.ts.map +0 -1
  244. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.d.ts.map +0 -1
  245. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/ws-test.d.ts +0 -73
  246. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/ws-test.d.ts.map +0 -1
  247. package/dist/proto-grpc/google/api/http.d.ts +0 -456
  248. package/dist/proto-grpc/google/api/http.d.ts.map +0 -1
  249. package/dist/proto-grpc/google/protobuf/any.d.ts.map +0 -1
  250. package/dist/proto-grpc/google/protobuf/descriptor.d.ts +0 -2340
  251. package/dist/proto-grpc/google/protobuf/descriptor.d.ts.map +0 -1
  252. package/dist/proto-grpc/google/protobuf/duration.d.ts.map +0 -1
  253. package/dist/proto-grpc/google/protobuf/empty.d.ts +0 -32
  254. package/dist/proto-grpc/google/protobuf/empty.d.ts.map +0 -1
  255. package/dist/proto-grpc/google/protobuf/struct.d.ts +0 -187
  256. package/dist/proto-grpc/google/protobuf/struct.d.ts.map +0 -1
  257. package/dist/proto-grpc/google/protobuf/timestamp.d.ts.map +0 -1
  258. package/dist/proto-grpc/google/protobuf/wrappers.d.ts +0 -308
  259. package/dist/proto-grpc/google/protobuf/wrappers.d.ts.map +0 -1
  260. package/dist/proto-grpc/google/rpc/code.d.ts.map +0 -1
  261. package/dist/proto-grpc/google/rpc/error_details.d.ts +0 -654
  262. package/dist/proto-grpc/google/rpc/error_details.d.ts.map +0 -1
  263. package/dist/proto-grpc/google/rpc/http.d.ts +0 -121
  264. package/dist/proto-grpc/google/rpc/http.d.ts.map +0 -1
  265. package/dist/proto-grpc/google/rpc/status.d.ts +0 -55
  266. package/dist/proto-grpc/google/rpc/status.d.ts.map +0 -1
  267. package/dist/proto-rest/index.d.ts.map +0 -1
  268. package/dist/proto-rest/plapi.d.ts.map +0 -1
  269. package/dist/test/tcp-proxy.d.ts.map +0 -1
  270. package/dist/test/test_config.d.ts.map +0 -1
  271. package/dist/util/branding.d.ts +0 -7
  272. package/dist/util/branding.d.ts.map +0 -1
  273. package/dist/util/pl.d.ts +0 -9
  274. package/dist/util/pl.d.ts.map +0 -1
  275. package/dist/util/util.d.ts +0 -2
  276. package/dist/util/util.d.ts.map +0 -1
@@ -1,131 +1,105 @@
1
- 'use strict';
2
-
3
- var net = require('node:net');
4
- var node_stream = require('node:stream');
5
- var promises = require('node:stream/promises');
6
- var tp = require('node:timers/promises');
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
- const { port, targetPort } = options;
30
- const state = {
31
- latency: options.latency,
32
- };
33
- const setLatency = (latency) => {
34
- state.latency = latency;
35
- };
36
- const getLatency = () => {
37
- return state.latency;
38
- };
39
- const connections = new Set();
40
- async function disconnectAll(delayMs = undefined) {
41
- const kill = () => {
42
- for (const { socket, client } of connections) {
43
- if (!socket.destroyed)
44
- socket.destroy();
45
- if (!client.destroyed)
46
- client.destroy();
47
- }
48
- connections.clear();
49
- };
50
- if (delayMs !== undefined)
51
- await tp__namespace.setTimeout(delayMs);
52
- kill();
53
- }
54
- const server = net__namespace.createServer((socket) => {
55
- const client = net__namespace.createConnection({ port: targetPort }, () => {
56
- if (options.verbose)
57
- console.log(`connected to ${targetPort}`);
58
- });
59
- const pair = { socket, client };
60
- connections.add(pair);
61
- const onClose = () => connections.delete(pair);
62
- socket.on("close", onClose);
63
- client.on("close", onClose);
64
- class LatencyTransform extends node_stream.Transform {
65
- pendingTimer;
66
- constructor() {
67
- super();
68
- }
69
- _transform(chunk, _enc, callback) {
70
- // Backpressure is respected by delaying the callback until after push
71
- this.pendingTimer = setTimeout(() => {
72
- this.pendingTimer = undefined;
73
- this.push(chunk);
74
- callback();
75
- }, state.latency);
76
- }
77
- _destroy(err, cb) {
78
- if (this.pendingTimer)
79
- clearTimeout(this.pendingTimer);
80
- this.pendingTimer = undefined;
81
- cb(err);
82
- }
83
- }
84
- const toClientLatency = new LatencyTransform();
85
- const toTargetLatency = new LatencyTransform();
86
- // Bidirectional pipelines with latency and error propagation
87
- promises.pipeline(socket, toTargetLatency, client).catch((err) => {
88
- socket.destroy(err);
89
- client.destroy(err);
90
- });
91
- promises.pipeline(client, toClientLatency, socket).catch((err) => {
92
- socket.destroy(err);
93
- client.destroy(err);
94
- });
95
- });
96
- server.listen({ port: port ?? 0 }, () => {
97
- console.log("Test TCP proxy server started on", server.address());
98
- });
99
- // Wait for proxy to be ready
100
- await new Promise((resolve, reject) => {
101
- if (server.listening)
102
- return resolve();
103
- const onError = (err) => {
104
- server.off("listening", onListening);
105
- reject(err);
106
- };
107
- const onListening = () => {
108
- server.off("error", onError);
109
- resolve();
110
- };
111
- server.once("error", onError);
112
- server.once("listening", onListening);
113
- });
114
- return {
115
- server,
116
- get port() {
117
- return server.address()?.port;
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"],"names":["timers","net","Transform","pipeline"],"mappings":"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"}
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"}
@@ -1,17 +1,21 @@
1
1
  import * as net from "node:net";
2
- export type TcpProxyOptions = {
3
- port?: number;
4
- targetPort: number;
5
- latency: number;
6
- verbose?: boolean;
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
- export declare function startTcpProxy(options: TcpProxyOptions): Promise<{
9
- server: net.Server;
10
- readonly port: number;
11
- setLatency: (latency: number) => void;
12
- getLatency: () => number;
13
- disconnectAll: (delayMs?: number | undefined) => Promise<void>;
14
- close: () => Promise<void>;
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
- export type TestTcpProxy = Awaited<ReturnType<typeof startTcpProxy>>;
18
+ type TestTcpProxy = Awaited<ReturnType<typeof startTcpProxy>>;
19
+ //#endregion
20
+ export { TestTcpProxy, startTcpProxy };
17
21
  //# sourceMappingURL=tcp-proxy.d.ts.map
@@ -1,109 +1,102 @@
1
- import * as net from 'node:net';
2
- import { Transform } from 'node:stream';
3
- import { pipeline } from 'node:stream/promises';
4
- import * as tp from 'node:timers/promises';
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
- const { port, targetPort } = options;
8
- const state = {
9
- latency: options.latency,
10
- };
11
- const setLatency = (latency) => {
12
- state.latency = latency;
13
- };
14
- const getLatency = () => {
15
- return state.latency;
16
- };
17
- const connections = new Set();
18
- async function disconnectAll(delayMs = undefined) {
19
- const kill = () => {
20
- for (const { socket, client } of connections) {
21
- if (!socket.destroyed)
22
- socket.destroy();
23
- if (!client.destroyed)
24
- client.destroy();
25
- }
26
- connections.clear();
27
- };
28
- if (delayMs !== undefined)
29
- await tp.setTimeout(delayMs);
30
- kill();
31
- }
32
- const server = net.createServer((socket) => {
33
- const client = net.createConnection({ port: targetPort }, () => {
34
- if (options.verbose)
35
- console.log(`connected to ${targetPort}`);
36
- });
37
- const pair = { socket, client };
38
- connections.add(pair);
39
- const onClose = () => connections.delete(pair);
40
- socket.on("close", onClose);
41
- client.on("close", onClose);
42
- class LatencyTransform extends Transform {
43
- pendingTimer;
44
- constructor() {
45
- super();
46
- }
47
- _transform(chunk, _enc, callback) {
48
- // Backpressure is respected by delaying the callback until after push
49
- this.pendingTimer = setTimeout(() => {
50
- this.pendingTimer = undefined;
51
- this.push(chunk);
52
- callback();
53
- }, state.latency);
54
- }
55
- _destroy(err, cb) {
56
- if (this.pendingTimer)
57
- clearTimeout(this.pendingTimer);
58
- this.pendingTimer = undefined;
59
- cb(err);
60
- }
61
- }
62
- const toClientLatency = new LatencyTransform();
63
- const toTargetLatency = new LatencyTransform();
64
- // Bidirectional pipelines with latency and error propagation
65
- pipeline(socket, toTargetLatency, client).catch((err) => {
66
- socket.destroy(err);
67
- client.destroy(err);
68
- });
69
- pipeline(client, toClientLatency, socket).catch((err) => {
70
- socket.destroy(err);
71
- client.destroy(err);
72
- });
73
- });
74
- server.listen({ port: port ?? 0 }, () => {
75
- console.log("Test TCP proxy server started on", server.address());
76
- });
77
- // Wait for proxy to be ready
78
- await new Promise((resolve, reject) => {
79
- if (server.listening)
80
- return resolve();
81
- const onError = (err) => {
82
- server.off("listening", onListening);
83
- reject(err);
84
- };
85
- const onListening = () => {
86
- server.off("error", onError);
87
- resolve();
88
- };
89
- server.once("error", onError);
90
- server.once("listening", onListening);
91
- });
92
- return {
93
- server,
94
- get port() {
95
- return server.address()?.port;
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"],"names":["timers"],"mappings":"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"}
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"}