llama-swap emits inflight events with operation 'upsert' (a single request, re-emitted as elapsed_ms updates) and id-only 'remove' events. The decoder ignored 'upsert' and dropped every id-only remove, so the tracker only ever reflected the connect-time snapshot and the count got stuck (e.g. at '1'). The tracker now keys in-flight state by request id (snapshot/add replace by id; remove deletes by id), and the decoder normalizes 'upsert' to 'add' and extracts the id from bare removes.
66 lines
2.4 KiB
TypeScript
66 lines
2.4 KiB
TypeScript
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 (upsert) is idempotent per request id", () => {
|
|
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: "1" }] });
|
|
tracker.apply({ type: "inflight", operation: "add", requests: [{ model: "A", id: "2" }] });
|
|
assert.equal(tracker.count("A"), 2);
|
|
});
|
|
|
|
test("remove is id-based and decrements the matching request", () => {
|
|
const tracker = new InflightTracker();
|
|
tracker.apply({ type: "inflight", operation: "add", requests: [{ model: "A", id: "1" }, { model: "B", id: "2" }] });
|
|
assert.equal(tracker.count("A"), 1);
|
|
assert.equal(tracker.count("B"), 1);
|
|
tracker.apply({ type: "inflight", operation: "remove", id: "1" });
|
|
assert.equal(tracker.count("A"), 0);
|
|
assert.equal(tracker.count("B"), 1);
|
|
tracker.apply({ type: "inflight", operation: "remove", id: "999" });
|
|
assert.equal(tracker.count("B"), 1);
|
|
});
|
|
|
|
test("snapshot replaces prior in-flight state", () => {
|
|
const tracker = new InflightTracker();
|
|
tracker.apply({ type: "inflight", operation: "add", requests: [{ model: "A", id: "1" }] });
|
|
tracker.apply({ type: "inflight", operation: "snapshot", requests: [{ model: "A", id: "2" }] });
|
|
assert.equal(tracker.count("A"), 1);
|
|
assert.equal(tracker.count("B"), 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);
|
|
});
|