UNPKG

asyncerator

Version:

Provide supporting types for AsyncIterable/AsyncIterableIterators, promisified stream.pipeline implementation, and Array-like utility operators, sources and sinks.

58 lines (57 loc) 3.06 kB
// src/operator/race.ts import debug from "debug"; var log = debug("asyncerator:operator:race"); var DEFAULT_CONCURRENT = 128; function race_default(raceFunction, concurrent = DEFAULT_CONCURRENT) { return async function* (iterator) { const queue = []; const pending = /* @__PURE__ */ new Set(); let complete = false; let errorThrown = false; let completionError; const producer = (async () => { for await (const item of iterator) { while (pending.size >= concurrent) { await new Promise((resolve) => { setTimeout(resolve, 0); }); } const promise = raceFunction(item); pending.add(promise); promise.then((value) => { queue.push(value); pending.delete(promise); return value; }).catch((error) => { log(error); }); } })().then(() => { complete = true; }).catch((error) => { errorThrown = true; completionError = error; }); while (!complete && !errorThrown) { if (pending.size === 0) { await new Promise((resolve) => { setTimeout(resolve, 0); }); } while (pending.size > 0 || queue.length > 0) { if (pending.size > 0) { await Promise.race(pending); } yield* queue.splice(0, queue.length); } } await producer; if (errorThrown) { throw completionError; } }; } export { race_default as default }; //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL29wZXJhdG9yL3JhY2UudHMiXSwKICAibWFwcGluZ3MiOiAiO0FBUUEsT0FBTyxXQUFXO0FBTWxCLElBQU0sTUFBTSxNQUFNLDJCQUEyQjtBQUU3QyxJQUFNLHFCQUFxQjtBQVFaLFNBQVIsYUFDTCxjQUNBLGFBQXFCLG9CQUNJO0FBQ3pCLFNBQU8saUJBQWlCLFVBQThCO0FBQ3BELFVBQU0sUUFBa0IsQ0FBQztBQUN6QixVQUFNLFVBQVUsb0JBQUksSUFBaUM7QUFDckQsUUFBSSxXQUFXO0FBQ2YsUUFBSSxjQUFjO0FBQ2xCLFFBQUk7QUFPSixVQUFNLFlBQVksWUFBWTtBQUM1Qix1QkFBaUIsUUFBUSxVQUFVO0FBQ2pDLGVBQU8sUUFBUSxRQUFRLFlBQVk7QUFFakMsZ0JBQU0sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUM3Qix1QkFBVyxTQUFTLENBQUM7QUFBQSxVQUN2QixDQUFDO0FBQUEsUUFDSDtBQUVBLGNBQU0sVUFBVSxhQUFhLElBQUk7QUFDakMsZ0JBQVEsSUFBSSxPQUFPO0FBR25CLGdCQUNHLEtBQUssQ0FBQyxVQUFVO0FBRWYsZ0JBQU0sS0FBSyxLQUFLO0FBQ2hCLGtCQUFRLE9BQU8sT0FBTztBQUN0QixpQkFBTztBQUFBLFFBQ1QsQ0FBQyxFQUNBLE1BQU0sQ0FBQyxVQUFtQjtBQUd6QixjQUFJLEtBQUs7QUFBQSxRQUNYLENBQUM7QUFBQSxNQUNMO0FBQUEsSUFDRixHQUFHLEVBQ0EsS0FBSyxNQUFNO0FBQ1YsaUJBQVc7QUFBQSxJQUNiLENBQUMsRUFDQSxNQUFNLENBQUMsVUFBbUI7QUFDekIsb0JBQWM7QUFDZCx3QkFBa0I7QUFBQSxJQUNwQixDQUFDO0FBT0gsV0FBTyxDQUFDLFlBQVksQ0FBQyxhQUFhO0FBQ2hDLFVBQUksUUFBUSxTQUFTLEdBQUc7QUFHdEIsY0FBTSxJQUFJLFFBQVEsQ0FBQyxZQUFZO0FBQzdCLHFCQUFXLFNBQVMsQ0FBQztBQUFBLFFBQ3ZCLENBQUM7QUFBQSxNQUNIO0FBRUEsYUFBTyxRQUFRLE9BQU8sS0FBSyxNQUFNLFNBQVMsR0FBRztBQUMzQyxZQUFJLFFBQVEsT0FBTyxHQUFHO0FBRXBCLGdCQUFNLFFBQVEsS0FBSyxPQUFPO0FBQUEsUUFDNUI7QUFHQSxlQUFPLE1BQU0sT0FBTyxHQUFHLE1BQU0sTUFBTTtBQUFBLE1BQ3JDO0FBQUEsSUFDRjtBQUVBLFVBQU07QUFHTixRQUFJLGFBQWE7QUFDZixZQUFNO0FBQUEsSUFDUjtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K