signal-desktop/ts/sql/channels.ts

62 lines
1.5 KiB
TypeScript
Raw Normal View History

2023-05-04 17:59:02 +00:00
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { ipcRenderer } from 'electron';
import * as log from '../logging/log';
import createTaskWithTimeout from '../textsecure/TaskWithTimeout';
import { explodePromise } from '../util/explodePromise';
const SQL_CHANNEL_KEY = 'sql-channel';
let activeJobCount = 0;
let resolveShutdown: (() => void) | undefined;
let shutdownPromise: Promise<void> | null = null;
2023-08-15 23:24:19 +00:00
export async function ipcInvoke<T>(
2023-05-04 17:59:02 +00:00
name: string,
args: ReadonlyArray<unknown>
2023-08-15 23:24:19 +00:00
): Promise<T> {
2023-05-04 17:59:02 +00:00
const fnName = String(name);
if (shutdownPromise && name !== 'close') {
throw new Error(
`Rejecting SQL channel job (${fnName}); application is shutting down`
);
}
activeJobCount += 1;
return createTaskWithTimeout(async () => {
try {
return await ipcRenderer.invoke(SQL_CHANNEL_KEY, name, ...args);
} finally {
activeJobCount -= 1;
if (activeJobCount === 0) {
resolveShutdown?.();
}
}
}, `SQL channel call (${fnName})`)();
}
export async function doShutdown(): Promise<void> {
log.info(
`data.shutdown: shutdown requested. ${activeJobCount} jobs outstanding`
);
if (shutdownPromise) {
return shutdownPromise;
}
// No outstanding jobs, return immediately
if (activeJobCount === 0) {
return;
}
({ promise: shutdownPromise, resolve: resolveShutdown } =
explodePromise<void>());
try {
await shutdownPromise;
} finally {
log.info('data.shutdown: process complete');
}
}