From ca1badad0046463fb0559a1cc321145db5a00479 Mon Sep 17 00:00:00 2001 From: Alexandre Tuleu Date: Tue, 26 Sep 2023 14:00:43 +0200 Subject: [PATCH] Fixes reactivity. --- src/hooks.server.ts | 2 -- src/lib/components/ServiceCard.svelte | 4 +-- src/lib/server/config.ts | 4 +-- src/lib/server/dataPolling.ts | 31 +++++++++++++---------- src/lib/server/serviceDataPolling.ts | 36 --------------------------- src/routes/+page.server.ts | 4 --- src/routes/+page.svelte | 11 ++++++-- 7 files changed, 31 insertions(+), 61 deletions(-) delete mode 100644 src/lib/server/serviceDataPolling.ts diff --git a/src/hooks.server.ts b/src/hooks.server.ts index e60c4f5..734486f 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -1,6 +1,5 @@ import { dev } from '$app/environment'; import { initConfig, watchDymamicConfig } from '$lib/server/config'; -import { initServicePolling } from '$lib/server/serviceDataPolling'; import { initComponents, initServices } from '$lib/services/services'; if (!dev) { @@ -12,4 +11,3 @@ if (!dev) { await initServices(); await initComponents(); initConfig(); -initServicePolling(); diff --git a/src/lib/components/ServiceCard.svelte b/src/lib/components/ServiceCard.svelte index ee6e1b0..cf83396 100644 --- a/src/lib/components/ServiceCard.svelte +++ b/src/lib/components/ServiceCard.svelte @@ -10,7 +10,7 @@ const component = getServiceComponent(service.type || ''); - function computeClasses(): string { + function computeClasses(status: ServiceStatus | undefined): string { switch (status) { case 'offline': return 'bg-error-400'; @@ -20,7 +20,7 @@ return 'bg-warning-400 animate-pulse'; } } - $: statusClasses = computeClasses(); + $: statusClasses = computeClasses(status); = { title: '', @@ -191,7 +191,7 @@ let _clientConfig: Config = defaultConfig; function buildServerAndClientConfig(config: SPOJO) { _serverConfig = mergeConfig(defaultConfig, config); _clientConfig = stripPrivateFields(_serverConfig); - initializeServiceData(); + resetServiceData(); } export function initConfig() { diff --git a/src/lib/server/dataPolling.ts b/src/lib/server/dataPolling.ts index 54b0271..ed1f64c 100644 --- a/src/lib/server/dataPolling.ts +++ b/src/lib/server/dataPolling.ts @@ -8,15 +8,6 @@ export type MayAsyncServiceData = Partial | Promise> { - logger.trace('getCurrentServiceData()'); - if (serviceData.length != 0) { - return serviceData; - } - logger.debug('polling for initial state'); - return pollAllServices(); -} - export interface ServiceDataEvent { group: number; item: number; @@ -28,21 +19,33 @@ export const serviceDataEvents = readable(undefined, (set) => pushServiceData = set; + if (serviceData.length == 0) { + logger.debug('polling for initial state'); + pollAllServices(); + } const timer = setInterval(() => { logger.debug('polling for service update'); pollAllServices(); }, pollInterval); + return () => { logger.debug('stopping polling loop and clearing data'); clearInterval(timer); serviceData = []; - pushServiceData = () => {}; + pushServiceData = undefined; }; }); -let pushServiceData: (value: ServiceDataEvent) => void = () => {}; +export function resetServiceData() { + serviceData = []; + if (pushServiceData != undefined) { + pollAllServices(); + } +} -const pollInterval = 5000; +let pushServiceData: ((value: ServiceDataEvent) => void) | undefined = undefined; + +const pollInterval = 30000; let serviceData: Array> = []; @@ -62,7 +65,9 @@ function pollAllServices(): Array> { .then((data: ServiceData) => { serviceLogger.trace({ data }, 'pollAllService:result()'); serviceData[idxGroup][idxItem] = data; - pushServiceData({ group: idxGroup, item: idxItem, data }); + if (pushServiceData != undefined) { + pushServiceData({ group: idxGroup, item: idxItem, data }); + } return data; }) .catch((error) => { diff --git a/src/lib/server/serviceDataPolling.ts b/src/lib/server/serviceDataPolling.ts deleted file mode 100644 index be89288..0000000 --- a/src/lib/server/serviceDataPolling.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { Config } from '$lib/config'; -import type { ServiceData, ServicePoller } from '$lib/services/service'; -import { getServiceRecord } from '$lib/services/services'; -import { serverConfig } from './config'; - -export const serviceData: Array | Promise>>> = []; - -function pollServices() { - const config: Config = serverConfig(); - - for (const [i, group] of config.services.entries()) { - for (const [j, service] of group.items.entries()) { - const poller: ServicePoller = getServiceRecord(service.type || '').poll; - serviceData[i][j] = poller(service).then((data: ServiceData) => { - serviceData[i][j] = data; - return data; - }); - } - } -} - -export function initializeServiceData() { - const config = serverConfig(); - serviceData.length = config.services.length; - for (let i = 0; i < serviceData.length; i++) { - serviceData[i] = []; - for (let j = 0; j < config.services[i].items.length; j++) { - serviceData[i][j] = {}; - } - } -} - -export function initServicePolling() { - pollServices(); - setInterval(pollServices, 30000); -} diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts index 5d98ede..49bb926 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+page.server.ts @@ -1,8 +1,5 @@ import { clientAddressIsPrivate, clientConfig, serverConfig } from '$lib/server/config'; import type { PageServerLoad } from './$types.d'; -import { serviceData } from '$lib/server/serviceDataPolling'; -import { getCurrentServiceData } from '$lib/server/dataPolling'; -import { request } from '@playwright/test'; import { requestLogger } from '$lib/server/logger'; export const load: PageServerLoad = async ({ getClientAddress }) => { @@ -12,7 +9,6 @@ export const load: PageServerLoad = async ({ getClientAddress }) => { return { config: clientConfig(), - serviceData: getCurrentServiceData(), location: getClientAddress(), privateAccess: clientAddressIsPrivate(getClientAddress(), serverConfig()) }; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 8462cb0..72dc40c 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -5,17 +5,24 @@ import { onMount } from 'svelte'; import type { PageData } from './$types'; import type { ServiceDataEvent } from '$lib/server/dataPolling'; + import type { ServiceData } from '$lib/services/service'; export let data: PageData; + const serviceData: Array>> = []; + for (const [i, group] of data.config.services.entries()) { + serviceData[i] = new Array(group.items.length).fill({}); + } onMount(() => { const sse = new EventSource('/api/updates'); + sse.onmessage = (e) => { if (e.data == undefined || e.data === 'undefined') { return; } const event = JSON.parse(e.data) as ServiceDataEvent; - data.serviceData[event.group][event.item] = event.data; + serviceData[event.group][event.item] = event.data; + console.log(event.data); }; return () => { @@ -56,7 +63,7 @@
{#each data.config.services as group, i} - + {/each}