{"version":3,"file":"promise.cjs","names":[],"sources":["../../../src/common/exec/promise.ts"],"sourcesContent":["/* eslint-disable ts/no-use-before-define */\n\n/**\n * Promise to be used with `await`. Example:\n *\n * ```\n * const [promise, resolve, reject] = createPromise()\n * setTimeout(() => {\n *   resolve(5)\n * }, 50)\n * const result = await promise\n * ```\n */\nexport function createPromise<T>(): [Promise<T>, any, any] {\n  let resolve, reject\n  const promise = new Promise<T>((_resolve, _reject) => {\n    resolve = _resolve\n    reject = _reject\n  })\n  return [promise, resolve, reject]\n}\n\n/** Sleep for `milliSeconds`. Example 1s: `await sleep(1000)` */\nexport async function sleep(milliSeconds: number): Promise<void> {\n  return new Promise(resolve => setTimeout(resolve, milliSeconds))\n}\n\n/** Same as `await sleep(0)`, just let the event loop execute. */\nexport async function immediate(): Promise<void> {\n  return new Promise(resolve => setTimeout(resolve, 0))\n}\n\n// type Unwrap<T> = T extends Promise<infer U>\n//   ? U\n//   : T extends (...args: any) => Promise<infer U>\n//     ? U\n//     : T extends (...args: any) => infer U\n//       ? U\n//       : T\n\nexport async function timeout<T>(\n  promise: Promise<T>,\n  milliSeconds: number,\n  timeoutValue = 'timeoutReached',\n): Promise<T | typeof timeoutValue> {\n  return new Promise((resolve, reject) => {\n    let done = false\n\n    const timeout = setTimeout(() => {\n      done = true\n      resolve(timeoutValue)\n    }, milliSeconds)\n\n    promise\n      .then((result) => {\n        clearTimeout(timeout)\n        if (!done)\n          resolve(result)\n      })\n      .catch((err) => {\n        clearTimeout(timeout)\n        if (!done)\n          reject(err)\n      })\n  })\n}\n\nexport function isTimeout(value: any): boolean {\n  return value === 'timeoutReached' || value?.name === 'Timeout reached'\n}\n\nexport async function tryTimeout<T>(\n  promise: Promise<T>,\n  milliSeconds: number,\n): Promise<T | undefined> {\n  if (milliSeconds <= 0)\n    return await promise\n\n  return new Promise((resolve, reject) => {\n    let done = false\n\n    const timeout = setTimeout(() => {\n      done = true\n      reject(new Error('Timeout reached'))\n    }, milliSeconds)\n\n    promise\n      .then((result) => {\n        clearTimeout(timeout)\n        if (!done)\n          resolve(result)\n      })\n      .catch((err) => {\n        clearTimeout(timeout)\n        if (!done)\n          reject(err)\n      })\n  })\n}\n\n/**\n * @deprecated use emitter.waitOn\n * Wait for `event` on `obj` to emit. Resolve with result or reject on `timeout`\n */\nexport function waitOn(\n  obj: any,\n  event: string,\n  timeoutMS = 1000,\n): Promise<any> {\n  return new Promise((resolve, reject) => {\n    const fn = (value: any) => {\n      if (timer) {\n        clearTimeout(timer)\n        done()\n        resolve(value)\n      }\n    }\n\n    let done = () => {\n      timer = null\n      if (obj.off)\n        obj.off(event, fn)\n      else if (obj.removeEventListener)\n        obj.removeEventListener(event, fn)\n      // else\n      //   log.warn('No remove listener method found for', obj, event)\n    }\n\n    let timer: any = setTimeout(() => {\n      done()\n      reject(new Error('Did not response in time'))\n    }, timeoutMS)\n\n    if (obj.on)\n      obj.on(event, fn)\n    else if (obj.addEventListener)\n      obj.addEventListener(event, fn)\n    // else\n    //   log.warn('No listener method found for', obj)\n  })\n}\n\nexport function isPromise<T>(value: Promise<T> | T): value is Promise<T> {\n  return Boolean(value && (value instanceof Promise || typeof (value as any).then === 'function'))\n}\n\n/** This is exactly what Prose.resolve(x) is supposed to be: return a Promise no matter what type x is */\nexport function promisify<T>(value: Promise<T> | T): Promise<T> {\n  return Promise.resolve(value)\n}\n\n// // https://github.com/unjs/items-promise\n\n// /**\n//  * Run tasks one by one by calling fn(task, previous) in a promise chain.\n//  * Return value is of type Promise<*> which resolves to the last fn result.\n//  */\n// export async function serial(tasks: any, fn: any) {\n//   return tasks.reduce(\n//     (promise: Promise<any>, task: any) =>\n//       promise.then((previous) => fn(task, previous)),\n//     Promise.resolve(null)\n//   )\n// }\n\n// /**\n//  * Run all tasks in parallel by calling fn(tasks) and await using Promise.all.\n//  * Return value is of type Promise<*[]> which resolves to results of all fns in an array.\n//  */\n// export async function parallel(tasks: any[], fn: any): Promise<any[]> {\n//   return Promise.all(tasks.map((task) => fn(task)))\n// }\n\n//\n\n/**\n *  Like ReturnType but for async functions.\n *  From https://www.jpwilliams.dev/how-to-unpack-the-return-type-of-a-promise-in-typescript\n */\nexport type AsyncReturnType<T extends (...args: any) => any> = T extends (\n  ...args: any\n) => Promise<infer U>\n  ? U\n  : T extends (...args: any) => infer U\n    ? U\n    : any\n"],"mappings":";;;;;;;;;;;;;;AAaA,SAAgB,gBAA2C;CACzD,IAAI,SAAS;AAKb,QAAO;EAJS,IAAI,SAAY,UAAU,YAAY;AACpD,aAAU;AACV,YAAS;IACT;EACe;EAAS;EAAO;;;AAInC,eAAsB,MAAM,cAAqC;AAC/D,QAAO,IAAI,SAAQ,YAAW,WAAW,SAAS,aAAa,CAAC;;;AAIlE,eAAsB,YAA2B;AAC/C,QAAO,IAAI,SAAQ,YAAW,WAAW,SAAS,EAAE,CAAC;;AAWvD,eAAsB,QACpB,SACA,cACA,eAAe,kBACmB;AAClC,QAAO,IAAI,SAAS,SAAS,WAAW;EACtC,IAAI,OAAO;EAEX,MAAM,UAAU,iBAAiB;AAC/B,UAAO;AACP,WAAQ,aAAa;KACpB,aAAa;AAEhB,UACG,MAAM,WAAW;AAChB,gBAAa,QAAQ;AACrB,OAAI,CAAC,KACH,SAAQ,OAAO;IACjB,CACD,OAAO,QAAQ;AACd,gBAAa,QAAQ;AACrB,OAAI,CAAC,KACH,QAAO,IAAI;IACb;GACJ;;AAGJ,SAAgB,UAAU,OAAqB;AAC7C,QAAO,UAAU,oBAAoB,OAAO,SAAS;;AAGvD,eAAsB,WACpB,SACA,cACwB;AACxB,KAAI,gBAAgB,EAClB,QAAO,MAAM;AAEf,QAAO,IAAI,SAAS,SAAS,WAAW;EACtC,IAAI,OAAO;EAEX,MAAM,UAAU,iBAAiB;AAC/B,UAAO;AACP,0BAAO,IAAI,MAAM,kBAAkB,CAAC;KACnC,aAAa;AAEhB,UACG,MAAM,WAAW;AAChB,gBAAa,QAAQ;AACrB,OAAI,CAAC,KACH,SAAQ,OAAO;IACjB,CACD,OAAO,QAAQ;AACd,gBAAa,QAAQ;AACrB,OAAI,CAAC,KACH,QAAO,IAAI;IACb;GACJ;;;;;;AAOJ,SAAgB,OACd,KACA,OACA,YAAY,KACE;AACd,QAAO,IAAI,SAAS,SAAS,WAAW;EACtC,MAAM,MAAM,UAAe;AACzB,OAAI,OAAO;AACT,iBAAa,MAAM;AACnB,UAAM;AACN,YAAQ,MAAM;;;EAIlB,IAAI,aAAa;AACf,WAAQ;AACR,OAAI,IAAI,IACN,KAAI,IAAI,OAAO,GAAG;YACX,IAAI,oBACX,KAAI,oBAAoB,OAAO,GAAG;;EAKtC,IAAI,QAAa,iBAAiB;AAChC,SAAM;AACN,0BAAO,IAAI,MAAM,2BAA2B,CAAC;KAC5C,UAAU;AAEb,MAAI,IAAI,GACN,KAAI,GAAG,OAAO,GAAG;WACV,IAAI,iBACX,KAAI,iBAAiB,OAAO,GAAG;GAGjC;;AAGJ,SAAgB,UAAa,OAA4C;AACvE,QAAO,QAAQ,UAAU,iBAAiB,WAAW,OAAQ,MAAc,SAAS,YAAY;;;AAIlG,SAAgB,UAAa,OAAmC;AAC9D,QAAO,QAAQ,QAAQ,MAAM"}