Use non-throttled timeouts for websockets
This commit is contained in:
parent
8cf6748dce
commit
27573e6dce
7 changed files with 107 additions and 32 deletions
43
ts/context/Timers.ts
Normal file
43
ts/context/Timers.ts
Normal 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);
|
||||
}
|
||||
}
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue