@xylabs/forget
Version:
Base functionality used throughout XY Labs TypeScript/JavaScript libraries
1 lines • 3.65 kB
Source Map (JSON)
{"version":3,"sources":["../../src/forget.ts"],"sourcesContent":["import { delay } from '@xylabs/delay'\nimport { isPromise, type Promisable } from '@xylabs/promise'\n\nexport interface ForgetTimeoutConfig {\n cancel: () => void\n delay: number\n}\n\nexport const ForgetPromise = {\n get active() {\n return this.activeForgets > 0\n },\n\n activeForgets: 0,\n\n async awaitInactive(interval = 100, timeout?: number) {\n let timeoutRemaining = timeout\n while (this.active) {\n await delay(interval)\n if (timeoutRemaining !== undefined) {\n timeoutRemaining -= interval\n if (timeoutRemaining <= 0) {\n return this.activeForgets\n }\n }\n }\n return 0\n },\n\n /**\n * Used to explicitly launch an async function (or Promise) with awaiting it\n * @param promise The promise to forget\n * @param config Configuration of forget settings\n */\n forget<T>(promise: Promisable<T>, onComplete?: (result: [T | undefined, Error | undefined]) => void, config?: ForgetTimeoutConfig) {\n if (isPromise(promise)) {\n let completed = false\n this.activeForgets++\n\n const promiseWrapper = async () => {\n await promise\n .then((result: T) => {\n this.activeForgets--\n completed = true\n onComplete?.([result, undefined])\n })\n .catch((error) => {\n this.activeForgets--\n completed = true\n onComplete?.([undefined, error])\n })\n }\n\n const promises = [promiseWrapper()]\n\n // if there is a timeout, add it to the race\n if (config) {\n const timeoutFunc = async () => {\n await delay(config.delay)\n if (!completed) {\n console.log(`forget promise timeout out after ${config.delay}ms [Cancelling]`)\n config.cancel?.()\n }\n }\n promises.push(timeoutFunc())\n }\n\n const all = Promise.race(promises)\n\n all\n .then(() => {\n return\n })\n .catch(() => {\n return\n })\n } else {\n return (promise as () => void)()\n }\n },\n}\n\n// used to explicitly launch an async function (or Promise) with awaiting it\nexport const forget = <T>(promise: Promisable<T>, onComplete?: (result: [T | undefined, Error | undefined]) => void, timeout?: ForgetTimeoutConfig) => {\n ForgetPromise.forget<T>(promise, onComplete, timeout)\n}\n"],"mappings":";AAAA,SAAS,aAAa;AACtB,SAAS,iBAAkC;AAOpC,IAAM,gBAAgB;AAAA,EAC3B,IAAI,SAAS;AACX,WAAO,KAAK,gBAAgB;AAAA,EAC9B;AAAA,EAEA,eAAe;AAAA,EAEf,MAAM,cAAc,WAAW,KAAK,SAAkB;AACpD,QAAI,mBAAmB;AACvB,WAAO,KAAK,QAAQ;AAClB,YAAM,MAAM,QAAQ;AACpB,UAAI,qBAAqB,QAAW;AAClC,4BAAoB;AACpB,YAAI,oBAAoB,GAAG;AACzB,iBAAO,KAAK;AAAA,QACd;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAU,SAAwB,YAAmE,QAA8B;AACjI,QAAI,UAAU,OAAO,GAAG;AACtB,UAAI,YAAY;AAChB,WAAK;AAEL,YAAM,iBAAiB,YAAY;AACjC,cAAM,QACH,KAAK,CAAC,WAAc;AACnB,eAAK;AACL,sBAAY;AACZ,uBAAa,CAAC,QAAQ,MAAS,CAAC;AAAA,QAClC,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,eAAK;AACL,sBAAY;AACZ,uBAAa,CAAC,QAAW,KAAK,CAAC;AAAA,QACjC,CAAC;AAAA,MACL;AAEA,YAAM,WAAW,CAAC,eAAe,CAAC;AAGlC,UAAI,QAAQ;AACV,cAAM,cAAc,YAAY;AAC9B,gBAAM,MAAM,OAAO,KAAK;AACxB,cAAI,CAAC,WAAW;AACd,oBAAQ,IAAI,oCAAoC,OAAO,KAAK,iBAAiB;AAC7E,mBAAO,SAAS;AAAA,UAClB;AAAA,QACF;AACA,iBAAS,KAAK,YAAY,CAAC;AAAA,MAC7B;AAEA,YAAM,MAAM,QAAQ,KAAK,QAAQ;AAEjC,UACG,KAAK,MAAM;AACV;AAAA,MACF,CAAC,EACA,MAAM,MAAM;AACX;AAAA,MACF,CAAC;AAAA,IACL,OAAO;AACL,aAAQ,QAAuB;AAAA,IACjC;AAAA,EACF;AACF;AAGO,IAAM,SAAS,CAAI,SAAwB,YAAmE,YAAkC;AACrJ,gBAAc,OAAU,SAAS,YAAY,OAAO;AACtD;","names":[]}