new

UniversalEventBus

Локальная realtime-шина MODX: adaptive SSE, cursor polling и browser events.
Версия 1.3.1-rc
Дата выпуска 07.08.2026
Загрузки 7
Просмотры 1 631
UniversalEventBus — двусторонняя шина событий для MODX: сервер публикует событие в браузер, а браузер передаёт действие на сервер. Никаких внешних realtime-сервисов, аккаунтов и подписок: transport работает на том же сервере, что и сайт.

Adaptive transport для shared-хостинга
  • Активная вкладка использует ограниченный по времени SSE с heartbeat; MODX загружается один раз на соединение.
  • После простоя SSE закрывается, а клиент переходит на короткий cursor polling с backoff. Между такими запросами PHP worker свободен.
  • Скрытая вкладка transport не держит; BroadcastChannel оставляет одно соединение на browser profile и передаёт события остальным вкладкам.
  • События сохраняются в локальной таблице до TTL. Cursor и eventId дают упорядоченную доставку и дедупликацию, а новая страница может дочитать событие после навигации.
  • PHP-session lock освобождается до SSE-цикла, поэтому stream не блокирует корзину, checkout и AJAX.

Совместимость
  • Версия 1.x — MODX 2.6–2.8, PHP 7.4+.
  • Версия 2.x — MODX 3.0+, PHP 8.1+.
  • Для обратной совместимости доступен legacy transport через настройку ueb_transport=legacy.

Использование
  • Создайте плагин MODX, подключите его к нужному системному событию и вызовите EventBus:
$autoload = $modx->getOption('core_path') . 'components/universaleventbus/vendor/autoload.php';
if (is_file($autoload)) { require_once $autoload; }
(new \UniversalEventBus\EventBus($modx))->handleEvent($modx->event->name);
  • Во фронтенде слушайте DOM-событие eventbus; browser event отправляется атрибутом data-ueb-event.
document.addEventListener('eventbus', (event) => {
  console.log(event.detail.data);
});

<a href="/next" data-ueb-event="click">Следующая страница</a>

Обычный переход по ссылке с browser-событием ждёт запись на сервер лишь ограниченное время, затем новая страница дочитывает событие по cursor.

1.3.1-rc

  • FIX: кука контекста снова ставится на домен основного контекста, а не на его первый символ. fetch(PDO::FETCH_COLUMN) возвращает значение колонки строкой, а обращение [0] брало из неё первый символ: setContextCookie отправлял домен вида "s", браузер такую куку отбрасывал. На сайтах, где витрины разведены по поддоменам одного домена, контекст из-за этого не переживал переход на соседний поддомен и откатывался к основному — вместе с языком и site_url. На однодоменных сайтах дефект не проявлялся.

1.3.0-rc

  • FEATURE: adaptive local transport без внешних сервисов. Активная вкладка держит bounded SSE с heartbeat, после idle переходит на короткий cursor polling с backoff, скрытая вкладка не держит PHP worker. BroadcastChannel оставляет один transport на browser profile.
  • FEATURE: события хранятся до TTL в локальной таблице ueb_events с cursor и UUID; SSE освобождает PHP session lock до цикла. Событие не удаляется при первом чтении, поэтому новая страница или вкладка может дочитать его до TTL.
  • FIX: click по обычной ссылке с data-ueb-event ждёт запись события не дольше ueb_navigation_timeout и перед переходом останавливает transport текущей страницы. Это устраняет гонку отменённого fetch при выгрузке документа.

1.2.6-pl

  • FIX: keepalive у fetch-запросов eventbus.js включается только по явному флагу (paramsObj.keepalive / data-ueb-params / config.keepalive) либо когда страница уже скрывается (visibilityState=hidden). Раньше keepalive:true стоял на всех запросах: по спецификации Fetch суммарное тело всех keepalive-запросов страницы ограничено 64 КБ, превышение давало TypeError: Failed to fetch и терялись события.

1.2.5-pl

  • Логирование переведено с файлов (logs/*.txt) на mxLogger. Хелпер Logging делегирует записи сервису mxLogger (если установлен), иначе молчит и один раз предупреждает в журнале MODX. Перевод затронул EventBus и QueueManager.
  • Гейты: ueb_debug (вкл/выкл) + новая настройка ueb_log_level (минимальный уровень debug|info|warning|error, по умолчанию error; единый приёмник mxLogger, включено из коробки). Консистентно с mxLogger.min_level. QueueManager теперь учитывает ueb_debug (раньше new Logging() без гейта).
  • Тэги: базовые universaleventbus + events, этапные order (orderData), queue (очередь). Воронка processuid = «universaleventbus»+md5(branch) — события одной сессии/ветки склеиваются в mxLogger одним процессом.
  • Сигнатура Logging::write сохранена (позиционные method/msg/data), добавлены параметры $level и $tags. Уровни: дампы resourceData/orderData/SQL — debug; пустая ветка/данные очереди — warning.
  • ВНИМАНИЕ: перед сборкой настройку ueb_log_level создать в менеджере (namespace universaleventbus) — сборка тянет настройки из БД стенда.

1.2.4-pl

  • Вынес contextCookieName в системные настройки (ueb_context_cookie_name).
  • Добавил проверку существования контекста перед переключением.

1.2.3-pl

  • Исправление ошибок.

1.2.2-pl

  • Исправление ошибок.

1.2.1-pl

  • Добавил возможность явно передать контекст в метод handleEvent().

1.2.0-pl

  • Мелкие правки.

1.2.0-beta7

  • Изменил логику смены контекста.
  • Добавил систему гарантированной доставки сообщений.
  • Добавил в ответ при отправке браузерного события информацию о добавлении события в очередь.
  • Оптимизировал работу компонент при нескольких открытых вкладках.
  • Поменял доступность свойства EventBus::contextCookieName.

1.2.0-beta6

  • Поместил создание экземпляра класса EventBus в метод обработчик события DOMContentLoaded.

1.2.0-beta5

  • Сделал свойство EventBus::isBot публичным.

1.2.0-beta4

  • Исправил ошибку в методе execute() при возврате строки.
  • Добавил возможность передавать в менеджер очередей опции при добавлении элемента в очередь.

1.2.0-beta3

  • Исправил получение данных о конкретном элементе корзины.

1.2.0-beta2

  • Добавил возможность транслитерации полей товара в orderData.
  • Изменил обработку открытий и закрытий элементов.

1.2.0-beta

  • Добавил возможность транслитерации полей товара в productsData.
  • Добавил получение данных модификации при использовании msOptionsPrice2.

1.1.0-beta4

  • Мелкие правки.

1.1.0-beta3

  • Добавил возможность использовать методы execute() и getSQL().
  • Добавил возможность определять страницу по переданному в параметрах uri.

1.1.0-beta2

  • Добавил возможность пересылать сообщения между пользователями.
  • Добавил возможность программно отправлять события на сервер.

1.1.0-beta

  • Добавил отправку браузерных событий на сервер.

1.0.0-beta2

  • Добавил ESLint.
  • Добавил информацию о корзине.
  • Поменял приоритет для события OnLoadWebDocument.
  • Убрал любые манипуляции с данными на фронтенде.

1.0.0-beta

  • Первая сборка.

Последние обсуждения в сообществе MODX.pro