Skip to content
This repository was archived by the owner on Mar 5, 2025. It is now read-only.

Websocket provider reconnecting timeout and reconnection event added #2994

Merged
merged 4 commits into from
Aug 2, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Provider timeout fixed and Maps are used now to handle subscriptions (#2955)
- stripHexPrefix fixed (#2989)
- BatchRequest error handling fixed for callbacks (#2993)
- ``reconnected`` event and reconnection timeout option added to WebsocketProvider (#2994)
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ export default class ProvidersModuleFactory {
connection = new window.WebSocket(url, options.protocol);
}

return new WebsocketProvider(connection, options.timeout);
return new WebsocketProvider(connection, options.timeout, options.reconnectionTimeout);
}

/**
Expand Down
28 changes: 24 additions & 4 deletions packages/web3-providers/src/providers/WebsocketProvider.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,31 @@ import isArray from 'lodash/isArray';
export default class WebsocketProvider extends AbstractSocketProvider {
/**
* @param {WebSocket} connection
* @param {Number} timeout
* @param {Number} responseTimeout
* @param {Number} reconnectionTimeout
*
* @constructor
*/
constructor(connection, timeout) {
super(connection, timeout);
constructor(connection, responseTimeout, reconnectionTimeout = 5000) {
super(connection, responseTimeout);
this.host = this.connection.url;
this.reconnectionTimeout = reconnectionTimeout;
this.reconnecting = false;
}

/**
* Emits the connect event and checks if there are subscriptions defined that should be resubscribed.
*
* @method onConnect
*/
async onConnect() {
if (this.reconnecting) {
this.emit('reconnected');
}

await super.onConnect()

this.reconnecting = false;
}

/**
Expand Down Expand Up @@ -86,6 +104,8 @@ export default class WebsocketProvider extends AbstractSocketProvider {
* @method reconnect
*/
reconnect() {
this.reconnecting = true;

setTimeout(() => {
this.removeAllSocketListeners();

Expand All @@ -106,7 +126,7 @@ export default class WebsocketProvider extends AbstractSocketProvider {

this.connection = connection;
this.registerEventListeners();
}, 5000);
}, this.reconnectionTimeout);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ describe('WebsocketProviderTest', () => {
socketMock.addEventListener = jest.fn();
socketMock.removeEventListener = jest.fn();

websocketProvider = new WebsocketProvider(socketMock, 1);
websocketProvider = new WebsocketProvider(socketMock, 1, 1);
});

it('constructor check', () => {
Expand All @@ -22,6 +22,8 @@ describe('WebsocketProviderTest', () => {
expect(websocketProvider.connection).toEqual(socketMock);

expect(websocketProvider.timeout).toEqual(1);

expect(websocketProvider.reconnectionTimeout).toEqual(1);

expect(socketMock.addEventListener.mock.calls[0][0]).toEqual('message');
expect(socketMock.addEventListener.mock.calls[0][1]).toBeInstanceOf(Function);
Expand Down Expand Up @@ -445,4 +447,14 @@ describe('WebsocketProviderTest', () => {

expect(websocketProvider.listenerCount('connect')).toEqual(0);
});

it('calls onConnect after the connection got lost', (done) => {
websocketProvider.on('reconnected', () => {

done();
});

websocketProvider.reconnecting = true;
websocketProvider.onConnect();
});
});