diff --git a/src/lib/server/dataPolling.ts b/src/lib/server/dataPolling.ts index ed1f64c..a5aabfb 100644 --- a/src/lib/server/dataPolling.ts +++ b/src/lib/server/dataPolling.ts @@ -3,8 +3,7 @@ import { getServiceRecord } from '$lib/services/services'; import { readable } from 'svelte/store'; import { serverConfig } from './config'; import { rootLogger } from './logger'; - -export type MayAsyncServiceData = Partial | Promise>; +import type { Unsubscriber } from 'svelte/motion'; const logger = rootLogger.child({ name: 'ServiceData' }); @@ -14,15 +13,22 @@ export interface ServiceDataEvent { data: ServiceData; } -export const serviceDataEvents = readable(undefined, (set) => { +export function subscribeToDataEvent(onEvent: (event: ServiceDataEvent) => void): Unsubscriber { + for (const [group, items] of serviceData.entries()) { + for (const [item, data] of items.entries()) { + onEvent({ group, item, data: data as ServiceData }); + } + } + return serviceDataEvents.subscribe(onEvent); +} + +const serviceDataEvents = readable(undefined, (set) => { logger.debug({ interval: pollInterval }, 'starting polling loop'); pushServiceData = set; - if (serviceData.length == 0) { - logger.debug('polling for initial state'); - pollAllServices(); - } + logger.debug('polling for initial state'); + pollAllServices(); const timer = setInterval(() => { logger.debug('polling for service update'); pollAllServices(); @@ -47,9 +53,9 @@ let pushServiceData: ((value: ServiceDataEvent) => void) | undefined = undefined const pollInterval = 30000; -let serviceData: Array> = []; +let serviceData: Array>> = []; -function pollAllServices(): Array> { +function pollAllServices() { logger.trace('pollAllServices()'); const config = serverConfig(); @@ -61,7 +67,8 @@ function pollAllServices(): Array> { for (const [idxItem, service] of group.items.entries()) { const poller: ServicePoller = getServiceRecord(service.type || '').poll; const serviceLogger = logger.child({ group: idxGroup, item: idxItem, service }); - serviceData[idxGroup][idxItem] = poller(service) + serviceData[idxGroup][idxItem] = {}; + poller(service) .then((data: ServiceData) => { serviceLogger.trace({ data }, 'pollAllService:result()'); serviceData[idxGroup][idxItem] = data; @@ -76,6 +83,4 @@ function pollAllServices(): Array> { }); } } - - return serviceData; } diff --git a/src/routes/api/updates/+server.ts b/src/routes/api/updates/+server.ts index efdcf44..3b76f75 100644 --- a/src/routes/api/updates/+server.ts +++ b/src/routes/api/updates/+server.ts @@ -1,5 +1,5 @@ -import { serviceDataEvents } from '$lib/server/dataPolling'; -import { requestLogger, rootLogger } from '$lib/server/logger'; +import { subscribeToDataEvent } from '$lib/server/dataPolling'; +import { requestLogger } from '$lib/server/logger'; import type { RequestHandler } from '@sveltejs/kit'; import type { Unsubscriber } from 'svelte/store'; @@ -17,7 +17,7 @@ export const GET: RequestHandler = ({ getClientAddress }) => { start: (controller) => { logger.info('new update request stream started'); - unsubscribe = serviceDataEvents.subscribe((event) => { + unsubscribe = subscribeToDataEvent((event) => { logger.trace({ event: event }, 'sending new event'); const data = `event:message\ndata:${JSON.stringify(event)}\n\n`; controller.enqueue(data);