openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
66 lines (65 loc) • 1.97 kB
JavaScript
//#region packages/llm-core/src/utils/event-stream.ts
/** Generic async-iterable event stream with a separately awaited final result. */
var EventStream = class {
constructor(isComplete, extractResult) {
this.queue = [];
this.waiting = [];
this.done = false;
this.isComplete = isComplete;
this.extractResult = extractResult;
this.finalResultPromise = new Promise((resolve) => {
this.resolveFinalResult = resolve;
});
}
push(event) {
if (this.done) return;
if (this.isComplete(event)) {
this.done = true;
this.resolveFinalResult(this.extractResult(event));
}
const waiter = this.waiting.shift();
if (waiter) waiter({
value: event,
done: false
});
else this.queue.push(event);
}
end(result) {
this.done = true;
if (result !== void 0) this.resolveFinalResult(result);
while (this.waiting.length > 0) this.waiting.shift()({
value: void 0,
done: true
});
}
async *[Symbol.asyncIterator]() {
while (true) if (this.queue.length > 0) yield this.queue.shift();
else if (this.done) return;
else {
const result = await new Promise((resolve) => {
this.waiting.push(resolve);
});
if (result.done) return;
yield result.value;
}
}
result() {
return this.finalResultPromise;
}
};
/** Assistant-message event stream that resolves on done/error terminal events. */
var AssistantMessageEventStream = class extends EventStream {
constructor() {
super((event) => event.type === "done" || event.type === "error", (event) => {
if (event.type === "done") return event.message;
else if (event.type === "error") return event.error;
throw new Error("Unexpected event type for final result");
});
}
};
/** Creates an assistant-message stream for provider and plugin adapters. */
function createAssistantMessageEventStream() {
return new AssistantMessageEventStream();
}
//#endregion
export { EventStream as n, createAssistantMessageEventStream as r, AssistantMessageEventStream as t };