diff --git a/packages/web3-providers/lib/providers/AbstractSocketProvider.js b/packages/web3-providers/lib/providers/AbstractSocketProvider.js index d166c8f42fd..46c71340a57 100644 --- a/packages/web3-providers/lib/providers/AbstractSocketProvider.js +++ b/packages/web3-providers/lib/providers/AbstractSocketProvider.js @@ -13,7 +13,7 @@ */ /** * @file AbstractSocketProvider - * @author Samuel Furter , Fabian Vogelsteller + * @author Samuel Furter * @date 2018 */ @@ -192,7 +192,7 @@ export default class AbstractSocketProvider extends EventEmitter { delete this.subscriptions[subscriptionId]; - this.subscriptions[this.getSubscriptionEvent(this.subscriptions[key].id)].id = subscriptionId; + this.subscriptions[key].id = subscriptionId; } } diff --git a/packages/web3-providers/src/factories/ProvidersModuleFactory.js b/packages/web3-providers/src/factories/ProvidersModuleFactory.js index 565ae23f764..55bb6e56592 100644 --- a/packages/web3-providers/src/factories/ProvidersModuleFactory.js +++ b/packages/web3-providers/src/factories/ProvidersModuleFactory.js @@ -125,17 +125,12 @@ export default class ProvidersModuleFactory { // runtime is of type node if (typeof process !== 'undefined' && process.versions != null && process.versions.node != null) { - let authToken; - let headers = options.headers || {}; - const urlObject = new URL(url); - if (urlObject.username && urlObject.password) { - authToken = Buffer.from(`${urlObject.username}:${urlObject.password}`).toString('base64'); + if (!headers.authorization && urlObject.username && urlObject.password) { + const authToken = Buffer.from(`${urlObject.username}:${urlObject.password}`).toString('base64'); headers.authorization = `Basic ${authToken}`; - } else if (urlObject.auth) { - headers.authorization = Buffer.from(urlObject.auth, 'base64'); } connection = new W3CWebsocket(url, options.protocol, null, headers, null, options.clientConfig); diff --git a/packages/web3-providers/src/providers/WebsocketProvider.js b/packages/web3-providers/src/providers/WebsocketProvider.js index 94d724f64cb..ed415ac0a39 100644 --- a/packages/web3-providers/src/providers/WebsocketProvider.js +++ b/packages/web3-providers/src/providers/WebsocketProvider.js @@ -71,7 +71,7 @@ export default class WebsocketProvider extends AbstractSocketProvider { * @param {CloseEvent} closeEvent */ onClose(closeEvent) { - if (closeEvent.code !== 1000) { + if (closeEvent.code !== 1000 || closeEvent.wasClean === false) { this.reconnect(); return; @@ -101,8 +101,7 @@ export default class WebsocketProvider extends AbstractSocketProvider { this.connection._client.config ); } else { - const protocol = this.connection.protocol || undefined; - connection = new this.connection.constructor(this.host, protocol); + connection = new this.connection.constructor(this.host, this.connection.protocol || undefined); } this.connection = connection; diff --git a/packages/web3-providers/tests/src/providers/WebsocketProviderTest.js b/packages/web3-providers/tests/src/providers/WebsocketProviderTest.js index 0588808385c..dfc72142193 100644 --- a/packages/web3-providers/tests/src/providers/WebsocketProviderTest.js +++ b/packages/web3-providers/tests/src/providers/WebsocketProviderTest.js @@ -143,6 +143,43 @@ describe('WebsocketProviderTest', () => { 5020 ); + it( + 'calls onClose with wasClean false', + (done) => { + const event = {code: 1000, wasClean: false}; + + setTimeout(() => { + expect(socketMock.addEventListener.mock.calls[0][0]).toEqual('message'); + expect(socketMock.addEventListener.mock.calls[0][1]).toBeInstanceOf(Function); + + expect(socketMock.addEventListener.mock.calls[1][0]).toEqual('open'); + expect(socketMock.addEventListener.mock.calls[1][1]).toBeInstanceOf(Function); + + expect(socketMock.addEventListener.mock.calls[2][0]).toEqual('open'); + expect(socketMock.addEventListener.mock.calls[2][1]).toBeInstanceOf(Function); + + expect(socketMock.addEventListener.mock.calls[3][0]).toEqual('close'); + expect(socketMock.addEventListener.mock.calls[3][1]).toBeInstanceOf(Function); + + expect(socketMock.addEventListener.mock.calls[4][0]).toEqual('error'); + expect(socketMock.addEventListener.mock.calls[4][1]).toBeInstanceOf(Function); + + expect(socketMock.host).toEqual('host'); + + expect(socketMock.protocol).toEqual('protocol'); + + expect(socketMock.removeEventListener).toHaveBeenCalled(); + + expect(websocketProvider.connection).toBeInstanceOf(Websocket); + + done(); + }, 5010); + + websocketProvider.onClose(event); + }, + 5020 + ); + it( 'calls reconnect with an WebSocket connection', (done) => {