Refactors on demand data polling.
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user