adds round telemetry support
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
<script lang="ts">
|
||||
import { telemetryByServer, uiNow } from '$ui/stores/servers.js';
|
||||
import { elapsedSince } from '$ui/duration.js';
|
||||
let { name }: { name: string } = $props();
|
||||
let report = $derived($telemetryByServer.get(name));
|
||||
</script>
|
||||
|
||||
{#if report}
|
||||
<div class="round" aria-live="polite">
|
||||
<strong>Round {report.round}</strong>
|
||||
<span title={report.receivedAt}>Last reported {elapsedSince(report.receivedAt, $uiNow)} ago · {report.players} players</span>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<style>
|
||||
.round { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--space-2); }
|
||||
strong { color: var(--text-primary); font-family: var(--font-mono); }
|
||||
span { color: var(--text-tertiary); font-size: var(--text-xs); }
|
||||
</style>
|
||||
@@ -1,4 +1,5 @@
|
||||
<script lang="ts">
|
||||
import RoundTelemetry from './RoundTelemetry.svelte';
|
||||
import type { RosterPlayer, Health } from '$ui/stores/servers.js';
|
||||
import { uiNow } from '$ui/stores/servers.js';
|
||||
import { gametypeLabel } from '$ui/gametype.js';
|
||||
@@ -118,6 +119,8 @@
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<RoundTelemetry {name} />
|
||||
|
||||
{#if showTiming}
|
||||
<div class="timing">
|
||||
{#if activeElapsed}
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
import { writable, readonly } from 'svelte/store';
|
||||
import { browser } from '$app/environment';
|
||||
import type { RoundTelemetry } from '$lib/telemetry.js';
|
||||
|
||||
export const telemetryByServer = writable<Map<string, RoundTelemetry>>(new Map());
|
||||
|
||||
export interface RosterPlayer {
|
||||
num: number | null;
|
||||
@@ -49,6 +52,14 @@ let source: EventSource | null = null;
|
||||
export function startServerStream(): void {
|
||||
if (!browser || source) return;
|
||||
source = new EventSource('/api/events/servers');
|
||||
source.addEventListener('server-telemetry', (evt) => {
|
||||
const data = JSON.parse((evt as MessageEvent).data) as { entries: RoundTelemetry[]; snapshot?: boolean };
|
||||
telemetryByServer.update((previous) => {
|
||||
const next = data.snapshot ? new Map<string, RoundTelemetry>() : new Map(previous);
|
||||
for (const entry of data.entries) next.set(entry.server, entry);
|
||||
return next;
|
||||
});
|
||||
});
|
||||
source.addEventListener('server-status', (evt) => {
|
||||
const data = JSON.parse((evt as MessageEvent).data) as { entries: ServerStatus[] };
|
||||
statusByServer.update(() => {
|
||||
|
||||
Reference in New Issue
Block a user