Я и моя команда работали над точно такой же проблемой - только то, что мы используем Openfire вместо Ejabberd (в основном потому, что у нас есть навыки Java, но мы не знакомы с Erlang). Наша компания занимается созданием браузерных игр.
Наше решение состоит из:
- XMPPHP - для предварительной привязки
- Strophe.js - для присоединения сеанса ( изменено )
- Пенджаб - в качестве диспетчера соединений ( расширено, изменено )
- Openfire - в качестве XMPP-сервера
Мы используем Пенджаб, потому что реализация Openfire в BOSH поначалу не очень хорошо работала с другими компонентами.
По сути, мы решили не создавать сеанс для каждой вкладки. Это связано с тем, что некоторые из наших игр работают так же, как и обычные веб-сайты: щелчок по ссылке запросит полную новую страницу (в то время как новые игры полностью работают в ajax, и большая часть GUI остается прежней). Другими словами, наш веб-чат должен работать в среде, где пользователь «перемещается по сайту». Один сеанс для одной вкладки будет означать новый сеанс для каждого запроса страницы, что кажется огромными накладными расходами, потому что игроки часто нажимают довольно быстро. Итак, мы хотели создать одну сессию и привязаться к игроку.
Чтобы решить, что мы, как и вы, изменили strophe.js для чтения / сохранения RID в файле cookie, чтобы все вкладки знали текущий RID и увеличивали его до правильного значения. Другое дело, что мы заставили Strophe добавить CID в тело разделов XMPP. CID, как идентификатор клиента. Я объясню использование в ближайшее время ..
Затем планировалось изменить две вещи в пенджабе. Сначала мы добавили класс, который заменил обычный способ хранения ожидающих запросов в пенджабе. Ожидание BOSH-запросов теперь сохраняется в словаре с CID (который strophe.js теперь добавляет к телу каждого запроса) в качестве ключа. Когда приходит другой запрос из той же вкладки, Пенджаб знает, какой ожидающий запрос отправить пустой ответ. Если появятся новые строфы, Пенджаб отправит их всем ожидающим запросам в словаре. Таким образом, входящее сообщение распространяется на все вкладки. Во-вторых, мы добавили несколько строк, чтобы сообщение, отправленное с одной вкладки, сразу же возвращалось на все остальные вкладки. Таким образом, сообщение может появиться и в истории других вкладок.
Конечно, есть и другие проблемы, с которыми нужно столкнуться, например, не потерять историю чата в графическом интерфейсе, когда игрок переходит к следующему экрану. Хранить это в cookie-файле было бы плохо, так как все это отправляется с каждым запросом и вызывает большой трафик. Для этого мы думаем о реализации чего-то похожего на архивирование сообщений XEP-0136.
Короче говоря, нам пришлось иметь дело с исправлением / расширением strophe.js и пенджаба, и мы немного изменили стандарты. Но пока он работает нормально, и я рад видеть, как эта установка будет работать в бета-версии.