diff --git a/src/events/ReconnectingWebSocket.js b/src/events/ReconnectingWebSocket.js index d2f3b59..6a2cb20 100644 --- a/src/events/ReconnectingWebSocket.js +++ b/src/events/ReconnectingWebSocket.js @@ -69,6 +69,9 @@ export default class ReconnectingWebSocket extends events.EventEmitter { /** @private */ this._reconnect = reconnect; + /** @private */ + this._reconnecting = false; + debug("attempting initial connection", { url }); this.connect(err => { if (err) { @@ -91,6 +94,7 @@ export default class ReconnectingWebSocket extends events.EventEmitter { */ connect(callback) { const operation = retry.operation(this._retryOptions); + const timeouts = retry.timeouts(this._retryOptions); operation.attempt(attemptNumber => { const numRetries = attemptNumber - 1; @@ -101,6 +105,13 @@ export default class ReconnectingWebSocket extends events.EventEmitter { this._ws.close(); } + if (this._reconnecting) { + this.emit("reconnecting", { + attempts: attemptNumber, + nextTimeout: timeouts[attemptNumber] + }); + } + /** @private */ this._ws = new WebSocket(this._url, this._wsOptions); @@ -112,6 +123,7 @@ export default class ReconnectingWebSocket extends events.EventEmitter { return; } + this._reconnecting = true; if (operation.retry(err)) { return; } @@ -120,11 +132,13 @@ export default class ReconnectingWebSocket extends events.EventEmitter { debug('connection attempts exhaused', { err, reconnect: this._reconnect, numRetries }); + this._reconnecting = false; callback(operation.mainError()); }; this._ws.once("error", handleConnectError); this._ws.once("open", () => { + this._reconnecting = false; debug("connected", { numRetries }); this._ws.removeListener("error", handleConnectError); this._ws.on("message", this.emit.bind(this, "message")); @@ -154,6 +168,7 @@ export default class ReconnectingWebSocket extends events.EventEmitter { this.emit("disconnected", { reason: "error", err }); debug("attempting to reconnect"); + this._reconnecting = true; this.connect(err => { if (err) { this.emit("error", err); @@ -182,6 +197,7 @@ export default class ReconnectingWebSocket extends events.EventEmitter { this.emit("disconnected", { reason: "close", code, message }); debug("attempting to reconnect"); + this._reconnecting = true; this.connect(err => { if (err) { this.emit("error", err);