{"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":[]}