export function promiseTimeout( promise: Promise, timeoutMs: number, ): Promise { let hasPromiseResolved = false; return Promise.race([ promise.then((value) => { hasPromiseResolved = true; return value; }), new Promise((resolve) => setTimeout(resolve, timeoutMs)).then(() => { if (hasPromiseResolved) { return null; } throw new PromiseTimedOutError(); }), ]); } export class PromiseTimedOutError extends Error { constructor(message?: string) { super(message ?? "Promise timed out"); this.name = "PromiseTimedOutError"; } }