Refactors on demand data polling.

This commit is contained in:
2023-09-26 10:59:38 +02:00
parent 9f7e1cf7ba
commit be4c25d333

View File

@@ -1,47 +1,16 @@
import type { ServiceData, ServicePoller } from '$lib/services/service'; import type { ServiceData, ServicePoller } from '$lib/services/service';
import { getServiceRecord } from '$lib/services/services'; import { getServiceRecord } from '$lib/services/services';
import { readable, type Readable } from 'svelte/store'; import { readable } from 'svelte/store';
import { serverConfig } from './config'; import { serverConfig } from './config';
type MayAsyncServiceData = ServiceData | Promise<ServiceData>; export type MayAsyncServiceData = ServiceData | Promise<ServiceData>;
let serviceData: MayAsyncServiceData[][] | undefined = undefined;
function forEachService(
fn: (group: number, item: number, pollResult: Promise<ServiceData>) => 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 function getCurrentServiceData(): MayAsyncServiceData[][] { export function getCurrentServiceData(): MayAsyncServiceData[][] {
if (serviceData != undefined) { if (serviceData.length != 0) {
return serviceData; return serviceData;
} }
return forEachService((group: number, item: number, pollResult: Promise<ServiceData>) => { return pollAllServices();
(serviceData as MayAsyncServiceData[][])[group][item] = pollResult.then(
(data: ServiceData) => {
(serviceData as MayAsyncServiceData[][])[group][item] = data;
return data;
}
);
});
} }
export interface ServiceDataEvent { export interface ServiceDataEvent {
@@ -50,24 +19,42 @@ export interface ServiceDataEvent {
data: ServiceData; data: ServiceData;
} }
const pollInterval = 30000;
export const serviceDataEvents = readable<ServiceDataEvent>(undefined, (set) => { export const serviceDataEvents = readable<ServiceDataEvent>(undefined, (set) => {
console.debug('starting ServiceData polling loop every ' + pollInterval / 1000 + 's'); console.debug('starting ServiceData polling loop every ' + pollInterval / 1000 + 's');
const timer = setInterval(() => { pushServiceData = set;
forEachService((group: number, item: number, result: Promise<ServiceData>) => { const timer = setInterval(pollAllServices, pollInterval);
(serviceData as MayAsyncServiceData[][])[group][item] = result.then(
(data: ServiceData) => {
(serviceData as MayAsyncServiceData[][])[group][item] = data;
set({ group, item, data });
return data;
}
);
});
}, pollInterval);
return () => { return () => {
console.debug('stopping ServiceData polling loop'); console.debug('stopping ServiceData polling loop');
clearInterval(timer); 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;
}