// services/dectStatus/buildHandsetContext.js // // Group Webex DECT handset inventory for /dectstatus rendering. /** * @param {object|null} phoneData collectPhoneStatus() output * @returns {object} */ export function buildHandsetContext(phoneData) { const basestations = Array.isArray(phoneData?.dectBasestations) ? phoneData.dectBasestations : []; const handsets = Array.isArray(phoneData?.dectHandsets) ? phoneData.dectHandsets : []; const handsetsByWebexId = new Map(); const linesRegisteredByWebexId = new Map(); const webexIdByMac = new Map(); for (const base of basestations) { if (base.id) { handsetsByWebexId.set(base.id, []); linesRegisteredByWebexId.set(base.id, base.linesRegistered ?? null); } const mac = normalizeMacLoose(base.mac); if (base.id && mac) webexIdByMac.set(mac, base.id); } const unassignedHandsets = []; for (const h of handsets) { const baseId = h.baseStationId || null; if (baseId && handsetsByWebexId.has(baseId)) { handsetsByWebexId.get(baseId).push(h); } else if (!baseId) { unassignedHandsets.push(h); } else { // Assigned to a base id we don't know — treat as unassigned for display. unassignedHandsets.push(h); } } return { handsetsByWebexId, linesRegisteredByWebexId, webexIdByMac, unassignedHandsets, dectNetwork: phoneData?.dectNetwork || null, }; } /** * Handsets registered to a base (by Webex base id). * * @param {object} handsetCtx buildHandsetContext() output * @param {string|null} webexId * @returns {object[]} */ export function handsetsForBase(handsetCtx, webexId) { if (!webexId || !handsetCtx?.handsetsByWebexId) return []; return handsetCtx.handsetsByWebexId.get(webexId) || []; } function normalizeMacLoose(mac) { if (!mac || typeof mac !== 'string') return null; const hex = mac.replace(/[^0-9a-fA-F]/g, '').toLowerCase(); if (hex.length !== 12) return null; return hex.match(/../g).join(':'); }