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.
Files changed (2) hide show
  1. package/dist/cli.js +29 -5
  2. 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) => parser.feed(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
- info(`${(delay / 1e3).toFixed(0)}\uCD08 \uD6C4 \uC7AC\uC5F0\uACB0 \uC2DC\uB3C4... (${reconnectAttempts}/${maxReconnectAttempts})`);
2518
- setTimeout(connect, delay);
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 });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "connectbase-client",
3
- "version": "3.48.0",
3
+ "version": "3.48.1",
4
4
  "description": "Connect Base JavaScript/TypeScript SDK for browser and Node.js",
5
5
  "repository": {
6
6
  "type": "git",