[UniversalEventBus 1.2.1] Оптимизация при работе с несколькими вкладками

Всем здрасьте! Если коротко, то с версии 1.2.1 компонент держит только одно подключение вне зависимости от количества открытых вкладок браузера

Для тех кто не в курсе, SSE (Server Sent Events), согласно документации, должен поддерживать соединение с сервером шо твой Web Socket, если последний его не разрывает. На практике же соединение не держится, а пропадает после получения ответа сервера. Разрыв соединения происходит по инициативе браузера и повлиять на это невозможно. Однако это не является большой проблемой, особенно если не ставить ueb_sse_retry очень маленьким.

Однако я хотел обратить ваше внимание на roadcast Channel API, поскольку сам не знал что подобные инструменты существуют в JavaScript. Данный API позволяет синхронизировать данные между вкладками браузера (и не только), если в этих вкладках открыт один и тот же сайт. Работает это так
1. Создаёшь канал
this.channel = new BroadcastChannel(this.config.channelName);
2. Отправляешь в него сообщения в нужные моменты времени, в моём случае когда открывается новая вкладка с сайтом
this.channel.postMessage({ type: this.config.types.ping });
3. Другие вкладки при этом слушают сообщения в канале
this.channel.onmessage = (event) => {
      if (event.data.type === this.config.types.ping && this.isActive) {
        this.channel.postMessage({ type: this.config.types.active });
      }

      if (event.data.type === this.config.types.tabChanged && this.isActive) {
        this.close();
      }
    };
4. И в зависимости от данных в полученном сообщении могут отправлять свои сообщения или просто выполнять какие-то операции.

ВАЖНО связь в BroadcastChannel односторонняя и синхронная, т.е., отправив сообщение, не стоит ждать какого-то ответа. Но если всё же ответ нужен ( в моём случае вкладка, которая была активной, при пинге сообщает об этом в канал), то можно поставить задержку
await new Promise(resolve => setTimeout(resolve, 100));
Я использовал BroadcastChannel API для закрытия соединений на неактивных вкладках, но с его помощью можно передавать данные между вкладками в реальном, что может быть полезным например для синхронизации данных при заполнении форм.

Спасибо за внимание!
Артур Шевченко
4 часа назад
modx.pro
37
0
Поблагодарить автора Отправить деньги

Комментарии: 0

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0