feat(FN-4921): merge fusion/fn-4921
This commit is contained in:
@@ -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",
|
||||
});
|
||||
});
|
||||
});
|
||||
49
packages/dashboard/app/utils/dashboardTraceBuffer.ts
Normal file
49
packages/dashboard/app/utils/dashboardTraceBuffer.ts
Normal 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,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user