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

Commit fef67cc

Browse files
Alexavkosspacesailor24
authored
5066 - fault tolerance websocket integration tests (#5876)
* add ganache tests * update ganache tests * update tests * updating tests * update tests * update changelog for past issue * remove settimeouts * update * delete unneccesary files * debug * debuggin * update * update tests * updating tests * fix lint errors * fix test * unskip test * update onmessage * update mock unit test * refactor tests * fix int test * fix up integration tests * update * remove unneccesary comment * update docs and changelog * address feedback * update provider tests * add conditional * address feedback * address feedback * add deferredPromise catch and tests * create mock method for ipc unit test --------- Co-authored-by: Oleksii Kosynskyi <oleksii.kosynskyi@gmail.com> Co-authored-by: Wyatt Barnes <me@wyatt.email>
1 parent 3359773 commit fef67cc

File tree

14 files changed

+544
-49
lines changed

14 files changed

+544
-49
lines changed

docs/docs/guides/web3_migration_guide/providers_migration_guide.md

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,35 @@ const provider = new WebSocketProvider(
199199
);
200200
```
201201

202+
#### Legacy Event `close` has been deprecated
203+
204+
Following EIP-1193, the `close` event has been deprecated and is superceded by `disconnect`.
205+
In 1.x, we listen for a `close` event:
206+
207+
```ts
208+
const provider = new WebSocketProvider(host + port);
209+
// we would use close to listen to the disconnect function
210+
provider.on('close', function (err) {
211+
console.log('closed');
212+
resolve();
213+
});
214+
provider.disconnect(1012);
215+
// would eventually log closed
216+
```
217+
218+
In 4.x, we listen for a `disconnect` event:
219+
220+
```ts
221+
const provider = new WebSocketProvider(host + port);
222+
// we would use disconnect to listen to the disconnect function
223+
provider.on('disconnect', function (err) {
224+
console.log('closed');
225+
resolve();
226+
});
227+
provider.disconnect(1012);
228+
// would eventually log 'closed'
229+
```
230+
202231
#### IpcProvider
203232

204233
The IPC provider is used in node.js dapps when running a local node. And it provide the most secure connection.
@@ -313,3 +342,32 @@ provider.on('error', error => {
313342
}
314343
});
315344
```
345+
346+
#### Legacy Event `close` has been deprecated
347+
348+
Following EIP-1193, the `close` event has been deprecated and is superceded by `disconnect`.
349+
In 1.x, we listen for a `close` event:
350+
351+
```ts
352+
const provider = new IpcProvider(host + port);
353+
// we would use close to listen to the disconnect function
354+
provider.on('close', function (err) {
355+
console.log('closed');
356+
resolve();
357+
});
358+
provider.disconnect(1012);
359+
// would eventually log closed
360+
```
361+
362+
In 4.x, we listen for a `disconnect` event:
363+
364+
```ts
365+
const provider = new IpcProvider(host + port);
366+
// we would use disconnect to listen to the disconnect function
367+
provider.on('disconnect', function (err) {
368+
console.log('closed');
369+
resolve();
370+
});
371+
provider.disconnect(1012);
372+
// would eventually log 'closed'
373+
```

packages/web3-providers-ipc/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
5959

6060
- `tsc` compiled files moved to `lib/` directory from `dist/` (#5739)
6161
- Refactor to use common SocketProvider class (#5683)
62+
- Legacy Event `close` has been deprecated, superseded by `disconnect` (#5683)
6263

6364
## [4.0.1-alpha.5]
6465

packages/web3-providers-ipc/src/index.ts

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -129,20 +129,7 @@ export default class IpcProvider<API extends Web3APISpec = EthExecutionAPI> exte
129129
this._socketConnection?.on('connect', this._onOpenHandler);
130130
this._socketConnection?.on('close', this._onClose.bind(this));
131131
this._socketConnection?.on('end', this._onCloseHandler);
132-
let errorListeners: unknown[] | undefined;
133-
try {
134-
errorListeners = (this._socketConnection as Socket)?.listeners('error');
135-
} catch (error) {
136-
// At some cases (at GitHub pipeline) there is an error raised when trying to access the listeners
137-
// However, no need to do take any specific action in this case beside try adding the event listener for `error`
138-
this._socketConnection?.on('error', this._onErrorHandler);
139-
return;
140-
}
141-
// The error event listener may be already there because we do not remove it like the others
142-
// So we add it only if it was not already added
143-
if (!errorListeners || errorListeners.length === 0) {
144-
this._socketConnection?.on('error', this._onErrorHandler);
145-
}
132+
this._socketConnection?.on('error', this._onErrorHandler);
146133
}
147134

148135
protected _removeSocketListeners(): void {
@@ -163,6 +150,8 @@ export default class IpcProvider<API extends Web3APISpec = EthExecutionAPI> exte
163150
this._clearQueues(event);
164151
this._removeSocketListeners();
165152
this._onDisconnect(event?.code, event?.reason);
153+
// disconnect was successful and can safely remove error listener
154+
this._socketConnection?.removeAllListeners('error');
166155
}
167156

168157
protected _onClose(event: CloseEvent): void {

packages/web3-providers-ipc/test/unit/check_implementation.test.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,9 @@ describe('IPCProvider', () => {
150150
it('listeners', () => {
151151
const ipc = new IpcProvider(socketPath, undefined, { autoReconnect: false });
152152
// @ts-expect-error mock method
153-
ipc.chunkResponseParser.parseResponse = jest.fn();
153+
ipc.chunkResponseParser.parseResponse = jest.fn(() => {
154+
return [];
155+
});
154156
// @ts-expect-error mock method
155157
ipc._socketConnection.listeners = () => {
156158
throw new Error('error');
@@ -170,7 +172,8 @@ describe('IPCProvider', () => {
170172
ipc.isReconnecting = true;
171173
// @ts-expect-error mock method
172174
ipc._reconnect = jest.fn();
173-
175+
// @ts-expect-error mock method
176+
ipc._clearQueues = jest.fn();
174177
// @ts-expect-error mock method
175178
ipc._addSocketListeners();
176179
// @ts-expect-error mock method

packages/web3-providers-ws/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
5353

5454
- `main` and `files` entries in `package.json` changed to `lib/` directory from `dist/` (#5739)
5555
- Refactor to use common SocketProvider class (#5683)
56+
- Legacy Event `close` has been deprecated, superseded by `disconnect` (#5683)
5657

5758
## [4.0.1-alpha.5]
5859

packages/web3-providers-ws/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
"eslint-config-web3-base": "0.1.0",
4242
"eslint-plugin-import": "^2.26.0",
4343
"express": "^4.18.1",
44+
"ganache": "^7.7.6",
4445
"http-proxy-middleware": "^2.0.6",
4546
"jest": "^28.1.3",
4647
"jest-extended": "^3.0.1",

packages/web3-providers-ws/src/index.ts

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -139,23 +139,10 @@ export default class WebSocketProvider<
139139
}
140140

141141
protected _addSocketListeners(): void {
142-
this._socketConnection?.addEventListener('message', this._onMessageHandler);
143142
this._socketConnection?.addEventListener('open', this._onOpenHandler);
143+
this._socketConnection?.addEventListener('message', this._onMessageHandler);
144144
this._socketConnection?.addEventListener('close', e => this._onCloseHandler(e));
145-
let errorListeners: unknown[] | undefined;
146-
try {
147-
errorListeners = this._socketConnection?.listeners('error');
148-
} catch (error) {
149-
// At some cases (at GitHub pipeline) there is an error raised when trying to access the listeners
150-
// However, no need to do take any specific action in this case beside try adding the event listener for `error`
151-
this._socketConnection?.addEventListener('error', this._onErrorHandler);
152-
return;
153-
}
154-
// The error event listener may be already there because we do not remove it like the others
155-
// So we add it only if it was not already added
156-
if (!errorListeners || errorListeners.length === 0) {
157-
this._socketConnection?.addEventListener('error', this._onErrorHandler);
158-
}
145+
this._socketConnection?.addEventListener('error', this._onErrorHandler);
159146
}
160147

161148
protected _removeSocketListeners(): void {
@@ -173,10 +160,11 @@ export default class WebSocketProvider<
173160
this._reconnect();
174161
return;
175162
}
176-
177163
this._clearQueues(event);
178164
this._removeSocketListeners();
179165
this._onDisconnect(event.code, event.reason);
166+
// disconnect was successful and can safely remove error listener
167+
this._socketConnection?.removeEventListener('error', this._onErrorHandler);
180168
}
181169
}
182170

0 commit comments

Comments
 (0)