During the last days I was playing around with a Javascript web chat application using strophe.js. To save user preferences on the ejabberd XMPP server I use Private XML storage (XEP-0049). The specification is pretty straight forward, but due to the lack of a real world example it still took me a while to get it working — hence this post. Thanks to badlop from the ejabberd@conference.jabber.ru XMPP chat room for valuable pointers. Here is how I did it:
1. Make sure mod_http_bind and mod_private are activated in ejabberd.cfg:
{modules, [ {mod_http_bind, []}, {mod_private, []}, ... ]}.
2. Open BOSH connection to XMPP server (in your Javascript application):
sc = new Strophe.Connection('/http-bind/'); sc.connect('user@example.org', 'password');
3. Build and send IQ stanza for storing data:
var stanza = $iq({type: 'set', id: '_set1'}) .c('query', {xmlns: 'jabber:iq:private'}) .c('myclient', {xmlns: 'myclient:prefs'}) .c('mypreference', 'yes') .tree(); sc.sendIQ(stanza);
Replace “myclient” and “myclient:prefs” with your own invented namespace and use your key/value names instead of “mypreference”/”yes”.
The IQ stanza sent to the server will look something like this:
<iq type='set' id='_set1' xmlns='jabber:client'> <query xmlns='jabber:iq:private'> <myclient xmlns='myclient:prefs'> <mypreference>yes</mypreference> </myclient> </query> </iq>
Server response:
<iq xmlns='jabber:client' from='...' to='...' id='_set1' type='result'> <query xmlns='jabber:iq:private'/> </iq>
4. Build and send IQ stanza for retrieving data:
var stanza = $iq({type: 'get', id: '_get1'}) .c('query', {xmlns: 'jabber:iq:private'}) .c('myclient', {xmlns: 'myclient:prefs'}) .tree(); sc.sendIQ(stanza, parsePrefs); function parsePrefs(element) { ... }
Sent to server:
<iq type='get' id='_get1' xmlns='jabber:client'> <query xmlns='jabber:iq:private'> <myclient xmlns='myclient:prefs'/> </query> </iq>
Server response:
<iq xmlns='jabber:client' from='...' to='...' id='_get1' type='result'> <query xmlns='jabber:iq:private'> <myclient xmlns='myclient:prefs'> <mypreference>yes</mypreference> </myclient> </query> </iq>
5. Write parsePrefs() function and enjoy your XML storage! 🙂
Questions?