return promises for chaining in promise-tracker.ts

This commit is contained in:
Hazelnoot 2025-11-11 20:15:40 -05:00
parent 5f37eef244
commit 05414ce0b9

View file

@ -8,20 +8,23 @@ import { coreLogger } from '@/boot/coreLogger.js';
const backgroundLogger = coreLogger.createSubLogger('background'); const backgroundLogger = coreLogger.createSubLogger('background');
const promiseRefs: Set<WeakRef<Promise<unknown>>> = new Set(); const promiseRefs: Set<WeakRef<Promise<unknown>>> = new Set();
export function trackTask(task: () => Promise<unknown>): void { export function trackTask<T>(task: () => Promise<T>): Promise<T> {
trackPromise(task()); const promise = task();
return trackPromise(promise);
} }
/** /**
* This tracks promises that other modules decided not to wait for, * This tracks promises that other modules decided not to wait for,
* and makes sure they are all settled before fully closing down the server. * and makes sure they are all settled before fully closing down the server.
* Returns the promise for chaining.
*/ */
export function trackPromise(promise: Promise<unknown>) { export function trackPromise<T>(promise: Promise<T>): Promise<T> {
const ref = new WeakRef(promise); const ref = new WeakRef(promise);
promiseRefs.add(ref); promiseRefs.add(ref);
promise promise
.catch(err => backgroundLogger.error('Unhandled error in tracked background task:', { err })) .catch(err => backgroundLogger.error('Unhandled error in tracked background task:', { err }))
.finally(() => promiseRefs.delete(ref)); .finally(() => promiseRefs.delete(ref));
return promise;
} }
export async function allSettled(): Promise<void> { export async function allSettled(): Promise<void> {