UNPKG

react-async-iterators

Version:

The magic of JavaScript async iterators in React ⛓️ 🧬 🔃

55 lines 2.48 kB
"use strict"; 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