feat(FN-4921): merge fusion/fn-4921

This commit is contained in:
gsxdsm
2026-05-17 19:11:59 -07:00
parent bf0e9a3e37
commit f9cf3f1bde
9 changed files with 644 additions and 52 deletions

View File

@@ -0,0 +1,47 @@
/**
* @vitest-environment jsdom
*/
import { beforeEach, describe, expect, it } from "vitest";
import { clearTraces, getTraces, pushTrace } from "../dashboardTraceBuffer";
describe("dashboardTraceBuffer", () => {
beforeEach(() => {
clearTraces();
});
it("appends trace entries", () => {
pushTrace("versionCheck", "mismatch", { local: "a", remote: "b" });
const traces = getTraces();
expect(traces).toHaveLength(1);
expect(traces[0]).toMatchObject({
source: "versionCheck",
event: "mismatch",
detail: { local: "a", remote: "b" },
});
expect(typeof traces[0].ts).toBe("string");
});
it("caps entries at 200 and drops oldest", () => {
for (let i = 0; i < 205; i += 1) {
pushTrace("sse-bus", "event", { idx: i });
}
const traces = getTraces();
expect(traces).toHaveLength(200);
expect(traces[0]?.detail).toEqual({ idx: 5 });
expect(traces[199]?.detail).toEqual({ idx: 204 });
});
it("exposes traces via window.__fusionDebug.dashboardTraces.get", () => {
pushTrace("useTasks", "dropped-stale-event", { count: 1 });
const debugApi = window.__fusionDebug?.dashboardTraces;
expect(debugApi).toBeDefined();
expect(debugApi?.get()).toHaveLength(1);
expect(debugApi?.get()[0]).toMatchObject({
source: "useTasks",
event: "dropped-stale-event",
});
});
});

View File

@@ -0,0 +1,49 @@
export type TraceEntry = {
ts: string;
source: string;
event: string;
detail: Record<string, unknown>;
};
const TRACE_CAP = 200;
const traces: TraceEntry[] = [];
export function pushTrace(source: string, event: string, detail: Record<string, unknown>): void {
traces.push({
ts: new Date().toISOString(),
source,
event,
detail,
});
if (traces.length > TRACE_CAP) {
traces.splice(0, traces.length - TRACE_CAP);
}
}
export function getTraces(): TraceEntry[] {
return [...traces];
}
export function clearTraces(): void {
traces.length = 0;
}
declare global {
interface Window {
__fusionDebug?: {
dashboardTraces?: {
get: typeof getTraces;
clear: typeof clearTraces;
};
};
}
}
if (typeof window !== "undefined") {
window.__fusionDebug ??= {};
window.__fusionDebug.dashboardTraces = {
get: getTraces,
clear: clearTraces,
};
}