@worker-tools/stream-response
Version:
Fetch API Response objects made from async generators. Build streaming HTML responses or SSE with JS sugar.
96 lines • 2.94 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.promiseToStream = exports.promiseToAsyncIter = exports.collect = exports.aJoin = exports.join = exports.aMap = exports.map = exports.aInterleaveFlattenSecond = exports.interleave = exports.isForAwaitable = exports.isAsyncIterable = exports.isIterable = void 0;
const isIterable = (x) => x != null && typeof x === 'object' && Symbol.iterator in x;
exports.isIterable = isIterable;
const isAsyncIterable = (x) => x != null && typeof x === 'object' && Symbol.asyncIterator in x;
exports.isAsyncIterable = isAsyncIterable;
const isForAwaitable = (x) => x != null && typeof x === 'object' && (Symbol.asyncIterator in x || Symbol.iterator in x);
exports.isForAwaitable = isForAwaitable;
/**
* Alternates items from the first and second iterable in the output iterable, until either input runs out of items.
*/
function* interleave(xs, ys) {
const itx = xs[Symbol.iterator]();
const ity = ys[Symbol.iterator]();
while (true) {
const rx = itx.next();
if (rx.done)
break;
else
yield rx.value;
const ry = ity.next();
if (ry.done)
break;
else
yield ry.value;
}
}
exports.interleave = interleave;
/**
* It's like interleave, but will flatten items of the second (async) iterable.
*/
async function* aInterleaveFlattenSecond(xs, ys) {
const itx = xs[Symbol.iterator]();
const ity = ys[Symbol.iterator]();
while (true) {
const rx = itx.next();
if (rx.done)
break;
else
yield rx.value;
const ry = ity.next();
if (ry.done)
break;
else
yield* ry.value;
}
}
exports.aInterleaveFlattenSecond = aInterleaveFlattenSecond;
function* map(iterable, f) {
for (const x of iterable)
yield f(x);
}
exports.map = map;
async function* aMap(iterable, f) {
for await (const x of iterable)
yield f(x);
}
exports.aMap = aMap;
function join(iterable) {
return [...iterable].join('');
}
exports.join = join;
async function aJoin(iterable) {
const chunks = [];
for await (const x of iterable)
chunks.push(x);
return chunks.join('');
}
exports.aJoin = aJoin;
async function collect(iterable) {
const chunks = [];
for await (const x of iterable)
chunks.push(x);
return chunks;
}
exports.collect = collect;
async function* promiseToAsyncIter(promise) {
yield await promise;
}
exports.promiseToAsyncIter = promiseToAsyncIter;
function promiseToStream(promise) {
return new ReadableStream({
async start(ctrl) {
try {
ctrl.enqueue(await promise);
ctrl.close();
}
catch (err) {
ctrl.error(err);
}
}
});
}
exports.promiseToStream = promiseToStream;
//# sourceMappingURL=iter.js.map