{"version":3,"file":"AsyncWorkTracker.js","sourceRoot":"","sources":["../../src/execution/AsyncWorkTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iCAAgC;AAGxD,MAAM,OAAO,gBAAgB;IAG3B;QACE,IAAI,CAAC,gBAAgB,GAAG,IAAI,GAAG,EAAE,CAAC;IACpC,CAAC;IAED,GAAG,CAAC,WAAiC;QACnC,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAC/C,MAAM,eAAe,GAAG,WAAW,CAAC,IAAI,CACtC,GAAG,EAAE;YACH,gBAAgB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAC3C,CAAC,EACD,GAAG,EAAE;YACH,gBAAgB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAC3C,CAAC,CACF,CAAC;QACF,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACxC,CAAC;IAED,SAAS,CAAC,MAA8B;QACtC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI;QAGF,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QACD,OAAO,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACxC,CAAC;IAED,uBAAuB,CACrB,MAAyC;QAEzC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;YAC3B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,uBAAuB;QACnC,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAEtC,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;CACF","sourcesContent":["import { isPromiseLike } from '../jsutils/isPromise.ts';\n\n/** @internal */\nexport class AsyncWorkTracker {\n  pendingAsyncWork: Set<PromiseLike<void>>;\n\n  constructor() {\n    this.pendingAsyncWork = new Set();\n  }\n\n  add(promiseLike: PromiseLike<unknown>): void {\n    const pendingAsyncWork = this.pendingAsyncWork;\n    const promiseToSettle = promiseLike.then(\n      () => {\n        pendingAsyncWork.delete(promiseToSettle);\n      },\n      () => {\n        pendingAsyncWork.delete(promiseToSettle);\n      },\n    );\n    pendingAsyncWork.add(promiseToSettle);\n  }\n\n  addValues(values: ReadonlyArray<unknown>): void {\n    for (const value of values) {\n      if (isPromiseLike(value)) {\n        this.add(value);\n      }\n    }\n  }\n\n  wait(): Promise<void> | void {\n    // wait can complete synchronously when there is no tracked async work,\n    // which allows synchronous execution paths to remain synchronous.\n    if (this.pendingAsyncWork.size === 0) {\n      return;\n    }\n    return this.waitForPendingAsyncWork();\n  }\n\n  promiseAllTrackOnReject<T>(\n    values: ReadonlyArray<PromiseLike<T> | T>,\n  ): Promise<Array<T>> {\n    const promise = Promise.all(values);\n    promise.then(undefined, () => {\n      this.addValues(values);\n    });\n    return promise;\n  }\n\n  private async waitForPendingAsyncWork(): Promise<void> {\n    while (this.pendingAsyncWork.size > 0) {\n      // eslint-disable-next-line no-await-in-loop\n      await Promise.allSettled(Array.from(this.pendingAsyncWork));\n    }\n  }\n}\n"]}