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
JavaScript
// 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