/* === CoreScope — channels.js === */ 'use strict'; (function () { let channels = []; let selectedHash = null; let messages = []; let wsHandler = null; let autoScroll = true; let nodeCache = {}; let selectedNode = null; let observerIataById = {}; let observerIataByName = {}; let messageRequestId = 0; var _nodeCacheTTL = 5 * 60 * 1000; // 5 minutes function getSelectedRegionsSnapshot() { var rp = RegionFilter.getRegionParam(); return rp ? rp.split(',').filter(Boolean) : null; } function normalizeObserverNameKey(name) { if (!name) return ''; return String(name).trim().toLowerCase(); } function shouldProcessWSMessageForRegion(msg, selectedRegions, observerRegionsById, observerRegionsByName) { if (!selectedRegions || !selectedRegions.length) return true; if (observerRegionsById && observerRegionsById.byId) { observerRegionsByName = observerRegionsById.byName || {}; observerRegionsById = observerRegionsById.byId || {}; } observerRegionsById = observerRegionsById || {}; observerRegionsByName = observerRegionsByName || {}; var observerId = msg?.data?.packet?.observer_id || msg?.data?.observer_id || null; var observerRegion = observerId ? observerRegionsById[observerId] : null; if (!observerRegion) { var observerName = msg?.data?.packet?.observer_name || msg?.data?.observer_name || msg?.data?.observer || null; var observerNameKey = normalizeObserverNameKey(observerName); if (observerName) observerRegion = observerRegionsByName[observerName]; if (!observerRegion && observerNameKey) observerRegion = observerRegionsByName[observerNameKey]; } if (!observerRegion) return false; return selectedRegions.indexOf(observerRegion) !== -1; } async function loadObserverRegions() { try { var data = await api('/observers', { ttl: CLIENT_TTL.observers }); var list = data && data.observers ? data.observers : []; var byId = {}; var byName = {}; for (var i = 0; i < list.length; i++) { var o = list[i]; var id = o.id || o.observer_id; var name = o.name || o.observer_name; if (!o.iata) continue; if (id) byId[id] = o.iata; if (name) { byName[name] = o.iata; var key = normalizeObserverNameKey(name); if (key) byName[key] = o.iata; } } observerIataById = byId; observerIataByName = byName; } catch {} } function beginMessageRequest(hash, regionParam) { return { id: ++messageRequestId, hash: hash, regionParam: regionParam || '' }; } function isStaleMessageRequest(req) { if (!req) return true; var currentRegion = RegionFilter.getRegionParam() || ''; if (req.id !== messageRequestId) return true; if (selectedHash !== req.hash) return true; if (currentRegion !== req.regionParam) return true; return false; } function reconcileSelectionAfterChannelRefresh() { if (!selectedHash || channels.some(ch => ch.hash === selectedHash)) return false; selectedHash = null; messages = []; history.replaceState(null, '', '#/channels'); renderChannelList(); const header = document.getElementById('chHeader'); if (header) header.querySelector('.ch-header-text').textContent = 'Select a channel'; const msgEl = document.getElementById('chMessages'); if (msgEl) msgEl.innerHTML = '