From ab9d1936d95ee6563613961ed98c77b42ac14f47 Mon Sep 17 00:00:00 2001 From: Ivan Tivonenko Date: Fri, 15 Jan 2016 07:26:11 +0200 Subject: [PATCH] fix reconnect error - in case of connection was unexpectedly closed before it was open, resolve first promise that was returned from call to connect --- npm-shrinkwrap.json | 64 +++++++--------------------------------- src/common/connection.js | 15 ++++++++-- 2 files changed, 22 insertions(+), 57 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 82eac2af..d8641ef5 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -56,28 +56,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.1.2.tgz" }, - "create-hash": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.2.tgz", - "dependencies": { - "cipher-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz" - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, - "ripemd160": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-1.0.1.tgz" - }, - "sha.js": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.4.tgz" - } - } - }, "https-proxy-agent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", @@ -108,34 +86,6 @@ } } }, - "is-my-json-valid": { - "version": "2.12.3", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.3.tgz", - "dependencies": { - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "dependencies": { - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" - } - } - }, - "jsonpointer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz" - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" - } - } - }, "jayson": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jayson/-/jayson-1.2.2.tgz", @@ -178,10 +128,6 @@ "version": "3.10.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz" }, - "lru-cache": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.0.tgz" - }, "ripple-address-codec": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-2.0.1.tgz", @@ -244,6 +190,16 @@ "version": "0.10.0", "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-0.10.0.tgz", "dependencies": { + "babel-runtime": { + "version": "5.8.34", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.34.tgz", + "dependencies": { + "core-js": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.6.tgz" + } + } + }, "bn.js": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-3.3.0.tgz" diff --git a/src/common/connection.js b/src/common/connection.js index ae4bd61d..5d4c3024 100644 --- a/src/common/connection.js +++ b/src/common/connection.js @@ -96,13 +96,17 @@ class Connection extends EventEmitter { return this._state === WebSocket.OPEN && this._isReady; } - _onUnexpectedClose() { + _onUnexpectedClose(resolve = function() {}, reject = function() {}) { this._ws = null; this._isReady = false; - this.connect().then(); + this.connect().then(resolve, reject); } _onOpen() { + this._ws.removeListener('close', this._onUnexpectedCloseBound); + this._onUnexpectedCloseBound = this._onUnexpectedClose.bind(this); + this._ws.once('close', this._onUnexpectedCloseBound); + const request = { command: 'subscribe', streams: ['ledger'] @@ -176,7 +180,12 @@ class Connection extends EventEmitter { this._ws.on('error', error => this.emit('error', 'websocket', error.messsage, error)); this._ws.on('message', this._onMessage.bind(this)); - this._onUnexpectedCloseBound = this._onUnexpectedClose.bind(this); + // in browser close event can came before open event, so we must + // resolve connect's promise after reconnect in that case. + // after open event we will rebound _onUnexpectedCloseBound + // without resolve and reject functions + this._onUnexpectedCloseBound = this._onUnexpectedClose.bind(this, + resolve, reject); this._ws.once('close', this._onUnexpectedCloseBound); this._ws.once('open', () => this._onOpen().then(resolve, reject)); }