@sema-agent/core
Version:
Stateless, task-oriented AI agent core
39 lines (38 loc) • 1.37 kB
JavaScript
export function encodeFrame(json) {
const payload = Buffer.from(json, "utf8");
return Buffer.concat([Buffer.from(`Content-Length: ${payload.length}\r\n\r\n`, "ascii"), payload]);
}
export function createFrameDecoder(maxBytes = 50 * 1024 * 1024) {
const HEADER_SLACK = 128;
let buf = Buffer.alloc(0);
return function decode(chunk) {
const frames = [];
buf = Buffer.concat([buf, chunk]);
let awaiting;
for (;;) {
const he = buf.indexOf("\r\n\r\n");
if (he === -1)
break;
const m = /Content-Length:\s*(\d+)/i.exec(buf.subarray(0, he).toString("ascii"));
if (!m) {
buf = buf.subarray(he + 4);
continue;
}
const len = Number(m[1]);
if (!Number.isFinite(len) || len < 0 || len > maxBytes) {
buf = buf.subarray(he + 4);
continue;
}
const start = he + 4;
if (buf.length < start + len) {
awaiting = start + len;
break;
}
frames.push(buf.subarray(start, start + len).toString("utf8"));
buf = buf.subarray(start + len);
}
if (buf.length > (awaiting ?? maxBytes + HEADER_SLACK))
buf = Buffer.alloc(0);
return frames;
};
}