Files
web-app/src/lib/common/services/network.service.js

46 lines
2.0 KiB
JavaScript
Raw Normal View History

// lib/common/services/network.service.js
//
// Определение сети, в которой находится устройство.
//
// - внутри локальной сети принтера (Wi-Fi UnitPrintLocal)
// домен unitprint.ru резолвится на 192.168.20.1 — локальный сервер печати;
// - из интернета домен отвечает публичным адресом 95.165.135.233.
//
// Клиент не может сам отличить эти случаи по IP (сертификаты, mixed content),
// поэтому спрашиваем сам сервер: GET /api/is_local → { "is_local": true|false }.
// Эндпоинт обязан быть на обоих инстансах:
// локальный → { "is_local": true }
// публичный → { "is_local": false }
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';
/**
* Определяет текущий режим сети.
* @returns {Promise<'local' | 'internet' | 'offline'>}
* - 'local' отвечающий сервер локальный (домен 192.168.20.1)
* - 'internet' отвечающий сервер публичный (домен 95.165.135.233)
* - 'offline' сервер вообще не ответил
*/
export async function detectNetwork(timeoutMs = 6000) {
if (typeof fetch === 'undefined') return 'offline';
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), timeoutMs);
try {
const res = await fetch('/api/is_local', {
cache: 'no-store',
signal: controller.signal,
});
if (!res.ok) return 'offline';
const data = await res.json();
if (typeof data?.is_local !== 'boolean') return 'offline';
return data.is_local ? 'local' : 'internet';
} catch {
return 'offline';
} finally {
clearTimeout(timer);
}
}