Thursday, June 19, 2014

eXtensible Jabber untuk Instant Messenger

Banyak orang telah bekerja diatas core protokol jabber. Beberapa diantaranya membuatnya menjadi sebuah standar extension yang dapat dipakai semua orang. Alasan kenapa protokol ini banyak sekali ekstensi yang berseliweran dibanding dengan protokol lain adalah sifatnya yang extensibe. Huruf X dari singkatan XMPP adalah kata eXtensible. Extensible merupakan inti utama yang pengen dibuat dengan protokol ini. Dengan spesifikasi core protokol yang sederhana dan sifatnya yang extensible, semua orang dapat bekerja bersama menciptakan beberapa extensions untuk tujuan integrasi dengan arsitektur sistem mereka. Dengan juga seperti ini, protokol jabber memiliki tingkat interoperabilitas yang besar terhadap banyak teknologi dan protokol lain diluar itu seperti TLS, SASL, SIP, OAuth, SOAP, AMQP, WebDav, Web Socket,  HTTP, dll.

Terdapat kurang lebih tiga ratus standar ekstensi yang didaftar dan dikelola oleh XSF. Beberapa diantaranya adalah ekstensi yang biasa kita temukan pada aplikasi instant messenger. Beberapa ekstensi ini sudah lama dibuat, tapi tetap saja masih relevan dan tetap dipakai oleh aplikasi messenger sekarang ini. 

1. XEP-0054 vCard User

vCard adalah sebuah standar yang digunakan secara luas untuk informasi personal user. Format vCard ini didefinisikan pada RFC 2426. Sedangkan extension ini adalah spesifikasi yang mendefinikan bagaimana menyimpan dan mengambil sebuah representasi XML vCard entitas/user dari server jabber. Penyimpanan dan pengambilan vCard dapat dilakukan dengan mengirim <iq/> tipe set (storage) atau get (retrieval) ke server entitas jabber. Aliran IQ memiliki child elemen <vCard/> dengan namespace 'vcard-temp'. <vCard/> elemen mengandung unsur-unsur vCard-XML yang didefinisikan oleh vCard-XML DTD.

<iq from='mustofa@uin-malang.ac.id/home' id='v1' type='get'>
 <vCard xmlns='vcard-temp' />
</iq>
Contoh ini digunakan untuk mengambil vCard pengguna (sender) dari server jabber. Untuk mengambil vCard dari entitas/user lain dilakukan dengan menambahkan atribut "to" pada <iq> paket. Contoh keluaran yang akan didapat oleh sender adalah sebagai berikut:
<iq id='v1' to='tri@mimicreative.net/home' type='result'> <vCard xmlns='vcard-temp'> <FN>Achmad Mustofa</FN> <N> <FAMILY></FAMILY> <GIVEN>Mustofa</GIVEN> <MIDDLE/> </N> <NICKNAME>Tofa</NICKNAME> <URL>http://goo-code.blogspot.com</URL> <BDAY>1988-02-24</BDAY> <ORG> <ORGNAME>Mimicreative</ORGNAME> <ORGUNIT/> </ORG> <TITLE>CTO</TITLE> <ROLE></ROLE> <TEL><WORK/><VOICE/><NUMBER>087859584883</NUMBER></TEL> <TEL><WORK/><FAX/><NUMBER/></TEL> <TEL><WORK/><MSG/><NUMBER/></TEL> <ADR> <WORK/> <EXTADD></EXTADD> <STREET>Jl. Soekarno hatta 29</STREET> <LOCALITY>Malang</LOCALITY> <REGION>Jatim</REGION> <PCODE> 80202 </PCODE> <CTRY>Indonesia</CTRY> </ADR> <TEL> <HOME /> <VOICE /> <NUMBER>087859584883</NUMBER></TEL> <TEL><HOME/><FAX/><NUMBER/></TEL> <TEL><HOME/><MSG/><NUMBER/></TEL> <ADR> <HOME/> <EXTADD/> <STREET/> <LOCALITY>Malang</LOCALITY> <REGION>Jatim</REGION> <PCODE> 80209 </PCODE> <CTRY>Indonesia</CTRY> </ADR> <EMAIL><INTERNET/><PREF/><USERID>goo.code@gmail.com</USERID></EMAIL> <JABBERID>mustofa@jabber.com</JABBERID> <DESC> More information about me is located on my personal website: http:goo-code.blogspot.com </DESC> </vCard> </iq>
Jika tidak terdapat vCard kontak user, maka keluaran yang akan didapat sender adalah stanza IQ tipe error dengan elemen child <item-not-found>.
<iq id='v1' to='mustofa@uin-malang.ac.id' type ='error'> <vCard xmlns ='vcard-temp'/> <error type ='cancel'> <item-not-found xmlns ='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq >
Entitas/user bisa saja tidak memberikan informasi apapun terkait dirinya. Untuk kasus seperti ini keluaran yang akan didapatkan sender adalah seperti berikut.
<iq id='v1' to='mustofa@uin-malang.ac.id' type ='result'> <vCard xmlns ='vcard-temp'/> <iq>
Mengambil vCard menggunakan stanza IQ-get seperti yang ditunjukkan pada xml stream diatas, sedangkan untuk mengedit informasi vCard disini kemudian menggunakan IQ-set, seperti yang ditunjukkan pada paket xml berikut ini.
<iq id='v2' type ='set'> <vCard xmlns ='vcard-temp'> <FN>Peter Saint - Andre </FN> <N> <FAMILY >Saint - Andre </FAMILY> <GIVEN>Peter </GIVEN> <MIDDLE/> </N> <NICKNAME >stpeter </NICKNAME> <URL>http: // www . xmpp . org / xsf / people / stpeter . shtml </URL> <BDAY>1966 -08 -06 </BDAY> <ORG> <ORGNAME>XMPP Standards Foundation </ORGNAME> <ORGUNIT/> </ORG> <TITLE>Executive Director </TITLE> <ROLE>Patron Saint </ROLE> <TEL><WORK/><VOICE/><NUMBER>303 -308 -3282 </NUMBER></TEL> <TEL><WORK/><FAX/><NUMBER/></TEL> <TEL><WORK/><MSG/><NUMBER/></TEL> <ADR> <WORK/> <EXTADD>Suite 600 </EXTADD> <STREET>1899 Wynkoop Street </STREET> <LOCALITY>Denver </LOCALITY> <REGION>CO </REGION> <PCODE>80202 </PCODE> <CTRY>USA </CTRY> </ADR> <TEL><HOME/><VOICE/><NUMBER>303 -555 -1212 </NUMBER></TEL> <TEL><HOME /><FAX /><NUMBER /></TEL> <TEL><HOME /><MSG /><NUMBER /></TEL> <ADR> <HOME/> <EXTADD /> <STREET /> <LOCALITY >Denver </LOCALITY> <REGION >CO </REGION> <PCODE >80209 </PCODE> <CTRY>USA </CTRY> </ADR> <EMAIL><INTERNET/><PREF/><USERID> stpeter@jabber . org </ USERID ></EMAIL> <JABBERID > stpeter@jabber . org </JABBERID> <DESC> Check out my blog at https: // stpeter .im/ </DESC> </vCard> </iq>

2. XEP-0184 Receipt Message

Sesuai dengan core protokol jabber, bahwa stanza message bersifat send and forget. Message akan terkirim dan tidak mengembalikan laporan apapun ke sender. Core jabber tidak menspesifikan laporan ke sender bahwa stanza message yang dia kirim telah diterima pada tujuan. Dengan extension ini memberikan sebuah mekanisme apakah sebuah message yang telah dikirim oleh entitas sender sudah sampai pada entitas tujuannya (delivered). Terdapat dua elemen yang didefinisikan pada spesifikasi ini, yang pertama adalah <request/> yang diikutsertakan pada setiap message entitas sender, kedua adalah <received/> yang dikirim oleh entitas receiver, menandakan sebagai ack bahwa message telah delivered.
<iq  from='mustofa@uin-malang.ac.id/kantor'  id='disco1'  to='himma@mimicreative.net/kantor'  type='result'> <query xmlns='http://jabber.org/protocol/disco#info'> ... <feature var='urn:xmpp:receipts'/> ... </query> </iq>
Receipts message memiliki namespace "urn:xmpp:receipts" pada keluaran Service Discovery. Baik entitas sender maupun entitas receiver yang terhubung harus memiliki namespace ini. Service discovery ini merupakan sebuah mekanisme bagi setiap entitas untuk mengetahui service atau fitur apa saja baik yang didukung oleh server maupun setiap entitas user.

Contoh sebuah paket message dengan spesifikasi ini adalah sebagai berikut,
<message
from = 'mustofa@uin-malang.ac.id/kantor' id = '0c7des' to='himma@mimicreative.net/kantor' > <body>Ngopi, nanti malem ditempat biasa.</body > <request xmlns='urn:xmpp:receipts' /> </message >
Sender harus memasukkan juga sebuah atribut id pada tiap message yang akan dia kirimkan. Tampak pada contoh diatas, id message tersebut angka random 0c7des. Untuk melakukan implementasi XEP-0184 adalah dengan menambahkan tag request pada paket message seperti yang tampak pada contoh diatas. Ketika entitas tujuan juga mengimplementasi spesifikasi ini, maka dia akan mengirimkan sebuah paket ack yang menandakan bahwa paket message telah diterimanya.
<message  from='himma@ mimicreative.net/kantor'  id='698'  to='mustofa@uin-maliki.ac.id/kantor> <received xmlns='urn:xmpp:receipts' id = '0c7des' /> </message>

3. XEP-0085 Chat State Notifications

Pada dasarnya ekstensi ini menghasilkan beberapa informasi yang dapat membantu partner/user dalam sebuah sesi conversation. Informasi yang dimaksud adalah ketika user meninggalkan halaman chat conversation, atau ketika user sedang melakukan typing, atau mungkin juga membatalkan/menghapus semua kata yang seharusnya dia kirimkan. Ada lima state chat yang didefinisikan, yaitu:
  1. <active/> : Definisi bahwa user mendukung ekstensi ini dan siap berpartisipasi terhadap chat session. 
  2. <inactive/> : Definisi bahwa user tidak lagi aktif berpartisipasi terhadap chat session.
  3. <gone/> : Definisi bahwa user selesai melakukan session.
  4. <composing/> : Definisi bahwa user sedang melakukan "typing".
  5. <paused/> : Definisi bahwa user sebelumnya melakukan "typing" tapi kemudian berhenti (melakukannya).

<iq
from='haqqi@tomatech.mobi/office' id='disco1' to='tri@thewolflabs.com' type='result'> <query xmlns='http://jabber.org/protocol/disco#info'> ... <feature var='http://jabber.org/protocol/chatstates'/> ... </query> </iq>
Spesifikasi ini memiliki namespace http://jabber.org/protocol/chatstates pada keluaran Service Discovery. User maupun partner dalam sebuah sesi harus memiliki namespace ini. Hal ini dapat digunakan sebagai mekanisme cek dan ricek bahwa user entitas tujuan/lain juga mendukung extension ini.

Beberapa contoh sebuah sesi percakapan dengan Chat State Notifications adalah sebagai berikut,
<message from='haqqi@tomatech.mobi/office' to='tri@thewolflabs.com/kantor' type='chat'> <body>Howl, jadi kapan?</body> <active xmlns='http://jabber.org/protocol/chatstates'/> </message>
Pada contoh, user haqqi@tomatech.mobi/office memulai sebuah percakapan dengan mengirimkan paket <message/> dengan state active kepada tri@thewolflabs.com/kantor. Jika partner percakapan yaitu tri@thewolflabs.com/kantor juga support terhadap spesifikasi ini, maka contoh reply yang akan didapat adalah sebagai berikut:
<message from = 'tri@thewolflabs.com' to = 'haqqi@tomatech.mobi/kantor' type='chat'> <body>Nanti malem yah #BraveYourSelf</body> <active xmlns='http://jabber.org/protocol/chatstates'/> </message>
Karena kedua entitas mendukung chat state notifications, maka keduanya kemudian dapat memperoleh state informasi terhadap sesi percakapan yang mereka lakukan.
<message from = 'haqqi@tomatech.mobi/office' to='tri@thewolflabs.com/kantor' type='chat'> <composing xmlns='http://jabber.org/protocol/chatstates'/> </message>

4. XEP-0256 Last Activity

Ekstensi ini mendefinisikan sebuah mekanisme untuk mengetahui kapan terakhir sebuah entitas user aktif (terkoneksi dan terautentikasi pada server). Spesifikasi ini memiliki namespace jabber:iq:last. Ketika user memulai sebuah sesi presence, maka paket berikut memberikan informasi bahwa kapan user tertentu terakhir online atau aktif (memiliki status mode away atau xa) pada jam dan waktu tertentu.
<presence from='haqqi@mimicreative.net'> <query xmlns='jabber:iq:last' seconds='86511'/> </presence>
<presence from='himma@mimicreative.net'> <show>away</show> <query xmlns='jabber:iq:last' seconds='600'/> </presence>
Pada contoh terdapat informasi yang memberitahukan bahwa user haqqi@mimicreative.net terakhir online pada 24 jam dan 111 detik yang lalu dan user himma@mimicreative.net aktif pada 10 menit yang lalu.

5. XEP-0203 Delayed Delivery

Spesifikasi ini menyediakan timestamp informasi mengenai store data atau pesan delay pada server. Ketika entitas tujuan belum available untuk bertukar pesan, pesan yang masuk akan disimpan pada server (delay). Begitu entitas tujuan available, semua pesan delay akan terkirim padanya. Dengan memakai ekstensi ini, pesan delay yang masuk pada entitas tujuan akan terdapat tag <delay/> yang memuat informasi kapan entitas sender mengirim paket message ini.
<message from='' to='' type='chat'> <body>Hello</body> <delay xmlns='urn:xmpp:delay' from='' stamp='2002-09-10 T23:08:25Z'> Offline Storage </delay> </message>
Receiving a Message Sent While Offline
<presence from='' to=''> <status>anon!</status> <show>xa</show> <priority>1</priority> <delay xmlns='urn:xmpp:delay' from='' stamp='2002-09-10 T23:41:07Z'/> </presence>
Receiving the Last Presence Update of Another Entity
<message from='' to='' type='groupchat'> <body>Hola</body> <delay xmlns='urn:xmpp:delay' from='' stamp='2002-09-10 T23:05:37Z'/> </message>
Receiving Cached Messages from a Conference Room
Masih banyak ekstensi yang dapat dimanfaatkan dalam rangka pembuatan aplikasi instant messenger. Sebenarnya ada tiga ekstensi lagi yang pengen saya masukkan, tapi berhubung banyak sekali spesifikasi manual dari masing-masing ekstensi ini, maka akan saya pisah untuk artikel selanjutnya. Tiga ekstensi ini adalah Multi-User Chat (XEP-0045), Message Archiving (XEP-0136), dan Personal Eventing Point (XEP-0163). Dengan memahami beberapa ekstensi ini, saya yakin membuat aplikasi messenger yang berjalan pada jaringan jabber akan menjadi mudah banget. Protokol ini memang sederhana tapi komplit, saya sarankan pada rekan-rekan sebelum memutuskan untuk membuat komponen/plugin yang berjalan pada server jabber coba cari dulu ekstensi-ekstensi yang sudah berjalan dan dibuat. Selain memang untuk memangkas waktu untuk development, ekstensi-ekstensi ini terus diawasi/dikembangkan agar tetap relevan terhadap perkembangan teknologi.

No comments:

Post a Comment