v1.0.9 upd connections instruct and upd backend realisation
This commit is contained in:
@ -1,22 +1,47 @@
|
||||
// lib/common/services/network.service.js
|
||||
//
|
||||
// Определение сети, в которой находится устройство.
|
||||
// Проверка подключения через эндпоинты бэкенда:
|
||||
//
|
||||
// - внутри локальной сети принтера (Wi-Fi UnitPrintLocal)
|
||||
// домен unitprint.ru резолвится на 192.168.20.1 — локальный сервер печати;
|
||||
// - из интернета домен отвечает публичным адресом 95.165.135.233.
|
||||
// - /api/is_server — публичный сервер unitprint.ru.
|
||||
// Отвечает {"is_server":true} → интернет есть, скан доступен;
|
||||
// - local.unitprint.ru/api/is_local — локальный сервер печати.
|
||||
// Отвечает {"is_local":true} → устройство в Wi-Fi принтера (UnitPrintLocal),
|
||||
// печать доступна.
|
||||
//
|
||||
// Сайт всегда отдаётся с unitprint.ru, поэтому проверка локалки ходит
|
||||
// на отдельный хост local.unitprint.ru: вне локальной сети принтера
|
||||
// он просто недоступен.
|
||||
//
|
||||
// Скан работает только через интернет, печать — только через локальную сеть.
|
||||
|
||||
export const DOMAIN = 'unitprint.ru';
|
||||
export const PUBLIC_IP = '95.165.135.233';
|
||||
export const LOCAL_IP = '192.168.20.1';
|
||||
export const LOCAL_HOST = 'local.unitprint.ru';
|
||||
export const LOCAL_WIFI_NAME = 'UnitPrintLocal';
|
||||
|
||||
/**
|
||||
* Сетевая доступность URL.
|
||||
* mode: 'no-cors' — чтобы CORS не мешал: важен сам факт ответа сервера,
|
||||
* а не содержимое ответа. Любой HTTP-ответ = хост доступен.
|
||||
* GET с таймаутом, читаем JSON.
|
||||
* @returns {Promise<any|null>} null — если хост недоступен или ошибка.
|
||||
*/
|
||||
async function getJson(url, timeoutMs = 4000) {
|
||||
if (typeof fetch === 'undefined') return null;
|
||||
const controller = new AbortController();
|
||||
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
||||
try {
|
||||
const res = await fetch(url, {
|
||||
method: 'GET',
|
||||
cache: 'no-store',
|
||||
signal: controller.signal,
|
||||
});
|
||||
if (!res.ok) return null;
|
||||
return await res.json();
|
||||
} catch {
|
||||
return null;
|
||||
} finally {
|
||||
clearTimeout(timer);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Доступность хоста в режиме 'no-cors': CORS не мешает, важен сам факт ответа.
|
||||
*/
|
||||
async function canReach(url, timeoutMs = 4000) {
|
||||
if (typeof fetch === 'undefined') return false;
|
||||
@ -37,33 +62,27 @@ async function canReach(url, timeoutMs = 4000) {
|
||||
}
|
||||
}
|
||||
|
||||
/** Доступен ли локальный сервер печати (192.168.20.1) */
|
||||
export async function isLocalServerReachable() {
|
||||
/**
|
||||
* Устройство в локальной сети принтера:
|
||||
* local.unitprint.ru/api/is_local отвечает {"is_local":true}.
|
||||
*/
|
||||
export async function isLocalNetwork() {
|
||||
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);
|
||||
}
|
||||
const httpsUrl = `https://${LOCAL_HOST}/api/is_local?ping=${ts}`;
|
||||
const httpUrl = `http://${LOCAL_HOST}/api/is_local?ping=${ts}`;
|
||||
|
||||
/** Есть ли интернет (домен отвечает публичным сервером) */
|
||||
export function isInternetReachable() {
|
||||
return canReach(`https://${DOMAIN}/api/version?ping=${Date.now()}`, 5000);
|
||||
const data = (await getJson(httpsUrl, 3000)) ?? (await getJson(httpUrl, 3000));
|
||||
if (data) return data.is_local === true;
|
||||
|
||||
// JSON не читается (CORS / самоподписанный сертификат) —fallback:
|
||||
// сам факт ответа local.unitprint.ru означает, что мы в локалке.
|
||||
return canReach(httpsUrl, 3000);
|
||||
}
|
||||
|
||||
/**
|
||||
* Определяет текущий режим сети.
|
||||
* @returns {Promise<'local' | 'internet' | 'offline'>}
|
||||
* - 'local' → устройство в сети принтера (домен → 192.168.20.1)
|
||||
* - 'internet' → устройство в интернете (домен → 95.165.135.233)
|
||||
* - 'offline' → нет ни того, ни другого
|
||||
* Есть интернет: публичный сервер отвечает на /api/is_server.
|
||||
*/
|
||||
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';
|
||||
export async function isServerReachable() {
|
||||
const data = await getJson(`/api/is_server?ping=${Date.now()}`, 5000);
|
||||
return data?.is_server === true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user