Как использовать *одно* соединение WebSocket на все вкладки?

Добрый день.

Хочу сделать так, чтобы мой сайт поддерживал web-socket соединение с сервером, но при этом только одно на все вкладки с моим сайтом.
Сразу вспомнился механизм общения между вкладками с помощью LocalStorage.
Но надежного механизма поддержания одного соединения я не придумал. Ведь пользователь может закрыть вкладку с соединением, нужно открыть новое. При этом вкладки должны как-то выбрать кто из них это сделает. И нужно чтобы сразу две не открыли.
Для моих представлений не хватает блокировок.

Подскажите, как бы вы сделали?
  • Вопрос задан
  • 3049 просмотров
Пригласить эксперта
Ответы на вопрос 4
RubaXa
@RubaXa
Есть js библиотека для запуска js только в одной вкладке?
Вам нужен Master/Slave, реализовать его можно использовав:
- SharedWorker + fallback в localStorage и/или LocalConnection (Flash) — это если самому
- BNC Connector — theprivateland.com/bncconnector/home.htm
- Intercom.js — https://github.com/diy/intercom.js/ (работа с сокетами из коробки)
- Wormhole.js — https://github.com/RubaXa/wormhole (в разработке, demo)

Сейчас ещё Service Worker можно добавить к этому списку.
Ответ написан
@ComodoHacker
Web Workers?

А вообще странные требования, зачем ограничивать пользователя?
Ответ написан
@Atllantis
Ну раз хотите только одно соединение на браузер, то при закрытии вкладки в которой активно соединение, открывайте новое соединение в другой вкладке. В чём проблема?
Можно сделать например так:
При установке соединения в LS указываете ID вкладки и время последнего обновления состояния.
В других вкладках проверяете время последнего обновления состояния. Если оно больше определённого промежутка - выбираем новую вкладку и открываем там соединение. Ну и всё по новой.

У меня правда было всё немного по другому...
Я делал свой "транспорт" между вкладками браузера через LS и в итоге мог свободно общаться между вкладками... И при закрытии вкладки, я отправлял сообщение другой случайной вкладке в которой и открывалось новое соединение.
Ответ написан
@Levhav
Возьмусь за разработку проектов любой сложности.
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы