Piero V.

Prosody, strophe.js e websocket

XMPP (Extensible Messaging and Presence Protocol), è uno standard nato nel 1999 per l’instant messaging col nome di Jabber. È stato usato ed è tuttora usato da moltissime compagnie: Google Talk non era che un servizio jabber, Facebook lo usava come API per la sua chat, Whatsapp usa un server jabber (ejabberd) notevolmente modificato.

Oggi questo protocollo può essere utilissimo alle app per smartphone e tablet: è stato disegnato apposta per l’uso in tempo reale e per essere esteso e i server XMPP sono testati moltissimo, quindi sono ottimi per il concetto di “Don’t reinvent the wheel”.

Inoltre, dopo l’introduzione delle websocket, è stato anche creato uno standard per usarle come canale per XMPP.

Lato server ho testato il server Prosody. L’idea con cui è sviluppato è la semplicità e la leggerezza: è altamente modulare, quindi si possono abilitare solo le funzionalità necessarie, ed è scritto in Lua, un linguaggio molto leggero e performante.

Abilitare le websocket è abbastanza facile, però è richiesta la versione ancora in sviluppo, la 0.10.

Su Debian e altre distribuzioni è presente l’ultima stabile, la 0.9. Anche se secondo la documentazione ufficiale dovrebbe essere compatibile con le websocket, in realtà va evitata: lo sviluppo del modulo è stato integrato nello sviluppo delle funzionalità essenziali e l’ultima versione compatibile produce un XML invalido.

Fortunatamente per Debian e Ubuntu ci sono dei repository ufficiali, basta aggiungerli e installare il pacchetto prosody-0.10, per le altre distribuzioni invece bisogna scaricare i sorgenti ed eseguire configure e make. In ogni caso per l’installazione vi rimando alla guida ufficiale.

Una volta installato bisogna modificare la configurazione (solitamente in /etc/prosody/prosody.cfg.lua), aggiungendo prima il modulo websocket:

modules_enabled = {
[...]
		"websocket";
[...]
}

inoltre, finché non avete un certificato TSL valido, sebbene venga creato un certificato auto firmato di default, vi consiglio di disabilitare la cifratura:

c2s_require_encryption = false
consider_websocket_secure = true

Vi sconsiglio di farlo in produzione però, anche perché esistono alcuni enti certificatori che fanno certificati gratis, come StartSSL.

Un’altra impostazione utile allo sviluppo è anche quella per la protezione per il cross domain:

cross_domain_websocket = true

Per i client, inteso che l’obiettivo sono le app, in particolare quelle ibride (Cordova/PhoneGap), ci sono tre/quattro librerie javascript.

Io ho scelto Strophe.js perché sembra essere la più documentata. All’inizio ho avuto diversi problemi, ci ho provato più e più volte a configurare sia Prosody che i miei script. Alla fine con le configurazioni consigliate sopra dovrebbe andare tutto. Alcuni errori erano che con Prosody 0.9 e Chrome non andava proprio niente, Firefox invece chiudeva prematuramente la connessione perché un tag XML non era chiuso correttamente e il DOMParser lanciava un’eccezione. Con Prosody 0.10 invece il problema era che era obbligatorio passare a TLS (veniva mandato starttls), ma secondo lo standard non si deve usare il TLS di XMPP con le websocket, invece la crittografia deve essere abilitata a livello di websocket, quindi bisogna usare lo schema wss (si veda il punto 3.9 della bozza xmpp-over-websocket-04).

Altre librerie sembravano funzionare anche con configurazioni diverse di Prosody: stanza.io e lighstring.js sono due esempi, tuttavia entrambe sono meno documentate di Strophe.

Un’ultima nota per i client riguarda la compatibilità con websocket: Android KitKat e iOS 7.1 sono certamente requisiti restrittivi. Quello di Android può essere esteso ad Android 1.6 (API 4) grazie al plugin Websocket per Phonegap, ovvero quasi la totalità dei dispositivi Android. Invece, per iOS 7.1, Apple riporta che è disponibile da iPhone 4, iPod Touch 5^ gen., iPad 2 e successivi. Se non vi basta potete sempre usare BOSH e il long polling. Funziona, anche perché è stato sviluppato prima delle websocket, ma ha alcuni svantaggi rispetto a queste ultime, anche se per questo argomento vi rimando a una vostra ricerca.