diff --git a/apps/forwarder-ui/src/lib/api.test.ts b/apps/forwarder-ui/src/lib/api.test.ts index d9d93d52..5f9eae53 100644 --- a/apps/forwarder-ui/src/lib/api.test.ts +++ b/apps/forwarder-ui/src/lib/api.test.ts @@ -34,6 +34,8 @@ describe("forwarder api client", () => { approval_state: "pending", waiting_for_approval: true, message: "Waiting for server admin approval", + cached: true, + checked_unix_ms: 1700000000000, }, readers: [], }), diff --git a/apps/forwarder-ui/src/lib/api.ts b/apps/forwarder-ui/src/lib/api.ts index f12c51ec..a0e5fb16 100644 --- a/apps/forwarder-ui/src/lib/api.ts +++ b/apps/forwarder-ui/src/lib/api.ts @@ -50,6 +50,8 @@ export interface ServerDeviceStatus { approval_state: string | null; waiting_for_approval: boolean; message: string | null; + cached: boolean; + checked_unix_ms: number | null; } export interface ForwarderStatus { diff --git a/apps/forwarder-ui/src/lib/config-load.test.ts b/apps/forwarder-ui/src/lib/config-load.test.ts index e775df84..d42ccb19 100644 --- a/apps/forwarder-ui/src/lib/config-load.test.ts +++ b/apps/forwarder-ui/src/lib/config-load.test.ts @@ -25,6 +25,8 @@ function makeStatus(restart_needed: boolean): ForwarderStatus { approval_state: null, waiting_for_approval: false, message: null, + cached: true, + checked_unix_ms: null, }, readers: [], }; diff --git a/apps/forwarder-ui/src/lib/reader-status-cache.test.ts b/apps/forwarder-ui/src/lib/reader-status-cache.test.ts index 1dda2e68..1081490b 100644 --- a/apps/forwarder-ui/src/lib/reader-status-cache.test.ts +++ b/apps/forwarder-ui/src/lib/reader-status-cache.test.ts @@ -30,6 +30,8 @@ function makeStatus(readers: ForwarderStatus["readers"]): ForwarderStatus { approval_state: null, waiting_for_approval: false, message: null, + cached: true, + checked_unix_ms: null, }, readers, }; diff --git a/apps/forwarder-ui/src/lib/sse.ts b/apps/forwarder-ui/src/lib/sse.ts index d641f51f..2b292bf9 100644 --- a/apps/forwarder-ui/src/lib/sse.ts +++ b/apps/forwarder-ui/src/lib/sse.ts @@ -1,5 +1,10 @@ import { createSSE, type SseHandle } from "@rusty-timer/shared-ui/lib/sse"; -import type { ReaderInfo, ReaderStatus, UpdateStatusResponse } from "./api"; +import type { + ReaderInfo, + ReaderStatus, + ServerDeviceStatus, + UpdateStatusResponse, +} from "./api"; export type ForwarderSseCallbacks = { onStatusChanged: (data: { @@ -19,6 +24,7 @@ export type ForwarderSseCallbacks = { available: boolean; status: any | null; }) => void; + onServerStatusChanged?: (payload: { server: ServerDeviceStatus }) => void; }; let handle: SseHandle | null = null; @@ -57,6 +63,9 @@ export function initSSE(callbacks: ForwarderSseCallbacks): void { }) => { callbacks.onUpsStatusChanged?.(data); }, + server_status_changed: (data: { server: ServerDeviceStatus }) => { + callbacks.onServerStatusChanged?.(data); + }, }, (connected) => { callbacks.onConnectionChange(connected); diff --git a/apps/forwarder-ui/src/routes/+page.svelte b/apps/forwarder-ui/src/routes/+page.svelte index 560c9f64..44cd9e0c 100644 --- a/apps/forwarder-ui/src/routes/+page.svelte +++ b/apps/forwarder-ui/src/routes/+page.svelte @@ -508,6 +508,11 @@ onUpsStatusChanged: (payload) => { upsState = { available: payload.available, status: payload.status }; }, + onServerStatusChanged: (payload) => { + if (status) { + status = { ...status, server: payload.server }; + } + }, onUpdateStatusChanged: (us) => { if ( (us.status === "available" || us.status === "downloaded") && diff --git a/apps/receiver-ui/src/lib/components/ForwarderConfigModal.svelte b/apps/receiver-ui/src/lib/components/ForwarderConfigModal.svelte index c99ccf78..e84b8bcf 100644 --- a/apps/receiver-ui/src/lib/components/ForwarderConfigModal.svelte +++ b/apps/receiver-ui/src/lib/components/ForwarderConfigModal.svelte @@ -257,11 +257,15 @@
+

+ Managed locally on the forwarder — not editable remotely. +