ai-utils.js
Version:
Build AI applications, chatbots, and agents with JavaScript and TypeScript.
55 lines (54 loc) • 2.1 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseTextDeltaEventSource = exports.createTextDeltaEventSource = void 0;
const secure_json_parse_1 = __importDefault(require("secure-json-parse"));
const zod_1 = require("zod");
const AsyncQueue_js_1 = require("./AsyncQueue.cjs");
const parseEventSourceReadableStream_js_1 = require("./parseEventSourceReadableStream.cjs");
const textEncoder = new TextEncoder();
const textDeltaEventDataSchema = zod_1.z.object({
textDelta: zod_1.z.string().optional(),
isFinished: zod_1.z.boolean(),
});
function enqueueData(controller, data) {
controller.enqueue(textEncoder.encode(`data: ${JSON.stringify(data)}\n\n`));
}
function createTextDeltaEventSource(textDeltas) {
return new ReadableStream({
async start(controller) {
for await (const textDelta of textDeltas) {
enqueueData(controller, { textDelta, isFinished: false });
}
enqueueData(controller, { isFinished: true });
},
});
}
exports.createTextDeltaEventSource = createTextDeltaEventSource;
function parseTextDeltaEventSource(stream, options) {
const queue = new AsyncQueue_js_1.AsyncQueue();
// run async (no await on purpose):
(0, parseEventSourceReadableStream_js_1.parseEventSourceReadableStream)({
stream,
callback: (event) => {
if (event.type !== "event") {
return;
}
try {
const data = textDeltaEventDataSchema.parse(secure_json_parse_1.default.parse(event.data));
queue.push(data.textDelta);
if (data.isFinished) {
queue.close();
}
}
catch (error) {
options?.errorHandler(error);
queue.close();
}
},
});
return queue;
}
exports.parseTextDeltaEventSource = parseTextDeltaEventSource;