UNPKG

tunnelmole

Version:

Tunnelmole, an open source ngrok alternative. Instant public URLs for any http/https based application. Available as a command line application or as an NPM dependency for your code. Stable and maintained. Good test coverage. Works behind firewalls

49 lines 1.9 kB
/* * Handle automatic reconnection if a custom subdomain is used. Use a delay with exponential backoff. */ import log from "../logging/log.js"; import { connect } from "./connect.js"; let reconnectAttempts = 0; let isReconnecting = false; const maxReconnectDelay = 30000; // Maximum delay of 30 seconds const baseReconnectDelay = 1000; // Start with 1 second // Every 6 hours, reset reconnectAttempts. This should keep reconnections fast for long lived connections. let resetConnnectionAttemptsInterval; const resetTheConnectionAttemptsInterval = () => { resetConnnectionAttemptsInterval = setInterval(() => { reconnectAttempts = 0; }, 21600000); }; const attemptReconnection = async (options) => { if (isReconnecting) return; isReconnecting = true; reconnectAttempts++; const reconnectDelay = Math.min(baseReconnectDelay * Math.pow(2, reconnectAttempts - 1), maxReconnectDelay); setTimeout(async () => { log("Got disconnected, attempting to reconnect...", "warning"); try { const newWebsocket = await connect(options); isReconnecting = false; setUpAutoReconnect(options, newWebsocket); } catch (error) { log("Reconnection attempt failed.", "error"); isReconnecting = false; attemptReconnection(options); } }, reconnectDelay); }; const setUpAutoReconnect = async (options, websocket) => { // We can only reliably reconnect custom subdomains. Otherwise you'd get another random subdomain on reconnection if (typeof options.domain !== 'string') { return; } // Set up the websocket connection to auto reconnect websocket.on('close', () => { attemptReconnection(options); }); resetTheConnectionAttemptsInterval(); }; export { setUpAutoReconnect }; //# sourceMappingURL=setup-auto-reconnect.js.map