// lib/common/services/network.service.js // // Определение сети, в которой находится устройство. // // - внутри локальной сети принтера (Wi-Fi UnitPrintLocal) // домен unitprint.ru резолвится на 192.168.20.1 — локальный сервер печати; // - из интернета домен отвечает публичным адресом 95.165.135.233. // // Скан работает только через интернет, печать — только через локальную сеть. export const DOMAIN = 'unitprint.ru'; export const PUBLIC_IP = '95.165.135.233'; export const LOCAL_IP = '192.168.20.1'; export const LOCAL_WIFI_NAME = 'UnitPrintLocal'; /** * Сетевая доступность URL. * mode: 'no-cors' — чтобы CORS не мешал: важен сам факт ответа сервера, * а не содержимое ответа. Любой HTTP-ответ = хост доступен. */ async function canReach(url, timeoutMs = 4000) { if (typeof fetch === 'undefined') return false; const controller = new AbortController(); const timer = setTimeout(() => controller.abort(), timeoutMs); try { await fetch(url, { method: 'GET', mode: 'no-cors', cache: 'no-store', signal: controller.signal, }); return true; } catch { return false; } finally { clearTimeout(timer); } } /** Доступен ли локальный сервер печати (192.168.20.1) */ export async function isLocalServerReachable() { const ts = Date.now(); if (await canReach(`http://${LOCAL_IP}/api/version?ping=${ts}`, 3000)) return true; return canReach(`https://${LOCAL_IP}/api/version?ping=${ts}`, 3000); } /** Есть ли интернет (домен отвечает публичным сервером) */ export function isInternetReachable() { return canReach(`https://${DOMAIN}/api/version?ping=${Date.now()}`, 5000); } /** * Определяет текущий режим сети. * @returns {Promise<'local' | 'internet' | 'offline'>} * - 'local' → устройство в сети принтера (домен → 192.168.20.1) * - 'internet' → устройство в интернете (домен → 95.165.135.233) * - 'offline' → нет ни того, ни другого */ export async function detectNetwork() { const [local, internet] = await Promise.all([ isLocalServerReachable(), isInternetReachable(), ]); // Локальная сеть в приоритете: если 192.168.20.1 доступен, // значит домен сейчас указывает на локальный сервер печати. if (local) return 'local'; if (internet) return 'internet'; return 'offline'; }