70 lines
2.8 KiB
JavaScript
70 lines
2.8 KiB
JavaScript
|
|
// 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';
|
|||
|
|
}
|