UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

66 lines (65 loc) 1.97 kB
//#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 };