Reconnect within MessageReceiver
This commit is contained in:
parent
0ec23be91b
commit
a6394e0c8b
5 changed files with 40 additions and 24 deletions
|
@ -41,6 +41,7 @@ import {
|
|||
Sessions,
|
||||
SignedPreKeys,
|
||||
} from '../LibSignalStores';
|
||||
import { BackOff, FIBONACCI_TIMEOUTS } from '../util/BackOff';
|
||||
import { BatcherType, createBatcher } from '../util/batcher';
|
||||
import { sleep } from '../util/sleep';
|
||||
import { parseIntOrThrow } from '../util/parseIntOrThrow';
|
||||
|
@ -51,6 +52,7 @@ import utils from './Helpers';
|
|||
import WebSocketResource, {
|
||||
IncomingWebSocketRequest,
|
||||
} from './WebsocketResources';
|
||||
import { ConnectTimeoutError } from './Errors';
|
||||
import * as Bytes from '../Bytes';
|
||||
import Crypto from './Crypto';
|
||||
import { deriveMasterKeyFromGroupV1, typedArrayToArrayBuffer } from '../Crypto';
|
||||
|
@ -80,7 +82,6 @@ const FIXMEU8 = Uint8Array;
|
|||
const GROUPV1_ID_LENGTH = 16;
|
||||
const GROUPV2_ID_LENGTH = 32;
|
||||
const RETRY_TIMEOUT = 2 * 60 * 1000;
|
||||
const RECONNECT_DELAY = 1 * 1000;
|
||||
|
||||
const decryptionErrorTypeSchema = z
|
||||
.object({
|
||||
|
@ -229,6 +230,8 @@ class MessageReceiverInner extends EventTarget {
|
|||
|
||||
wsr?: WebSocketResource;
|
||||
|
||||
private readonly reconnectBackOff = new BackOff(FIBONACCI_TIMEOUTS);
|
||||
|
||||
constructor(
|
||||
oldUsername: string,
|
||||
username: string,
|
||||
|
@ -348,6 +351,11 @@ class MessageReceiverInner extends EventTarget {
|
|||
} catch (error) {
|
||||
this.socketStatus = SocketStatus.CLOSED;
|
||||
|
||||
if (error instanceof ConnectTimeoutError) {
|
||||
await this.onclose(-1, 'Connection timed out');
|
||||
return;
|
||||
}
|
||||
|
||||
const event = new Event('error');
|
||||
event.error = error;
|
||||
await this.dispatchAndWait(event);
|
||||
|
@ -443,7 +451,7 @@ class MessageReceiverInner extends EventTarget {
|
|||
|
||||
async onclose(code: number, reason: string): Promise<void> {
|
||||
window.log.info(
|
||||
'websocket closed',
|
||||
'MessageReceiver: websocket closed',
|
||||
code,
|
||||
reason || '',
|
||||
'calledClose:',
|
||||
|
@ -464,12 +472,18 @@ class MessageReceiverInner extends EventTarget {
|
|||
this.onEmpty();
|
||||
}
|
||||
|
||||
await sleep(RECONNECT_DELAY);
|
||||
const timeout = this.reconnectBackOff.getAndIncrement();
|
||||
|
||||
// Try to reconnect (if there is an error - we'll get an
|
||||
// `error` event from `connect()` and hit the retry backoff logic in
|
||||
// `ts/background.ts`)
|
||||
window.log.info(`MessageReceiver: reconnecting after ${timeout}ms`);
|
||||
await sleep(timeout);
|
||||
|
||||
// Try to reconnect (if there is an HTTP error - we'll get an
|
||||
// `error` event from `connect()` and hit the secondary retry backoff
|
||||
// logic in `ts/background.ts`)
|
||||
await this.connect();
|
||||
|
||||
// Successfull reconnect, reset the backoff timeouts
|
||||
this.reconnectBackOff.reset();
|
||||
}
|
||||
|
||||
checkSocket(): void {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue