diff --git a/src/errors.js b/src/errors.js index 3e356f2..2940b14 100644 --- a/src/errors.js +++ b/src/errors.js @@ -8,6 +8,7 @@ var createError = require('errno').create * | +-- ChainRequestError * | +-- ConnectionTimeout * | +-- ElectrumJSError + * | +-- GetHeaderError * | +-- GetTxError * | +-- IdleTimeout * | +-- NotConnectedError diff --git a/src/network/chain.js b/src/network/chain.js index 5626924..5d2d3cd 100644 --- a/src/network/chain.js +++ b/src/network/chain.js @@ -90,6 +90,10 @@ Chain.prototype._doOpen = function () { return self.emit('error', new errors.NotImplementedError(errMsg)) } + if (self.readyState !== self.CLOSED) { + return + } + self._setReadyState(self.CONNECTING) self._autoReconnect = true @@ -164,6 +168,10 @@ Chain.prototype._doOpen = function () { * @see {@link Network#_doClose} */ Chain.prototype._doClose = function () { + if (this.readyState === this.CLOSING || this.readyState === this.CLOSED) { + return + } + this._setReadyState(this.CLOSING) this._ws.onopen = null @@ -198,7 +206,7 @@ Chain.prototype._updateIdleTimeout = function () { self._idleTimeout = setTimeout(function () { if (self.readyState === self.OPEN) { self._ws.close() - self.emit('error', new errors.IdleTimeout('Chain: WebSocket')) + self.emit('error', new errors.IdleTimeout('Chain: WebSocket timeout')) } }, 25000) @@ -333,7 +341,8 @@ Chain.prototype.getHeader = function (height) { } if (response.height !== height) { - throw new errors.GetHeaderError() + var errMsg = 'Chain: requested - ' + height + ', got - ' + response.height + throw new errors.GetHeaderError(errMsg) } yatc.verify('ChainHeader', response) diff --git a/src/network/electrumjs.js b/src/network/electrumjs.js index a562e75..cac65a6 100644 --- a/src/network/electrumjs.js +++ b/src/network/electrumjs.js @@ -54,12 +54,12 @@ function ElectrumJS(opts) { self._socket.on('connect_error', function () { self._setReadyState(self.CLOSED) - self.emit('error', new errors.ConnectionTimeout('ElectrumJS')) + self.emit('error', new errors.ConnectionTimeout('ElectrumJS: connect_error')) }) self._socket.on('connect_timeout', function () { self._setReadyState(self.CLOSED) - self.emit('error', new errors.ConnectionTimeout('ElectrumJS')) + self.emit('error', new errors.ConnectionTimeout('ElectrumJS: connect_timeout')) }) self._socket.on('disconnect', function (reason) { @@ -150,6 +150,10 @@ inherits(ElectrumJS, Network) * @see {@link Network#_doOpen} */ ElectrumJS.prototype._doOpen = function () { + if (this.readyState !== this.CLOSED) { + return + } + this._setReadyState(this.CONNECTING) this._socket.connect() } @@ -160,6 +164,10 @@ ElectrumJS.prototype._doOpen = function () { * @see {@link Network#_doClose} */ ElectrumJS.prototype._doClose = function () { + if (this.readyState === this.CLOSING || this.readyState === this.CLOSED) { + return + } + this._setReadyState(this.CLOSING) this._socket.disconnect() } @@ -248,7 +256,8 @@ ElectrumJS.prototype.getHeader = function (height) { } if (response.block_height !== height) { - throw new errors.GetHeaderError() + var errMsg = 'Chain: requested - ' + height + ', got - ' + response.block_height + throw new errors.GetHeaderError(errMsg) } yatc.verify('ElectrumHeader', response)