session-desktop/ts/session/utils/TaskWithTimeout.ts
2021-08-04 10:52:24 +10:00

67 lines
1.6 KiB
TypeScript

export const createTaskWithTimeout = (task: any, id: string, givenTimeout?: number) => {
const timeout = givenTimeout || 1000 * 60 * 3; // three minutes
const errorForStack = new Error('for stack');
return async () =>
new Promise((resolve, reject) => {
let complete = false;
let timer: NodeJS.Timeout | null = global.setTimeout(() => {
if (!complete) {
const message = `${id || ''} task did not complete in time. Calling stack: ${
errorForStack.stack
}`;
window?.log?.error(message);
reject(new Error(message));
return;
}
return null;
}, timeout);
const clearTimer = () => {
try {
const localTimer = timer;
if (localTimer) {
timer = null;
global.clearTimeout(localTimer);
}
} catch (error) {
window?.log?.error(
id || '',
'task ran into problem canceling timer. Calling stack:',
errorForStack.stack
);
}
};
const success = (result: any) => {
clearTimer();
complete = true;
resolve(result);
return;
};
const failure = (error: any) => {
clearTimer();
complete = true;
reject(error);
return;
};
let promise;
try {
promise = task();
} catch (error) {
clearTimer();
throw error;
}
if (!promise || !promise.then) {
clearTimer();
complete = true;
resolve(promise);
return;
}
return promise.then(success, failure);
});
};