react-async-iterators
Version:
The magic of JavaScript async iterators in React ⛓️ 🧬 🔃
55 lines • 2.48 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.asyncIterShare = asyncIterShare;
function asyncIterShare() {
return srcIter => {
let sharedSourceIterator;
let prevSourceIteratorActiveTearDownPromise;
let nextPromise;
let activeSubIteratorsCount = 0;
return {
[Symbol.asyncIterator]() {
let iteratorClosed = false;
const whenIteratorCloses = Promise.withResolvers();
if (++activeSubIteratorsCount === 1) {
sharedSourceIterator = srcIter[Symbol.asyncIterator]();
}
return {
async next() {
if (prevSourceIteratorActiveTearDownPromise) {
await prevSourceIteratorActiveTearDownPromise;
}
if (iteratorClosed) {
return { done: true, value: undefined };
}
nextPromise ??= sharedSourceIterator.next().finally(() => {
nextPromise = undefined;
});
return Promise.race([whenIteratorCloses.promise, nextPromise]);
},
async return() {
if (!iteratorClosed) {
iteratorClosed = true;
if (--activeSubIteratorsCount === 0) {
await (prevSourceIteratorActiveTearDownPromise ??= (async () => {
try {
if (sharedSourceIterator.return) {
await sharedSourceIterator.return();
}
}
finally {
prevSourceIteratorActiveTearDownPromise = undefined;
}
})());
}
whenIteratorCloses.resolve({ done: true, value: undefined });
await whenIteratorCloses.promise;
}
return { done: true, value: undefined };
},
};
},
};
};
}
//# sourceMappingURL=asyncIterShare.js.map