@xylabs/forget
Version:
Base functionality used throughout XY Labs TypeScript/JavaScript libraries
71 lines • 1.91 kB
JavaScript
// src/forget.ts
import { delay } from "@xylabs/delay";
import { isPromise } from "@xylabs/promise";
var ForgetPromise = {
get active() {
return this.activeForgets > 0;
},
activeForgets: 0,
async awaitInactive(interval = 100, timeout) {
let timeoutRemaining = timeout;
while (this.active) {
await delay(interval);
if (timeoutRemaining !== void 0) {
timeoutRemaining -= interval;
if (timeoutRemaining <= 0) {
return this.activeForgets;
}
}
}
return 0;
},
/**
* Used to explicitly launch an async function (or Promise) with awaiting it
* @param promise The promise to forget
* @param config Configuration of forget settings
*/
forget(promise, onComplete, config) {
if (isPromise(promise)) {
let completed = false;
this.activeForgets++;
const promiseWrapper = async () => {
await promise.then((result) => {
this.activeForgets--;
completed = true;
onComplete?.([result, void 0]);
}).catch((error) => {
this.activeForgets--;
completed = true;
onComplete?.([void 0, error]);
});
};
const promises = [promiseWrapper()];
if (config) {
const timeoutFunc = async () => {
await delay(config.delay);
if (!completed) {
console.log(`forget promise timeout out after ${config.delay}ms [Cancelling]`);
config.cancel?.();
}
};
promises.push(timeoutFunc());
}
const all = Promise.race(promises);
all.then(() => {
return;
}).catch(() => {
return;
});
} else {
return promise();
}
}
};
var forget = (promise, onComplete, timeout) => {
ForgetPromise.forget(promise, onComplete, timeout);
};
export {
ForgetPromise,
forget
};
//# sourceMappingURL=index.mjs.map