assistant-stream
Version:
Streaming utilities for AI assistants
70 lines (69 loc) • 1.53 kB
JavaScript
// src/utils/AsyncIterableStream.ts
function streamIteratorPolyfill() {
const reader = this.getReader();
let finished = false;
let ongoing = Promise.resolve();
const enqueue = (operation) => {
const result = ongoing.then(operation);
ongoing = result.then(() => void 0, () => void 0);
return result;
};
const cancel = async (reason) => {
if (finished) return;
finished = true;
try {
return reader.cancel(reason);
} finally {
reader.releaseLock();
}
};
const iterator = {
next: () => enqueue(async () => {
if (finished) return {
done: true,
value: void 0
};
try {
const result = await reader.read();
if (result.done) {
finished = true;
reader.releaseLock();
}
return result;
} catch (error) {
finished = true;
reader.releaseLock();
throw error;
}
}),
return: (value) => enqueue(async () => {
await cancel(value);
return {
done: true,
value
};
}),
throw: (error) => enqueue(async () => {
await cancel(void 0);
throw error;
}),
[Symbol.asyncIterator]() {
return this;
}
};
const asyncDispose = Symbol.asyncDispose;
if (asyncDispose) Object.defineProperty(iterator, asyncDispose, {
value: async () => {
await iterator.return();
},
writable: true,
configurable: true
});
return iterator;
}
function asAsyncIterableStream(source) {
source[Symbol.asyncIterator] ??= streamIteratorPolyfill;
return source;
}
export { asAsyncIterableStream };
//# sourceMappingURL=AsyncIterableStream.js.map