Прежде всего, XEP-0022 устарел. Лучше всего следовать совету XSF - это фундамент, который стандартизирует XMPP - и использовать более современные XEP для решения этой проблемы. При этом я бы использовал XEP-0085: уведомления о состоянии чата для <composing/>
подобных уведомлений и XEP-0333: маркеры чата для <received/>
или <displayed/>
квитанций.
Как я могу гарантировать, что сообщение будет доставлено и отображено второму пользователю без головной боли при одновременном подключении обоих к сети?
Вы должны использовать XEP-313: Управление архивом сообщений , реализованное MongooseIM (или ejabberd) mod_mam . Он хранит историю чата в базе данных сервера, что позволяет в любое время извлекать прошлые разговоры, при этом партнеры по чату больше не находятся в сети.
По умолчанию mod_mam не хранит сообщения, которые не несут текст (точнее, не содержат или не содержат подэлемента <body/>
), но его можно настроить, и для хранения маркеров чата XEP-333 вам придется его перенастроить , Возможно, нет смысла хранить уведомления XEP-85, поскольку они имеют смысл только тогда, когда оба пользователя находятся в сети.
Как только вы сможете получить маркеры чата, клиентское приложение должно будет запросить архив сообщений, обработать результаты и найти любые маркеры чата, которые соответствуют сообщениям пользователей, которые сейчас не в сети. Пожалуйста, имейте в виду, что хотя обычный маркер, отправленный онлайн-пользователем, будет выглядеть следующим образом (пример 4 из XEP-333):
<message from='kingrichard@royalty.england.lit/throne'
id='message-2'
to='northumberland@shakespeare.lit/westminster'>
<thread>sleeping</thread>
<received xmlns='urn:xmpp:chat-markers:0' id='message-1'/>
</message>
Маркер чата, возвращенный из архива для пользователя northumberland@shakespeare.lit
, будет выглядеть следующим образом - он будет заключен в конверт, помечающий, что это результат запроса архива:
<message id='aeb213'
from='northumberland@shakespeare.lit'
to='northumberland@shakespeare.lit/westminster'>
<result xmlns='urn:xmpp:mam:2' queryid='f27' id='28482-98726-73623'>
<forwarded xmlns='urn:xmpp:forward:0'>
<delay xmlns='urn:xmpp:delay' stamp='2010-07-10T23:08:25Z'/>
<message from='kingrichard@royalty.england.lit/throne'
id='message-2'
to='northumberland@shakespeare.lit/westminster'>
<thread>sleeping</thread>
<received xmlns='urn:xmpp:chat-markers:0' id='message-1'/>
</message>
</forwarded>
</result>
</message>
Таким образом, northumberland@shakespeare.lit
знает, что kingrichard@royalty.england.lit
получил <message id='message-1'/>
, даже если kingrichard@royalty.england.lit
в данный момент отключен.