Skip to content

Commit 407cdd3

Browse files
committed
perf(dashboard): persist cache diagnostics across page navigation
Module-level cache stores events and watermark so navigating away and back renders instantly from cache instead of re-querying the full 200-row DB + log parse. Only incremental updates hit the DB.
1 parent 5c0f754 commit 407cdd3

File tree

1 file changed

+11
-9
lines changed

1 file changed

+11
-9
lines changed

packages/dashboard/src/components/CacheDiagnostics/CacheDiagnostics.tsx

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,28 @@ import { createSignal, For, Show, onCleanup, onMount } from "solid-js";
22
import type { DbCacheEvent, SessionCacheStats } from "../../lib/types";
33
import { formatDateTime, getCacheEventsFromDb, getSessions, truncate } from "../../lib/api";
44

5+
// Module-level cache — survives component unmount/remount (page navigation)
6+
let cachedEvents: DbCacheEvent[] = [];
7+
let cachedWatermark: number | null = null;
8+
59
export default function CacheDiagnostics() {
6-
const [events, setEvents] = createSignal<DbCacheEvent[]>([]);
10+
const [events, setEvents] = createSignal<DbCacheEvent[]>(cachedEvents);
711
const [sessionStats, setSessionStats] = createSignal<SessionCacheStats[]>([]);
812
const [sessionNames, setSessionNames] = createSignal<Record<string, string>>({});
9-
const [loading, setLoading] = createSignal(true);
13+
const [loading, setLoading] = createSignal(cachedEvents.length === 0);
1014
const [paused, setPaused] = createSignal(false);
1115
const [selectedSession, setSelectedSession] = createSignal<string | null>(null);
1216
const [hideSubagents, setHideSubagents] = createSignal(true);
1317
const [subagentIds, setSubagentIds] = createSignal<Set<string>>(new Set());
1418

15-
// Track watermark for incremental fetching — only fetch new events after initial load
16-
let watermark: number | null = null;
17-
1819
const fetchData = async () => {
1920
try {
2021
const [newEvents, sessions] = await Promise.all([
21-
getCacheEventsFromDb(200, watermark),
22+
getCacheEventsFromDb(200, cachedWatermark),
2223
getSessions(),
2324
]);
2425

25-
if (watermark === null) {
26+
if (cachedWatermark === null) {
2627
// Initial load — use full result
2728
setEvents(newEvents);
2829
} else if (newEvents.length > 0) {
@@ -31,10 +32,11 @@ export default function CacheDiagnostics() {
3132
setEvents(prev => [...prev, ...newEvents].slice(-200));
3233
}
3334

34-
// Update watermark to latest timestamp
35+
// Sync to module-level cache and update watermark
3536
const allEvents = events();
37+
cachedEvents = allEvents;
3638
if (allEvents.length > 0) {
37-
watermark = Math.max(...allEvents.map(e => e.timestamp));
39+
cachedWatermark = Math.max(...allEvents.map(e => e.timestamp));
3840
}
3941

4042
// Compute session stats client-side from cached events (no extra DB query)

0 commit comments

Comments
 (0)