chore(control): improve app startup and display status ping behavior

This commit is contained in:
E44
2026-01-18 13:17:53 +01:00
parent b57ea762bf
commit 922b47bd1e
3 changed files with 67 additions and 25 deletions
+47 -14
View File
@@ -5,26 +5,59 @@ import { update_folder_elements_recursively } from './stores/files';
import { db } from './database';
const update_display_status_interval_seconds = 20;
const update_display_loading_status_interval_seconds = 2;
export async function on_start() {
const loading_display_ids: string[] = [];
export async function on_app_start() {
await db.files.clear();
await db.files_on_display.clear();
await update_all_display_status();
await setInterval(update_all_display_status, update_display_status_interval_seconds * 1000);
await update_all_display_status(false);
await setInterval(
() => update_all_display_status(false),
update_display_status_interval_seconds * 1000
);
await setInterval(
() => update_all_display_status(true),
update_display_loading_status_interval_seconds * 1000
);
}
async function update_all_display_status() {
const all_displays: Display[] = await db.displays.toArray();
for (const display of all_displays) {
const new_status = await ping_ip(display.ip);
if (new_status === null && display.status !== null) continue;
if (new_status === 'app_online' && display.status !== 'app_online') {
on_display_start(display);
}
if (new_status !== display.status) {
display.status = new_status;
await db.displays.put(display); // save
async function update_all_display_status(only_loading_displays: boolean) {
const not_loading_displays: Display[] = await db.displays
.filter((d) =>
only_loading_displays
? loading_display_ids.includes(d.id)
: !loading_display_ids.includes(d.id)
)
.toArray();
for (const display of not_loading_displays) {
await update_display_status(display);
}
}
export async function update_display_status(display: Display) {
const new_status = await ping_ip(display.ip);
if (new_status === null && display.status !== null) return;
if (new_status !== display.status) {
// status change
if (new_status === 'app_offline') {
loading_display_ids.push(display.id);
} else {
remove_display_from_loading_displays(display.id);
if (new_status === 'app_online') {
on_display_start(display);
}
}
display.status = new_status;
await db.displays.put(display); // save
}
}
export function remove_display_from_loading_displays(display_id: string) {
const index = loading_display_ids.indexOf(display_id);
if (index !== -1) {
loading_display_ids.splice(index, 1);
}
}