<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style></head>
<body class='hmmessage'><div dir='ltr'><span style="font-family: Calibri, sans-serif; font-size: 12pt;">> Date: Tue, 13 Nov 2012 07:30:34 +0000</span><br><div style="font-family: Calibri, sans-serif; font-size: 12pt;">> From: kevin@kismith.co.uk<br>> To: jdev@jabber.org<br>> Subject: Re: [jdev] Help choosing the right technology<br>> <br>> Just to clear up a couple of things.<br>> <br>> On Tue, Nov 13, 2012 at 7:12 AM, Michael Weibel<br>> <michael.weibel+xmpp@gmail.com> wrote:<br>> >> Push based communication.<br>> > Besides ejabberd commercial, I don't know which servers implement this.<br>> <br>> {SNIP}<br>> <br>> JSON/XML is pretty much a red herring here - to encode the same data<br>> you're just switching <> for {}.<br>> <br>> But XMPP stanzas aren't /that/ big before transmission, when you're<br>> talking about working over phone networks. Yes, compression will help<br>> with stanza size.<br>> <br>> {SNIP}<br>> <br>> /K</div><div style="font-family: Calibri, sans-serif; font-size: 12pt;"><br></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;">You could do what MXit did back in the day and shorten element names. E.g.:</div><div style="font-family: Calibri, sans-serif; font-size: 12pt;"><br></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;">- {jabber:client}message = {jabber:client}m (jabber:client is usually defined on the stream:stream element, so there isn't much point in shortening it)</div><div style="font-family: Calibri, sans-serif; font-size: 12pt;">- {jabber:client}iq = {jabber:client}i</div><font face="Calibri, sans-serif" size="3">- {jabber:iq:roster}query = {j:i:r}q</font><div style="font-family: Calibri, sans-serif; font-size: 12pt;">- @from = @f</div><div style="font-family: Calibri, sans-serif; font-size: 12pt;">- And so forth</div><div style="font-family: Calibri, sans-serif; font-size: 12pt;"><br></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;">You should be able to do this at the XML emission/parsing layer through encapsulation or polymorphism (this should be a really simple hashtable lookup if your server/client of choice sees XML as data and not a string). If you care about interopability (which you should), it would likely be appropriate in the transport features section of the stream.</div><div style="font-family: Calibri, sans-serif; font-size: 12pt;"><br></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;">S:</div><div><div style="font-family: Calibri, sans-serif; font-size: 12pt;"><stream:features></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;">  <nameshortening xmlns='http://mycompany.com/xmpp/features' /></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;">  <starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;">    <required/></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;">  </starttls></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;">  ...</div><div style="font-family: Calibri, sans-serif; font-size: 12pt;"></stream:features></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;"><br></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;">C:</div><div style="font-family: Calibri, sans-serif; font-size: 12pt;"><span style="font-size: 12pt;"><optimize xmlns='http://mycompany.com/xmpp/features' /></span></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;"><span style="font-size: 12pt;"><br></span></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;"><div>S:</div><div><span style="font-size: 12pt;"><proceed xmlns='http://mycompany.com/xmpp/features' /></span></div></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;"><br></div><div style="font-family: Calibri, sans-serif; font-size: 12pt;">That way clients that don't understand it would simply skip past it and head directly to STARTTLS.</div><div style="font-family: Calibri, sans-serif; font-size: 12pt;"><br></div><div><font face="Calibri, sans-serif" size="3">Compression alone *should* be good enough, but I remember the MXit team indicating that they did get some clutch savings from doing this: even with compression. You could take it further by also omitting the 'from' attribute on the client (assume that the server will fill it in for you), and </font><font face="Calibri, sans-serif">omitting</font><font face="Calibri, sans-serif" size="3"> the 'to' element if the communication is directly C->S or S->C (that would likely be an additional customization you would need to make, likely as part of 'nameshortening').</font></div><div><font face="Calibri, sans-serif" size="3"><br></font></div><div><font face="Calibri, sans-serif" size="3">Taking all of that into consideration we can shorten this:</font></div><div><span style="font-family: Calibri, sans-serif;"><message from='juliet@example.com' to='romeo@example.net' xml:lang='en'><body>Art thou not Romeo, and a Montague?</body></message> (130 characters)</span></div><div><span style="font-family: Calibri, sans-serif;">to this:</span></div><div><span style="font-family: Calibri, sans-serif;"><m t='romeo@example.net' xml:lang='en'><b>Art thou not Romeo, and a Montague?</b></m> (85 characters, 65% of the length)</span></div><div><span style="font-family: Calibri, sans-serif;"><br></span></div><div><span style="font-family: Calibri, sans-serif;">XEP-0286<</span><font face="Calibri, sans-serif">http://xmpp.org/extensions/xep-0286.html> has some really nice recommendations. Without compression, a few simple tricks like that will comfortably get you out of the 128 octet FACH threshold. With compression you should be able to send a fair amount of data comfortably. As always, though, test it out before committing to it - it may not be worth the additional interopability headaches.</font></div><br><font face="Calibri, sans-serif" size="3">-- Jonathan Dickinson</font></div>                                           </div></body>
</html>