feat: add SSE parser and in-flight request tracker

This commit is contained in:
2026-08-14 10:42:17 -06:00
parent c6d50f6daf
commit b54eeeadc4
4 changed files with 161 additions and 0 deletions
+50
View File
@@ -0,0 +1,50 @@
import assert from "node:assert/strict";
import { test } from "node:test";
import { InflightTracker, type FeedEvent } from "../src/lib/inflight-tracker";
test("snapshot rebuilds counts for all in-flight requests", () => {
const tracker = new InflightTracker();
tracker.apply({
type: "inflight",
operation: "snapshot",
requests: [
{ model: "A", id: "1" },
{ model: "A", id: "2" },
{ model: "B", id: "3" },
],
});
assert.equal(tracker.count("A"), 2);
assert.equal(tracker.count("B"), 1);
assert.equal(tracker.count("C"), 0);
});
test("add and remove adjust per-model counts", () => {
const tracker = new InflightTracker();
tracker.apply({ type: "inflight", operation: "add", requests: [{ model: "A", id: "1" }] });
tracker.apply({ type: "inflight", operation: "add", requests: [{ model: "A", id: "2" }] });
assert.equal(tracker.count("A"), 2);
tracker.apply({ type: "inflight", operation: "remove", requests: [{ model: "A", id: "1" }] });
assert.equal(tracker.count("A"), 1);
tracker.apply({ type: "inflight", operation: "remove", requests: [{ model: "A", id: "2" }] });
assert.equal(tracker.count("A"), 0);
tracker.apply({ type: "inflight", operation: "remove", requests: [{ model: "A", id: "9" }] });
assert.equal(tracker.count("A"), 0);
});
test("modelStatus normalizes states", () => {
const tracker = new InflightTracker();
tracker.apply({
type: "modelStatus",
models: [
{ id: "A", state: "ready" },
{ id: "B", state: "loading" },
{ id: "C", state: "stopped" },
{ id: "D", state: "weird" },
],
});
assert.equal(tracker.state("A"), "ready");
assert.equal(tracker.state("B"), "loading");
assert.equal(tracker.state("C"), "stopped");
assert.equal(tracker.state("D"), "stopped");
assert.equal(tracker.state("missing"), undefined);
});
+24
View File
@@ -0,0 +1,24 @@
import assert from "node:assert/strict";
import { test } from "node:test";
import { parseSse } from "../src/lib/sse";
test("parseSse extracts event + data blocks separated by blank lines", () => {
const { messages, rest } = parseSse('event:message\ndata:{"a":1}\n\nevent:message\ndata:hello\n\n');
assert.equal(rest, "");
assert.equal(messages.length, 2);
assert.equal(messages[0].event, "message");
assert.equal(messages[0].data, '{"a":1}');
assert.equal(messages[1].data, "hello");
});
test("parseSse keeps a trailing partial event in rest", () => {
const { messages, rest } = parseSse("event:message\ndata:par");
assert.equal(messages.length, 0);
assert.equal(rest, "event:message\ndata:par");
});
test("parseSse joins multi-line data fields with newline", () => {
const { messages } = parseSse("data:line1\ndata:line2\n\n");
assert.equal(messages.length, 1);
assert.equal(messages[0].data, "line1\nline2");
});