Signal-Desktop/ts/util/StartupQueue.ts

41 lines
929 B
TypeScript

// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import * as Errors from '../types/errors';
type EntryType = Readonly<{
value: number;
callback(): void;
}>;
export class StartupQueue {
private readonly map = new Map<string, EntryType>();
public add(id: string, value: number, f: () => void): void {
const existing = this.map.get(id);
if (existing && existing.value >= value) {
return;
}
this.map.set(id, { value, callback: f });
}
public flush(): void {
window.log.info('StartupQueue: Processing', this.map.size, 'actions');
const values = Array.from(this.map.values());
this.map.clear();
for (const { callback } of values) {
try {
callback();
} catch (error) {
window.log.error(
'StartupQueue: Failed to process item due to error',
Errors.toLogFormat(error)
);
}
}
}
}