diff --git a/src/lib/server/dataPolling.ts b/src/lib/server/dataPolling.ts index 4d1f68c..8847be6 100644 --- a/src/lib/server/dataPolling.ts +++ b/src/lib/server/dataPolling.ts @@ -1,47 +1,16 @@ import type { ServiceData, ServicePoller } from '$lib/services/service'; import { getServiceRecord } from '$lib/services/services'; -import { readable, type Readable } from 'svelte/store'; +import { readable } from 'svelte/store'; import { serverConfig } from './config'; -type MayAsyncServiceData = ServiceData | Promise; - -let serviceData: MayAsyncServiceData[][] | undefined = undefined; - -function forEachService( - fn: (group: number, item: number, pollResult: Promise) => void -): MayAsyncServiceData[][] { - const config = serverConfig(); - - if (serviceData == undefined) { - serviceData = []; - } - - for (const [idxGroup, group] of config.services.entries()) { - if (serviceData[group] == undefined) { - serviceData[group] = []; - } - - for (const [idxItem, service] of group.items.entries()) { - const poller: ServicePoller = getServiceRecord(service.type || '').poll; - fn(idxGroup, idxItem, poller(service)); - } - } - return serviceData; -} +export type MayAsyncServiceData = ServiceData | Promise; export function getCurrentServiceData(): MayAsyncServiceData[][] { - if (serviceData != undefined) { + if (serviceData.length != 0) { return serviceData; } - return forEachService((group: number, item: number, pollResult: Promise) => { - (serviceData as MayAsyncServiceData[][])[group][item] = pollResult.then( - (data: ServiceData) => { - (serviceData as MayAsyncServiceData[][])[group][item] = data; - return data; - } - ); - }); + return pollAllServices(); } export interface ServiceDataEvent { @@ -50,24 +19,42 @@ export interface ServiceDataEvent { data: ServiceData; } -const pollInterval = 30000; - export const serviceDataEvents = readable(undefined, (set) => { console.debug('starting ServiceData polling loop every ' + pollInterval / 1000 + 's'); - const timer = setInterval(() => { - forEachService((group: number, item: number, result: Promise) => { - (serviceData as MayAsyncServiceData[][])[group][item] = result.then( - (data: ServiceData) => { - (serviceData as MayAsyncServiceData[][])[group][item] = data; - set({ group, item, data }); - return data; - } - ); - }); - }, pollInterval); - + pushServiceData = set; + const timer = setInterval(pollAllServices, pollInterval); return () => { console.debug('stopping ServiceData polling loop'); clearInterval(timer); + serviceData = []; + pushServiceData = () => {}; }; }); + +let pushServiceData: (value: ServiceDataEvent) => void = () => {}; + +const pollInterval = 30000; + +let serviceData: MayAsyncServiceData[][]; + +function pollAllServices(): MayAsyncServiceData[][] { + const config = serverConfig(); + + for (const [idxGroup, group] of config.services.entries()) { + if (serviceData[idxGroup] == undefined) { + serviceData[idxGroup] = []; + } + + for (const [idxItem, service] of group.items.entries()) { + const poller: ServicePoller = getServiceRecord(service.type || '').poll; + + serviceData[idxGroup][idxItem] = poller(service).then((data: ServiceData) => { + serviceData[idxGroup][idxItem] = data; + pushServiceData({ group: idxGroup, item: idxItem, data }); + return data; + }); + } + } + + return serviceData; +}