46 lines
2.0 KiB
JavaScript
46 lines
2.0 KiB
JavaScript
// 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);
|
|
}
|
|
}
|