WebSocketProvider.disconnect() should have an option to wait until _pendingRequestsQueue/_sentRequestsQueue are empty. If this is not possible, WebSocketProvider could export public field (requestQueueSize?) to check current queue size. This would allow us to wait until all requests are completed on user side.
Actual behavior
ConnectionNotOpenError is thrown, some request may not be sent to the ledger node. Current behavior is problematic when there are many web3js requests sent asynchronously from different parts of an app (for instance from async callbacks, which can be hard to track). This happened in one of https://github.com/hyperledger/cacti CI tests.
node_modules/web3-providers-ws/node_modules/web3-utils/lib/commonjs/socket_provider.js:299
request.deferredPromise.reject(new web3_errors_1.ConnectionNotOpenError(event));
^
ConnectionNotOpenError: Connection not open
at /home/vagrant/cactus/packages/cactus-plugin-ledger-connector-ethereum/node_modules/web3-providers-ws/node_modules/web3-utils/lib/commonjs/socket_provider.js:299:48
at Map.forEach (<anonymous>)
at WebSocketProvider._clearQueues (/home/vagrant/cactus/packages/cactus-plugin-ledger-connector-ethereum/node_modules/web3-providers-ws/node_modules/web3-utils/lib/commonjs/socket_provider.js:297:37)
at WebSocketProvider._onCloseEvent (/home/vagrant/cactus/packages/cactus-plugin-ledger-connector-ethereum/node_modules/web3-providers-ws/lib/commonjs/index.js:133:14)
at WebSocket.<anonymous> (/home/vagrant/cactus/packages/cactus-plugin-ledger-connector-ethereum/node_modules/web3-providers-ws/lib/commonjs/index.js:116:115)
at callListener (/home/vagrant/cactus/packages/cactus-plugin-ledger-connector-ethereum/node_modules/ws/lib/event-target.js:290:14)
at WebSocket.onClose (/home/vagrant/cactus/packages/cactus-plugin-ledger-connector-ethereum/node_modules/ws/lib/event-target.js:220:9)
at WebSocket.emit (node:events:513:28)
at WebSocket.emitClose (/home/vagrant/cactus/packages/cactus-plugin-ledger-connector-ethereum/node_modules/ws/lib/websocket.js:258:10)
at Socket.socketOnClose (/home/vagrant/cactus/packages/cactus-plugin-ledger-connector-ethereum/node_modules/ws/lib/websocket.js:1264:15)
Emitted 'error' event at:
at /home/vagrant/cactus/packages/cactus-plugin-ledger-connector-ethereum/node_modules/web3-providers-ws/node_modules/web3-utils/lib/commonjs/socket_provider.js:223:36
at processTicksAndRejections (node:internal/process/task_queues:96:5) {
innerError: undefined,
code: 503,
errorCode: 1000,
errorReason: ''
}
Expected behavior
WebSocketProvider.disconnect()
should have an option to wait until_pendingRequestsQueue
/_sentRequestsQueue
are empty. If this is not possible,WebSocketProvider
could export public field (requestQueueSize
?) to check current queue size. This would allow us to wait until all requests are completed on user side.Actual behavior
ConnectionNotOpenError
is thrown, some request may not be sent to the ledger node. Current behavior is problematic when there are many web3js requests sent asynchronously from different parts of an app (for instance from async callbacks, which can be hard to track). This happened in one of https://github.com/hyperledger/cacti CI tests.Steps to reproduce the behavior
./geth --dev --ws --ws.addr 0.0.0.0 --ws.port 8546 --ws.origins "*" --dev.period 1
newBlockHeaders
monitor, unsubscribes from it and immediately disconnects WS provider.Logs
Exception
Request on queue
Environment