feat: add SSE parser and in-flight request tracker
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
export interface InflightRequest {
|
||||
id?: string;
|
||||
model: string;
|
||||
req_path?: string;
|
||||
method?: string;
|
||||
timestamp?: string;
|
||||
elapsed_ms?: number;
|
||||
}
|
||||
|
||||
export interface ModelState {
|
||||
id: string;
|
||||
state: string;
|
||||
}
|
||||
|
||||
export type FeedEvent =
|
||||
| { type: "inflight"; operation: "snapshot" | "add" | "remove"; requests: InflightRequest[] }
|
||||
| { type: "modelStatus"; models: ModelState[] };
|
||||
|
||||
export type ModelRuntimeState = "stopped" | "loading" | "ready";
|
||||
|
||||
export class InflightTracker {
|
||||
private counts = new Map<string, number>();
|
||||
private states = new Map<string, ModelRuntimeState>();
|
||||
|
||||
apply(event: FeedEvent): void {
|
||||
if (event.type === "inflight") {
|
||||
if (event.operation === "snapshot") {
|
||||
const counts = new Map<string, number>();
|
||||
for (const r of event.requests) counts.set(r.model, (counts.get(r.model) ?? 0) + 1);
|
||||
this.counts = counts;
|
||||
} else if (event.operation === "add") {
|
||||
for (const r of event.requests) this.counts.set(r.model, (this.counts.get(r.model) ?? 0) + 1);
|
||||
} else if (event.operation === "remove") {
|
||||
for (const r of event.requests) {
|
||||
const c = this.counts.get(r.model) ?? 0;
|
||||
if (c <= 1) this.counts.delete(r.model);
|
||||
else this.counts.set(r.model, c - 1);
|
||||
}
|
||||
}
|
||||
} else if (event.type === "modelStatus") {
|
||||
for (const m of event.models) this.states.set(m.id, normalizeState(m.state));
|
||||
}
|
||||
}
|
||||
|
||||
count(modelId: string): number {
|
||||
return this.counts.get(modelId) ?? 0;
|
||||
}
|
||||
|
||||
state(modelId: string): ModelRuntimeState | undefined {
|
||||
return this.states.get(modelId);
|
||||
}
|
||||
}
|
||||
|
||||
function normalizeState(state: string): ModelRuntimeState {
|
||||
if (state === "ready") return "ready";
|
||||
if (state === "loading") return "loading";
|
||||
return "stopped";
|
||||
}
|
||||
Reference in New Issue
Block a user