diff --git a/src/server/tunnels.ts b/src/server/tunnels.ts index 4c1cebc..5419e57 100644 --- a/src/server/tunnels.ts +++ b/src/server/tunnels.ts @@ -146,18 +146,19 @@ export function renameTunnelConfig(oldName: string, newName: string) { saveConfig(config) } -function cancelReconnect(appName: string) { +function cancelReconnect(appName: string, resetAttempts = true) { const timer = _reconnectTimers.get(appName) if (timer) { clearTimeout(timer) _reconnectTimers.delete(appName) } - _reconnectAttempts.delete(appName) + if (resetAttempts) _reconnectAttempts.delete(appName) } -function openTunnel(appName: string, port: number, subdomain?: string) { +function openTunnel(appName: string, port: number, subdomain?: string, isReconnect = false) { // Cancel any pending reconnect timer to prevent duplicate loops - cancelReconnect(appName) + // but preserve attempts counter during reconnection so backoff works + cancelReconnect(appName, !isReconnect) // Close existing tunnel if any const existing = _tunnels.get(appName) @@ -232,7 +233,7 @@ function openTunnel(appName: string, port: number, subdomain?: string) { const config = loadConfig() if (!config[appName]) return hostLog(`Tunnel reconnecting: ${appName}`) - openTunnel(appName, port, config[appName]?.subdomain) + openTunnel(appName, port, config[appName]?.subdomain, true) }, delay) _reconnectTimers.set(appName, timer)