UNPKG

graphql

Version:

A Query Language and Runtime which can target any service.

1 lines 2.85 kB
{"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"]}