diff --git a/packages/web3-providers-ipc/CHANGELOG.md b/packages/web3-providers-ipc/CHANGELOG.md index 081feaee086..8fc671b4a20 100644 --- a/packages/web3-providers-ipc/CHANGELOG.md +++ b/packages/web3-providers-ipc/CHANGELOG.md @@ -129,4 +129,8 @@ Documentation: - Dependencies updated -## [Unreleased] \ No newline at end of file +## [Unreleased] + +### Fixed + +- Fixed bug in chunks processing logic (#6496) \ No newline at end of file diff --git a/packages/web3-providers-ws/CHANGELOG.md b/packages/web3-providers-ws/CHANGELOG.md index 8561e087f59..f3eaafc94ee 100644 --- a/packages/web3-providers-ws/CHANGELOG.md +++ b/packages/web3-providers-ws/CHANGELOG.md @@ -123,4 +123,8 @@ Documentation: - Dependencies updated -## [Unreleased] \ No newline at end of file +## [Unreleased] + +### Fixed + +- Fixed bug in chunks processing logic (#6496) \ No newline at end of file diff --git a/packages/web3-providers-ws/test/integration/ganache_fault_tolerance.test.ts b/packages/web3-providers-ws/test/integration/ganache_fault_tolerance.test.ts index bd584667800..4a0ba982996 100644 --- a/packages/web3-providers-ws/test/integration/ganache_fault_tolerance.test.ts +++ b/packages/web3-providers-ws/test/integration/ganache_fault_tolerance.test.ts @@ -25,11 +25,12 @@ import { waitForEvent, describeIf, getSystemTestBackend, + isWs, } from '../fixtures/system_test_utils'; import WebSocketProvider from '../../src/index'; // create helper functions to open server -describeIf(getSystemTestBackend() === 'ganache')('ganache tests', () => { +describeIf(getSystemTestBackend() === 'ganache' && isWs)('ganache tests', () => { describe('WebSocketProvider - ganache', () => { jest.setTimeout(17000); const port = 7547; @@ -232,26 +233,21 @@ describeIf(getSystemTestBackend() === 'ganache')('ganache tests', () => { const webSocketProvider = new WebSocketProvider(host, {}, reconnectionOptions); await waitForSocketConnect(webSocketProvider); + webSocketProvider.on('error', (err: any) => { + if (err.message === `Maximum number of reconnect attempts reached! (${1})`) { + mockCallBack(); + } + }); + await server.close(); - const errorPromise = new Promise(resolve => { - webSocketProvider.on('error', (err: any) => { - if (err.message === `Maximum number of reconnect attempts reached! (${1})`) { - mockCallBack(); - resolve(true); - } - }); - }); - // send an event to be parsed and fail - const event = { - data: 'abc|--|ded', - type: 'websocket', - // @ts-expect-error run protected method - target: webSocketProvider._socketConnection, - }; - // @ts-expect-error run protected method - webSocketProvider._onMessage(event); - await errorPromise; + // when server is not listening send request, and expect that lib will try to reconnect and at end will throw con not open error + await expect( + webSocketProvider.request( + {"method":"eth_getBlockByNumber","params":["0xc5043f",false],"id":1,"jsonrpc":"2.0"} + )) + .rejects.toThrow(ConnectionNotOpenError); + expect(mockCallBack).toHaveBeenCalled(); }); diff --git a/packages/web3-utils/CHANGELOG.md b/packages/web3-utils/CHANGELOG.md index c46f98df69f..ca3aa5b9a3d 100644 --- a/packages/web3-utils/CHANGELOG.md +++ b/packages/web3-utils/CHANGELOG.md @@ -162,5 +162,9 @@ Documentation: ### Added -- As a replacement of the node EventEmitter, a custom `EventEmitter` has been implemented and exported. (#6398) +- As a replacment of the node EventEmitter, a custom `EventEmitter` has been implemented and exported. (#6398) + +### Fixed + - Fix issue with default config with babel (and React): "TypeError: Cannot convert a BigInt value to a number #6187" (#6506) +- Fixed bug in chunks processing logic (#6496) diff --git a/packages/web3-utils/src/socket_provider.ts b/packages/web3-utils/src/socket_provider.ts index b8124b18ed6..380c230bd72 100644 --- a/packages/web3-utils/src/socket_provider.ts +++ b/packages/web3-utils/src/socket_provider.ts @@ -465,13 +465,10 @@ export abstract class SocketProvider< protected _onMessage(event: MessageEvent): void { const responses = this._parseResponses(event); - if (responses.length === 0) { - // no responses means lost connection, autoreconnect if possible - if (this._reconnectOptions.autoReconnect) { - this._reconnect(); - } + if (isNullish(responses) || responses.length === 0) { return; } + for (const response of responses) { if ( jsonRpc.isResponseWithNotification(response as JsonRpcNotification) && diff --git a/packages/web3-utils/test/unit/socket_provider.test.ts b/packages/web3-utils/test/unit/socket_provider.test.ts index d50f9aaffac..9c20df7fdd3 100644 --- a/packages/web3-utils/test/unit/socket_provider.test.ts +++ b/packages/web3-utils/test/unit/socket_provider.test.ts @@ -85,14 +85,14 @@ describe('SocketProvider', () => { // @ts-expect-error run protected method expect(provider._reconnect).not.toHaveBeenCalled(); }); - it('should be called when { autoReconnect: true }', () => { + it('should not call _reconnect with empty response when { autoReconnect: true }', () => { const reconnectOptions = { autoReconnect: true }; const provider = new TestProvider(socketPath, socketOption, reconnectOptions); // @ts-expect-error run protected method jest.spyOn(provider, '_reconnect').mockReturnValue(''); provider.message(''); // @ts-expect-error run protected method - expect(provider._reconnect).toHaveBeenCalled(); + expect(provider._reconnect).not.toHaveBeenCalled(); }); });