Skip to content

Commit 3102d37

Browse files
feat: implement derived filtered logs and enhance live polling in KeyLogViewer
1 parent 1d1c746 commit 3102d37

2 files changed

Lines changed: 84 additions & 49 deletions

File tree

src/lib/components/KeyLogViewer.svelte

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,14 @@
3636
let chartTimeRange = $state<'30m' | '1h' | '2h' | '6h' | '24h' | 'all'>('all');
3737
let chartLogs = $state<KeyLogEntry[]>([]);
3838
39+
const filteredLogs = $derived(
40+
loggerState.logs.filter((log) => {
41+
if (loggerState.filterMode === 'all') return true;
42+
const match = valuesMatch(log.server1_value, log.server2_value);
43+
return loggerState.filterMode === 'match' ? match : !match;
44+
})
45+
);
46+
3947
const trendByLogId = $derived.by(() => {
4048
const map = new SvelteMap<
4149
number,
@@ -253,21 +261,19 @@
253261
}
254262
}
255263
256-
const filteredLogs = $derived(
257-
loggerState.logs.filter((log) => {
258-
if (loggerState.filterMode === 'all') return true;
259-
const match = valuesMatch(log.server1_value, log.server2_value);
260-
return loggerState.filterMode === 'match' ? match : !match;
261-
})
262-
);
263-
264264
onMount(() => {
265265
fetchLoggedEndpoints();
266-
if (loggerState.selectedEndpoint) {
267-
fetchKeyPaths(loggerState.selectedEndpoint);
268-
fetchLogs(false);
266+
});
267+
268+
$effect(() => {
269+
void loggedEndpoints;
270+
if (!loggerState.selectedEndpoint) {
271+
if (comparatorState.selectedEndpoint) {
272+
loggerState.selectedEndpoint = comparatorState.selectedEndpoint;
273+
} else if (loggedEndpoints.length > 0) {
274+
loggerState.selectedEndpoint = loggedEndpoints[0];
275+
}
269276
}
270-
fetchCount();
271277
});
272278
273279
$effect(() => {
@@ -293,9 +299,10 @@
293299
});
294300
});
295301
302+
let livePollTimer: ReturnType<typeof setInterval> | undefined = $state();
303+
296304
$effect(() => {
297305
void logState.lastUpdated;
298-
if (loggerState.timeRange !== 'live') return;
299306
untrack(() => {
300307
if (loggerState.selectedEndpoint) {
301308
fetchLogs(true);
@@ -304,6 +311,28 @@
304311
});
305312
});
306313
314+
$effect(() => {
315+
if (loggerState.timeRange === 'live' && loggerState.selectedEndpoint) {
316+
fetchLogs(true);
317+
fetchCount();
318+
livePollTimer = setInterval(() => {
319+
fetchLogs(true);
320+
fetchCount();
321+
}, 1000);
322+
return () => {
323+
if (livePollTimer !== undefined) {
324+
clearInterval(livePollTimer);
325+
livePollTimer = undefined;
326+
}
327+
};
328+
} else {
329+
if (livePollTimer !== undefined) {
330+
clearInterval(livePollTimer);
331+
livePollTimer = undefined;
332+
}
333+
}
334+
});
335+
307336
async function fetchLoggedEndpoints() {
308337
try {
309338
const res = await fetch('/api/keylog?meta=endpoints');
@@ -392,6 +421,7 @@
392421
: '/api/keylog';
393422
await fetch(url, { method: 'DELETE' });
394423
loggerState.logs = [];
424+
chartLogs = [];
395425
await fetchLoggedEndpoints();
396426
await fetchCount();
397427
} catch (e) {

src/routes/+page.svelte

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -364,46 +364,51 @@
364364
</div>
365365
{/snippet}
366366
</SplitPane>
367-
{:else if activeTab === 'comparator'}
368-
<ComparatorPanel />
369-
{:else if activeTab === 'protobuf'}
370-
<div class="h-full">
371-
<ProtobufPanel />
367+
{:else}
368+
<div class="h-full {activeTab !== 'comparator' ? 'hidden' : ''}">
369+
<ComparatorPanel />
372370
</div>
373-
{:else if activeTab === 'gtfs-static'}
374-
<div class="h-full">
375-
<GtfsStaticViewer />
371+
<div class="h-full {activeTab !== 'protobuf' ? 'hidden' : ''}">
372+
<div class="h-full">
373+
<ProtobufPanel />
374+
</div>
376375
</div>
377-
{:else if activeTab === 'logger'}
378-
<div class="flex h-full flex-col">
379-
<div class="mb-6 flex shrink-0 justify-center">
380-
<div class="inline-flex rounded-xl bg-gray-200/50 p-1 dark:bg-gray-800/50">
381-
<button
382-
onclick={() => (loggerSubTab = 'api')}
383-
class="rounded-lg px-6 py-2 text-sm font-bold transition-all {loggerSubTab === 'api'
384-
? 'bg-white text-green-600 shadow-sm dark:bg-gray-700 dark:text-green-400'
385-
: 'text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200'}"
386-
>
387-
API Response Logs
388-
</button>
389-
<button
390-
onclick={() => (loggerSubTab = 'gtfsrt')}
391-
class="rounded-lg px-6 py-2 text-sm font-bold transition-all {loggerSubTab ===
392-
'gtfsrt'
393-
? 'bg-white text-green-600 shadow-sm dark:bg-gray-700 dark:text-green-400'
394-
: 'text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200'}"
395-
>
396-
GTFS-RT Snapshots
397-
</button>
398-
</div>
376+
<div class="h-full {activeTab !== 'gtfs-static' ? 'hidden' : ''}">
377+
<div class="h-full">
378+
<GtfsStaticViewer />
399379
</div>
380+
</div>
381+
<div class="h-full {activeTab !== 'logger' ? 'hidden' : ''}">
382+
<div class="flex h-full flex-col">
383+
<div class="mb-6 flex shrink-0 justify-center">
384+
<div class="inline-flex rounded-xl bg-gray-200/50 p-1 dark:bg-gray-800/50">
385+
<button
386+
onclick={() => (loggerSubTab = 'api')}
387+
class="rounded-lg px-6 py-2 text-sm font-bold transition-all {loggerSubTab === 'api'
388+
? 'bg-white text-green-600 shadow-sm dark:bg-gray-700 dark:text-green-400'
389+
: 'text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200'}"
390+
>
391+
API Response Logs
392+
</button>
393+
<button
394+
onclick={() => (loggerSubTab = 'gtfsrt')}
395+
class="rounded-lg px-6 py-2 text-sm font-bold transition-all {loggerSubTab ===
396+
'gtfsrt'
397+
? 'bg-white text-green-600 shadow-sm dark:bg-gray-700 dark:text-green-400'
398+
: 'text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200'}"
399+
>
400+
GTFS-RT Snapshots
401+
</button>
402+
</div>
403+
</div>
400404

401-
<div class="min-h-0 flex-1">
402-
{#if loggerSubTab === 'api'}
403-
<KeyLogViewer />
404-
{:else}
405-
<GtfsRtLogViewer />
406-
{/if}
405+
<div class="min-h-0 flex-1">
406+
{#if loggerSubTab === 'api'}
407+
<KeyLogViewer />
408+
{:else}
409+
<GtfsRtLogViewer />
410+
{/if}
411+
</div>
407412
</div>
408413
</div>
409414
{/if}

0 commit comments

Comments
 (0)