Релиз RootRouter монитор v3: слияние тестов доступности и скорости в единый асинхронный конвейер
В рамках модернизации диагностического инструментария проекта RootRouter завершена работа над версией v3. Исходная задача заключалась в глубоком рефакторинге, оптимизации архитектуры под требования поисковых систем (в частности, Яндекс) и устранении взаимного влияния конкурентных сетевых потоков при одновременном замере пропускной способности и проверке доступности хостов.
Инструмент предназначен для комплексной оценки качества интернет-подключения. Он позволяет выявить, на каком именно уровне происходит деградация сервиса: на физическом/транспортном (низкая скорость, высокий джиттер) или на прикладном (сетевые блокировки конкретных URL).
Виджет полностью автономен, распространяется бесплатно и может быть интегрирован на любой сторонний ресурс.
Код для встраивания (iframe):
<iframe src="https://rootrouter.ru/online/?rkn3_embed=1" width="100%" height="900" style="border:0;max-width:100%;" loading="lazy" sandbox="allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox allow-forms" allow="clipboard-write" title="RootRouter — тест доступности сайтов"></iframe>
<p style="font:12px/1.4 sans-serif;margin:6px 0 0;">Тест предоставлен сайтом <a href="https://rootrouter.ru/" target="_blank" rel="noopener">RootRouter</a></p>
Полная веб-версия монитора доступна по прямой ссылке: https://rootrouter.ru/online/
Как будет выглядеть встраиваемый через <iframe> RootRouter monitor – тест доступности сайтов на вашем сайте? Вот так 👍
Архитектурные изменения и рефакторинг (Часть 1)
Исторически кодовая база проекта развивалась стихийно, из-за чего логика чекера ({rkn_checker_v2}) и виджета скорости ({rr_speedtest}) была частично завязана на конфигурацию дочерней темы WordPress (AstraPro) и аккумулировалась в functions.php. Это усложняло масштабирование и создавало избыточную нагрузку на рендеринг страниц.
В v3 весь код полностью изолирован в рамках единого плагина со строгой модульной структурой:
rootrouter-monitor.php– единая точка входа. Выполняет регистрацию нового унифицированного шорткода{rootrouter_monitor}, инициализацию констант и централизованное подключение ассетов черезwp_enqueue_scriptиwp_enqueue_style.includes/services.php– вынесенный массив данных, содержащий конфигурацию и правила проверки для 105 целевых сервисов (включая YouTube, Instagram, Telegram).includes/speedtest-config.php– конфигурация пула CDN-источников (CacheFly, Cloudflare) для замеров пропускной способности.includes/rest-api.php– серверный слой. Обеспечивает работу REST-эндпоинтов внутри пространства именrootrouter/v1(/config,/ping,/upload) и обработку CORS-заголовков.templates/render-template.php– разметка интерфейса, реализующая концепцию SSR (Server-Side Rendering). Карточки ресурсов и структура FAQ формируются на стороне сервера для корректной индексации поисковыми роботами.assets/style.cssиassets/main.js– объединенные таблицы стилей и фронтенд-логика. Устранено дублирование хелперов (escapeHtml,copyToClipboard, механизмов работы с хранилищем).
Оптимизация сетевых потоков и устранение гонок (Race Conditions)
Основная техническая проблема предыдущих версий заключалась в том, что параллельный запуск проверки доступности 105 хостов и многопоточного теста скорости приводил к утилизации сетевого канала пользователя.
- Ложные таймауты (False Negatives): Замер скорости (скачивание/отдача) забивал пропускную способность («полку») канала. В этот же момент JS-чекер пытался выполнять
fetchилиscript_probeзапросы к проверяемым сайтам. Из-за нехватки полосы пакеты чекера упирались в таймаут, и доступные ресурсы ошибочно маркировались как «Не доступно». - Деградация метрик задержки: Одновременный залп HTTP-запросов к сотне доменов раздувал показатели Ping и Jitter в тесте скорости, делая результаты замера нерелевантными.
Решение: Асинхронный последовательный конвейер
В v3 внедрена жесткая последовательность выполнения (сериализация процессов):
[Загрузка страницы] ➔ [Автозапуск: Тест Скорости] ➔ [Триггер окончания] ➔ [Автозапуск: Тест Доступности]
На время выполнения любого из этапов обе управляющие кнопки программно блокируются функциями управления состоянием DOM (refreshButtons() и onAvailabilityDone()). Ручной перезапуск позволяет инициировать каждый тест изолированно, предотвращая наложение потоков.
Дополнительно в верхнюю часть виджета выведены независимые асинхронные прогресс-бары для каждого типа тестирования, скрывающиеся по факту завершения их потоков.
Решение проблемы детерминации IP-адреса во фреймах и при split-tunneling
В версии 1.6 теста доступности наблюдался баг: при активном туннель-подключении тест доступности мог отображать реальный IP-адрес провайдера, в то время как тест скорости v 1.04 фиксировал IP-адрес туннель-сервера.
Причина расхождения
Тест скорости определял адрес классическим серверным методом (PHP-обработчик считывал заголовки сетевого пакета, пришедшего на rootrouter.ru). Тест доступности отправлял клиентские асинхронные запросы из браузера к 7 сторонним публичным API (ipify, my-ip.io и др.).
При использовании split-tunnel маршрутизации на роутере (когда домены зоны .ru идут напрямую через физического провайдера, а заблокированные ресурсы перенаправляются в туннель-туннель), запросы к rootrouter.ru и к международным IP-API шли по разным маршрутам. Чекер не ломался – он фиксировал реальную утечку маршрутов (DNS/IP leak) на стороне клиента, но это путало конечного пользователя.
Дополнительно во встраиваемых <iframe> без флага allow-same-origin браузер присваивал фрейму пустой origin (null). Это полностью блокировало сетевые запросы к локальному API и вызывало критическую ошибку All ping attempts failed.
Реализованное решение
- Централизованный серверный IP: Клиентский пул из 7 сторонних API полностью удален из JS. IP-адрес теперь определяется строго один раз на сервере
RootRouterфункциейrkn3_get_client_ip()(с валидацией заголовковCF-Connecting-IP,X-Forwarded-For,REMOTE_ADDR). Данные жестко вшиваются в HTML при SSR-рендере и отдаются в JSON-ответе эндпоинта/config. - CORS и Sandbox-политика: В генератор Embed-кода iframe принудительно добавлен флаг
allow-same-origin. Для защиты на случай сторонних жестких политик CSP (Content Security Policy) на сайтах-встройщиках, все REST-маршруты плагина (/config,/ping,/upload) теперь отдают wildcard-заголовкиAccess-Control-Allow-Origin: *. Если браузер родительского сайта всё же блокирует сетевой трафик фрейма, в JS предусмотрен перехват исключения (fallback), выводящий уведомление о необходимости пройти тест на первоисточнике.
Математика вердиктов и обработка политик безопасности браузеров
Интегральный показатель доступности сети теперь рассчитывается исключительно на основе детерминированных исходов. Статусы «Не определено» (таймаут ответа хоста) и «Скрыто защитой» не ухудшают итоговую оценку подключения.
Формула расчета индекса доступности:
Индекс = Доступно / (Доступно + Не доступно)
Обработка CORS и Cross-Origin политик в современных браузерах
Браузеры на движках WebKit и Gecko (Safari, Firefox, а также любые браузеры на базе iOS и встроенные WebView-клиенты мессенджеров, таких как Telegram) применяют строгие эвристики защиты от межсайтового отслеживания. При попытке задебажить статус сетевого сокета стороннего ресурса (например, через генерацию ошибки загрузки картинки/скрипта на чужом домене), эти браузеры принудительно скрывают детали сетевой ошибки в целях безопасности.
Фронтенд-скрипт main.js теперь валидирует navigator.userAgent через функцию detectBrowser(). Если обнаруживается WebKit/Gecko среда, интерфейс корректно подставляет статус «Скрыто защитой» вместо ложного «Заблокировано», а вердикт дополняется техническим пояснением. Для Chromium-систем, где данные ограничения в текущей реализации отсутствуют, диагностика выполняется в стандартном режиме.
SEO-оптимизация под требования поисковых систем (Яндекс)
Для продвижения страницы /online/ (или /rrm/), лишенной классических лонгридов, семантическое поле было интегрировано непосредственно в разметку интерфейса:
- Динамические статические атрибуты: Для всех 105 карточек сервисов генерация тегов изображений переведена на жесткий формат:
alt="Проверить доступность [Название Сервиса] онлайн"title="Тест работы [Название Сервиса] через интернет"
Это позволяет роботу Яндекса считывать ключевые маркеры релевантности при обходе DOM.
- Семантическая иерархия: Заголовки разделов переведены на теги
H2иH3. Спойлеры легенд и категорий сохраняют текстовое содержимое в DOM, но скрыты через CSS, что делает их доступными для индексации без замусоривания UX. - Schema.org (JSON-LD): На уровне шаблона внедрены два массива микроразметки:
WebApplication(Сущность: RootRouter Тест доступности, ОС: Web/Все).FAQPage(Валидный JSON-LD, дублирующий раскрывающиеся списки частых вопросов, очищенный от ломающих синтаксис HTML-тегов).
Фильтрация, UX и работа с сессионными данными
Вместо старой системы переключения вкладок, которая скрывала часть интерфейса, в v3 применена сквозная фильтрация на базе JS-аккордеонов:
- Сводная панель статистики: Выступает в роли интерактивного фильтра. Клик по кнопке-счетчику «Заблокировано» вешает триггер на MutationObserver и CSS-класс, мгновенно скрывая карточки со статусом
successи отображая только проблемные хосты. Повторный клик сбрасывает маску фильтра. - Управление историей (LocalStorage): Логика изменена с потестовой на сессионную. Ранее каждый прогон перезаписывал стек истории из 3 элементов. Теперь сущность
currentSessionEntryаккумулирует данные текущей сессии: если пользователь выполнил тест доступности, а затем – тест скорости, данные объединяются в один лог-объект с временной меткой.
Заключение и коммерческая интеграция
Релиз v3 позволил изолировать код, решить проблемы с блокировкой сетевых потоков в браузере и подготовить платформу к высокому поисковому трафику. Однако, если результаты тестов в вашем браузере стабильно возвращают статус Таймаут, Заблокировано или фиксируют критическое падение скорости через зарубежные туннель-шлюзы – проблема лежит на уровне маршрутизации вашего текущего провайдера.
Я занимаюсь проектированием и сборкой аппаратных роутеров с интеллектуальным split-tunneling обходом блокировок на сетевом уровне (без необходимости держать включенными нестабильные туннель-клиенты на телефонах и компьютерах).
Если вам требуется стабильный доступ к YouTube в 4K, Instagram и рабочим зарубежным сервисам на всех домашних устройствах сразу (включая Smart TV и консоли) – вы можете заказать у меня индивидуальную настройку роутера Netcraze. Для анализа вашей сетевой конфигурации и подбора оборудования свяжитесь со мной напрямую через форму на сайте или напишите в Директ. Первичный разбор вашей проблемы – бесплатный.

