Use non-throttled timeouts for websockets

This commit is contained in:
Fedor Indutny 2021-10-07 11:18:22 -07:00 committed by GitHub
parent 8cf6748dce
commit 27573e6dce
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 107 additions and 32 deletions

43
ts/context/Timers.ts Normal file
View file

@ -0,0 +1,43 @@
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { setTimeout, clearTimeout } from 'timers';
export type Timeout = {
id: number;
__signalContext: never;
};
export class Timers {
private counter = 0;
private readonly timers = new Map<number, NodeJS.Timeout>();
public setTimeout(callback: () => void, delay: number): Timeout {
let id: number;
do {
id = this.counter;
// eslint-disable-next-line no-bitwise
this.counter = (this.counter + 1) >>> 0;
} while (this.timers.has(id));
const timer = setTimeout(() => {
this.timers.delete(id);
callback();
}, delay);
this.timers.set(id, timer);
return ({ id } as unknown) as Timeout;
}
public clearTimeout({ id }: Timeout): ReturnType<typeof clearTimeout> {
const timer = this.timers.get(id);
if (timer === undefined) {
return;
}
this.timers.delete(id);
return clearTimeout(timer);
}
}

View file

@ -3,6 +3,7 @@
import { Bytes } from './Bytes';
import { Crypto } from './Crypto';
import { Timers } from './Timers';
import {
createNativeThemeListener,
MinimalIPC,
@ -13,6 +14,8 @@ export class Context {
public readonly crypto = new Crypto();
public readonly timers = new Timers();
public readonly nativeThemeListener;
constructor(private readonly ipc: MinimalIPC) {