lib/client: don't throttle reconnections if opened long ago

If a connection was opened a long time ago, and recently got broken,
try to reconnect immediately.
This commit is contained in:
Simon Ser 2024-11-09 02:53:52 +01:00
parent 414d93ebab
commit 721ae1d2ae

View file

@ -74,8 +74,8 @@ class IRCError extends Error {
class Backoff { class Backoff {
n = 0; n = 0;
constructor(min, max) { constructor(base, max) {
this.min = min; this.base = base;
this.max = max; this.max = max;
} }
@ -86,10 +86,10 @@ class Backoff {
next() { next() {
if (this.n === 0) { if (this.n === 0) {
this.n = 1; this.n = 1;
return this.min; return 0;
} }
let dur = this.n * this.min; let dur = this.n * this.base;
if (dur > this.max) { if (dur > this.max) {
dur = this.max; dur = this.max;
} else { } else {
@ -134,6 +134,7 @@ export default class Client extends EventTarget {
autoReconnect = true; autoReconnect = true;
reconnectTimeoutID = null; reconnectTimeoutID = null;
reconnectBackoff = new Backoff(RECONNECT_MIN_DELAY_MSEC, RECONNECT_MAX_DELAY_MSEC); reconnectBackoff = new Backoff(RECONNECT_MIN_DELAY_MSEC, RECONNECT_MAX_DELAY_MSEC);
lastReconnectDate = new Date(0);
pingIntervalID = null; pingIntervalID = null;
pendingCmds = { pendingCmds = {
WHO: Promise.resolve(null), WHO: Promise.resolve(null),
@ -159,6 +160,7 @@ export default class Client extends EventTarget {
console.log("Connecting to " + this.params.url); console.log("Connecting to " + this.params.url);
this.setStatus(Client.Status.CONNECTING); this.setStatus(Client.Status.CONNECTING);
this.lastReconnectDate = new Date();
try { try {
this.ws = new WebSocket(this.params.url); this.ws = new WebSocket(this.params.url);
@ -207,6 +209,10 @@ export default class Client extends EventTarget {
console.info("Waiting for network to go back online"); console.info("Waiting for network to go back online");
} else { } else {
let delay = this.reconnectBackoff.next(); let delay = this.reconnectBackoff.next();
let sinceLastReconnect = new Date().getTime() - this.lastReconnectDate.getTime();
if (sinceLastReconnect < RECONNECT_MIN_DELAY_MSEC) {
delay = Math.max(delay, RECONNECT_MIN_DELAY_MSEC);
}
console.info("Reconnecting to server in " + (delay / 1000) + " seconds"); console.info("Reconnecting to server in " + (delay / 1000) + " seconds");
clearTimeout(this.reconnectTimeoutID); clearTimeout(this.reconnectTimeoutID);
this.reconnectTimeoutID = setTimeout(() => { this.reconnectTimeoutID = setTimeout(() => {