connectbase-client 3.48.0 → 3.48.1
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/cli.js +29 -5
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -2364,6 +2364,7 @@ async function startTunnel(port, config, tunnelOpts) {
|
|
|
2364
2364
|
const maxReconnectAttempts = 10;
|
|
2365
2365
|
let shouldReconnect = true;
|
|
2366
2366
|
let socket = null;
|
|
2367
|
+
let everConnected = false;
|
|
2367
2368
|
let negotiatedWsOpcode = false;
|
|
2368
2369
|
let lockReleased = false;
|
|
2369
2370
|
const releaseLock = () => {
|
|
@@ -2417,7 +2418,19 @@ ${colors.cyan}ConnectBase Tunnel${colors.reset}`);
|
|
|
2417
2418
|
req.on("upgrade", (_res, sock, _head) => {
|
|
2418
2419
|
socket = sock;
|
|
2419
2420
|
reconnectAttempts = 0;
|
|
2421
|
+
everConnected = true;
|
|
2420
2422
|
sock.setNoDelay(true);
|
|
2423
|
+
sock.setKeepAlive(true, 3e4);
|
|
2424
|
+
const idleTimeoutMs = 135e3;
|
|
2425
|
+
let idleTimer = null;
|
|
2426
|
+
const armIdleTimer = () => {
|
|
2427
|
+
if (idleTimer) clearTimeout(idleTimer);
|
|
2428
|
+
idleTimer = setTimeout(() => {
|
|
2429
|
+
warn(`${idleTimeoutMs / 1e3}\uCD08\uAC04 \uC11C\uBC84 \uC218\uC2E0 \uC5C6\uC74C \u2014 \uB04A\uAE34 \uC5F0\uACB0(half-open)\uB85C \uD310\uB2E8\uD558\uACE0 \uC7AC\uC5F0\uACB0\uD569\uB2C8\uB2E4`);
|
|
2430
|
+
sock.destroy();
|
|
2431
|
+
}, idleTimeoutMs);
|
|
2432
|
+
};
|
|
2433
|
+
armIdleTimer();
|
|
2421
2434
|
const parser = new WsFrameParser({
|
|
2422
2435
|
onMessage: (data) => {
|
|
2423
2436
|
try {
|
|
@@ -2446,8 +2459,12 @@ ${colors.cyan}ConnectBase Tunnel${colors.reset}`);
|
|
|
2446
2459
|
sock.write(createWsPongFrame());
|
|
2447
2460
|
}
|
|
2448
2461
|
});
|
|
2449
|
-
sock.on("data", (chunk) =>
|
|
2462
|
+
sock.on("data", (chunk) => {
|
|
2463
|
+
armIdleTimer();
|
|
2464
|
+
parser.feed(chunk);
|
|
2465
|
+
});
|
|
2450
2466
|
sock.on("close", () => {
|
|
2467
|
+
if (idleTimer) clearTimeout(idleTimer);
|
|
2451
2468
|
socket = null;
|
|
2452
2469
|
if (shouldReconnect) {
|
|
2453
2470
|
scheduleReconnect();
|
|
@@ -2455,6 +2472,7 @@ ${colors.cyan}ConnectBase Tunnel${colors.reset}`);
|
|
|
2455
2472
|
});
|
|
2456
2473
|
sock.on("error", (err) => {
|
|
2457
2474
|
warn(`\uC5F0\uACB0 \uC5D0\uB7EC: ${err.message}`);
|
|
2475
|
+
if (idleTimer) clearTimeout(idleTimer);
|
|
2458
2476
|
socket = null;
|
|
2459
2477
|
if (shouldReconnect) {
|
|
2460
2478
|
scheduleReconnect();
|
|
@@ -2507,15 +2525,21 @@ ${colors.cyan}ConnectBase Tunnel${colors.reset}`);
|
|
|
2507
2525
|
});
|
|
2508
2526
|
req.end();
|
|
2509
2527
|
}
|
|
2528
|
+
let reconnectTimer = null;
|
|
2510
2529
|
function scheduleReconnect() {
|
|
2530
|
+
if (reconnectTimer) return;
|
|
2511
2531
|
reconnectAttempts++;
|
|
2512
|
-
if (reconnectAttempts > maxReconnectAttempts) {
|
|
2532
|
+
if (!everConnected && reconnectAttempts > maxReconnectAttempts) {
|
|
2513
2533
|
error("\uCD5C\uB300 \uC7AC\uC5F0\uACB0 \uC2DC\uB3C4 \uD69F\uC218 \uCD08\uACFC");
|
|
2514
2534
|
process.exit(1);
|
|
2515
2535
|
}
|
|
2516
|
-
const delay = Math.min(2e3 * Math.pow(2, reconnectAttempts - 1), 3e4);
|
|
2517
|
-
|
|
2518
|
-
|
|
2536
|
+
const delay = Math.min(2e3 * Math.pow(2, Math.min(reconnectAttempts - 1, 8)), 3e4);
|
|
2537
|
+
const attemptLabel = everConnected ? `\uC2DC\uB3C4 ${reconnectAttempts}` : `${reconnectAttempts}/${maxReconnectAttempts}`;
|
|
2538
|
+
info(`${(delay / 1e3).toFixed(0)}\uCD08 \uD6C4 \uC7AC\uC5F0\uACB0 \uC2DC\uB3C4... (${attemptLabel})`);
|
|
2539
|
+
reconnectTimer = setTimeout(() => {
|
|
2540
|
+
reconnectTimer = null;
|
|
2541
|
+
connect();
|
|
2542
|
+
}, delay);
|
|
2519
2543
|
}
|
|
2520
2544
|
const streams = /* @__PURE__ */ new Map();
|
|
2521
2545
|
const localAgent = new http.Agent({ keepAlive: true, maxSockets: 64 });
|