feat(sync): implement separate API refresh loops for presentations and presenters
- Added dedicated background timers for room-level presentation and presenter metadata.\n- Staggered initial data fetches to prevent request storms during room entry.\n- Cleaned up redundant timer assignments and separated API refresh from native file sync.\n- Optimized loop frequencies for better balance between freshness and performance.
This commit is contained in:
@@ -22,10 +22,12 @@
|
|||||||
|
|
||||||
// Loop Timings (Visible in UI)
|
// Loop Timings (Visible in UI)
|
||||||
let loop_info = $state({
|
let loop_info = $state({
|
||||||
event: 120000,
|
event: 90000,
|
||||||
device: 60000,
|
device: 60000,
|
||||||
location: 90000,
|
location: 30000,
|
||||||
session: 45000
|
session: 15000,
|
||||||
|
presentation: 45000,
|
||||||
|
presenter: 60000
|
||||||
});
|
});
|
||||||
|
|
||||||
// Timer Handles
|
// Timer Handles
|
||||||
@@ -33,12 +35,15 @@
|
|||||||
let timer__device: any = $state(null);
|
let timer__device: any = $state(null);
|
||||||
let timer__location: any = $state(null);
|
let timer__location: any = $state(null);
|
||||||
let timer__session: any = $state(null);
|
let timer__session: any = $state(null);
|
||||||
|
let timer__presentation: any = $state(null);
|
||||||
|
let timer__presenter: any = $state(null);
|
||||||
|
let timer__file_sync: any = $state(null);
|
||||||
|
|
||||||
let is_syncing = false;
|
let is_syncing = false;
|
||||||
let show_monitor = $state(false);
|
let show_monitor = $state(false);
|
||||||
|
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
// 1. Initial hydration of native metadata (Phase 5)
|
// ... (hydration logic preserved)
|
||||||
if ($ae_loc.is_native) {
|
if ($ae_loc.is_native) {
|
||||||
try {
|
try {
|
||||||
const info = await native.get_device_info();
|
const info = await native.get_device_info();
|
||||||
@@ -64,27 +69,36 @@
|
|||||||
const dev = $ae_loc.native_device || {};
|
const dev = $ae_loc.native_device || {};
|
||||||
|
|
||||||
// Load timings from device config
|
// Load timings from device config
|
||||||
loop_info.event = dev.check_event_loop_period || 90000;
|
loop_info.event = dev.check_event_loop_period || 120000;
|
||||||
loop_info.device = dev.check_event_device_loop_period || 60000;
|
loop_info.device = dev.check_event_device_loop_period || 90000;
|
||||||
loop_info.location = dev.check_event_location_loop_period || 30000;
|
loop_info.location = dev.check_event_location_loop_period || 60000;
|
||||||
loop_info.session = dev.check_event_session_loop_period || 10000;
|
loop_info.session = dev.check_event_session_loop_period || 45000;
|
||||||
|
loop_info.presentation = dev.check_event_presentation_loop_period || 90000;
|
||||||
|
loop_info.presenter = dev.check_event_presenter_loop_period || 45000;
|
||||||
|
|
||||||
// Timers run in both browser and native for dev/testing
|
// 1. Structural/Metadata Loops
|
||||||
timer__event = setInterval(() => run_sync_cycle(), loop_info.event);
|
timer__event = setInterval(() => refresh_event_data(), loop_info.event);
|
||||||
timer__device = setInterval(
|
timer__device = setInterval(() => run_device_heartbeat(), loop_info.device);
|
||||||
() => run_device_heartbeat(),
|
timer__location = setInterval(() => refresh_location_config(), loop_info.location);
|
||||||
loop_info.device
|
|
||||||
);
|
|
||||||
timer__location = setInterval(
|
|
||||||
() => refresh_location_config(),
|
|
||||||
loop_info.location
|
|
||||||
);
|
|
||||||
timer__session = setInterval(() => run_sync_cycle(), loop_info.session);
|
|
||||||
|
|
||||||
// Immediate first run
|
// 2. Room Content Refresh Loops (API -> Dexie)
|
||||||
run_sync_cycle();
|
timer__session = setInterval(() => refresh_session_data(), loop_info.session);
|
||||||
|
timer__presentation = setInterval(() => refresh_presentation_data(), loop_info.presentation);
|
||||||
|
timer__presenter = setInterval(() => refresh_presenter_data(), loop_info.presenter);
|
||||||
|
|
||||||
|
// 3. Native File Sync Loop (Dexie -> Disk)
|
||||||
|
const sync_period = dev.check_file_sync_loop_period || 10000;
|
||||||
|
timer__file_sync = setInterval(() => run_sync_cycle(), sync_period);
|
||||||
|
|
||||||
|
// Immediate first run for metadata
|
||||||
|
refresh_event_data();
|
||||||
run_device_heartbeat();
|
run_device_heartbeat();
|
||||||
refresh_location_config();
|
refresh_location_config();
|
||||||
|
|
||||||
|
// Stagger initial data fetches
|
||||||
|
setTimeout(() => refresh_session_data(), 1000);
|
||||||
|
setTimeout(() => refresh_presentation_data(), 3000);
|
||||||
|
setTimeout(() => refresh_presenter_data(), 5000);
|
||||||
});
|
});
|
||||||
|
|
||||||
onDestroy(() => {
|
onDestroy(() => {
|
||||||
@@ -92,8 +106,78 @@
|
|||||||
if (timer__device) clearInterval(timer__device);
|
if (timer__device) clearInterval(timer__device);
|
||||||
if (timer__location) clearInterval(timer__location);
|
if (timer__location) clearInterval(timer__location);
|
||||||
if (timer__session) clearInterval(timer__session);
|
if (timer__session) clearInterval(timer__session);
|
||||||
|
if (timer__presentation) clearInterval(timer__presentation);
|
||||||
|
if (timer__presenter) clearInterval(timer__presenter);
|
||||||
|
if (timer__file_sync) clearInterval(timer__file_sync);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* API Refresh: Event
|
||||||
|
*/
|
||||||
|
async function refresh_event_data() {
|
||||||
|
if (!$events_slct.event_id) return;
|
||||||
|
try {
|
||||||
|
await events_func.load_ae_obj_id__event({
|
||||||
|
api_cfg: $ae_api,
|
||||||
|
event_id: $events_slct.event_id,
|
||||||
|
try_cache: true,
|
||||||
|
log_lvl: 0
|
||||||
|
});
|
||||||
|
} catch (err) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* API Refresh: Sessions in Room
|
||||||
|
*/
|
||||||
|
async function refresh_session_data() {
|
||||||
|
const location_id = $events_slct.event_location_id;
|
||||||
|
if (!location_id) return;
|
||||||
|
try {
|
||||||
|
await events_func.load_ae_obj_li__event_session({
|
||||||
|
api_cfg: $ae_api,
|
||||||
|
for_obj_type: 'event_location',
|
||||||
|
for_obj_id: location_id,
|
||||||
|
view: 'alt',
|
||||||
|
try_cache: true,
|
||||||
|
log_lvl: 0
|
||||||
|
});
|
||||||
|
} catch (err) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* API Refresh: Presentations in Room
|
||||||
|
*/
|
||||||
|
async function refresh_presentation_data() {
|
||||||
|
const location_id = $events_slct.event_location_id;
|
||||||
|
if (!location_id) return;
|
||||||
|
try {
|
||||||
|
await events_func.load_ae_obj_li__event_presentation({
|
||||||
|
api_cfg: $ae_api,
|
||||||
|
for_obj_type: 'event_location',
|
||||||
|
for_obj_id: location_id,
|
||||||
|
try_cache: true,
|
||||||
|
log_lvl: 0
|
||||||
|
});
|
||||||
|
} catch (err) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* API Refresh: Presenters in Room
|
||||||
|
*/
|
||||||
|
async function refresh_presenter_data() {
|
||||||
|
const location_id = $events_slct.event_location_id;
|
||||||
|
if (!location_id) return;
|
||||||
|
try {
|
||||||
|
await events_func.load_ae_obj_li__event_presenter({
|
||||||
|
api_cfg: $ae_api,
|
||||||
|
for_obj_type: 'event_location',
|
||||||
|
for_obj_id: location_id,
|
||||||
|
try_cache: true,
|
||||||
|
log_lvl: 0
|
||||||
|
});
|
||||||
|
} catch (err) {}
|
||||||
|
}
|
||||||
|
|
||||||
async function run_sync_cycle() {
|
async function run_sync_cycle() {
|
||||||
const location_id = $events_slct.event_location_id;
|
const location_id = $events_slct.event_location_id;
|
||||||
const cache_root = $ae_loc.local_file_cache_path;
|
const cache_root = $ae_loc.local_file_cache_path;
|
||||||
|
|||||||
Reference in New Issue
Block a user