force recreation of websocket connection when a ws connection is manually closed
This commit is contained in:
parent
aa4220407b
commit
d3653d7ea5
@ -125,30 +125,16 @@ const readMessage = (provider, buf, emitSynced) => {
|
||||
}
|
||||
|
||||
/**
|
||||
* Outsource this function so that a new websocket connection is created immediately.
|
||||
* I suspect that the `ws.onclose` event is not always fired if there are network issues.
|
||||
*
|
||||
* @param {WebsocketProvider} provider
|
||||
* @param {WebSocket} ws
|
||||
*/
|
||||
const setupWS = (provider) => {
|
||||
if (provider.shouldConnect && provider.ws === null) {
|
||||
const websocket = new provider._WS(provider.url, provider.protocols)
|
||||
websocket.binaryType = 'arraybuffer'
|
||||
provider.ws = websocket
|
||||
provider.wsconnecting = true
|
||||
provider.wsconnected = false
|
||||
provider.synced = false
|
||||
|
||||
websocket.onmessage = (event) => {
|
||||
provider.wsLastMessageReceived = time.getUnixTime()
|
||||
const encoder = readMessage(provider, new Uint8Array(event.data), true)
|
||||
if (encoding.length(encoder) > 1) {
|
||||
websocket.send(encoding.toUint8Array(encoder))
|
||||
}
|
||||
}
|
||||
websocket.onerror = (event) => {
|
||||
provider.emit('connection-error', [event, provider])
|
||||
}
|
||||
websocket.onclose = (event) => {
|
||||
provider.emit('connection-close', [event, provider])
|
||||
const closeWebsocketConnection = (provider, ws) => {
|
||||
if (ws === provider.ws) {
|
||||
provider.ws = null
|
||||
ws.close()
|
||||
provider.wsconnecting = false
|
||||
if (provider.wsconnected) {
|
||||
provider.wsconnected = false
|
||||
@ -178,6 +164,34 @@ const setupWS = (provider) => {
|
||||
provider
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {WebsocketProvider} provider
|
||||
*/
|
||||
const setupWS = (provider) => {
|
||||
if (provider.shouldConnect && provider.ws === null) {
|
||||
const websocket = new provider._WS(provider.url, provider.protocols)
|
||||
websocket.binaryType = 'arraybuffer'
|
||||
provider.ws = websocket
|
||||
provider.wsconnecting = true
|
||||
provider.wsconnected = false
|
||||
provider.synced = false
|
||||
|
||||
websocket.onmessage = (event) => {
|
||||
provider.wsLastMessageReceived = time.getUnixTime()
|
||||
const encoder = readMessage(provider, new Uint8Array(event.data), true)
|
||||
if (encoding.length(encoder) > 1) {
|
||||
websocket.send(encoding.toUint8Array(encoder))
|
||||
}
|
||||
}
|
||||
websocket.onerror = (event) => {
|
||||
provider.emit('connection-error', [event, provider])
|
||||
}
|
||||
websocket.onclose = (event) => {
|
||||
provider.emit('connection-close', [event, provider])
|
||||
closeWebsocketConnection(provider, websocket)
|
||||
}
|
||||
websocket.onopen = () => {
|
||||
provider.wsLastMessageReceived = time.getUnixTime()
|
||||
provider.wsconnecting = false
|
||||
@ -377,7 +391,7 @@ export class WebsocketProvider extends Observable {
|
||||
) {
|
||||
// no message received in a long time - not even your own awareness
|
||||
// updates (which are updated every 15 seconds)
|
||||
/** @type {WebSocket} */ (this.ws).close()
|
||||
closeWebsocketConnection(this, /** @type {WebSocket} */ (this.ws))
|
||||
}
|
||||
}, messageReconnectTimeout / 10))
|
||||
if (connect) {
|
||||
@ -484,7 +498,7 @@ export class WebsocketProvider extends Observable {
|
||||
this.shouldConnect = false
|
||||
this.disconnectBc()
|
||||
if (this.ws !== null) {
|
||||
this.ws.close()
|
||||
closeWebsocketConnection(this, this.ws)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user