[UniversalEventBus 1.2.1] Оптимизация при работе с несколькими вкладками
Всем здрасьте! Если коротко, то с версии 1.2.1 компонент держит только одно подключение вне зависимости от количества открытых вкладок браузера
Для тех кто не в курсе, SSE (Server Sent Events), согласно документации, должен поддерживать соединение с сервером шо твой Web Socket, если последний его не разрывает. На практике же соединение не держится, а пропадает после получения ответа сервера. Разрыв соединения происходит по инициативе браузера и повлиять на это невозможно. Однако это не является большой проблемой, особенно если не ставить ueb_sse_retry очень маленьким.
Однако я хотел обратить ваше внимание на roadcast Channel API, поскольку сам не знал что подобные инструменты существуют в JavaScript. Данный API позволяет синхронизировать данные между вкладками браузера (и не только), если в этих вкладках открыт один и тот же сайт. Работает это так
1. Создаёшь канал
ВАЖНО связь в BroadcastChannel односторонняя и синхронная, т.е., отправив сообщение, не стоит ждать какого-то ответа. Но если всё же ответ нужен ( в моём случае вкладка, которая была активной, при пинге сообщает об этом в канал), то можно поставить задержку
Спасибо за внимание!
Для тех кто не в курсе, 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 для закрытия соединений на неактивных вкладках, но с его помощью можно передавать данные между вкладками в реальном, что может быть полезным например для синхронизации данных при заполнении форм. Спасибо за внимание!
Поблагодарить автора
Отправить деньги
0