Friday, June 20, 2014

Model Group Chat XEP-0045

Pada tahun 1999, komunitas jabber telah membuat sebuah basis sistem text conferencing yaitu groupchat 1.0 (GC). Basis sistem ini merupakan minimal fitur untuk implementasi chat room. Groupchat 1.0 ini merupakan protokol yang memiliki kemiripan dengan protokol Internet Relay Chat (IRC). Sedangkan spesifikasi Multi-User Chat (XEP-0045) merupakan spesifikasi advanced features sebagai pengembangan dari groupchat 1.0. Terdapat banyak sekali fitur yang ditambahkan pada spesifikasi ini, seperti invitation, room moderation, pembagian tipe room, dan room discovery.

Secara umum spesifikasi tidak merubah basis sistem groupchat 1.0 (backwards-compatible), sehingga baseline functionality dari groupchat 1.0 ini masih dipakai oleh spesifikasi ini. Fungsionalitas groupchat 1.0 yang dimaksud adalah:

  1. Setiap room memiliki identitas unik sebagai "room JID" yang memiliki format penulisan room@service, contohnya thewolfpack@conference.hangover.com. "thewolfpack" adalah nama room sedangkan conference.hangover.com adalah alamat service dari Multi-User Chat.
  2. Setiap partisipator didalam room teridentitas sebagai "occupant JID" dengan format penulisan room@service/nickname, contoh thewolfpack@conference.hangover.com/alex. "alex" adalah room nickname dari user yang tergabung pada room.
  3. User dapat masuk kedalam chat room (menjadi partisipator) dengan mengirim secara langsung sebuah presence kepada alamat room@service/nickname.
  4. Partisipator dapat mengubah nicknamenya dengan mengirim informasi presence ke room@service/newnickname.
  5. Sebuah message dalam multi-user chat memiliki tipe "groupchat" dan memiliki alamat room@service. Service kemudian akan mengirimkannya kepada seluruh partisipator.
  6. Partisipator keluar dari room dengan mengirimkan presence tipe "unavailable" ke alamat room@service/nickname.

Sedangkan fitur tambahan yang ada pada spesifikasi XEP-0045 ini adalah sebagai berikut:

  1. Native conversation logging.
  2. Membolehkan user untuk request menjadi member pada private room.
  3. Membolehkan partisipator untuk melihat occupant JID pada non-anonymous room.
  4. Membolehkan moderator untuk melihat occupant JID pada semi-anonymous room.
  5. Dapat mengatur hanya moderator saja yang dapat mengganti topik/subjek sebuah room.
  6. Membolehkan moderator untuk mengeluarkan (kick) partisipator dan visitor pada room.
  7. Membolehkan moderator untuk mengeluarkan dan mencabut ijin bicara pada moderated room.
  8. Membolehkan administrator untuk memberi dan mencabut ijin sebagai moderator room.
  9. Membolehkan administrator untuk mengeluarkan user dari room (ban) dan juga mengatur daftar ban user.
  10. Membolehkan administrator untuk memberikan dan menolak membership privileges dan juga mengatur daftar member pada membe-only room.
  11. Membolehkan owner untuk mengatur konfigurasi sebuah room sebagai contoh memberikan limit member.
  12. Membolehkan owner untuk menunjuk owner lain.
  13. Membolehkan owner untuk memberikan dan mencabut ijin sebagai administrator dan juga mengatur daftar administrator.
  14. Membolehkan owner untuk menutup room.

Pada dokumen spesifikasi ini, disebutkan juga beberapa room type yang didefinisikan seperti:

  1. public vs. hidden
  2. persistent vs. temporary
  3. password-protected vs. unsecured
  4. members-only vs. open
  5. moderated vs. unmoderated
  6. non-anonymous vs. semi-anonymous

Beberapa spesifikasi ini saya ambil dari dokumen manual XEP-0045 yang dikeluarkan IETF. Rekan-rekan akan lebih baik membaca dokumen tersebut untuk mengetahui lebih detailnya. Spesifikasi ini begitu komplek bahkan untuk pembuatan aplikasi group chat, tapi memang pada dasarnya spesifikasi ini tidak dibuat hanya untuk pembuatan aplikasi itu. Kita bisa membandingkan model yang ditawarkan spesifikasi ini dengan model yang ada pada spesifikasi publish-subscribe yang ada pada XEP-0060. Dari kedua model yang ditawarkan ini, model mana yang lebih cocok dengan aplikasi yang hendak kita buat.

Tidak hanya pembuatan group chat saja, saya pernah menemukan sebuah aplikasi chess (catur) yang juga memanfaatkan spesifikasi MUC untuk urusan bisnis aplikasinya. Yang saya maksud ini seperti invite lawan untuk bermain, lawan menyetujui undangan untuk bermain, melihat semua daftar permainan yang sedang berlangsung (room) dan juga sampai pada mekanisme user viewer (bukan pemain) yang hanya masuk untuk menonton jalannya permainan. Game-game model seperti ini tentunya kita sudah banyak melihat, bahkan kita pernah juga memainkannya sekarang ini, seperti game poker dari zynga, poin blank (PB). Dan pada akhirnya kita bisa dengan mudah membuat aplikasi game yang serupa karena modelnya sudah ada dan terbentuk yaitu dengan model Multi-User Chat XEP-0045 ini.

Sebelum menyetujui untuk memilih spesifikasi ini, penting juga untuk mengetahui bahwa setiap pesan masuk pada room tidak-lah bersifat durable. Artinya adalah pesan masuk akan disampaikan, hanya pada user-user yang sedang join room sekarang. Penting juga mengetahui maksud kata “join” pada kalimat ini. Entitas/user harus memiliki status network available dan telah bergabung kedalam room, baru kemudian pesan masuk akan dapat dia terima, tapi jika kemudian koneksi terputus maka dia tidak akan mendapatkan lagi pesan sedang masuk sekarang ini. Baik tipe room publik maupun member-only memiliki mekanisme pesan seperti ini. Tidak ada mekanisme queue untuk pesan masuk agar pesan tersampaikan semua pada entitas yang sudah langganan ke group seperti yang ada pada protokol AMQP dan MQTT. Untuk beberapa permasalahan yang ada ini, MUC mendefinisikan Discussion History yang akan sangat membantu, tapi tentu saja cara ini merupakan trik untuk mengatasi permasalahan yang ada. Untuk alasan seperti ini jugalah, kita harus hati-hati dalam memilih protokol dengan spesifikasi Multi-User Chat ataukah protokol dengan model publish-subscribe seperti XEP-0060, AMQP, MQTT, Apache Kafka, dll. 

Thursday, June 19, 2014

Module Pattern Javascript


Modularisasi kode javascript bisa dilakukan dengan teknik module pattern. Teknik ini diperkenalkan oleh Douglas Crockfold, orang sama yang memperkenalkan JSON sebagai data interchange format. Sebenarnya tujuan utama dari teknik ini adalah menghindari penggunaan variabel global secara berlebihan. Sedikit variabel global yang ada pada aplikasi, tentunya akan semakin meningkatkan performa dari aplikasi yang akan jalan pada browser.
Dalam pemrograman javascript, baik variabel dan fungsi bersifat global atau publik, tidak ada scope private dan protected layaknya bahasa pemrograman lain seperti C, php, java. Tapi bukannya tidak bisa, kita bisa memberikan efek yang sama(scope variable) dengan memanfaatkan anonymous function dan single global variable yang nantinya juga memiliki efek sama dengan namespace.
Anonymous Function
(function () {
...
}());
Kode diatas merupakan bentuk dari anonymous function, ditambah dengan operator parentheses atau '()' yg tujuan nya langsung meng-call anonymous function. Anonymous function merupakan bagian fundamental dari kode javascript, semua kode yang berada didalam fungsi merupakan kode tertutup(closure) yang tidak akan bisa diakses dari luar. Kode akan terlihat lebih bersih dan kekawatiran kode memiliki nama yang sama atau collisions objek/variabel akan menjadi lebih kecil.
Single Global Variable
var myApp = {}; // Definisi single global variable object
myApp.messageHello='Hello'; // Membuat variabel didalam objek
myApp.sayHello = function() { // Menciptakan objek method sayHello
console.log(myApp.messageHello); // Display properti objek di console
};
myApp.sayHello(); // Memanggil method objek
myApp merupakan single global variable yang mereferensikan sebuah objek. Efek dari teknik ini, variabel dan fungsi dalam objek akan aman dari modifikasi script lain diluar objek myApp dan pemborosan global variabel pun juga tidak akan terjadi.
Module Pattern
Dengan memahami anonymous function dan single global variable, kita bisa menentukan variabel-variabel mana yang bisa bersifat global dan mana yang cukup hanya diakses diwilayah fungsi/lokal saja. Bukan hanya itu, kode seperti ini dapat memiliki efek sama dengan saat kita bekerja dengan modul-modul kode yang independen. Berikut adalah contoh kode saat kita menggabungkan kedua teknik ini.
var MODULE = (function () {
var my = {},

privateVariable = 1;
function privateMethod() {
...
}

my.moduleProperty = 1;
my.moduleMethod = function () {
console.log('Private variable: '+privateVariable);
console.log('MODULE variable: '+my.moduleProperty);
};

return my;
}());
MODULE.moduleMethod();
MODULE adalah variabel global yang dibuat dengan anonymous function, dengan me-return objek my. Variabel yang berada langsung di bawah anonymous function memiliki sifat scope private sedangkan properti dan fungsi dari objek my, bisa diakses dari luar/publik, tentu saja dengan menyebutkan nama "modul" nya jika hendak mengaksesnya.
Hal ini sangat bagus, selain kode yang kita buat tampak seperti modular, ada begitu banyak bentuk pengembangan teknik ini yang tentunya akan sangat bermanfaat saat kita berada di pemrograman front-end seperti nested namespacing dan lazy loading code. Berikut adalah manfaat dari module pattern seperti yang disampaikan oleh Brian Cray:
  1. Scalable. Modules are isolated pieces of code that when well designed.
  2. Team-ready. Building a large-scale javascript application is simpler with the module pattern.
  3. Localized. Anonymous wrappers automatically create a new “namespace” for the whole module.
  4. Cross-instantiation private variables.
  5. Extensible. Want to dynamically add additional methods to a module? No problem.
  6. Deferrable. Another advantage of its isolation and containment is that you can inject it on demand without worrying about its impact on other modules.

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.

Core Protokol Jabber: XML Stanza

Core protokol jabber didefinisikan pada RFC 3920. Pada dokumen ini, terdapat dua pokok bahasan yang dijelaskan, yaitu  XML Stream dan XML Stanza. Seperti yang diketahui semua paket data yang ditransmisikan pada jaringan ini memiliki format XML. XML Stream yang hampir memenuhi isi dokumen mengenai bahasan (1) penggunaan protokol keamanan TLS (Transport Layer Security) pada jaringan jabber, (2) otentikasi menggunakan metode SASL (Simple Authentication and Security Layer) dan juga (3) mekanisme untuk binding sebuah resource untuk client koneksi yang terbentuk (Resource Binding). Setelah itu bahasan pada dokumen RFC 3920 akan beralih pada XML Stanza. Stanza ini merupakan salah satu dari child elemen XML Stream, seperti yang ditunjukkan pada gambar bawah. Dan pada artikel ini saya coba tulis hanya perbagian XML Stanza saja, hal ini karena memang pada prakteknya kita akan cukup banyak berurusan dengan ini untuk membangun sebuah sistem aplikasi yang berjalan pada jaringan jabber.
XML Stream dan XML Stanza
Terdapat tiga jenis XML Stanza yang ditransmisikan, antara lain message, presence, dan info query atau lebih dikenal dengan IQ.  Jenis pertama (1) message, merupakan general paket jabber berisi informasi yang dikirim dari satu entitas ke entitas lainnya. Pengiriman paket ini bersifat fire and forget, artinya entitas pengirim tidak akan mendapatkan result dari paket message yang telah dia kirimkan. Selain itu juga message ini dikirimkan dari dan ke one-to-one entitas atau one-to-many. Jenis yang kedua adalah (2) presence, dikirimkan dengan tujuan availability kehadiran entitas yang terhubung dalam jaringan. Entitas dapat mengetahui status online atau offline dari setiap entitas lain karena adanya aliran data presence ini. Tidak seperti message, presence dikirimkan ke semua entitas (broadcast) yang sudah subscribe ke entitas tersebut. Terakhir, jenis yang ketiga adalah (3) IQ, digunakan untuk mekanisme request-response antar entitas dalam jaringan jabber. Mirip dengan metode GET dan POST pada protokol HTTP. Terdapat sebuah entitas yang mengirimkan request ke entitas lain, dan akan menerima response balasan dari entitas tersebut.
XMPP Server

1. Message

Jabber menggunakan stanza message untuk mengirim pesan. Pesan dapat dikirm antara jabber client dengan jabber server atau antara jabber server dengan server jabber yang lain. Stanza message sangat sederhana, Entitas sender mengirim stanza message ke entitas recepient. Secara default tidak ada acknowledge ketika recepient menerima stanza message. Jika pesan dikirim dan recepient dalam keadaan offline maka server berkewajiban menyimpan pesan tersebut dan mengirimkannya ketika recepient sudah dalam keadaan online/available. Proses seperti ini mengacu pada proses store and foward. Pada dasarnya format untuk stanza message adalah sebagai berikut :

Message Stanza


  1. to="" from="" Mengidentifikasikan sender dan recepient. Format alamat jabber diatur dalam spesifikasi core jabber mengenai JID. Atribut ini diperlukan untuk semua paket stanza message.
  2. id="" Digunakan identifier yang unik pada pesan. Client dapat menggunakan id untuk mengidentifikasikan pesan jika paket message mengalami error. Atribut ini bersifat opsional.
  3. type="error" Mengindikasikan bahwa pesan adalah error message.
  4. type="chat" Mengindikasikan bahwa pesan ditampilkan dalam sebuat line-by-line chat interface (one-to-one chat).
  5. type="groupchat" Mengindikasikan bahwa pesan ditampilkan dalam room chat interface.

Stanza message mempunyai dua set subelemen (child element) didalamnya. Pertama adalah content atau payload paket (body elemen dan error elemen) dan kedua adalah subelemen yang merupakan informasi metadata dari paket message tersebut (x elemen).

<body><body>
Subelemen ini membungkus isi pesan (payload) yang akan dikirimkan. Subelemen ini hanya diperbolehkan ada satu kali pada setiap paket stanza message dan juga harus berupa plain-text.

<x xlmns="jabber:x:"></x>
Subelemen ini digunakan untuk mengirim perintah antar client atau sebagai mekanisme tambahan. Setiap kali elemen ini digunakan, namespaces (xmlns) harus didefinisikan. Sebuah pesan dapat memiliki banyak elemen <x> ini. Sebagai contoh namespaces untuk out-of-bond extension dapat digunakan untuk mengirim file antar aplikasi.

Subelemen ini disertakan ketika atribut type dari pesan di set error. Error yang sebenarnya didefinisikan oleh atribut dengan type="nnn" yang menunjukkan jenis dari error tersebut.

  • 302 – redirect
  • 400 – Bad Request
  • 401 – Unauthorized
  • 402 – Payment Reuired
  • 407 – Registration Required
  • 408 – Request Timeout
  • 409 – Conflict
  • 500 – Internal Sevrer Error

Isi subelemen error adalah penjelasan teks untuk spesifik error yang sedang terjadi. Sebagai contoh, bad request akan memiliki format penulisan sebagai berikut :

<error type="400">Bad Request</error>

Contoh paket stanza message yang valid dikirim ke entitas/user tujuan adalah sebagai berikut:

<message from='mustofa@uin-malang.ac.id/kampus' to='haqqi@tomatech.mobi'>
   <body>Howdy</body>
</message>

2. Presence

Stanza presence ini bertanggung jawab terhadap dua hal dibawah ini, yaitu :

  1. Presence Update, menginformasikan pengguna lain status presence yang sedang kita digunakan.
  2. Presence Subscription Management, mengijinkan pengguna untuk mendaftarkan update presence dari pengguna lain dan mengatur siapa saja yang berhak mengetahui status kehadirannya.

Dalam kedua peran tersebut server jabber bertindak sebagai penengah antara presence information generator dan presence recepients. Server tidak memiliki kewenangan untuk secara pasif mengatur rute dari paket presence namun secara aktif server berpartisipasi di dalam paket presence untuk memastikan operasi dilakukan dengan benar.

Presence update menggunakan  model pesan satu arah atau one-way message. Client mengirim stanza presence untuk memperbarui status kehadirannya kepada server, kemudian server meneruskan salinan dari paket tersebut kepada semua pihak yang terdaftar pada presence subscription list dari client pengirim. Subscription list tersebut dinamakan roster di dalam jabber, namun lebih umum dikenal dengan sebutan buddy list.

Entitas jabber dapat dapat meminta subscribe presence dari entitas/client lainnya. Proses subscribing tersebut adalah sebuah mekanisme/kesepakatan untuk mengetahui status kehadiran dari entitas yang satu dengan yang lain. Sebagai contoh, kita dapat meminta subscribe presence teman sehingga ketika teman tersebut available/online, kita akan mendapatkan paket kehadirannya, tapi tidak sebaliknya.
Beberapa atribut stanza presence diasosiasikan sama dengan stanza message, seperti atribut to dan from. Presence memiliki memiliki tipe atribut yang memiliki 7 state sebagai berikut:

  1. unavailable : client tidak lama tersedia untuk berkomunikasi
  2. subscribe: pengirim mengirimkan request untuk subscribe terhadap presence penerima
  3. subscribed: pengirim yang telah diizinkan terhadap recipient untuk menerima presence mereka.
  4. unsubscribe : subscription request yang telah ditolak atau subscription yang telah di cancel sebelumnya.
  5. probe: request dari client yang presence saat ini
  6. error: pesan kesalahan yang berlangsung berdasarkan pemrosesan atau menyediakan paket presence yang telah dikirim sebelumnya.

Server menggunakan probe presence packet untuk request spesifik entitas dari presence packet. Dalam hal ini entitas yang dimaksud adalah menentukan apakan entitas tersebut available atau unavailable. Entity Probe mengijinkan informasi presence untuk dikirimkan
Elemen request probe presence dikirim dengan menggunakan format dibawah ini

<presence type="probe">
Elemen-elemen dibawah ini digunakan di dalam elemen <presence>.

<status></status>
Elemen ini digunakan untuk menampilkan deskripsi status dari user yang dapat langsung dilihat oleh user lain. Misal, pengguna ingin menampilkan status yang menunjukkan deskripsi dari apa yang sedang ia lakukan, “i’m at lunch" atau "be back in 5 minutes"

<priority><priority>
Elemen ini memberi prioritas dari presence pada satu entitas pengguna. Misal mustofa@uin-malang.ac.id mungkin login dengan menggunakan multiple resources (home computer, work dan work computer). Elemen ini memberikan prioritas angka untuk setiap resources. Semua pesan dan komunikasi akan diarahkan kepada resources yang mempunyai nilai prioritas paling tinggi. Ketika prioritas resources paling tinggi tersebut menjadi unavailable, pesan dan komunikasi akan dikirim ke resources lainnya yang mempunyai nilai prioritas tertinggi kedua. Prioritas yang bernilai negatif menunjukkan bahwa resources tidak dapat digunakan untuk direct atau immediate contact.

Elemen ini menunjukkan bagaimana status kehadiran seorang user kepada entitas/user lain.

  • show : menggambarkan status yang tersedia dari entities atau resource yang spesifik. show memiliki empat nilai yang digunakan :
  • away : temporarily away
  • chat : bebas untuk chat
  • xa : extended away
  • dnd : do not disturb
  • status : merupakan deskripsi bahasa natural yang bersifat opsional yang mendeskripsikan status yang tersedia.
  • priority : bilangan integer bukan negatif yang menampilkan level prioritas pada resource yang terkoneksi, dengan 0 sebagai prioritas terendah.
  • error : deskripsi pesan kesalahan

Contoh stanza presence adalah sebagai berikut :

<presence from='juliet@capulet.com/balcony' to='romeo@montague.net/orchard'>
 <show>away</show>
 <status>be right back</status>
 <priority>0</priority>
</presence>

Presence Stanza


3. Info/Query

Meskipun secara garis besar trafik jabber terdiri dari message dan presence, sebagian besar pekerjaan implementasi arsitektur client-server adalah mengatur urusan administrasi dan manajemen. Pada protokol jabber tugas tersebut menggunakan  generic query protocol yang disebut IQ. Tipe atribut pada stanza info/query memiliki 4 nilai yang dapat digunakan,

  1. get : informasi request
  2. set : menyediakan data yang dibutuhkan
  3. result : respon terhadap get dan set request yang sukses
  4. error : kesalahan yang terjadi dalam pemrosesan dan layanan get dan set request

Di dalam setiap IQ, sebuah namaspaces mendefinisikan tipe dari query yang akan dilakukan. Namespaces didefinisikan di dalam elemen query seperti yang ditunjukkan dibawah ini.

<query xmlns="*"/>
Paket IQ

Sebagai contoh, client mengirim query-set dengan client authentication namespaces ke server untuk login.

<iq type="set" to="mustofa@uin-malang.ac.id">
 <query xmlns="jabber:iq:auth"></query>
</iq>
Format protokol IQ yang digunakan pada jabber dapat dirumuskan seperti yang ditunjukkan dibawah ini.

<iq
 type='set|get|result|error'
 to='handler_jid'
 from='originator_jid'
 id='unique'>
 <query xmlns='iq extension namespace'>
 <query_field1/>
 <query_field2/>
 </query>
</iq>
Stanza IQ sangat penting jika ingin membangun server berdasarkan kebijakan keamanan sistem yang harus dipenuhi oleh client. Jika keamanan client telah terpenuhi maka harus mendukung pula terhadap keamanan pada sisi server.
Tipe IQ


Sunday, October 27, 2013

Menggabungkan banyak file script dengan Ant


Tips penting untuk optimasi website adalah mengurangi jumlah komponen yang ter-load. Yahoo!’s Exceptional Performance team menempatkan tip ini pada urutan pertama, ini artinya mengurangi jumlah komponen-komponen yang ter-load seperti image, style dan script file akan dapat mempercepat waktu load secara nyata pada halaman web. Beberapa artikel berkenaan optimasi pernah saya tulis, diantaranya:

Masih terkait dengan optimasi website, artikel ini akan menjelaskan bagaimana kita dapat menggabungkan beberapa file javascript menjadi satu file javascript, istilah teknisnya adalah concatenate file. Kita bisa saja melakukannya secara manual dengan satu persatu isi file kita pindahkan. Untuk dua atau tiga file mungkin cara ini dapat dilakukan, tapi dengan jumlah file lebih dari itu, tentu cara ini akan sangat merepotkan.
Pada tutorial ini, saya akan tunjukkan bagaimana cara concatenate javascript file dengan memakai Ant script pada Netbeans. Sebenarnya ini pengalaman yang saya dapati kemaren. Saya mendapatkan sebuah theme wordpress yang harus saya pakai, namun setelah saya pelajari ternyata theme ini meload belasan librari jQuery pada setiap page wordpress. Hal ini tentunya merupakan permasalahan untuk optimasi website yang saya kerjakan.
Berikut adalah IDE dan ant version yang saya gunakan:
  • NetBeans 7.0 untuk PHP Project 
  • Ant version 1.12.1

STEP 1. BUAT BUILD.XML

File konfigurasi yang akan dibaca oleh ant berbentuk xml. File ini bernama build.xml. Semua konfigurasi dan task terdapat pada file ini. Di Netbeans kita bebas membuat file ini dimana saja, caranya klik kanan pada folder dan pilih bagian "Other -> Ant Build Script"
Ant Build Script
Ant Build Script
Pada PHP project(Netbeans 7.0) yang saya pakai, pilihan menu "Other -> Ant Build Script" tidak dapat saya temukan, tapi jangan khawatir kita masih bisa membuatnya dengan memilih file "XML -> XML Document".
XML Document
XML Document
File xml dengan cara ini tidak akan dikenali sebagai file konfigurasi ant, dia akan dikenali sebagai file xml biasa. Trik agar dikenal sebagai file ant adalah dengan mengubah namanya menjadi build.ant. Kemudian iconnya harusnya akan berubah seperti ini.
Ant File Konfigurasi
Ant File Konfigurasi
Root tag dan atribut dari file xml ini adalah "project" dengan beberapa atribut yang dapat anda lihat pada gambar berikut ini:
Ant Project File
Ant Project File
Disini terlihat beberapa properti yang saya definisikan. Properti root didefinisikan sebagai tempat dimana file konfigurasi ini berada(build.xml). Kemudian src merupakan folder dimana file-file sumber berada dan build folder dimana hasilnya akan disimpan.

STEP 2. BUAT ANT TARGET "CONCATENATE"

Pada dasarnya file konfigurasi ant ini terdiri dari beberapa properti dan task yang kita berikan padanya. Dalam kasus ini, kita akan membuat sebuah task yang akan menggabungkan file-file javascript yang kita berikan padanya. Berikut adalah script lengkap mengenai task ini:
<project name="Concat file javascript" default="default" basedir=".">
  <description>
        Concatenate javascript file
  </description>
  <property name="root" location="." />
  <property name="src" location="${root}" />
  <property name="build" location="${root}/concat" />
  <target name="concatenate-js-file">
    <concat destfile="${build}/jquery-lib-concat.js" encoding="UTF-8" fixlastline="yes">
      <filelist dir="${src}"
        files= "jquery.prettyPhoto.js,
        jquery.tools.min.js,
        jquery.easing.1.3.js,
        jquery.cycle.all.min.js,
        jquery.nivo.slider.pack.js,
        jquery.anythingslider-min.js,
        jquery.anythingslider.fx-min.js,
        jquery.anythingslider.video.min.js,
        jquery.isotope.min.js,
        jquery.ba-bbq-min.js,
        jquery-ui-1.8.20.custom.min.js,
        jquery.bxSlider.min.js,
        jquery.li-scroller.1.0.js,"
      >
      </filelist>
    </concat>
  </target>
  <target name="minify-js-file"></target>
</project>
Atribut name pada tag target merupakan nama dari sebuah task yang kita definisikan. File hasil dari concatenate akan diletakkan pada file jquery-lib-concat.js, sedangkan file-file sumber di daftar pada tag filelist.
jQuery Librari
jQuery Librari

STEP 3. RUN ANT TASK "CONCATENATE"

Semua task atau target yang kita buat, akan tampak pada Navigator yang tampak pada window sebelah kiri IDE. Shortcut untuk menampilkan window ini adalah Ctrl+7
Ant Target Concatenate
Ant Target Concatenate
Klik kanan pada target "concatenate", pilih "run target" dan kemudian kita akan mendapatkan satu file bernama jquery-lib-concat.js sebagai hasil concatenate file librari jQuery tersebut.
Hasil concat file js
Hasil concat file js

PENUTUP

Saya belum terlalu banyak mempelajari build.xml ant tool, script konfigurasi dalam artikel ini masih sangat sederhana. Belum ada pengecekan apakah dua file bisa digabung atau tidak. Ini penting untuk diketahui developer, sebuah file js akan aman di concat jika file itu menggunakan anonymous function sebagai wrapper kode dari akses luar. Ini dimaksudkan agar kode terhindar dari konflik dan pengaksesan yang tidak semestinya. Semua file-file librari diatas pastinya menggunakan hal ini.

Sebenarnya ada banyak hal yang dapat kita lakukan dengan memahami ant task. Kita dapat membuat beberapa task yang mungkin akan sangat memudahkan kita dalam development project, misalnya minify script, backup file, synchro, debugging, dll.

Friday, October 25, 2013

Real-time protokol XMPP

Disini saya ingin berbagi beberapa pengetahuan yang saya pelajari mengenai sebuah protokol bernama Jabber atau lebih dikenal dengan XMPP. Saya tertarik untuk membahas protokol ini, selain memang sangat penting pengetahuan tentang protokol ini bagi para developer, artikel-artikel yang banyak saya dapati di internet hanya menyebutkan seolah-olah bahwa protokol ini hanya dapat diimplementasikan pada Instant Messaging saja. Padahal tidak demikian, protokol ini merupakan protokol standar komunikasi real-time yang telah disahkan oleh IETF. Memang pada tahun 2002 kemarin IETF telah merancang core protokol ini untuk keperluan Instance Messaging dan teknologi presence, namun komunitas jabber bekerja terus menerus agar protokol ini bersifat extensible dan luas dalam hal penggunaannya.




Dalam artikel ini, akan saya tulis beberapa karakteristik yang dimiliki oleh open-standard protokol XMPP. Tidak akan terlalu detail menjelaskan apa itu protokol XMPP atau prosedur teknis kerja protokol ini. Hanya beberapa karakteristik pokok yang akan saya sebutkan. Baiklah berikut adalah poin-poin penting yang bagus untuk pemahaman awal tentang protokol ini:

1. Desentralisasi Arsitektur

Implementasi protokol XMPP merupakan teknologi dengan jaringan client-server yang terdesentralisasi. Jaringan ini mirip dengan jaringan email, dimana paket data dapat diteruskan kepada server XMPP lain yang menjadi tujuannya. Kita dapat saja membuat jaringan XMPP dan kemudian membuat saluran komunikasi dengan server Instant Messaging seperti GTalk, YM dan Facebook chat. Instant Messaging sekarang memang kebanyakan menggunakan protokol ini untuk saling berkomunikasi.

2. JabberID

Penamaan address entitas pada jaringan XMPP menggunakan layanan DNS. Dengan memakai DNS akan sangat memudahkan untuk menghafal seluruh entitas-entitas yang terhubung, daripada mengingat satu-persatu IP address pada setiap entitas. Tiap entitas pasti memiliki sebuah ID yang unik yang dikenal dengan istilah JabberID atau disingkat dengan JID. JabberID ini terbagi menjadi tiga bagian: local part, domain dan resource. Contoh-nya adalah mustofa@mimicreative.net/athome, dimana mustofa adalah local part, mimicreative.net merupakan domain dimana saya terhubung dan athome adalah resource session dimana saya sedang melakukan komunikasi sekarang.

3. Core Protokol

Core protokol XMPP hanya mentransmisi aliran data dalam format XML. Terdapat tiga jenis aliran XML yang ditransmisikan, antara lain message, presence, dan info query atau lebih dikenal dengan IQ. Jenis pertama (1) message, merupakan general paket XMPP berisi informasi yang dikirim dari satu entitas ke entitas lainnya. Pengiriman paket ini bersifat fire and forget, artinya entitas pengirim tidak akan mendapatkan result dari paket message yang telah dia kirimkan. Selain itu juga message ini dikirimkan dari dan ke one-to-one entitas atau one-to-many. Jenis yang kedua adalah (2) presence, dikirimkan dengan tujuan availability kehadiran entitas yang terhubung dalam jaringan. Kita dapat mengetahui status online atau offline dari setiap entitas karena adanya aliran data presence ini. Tidak seperti message, presence dikirimkan ke semua entitas (broadcast) yang sudah subscribe ke entitas tersebut. Terakhir, jenis yang ketiga adalah (3) IQ, digunakan untuk mekanisme request-response antar entitas dalam jaringan XMPP. Mirip dengan metode GET dan POST pada protokol HTTP. Terdapat sebuah entitas yang mengirimkan request ke entitas lain, dan akan menerima response balasan dari entitas tersebut.

4. Server XMPP

Pada jaringan XMPP, tidak semua operasi dilakukan oleh server. Tugas server hanya terbatas pada meneruskan aliran data, mencatat status kehadiran entitas dan mengatur roster (subscribing user/entitas). Pemprosesan setiap paket akan dilakukan sendiri oleh masing-masing entitas. Dalam beberapa kasus bahkan kita tidak memerlukan operasi tambahan di server. Kita hanya membutuhkan core protokol dan server XMPP bekerja sebagaimana mestinya. Semua operasi dan proses dilakukan oleh aplikasi client yang kita bangun. Kasusnya seperti pada game sederhana Tankar. Game ini merupakan game multi-player yang juga memanfaatkan core protokol XMPP untuk bertukar data dan berkomunikasi antar pemainnya. Semua proses sepenuhnya ada pada aplikasi client yang di jalankan independent pada masing-masing player. Tidak ada spesifik server, karena aliran data akan berjalan melewati server-server XMPP yang sudah ada, seperti server jabber.org dan server GTalk.

5. Payload

Setiap child elemen dari aliran XML yang ditransmisi, merupakan payload data aplikasi. Kalau dalam ilmu komunikasi dan informasi, payload disini adalah sekumpulan data seperti data buku, event, atau informasi apapun yang nantinya akan diproses oleh aplikasi yang kita bangun. Ketiga jenis aliran XML yang sudah saya sebutkan diatas (message, presence, dan IQ), dapat membawa data-data informasi untuk sistem aplikasi. Lalu format payload seperti apa yang dapat kita sisipkan pada aliran XML? Dari e-book yang berjudul Profesional XMPP Programming with Javascript and jQuery karangan Jack Moffitt, payload disini dapat berbagai macam jenis data, contohnya seperti XHTML (contoh pada Data Form pada XEP-0004), URL, RSS, SOAP, XML-RPC dan banyak lagi lainnya. Dalam bukunya Jack Moffitt bahkan berkata bahwa payload types are limited only by your imagination! yang memberikan penjelasan bahwa apapun tipe datanya dapat di sisipkan pada aliran XML protokol ini.

6. Extensions Protokol

Komunitas XMPP telah membuat banyak sekali extensions yang dapat kita manfaatkan untuk build sistem aplikasi. Extensions disini bukanlah library, module atau add-ons. Bisa dibilang extension ini merupakan kekuatan utama protokol XMPP.

X dari singkatan XMPP merupakan extensible. Merupakan sifat yang dimiliki oleh core protokol XMPP. Istilah extensible -menurut saya- berkenaan dengan sifat core protokol XMPP untuk membawa data (payload) yang telah kita definisikan untuk membangun berbagai macam sistem aplikasi yang berbeda. Sistem aplikasi mulai dari content syndication, push notification, lightweight middleware and web services, whiteboarding, multimedia session negotiation, intelligent workflows, geolocation, social gaming, social networking dan bahkan cloud computing.

Dari sifat extensible ini kemudian terdapat sebuah istilah extensions yang berarti proses dan payload data yang sudah developer rancang untuk tujuan tertentu. Setiap developer dapat merancang atau membangun extensions-nya sendiri. Sehingga akan sangat banyak sekali extensions yang akan dapat kita temukan. Tapi terdapat juga extensions standar yang diatur oleh XSF (XMPP Standart Foundations). Extensions standar ini kemudian di kenal dengan istilah XEP (XMPP Extension Protocol). Berikut adalah extensions standar yang paling sering digunakan oleh para developer untuk membangun sistem aplikasi:


Terdapat tiga ratusan lebih extensions yang sudah masuk dalam daftar XSF. Untuk melihat keseluruhannya Anda dapat membacanya pada link ini.

7. Keamanan Protokol

XMPP support TLS (Transport Layer Security) yang juga merupakan protokol kembaran dari SSL, digunakan untuk menangani keamanan data yang ditransmisikan melalui jaringan XMPP. Integrasi XMPP dengan TLS ini diatur pada sebuah extensions yaitu XEP-0290.

Itulah 7 karakteristik protokol XMPP yang dapat saya tulis. Dengan mengetahui beberapa karakteristik ini, tentunya kita dapat menebak aplikasi atau sistem seperti apa yang cocok diimplementasikan dengan protokol ini. Kita dapat saja membuat kendaraan yang berjalan diatas air dengan sangat baik atau membuat kendaraan yang melayang diudara dengan sangar baik, tapi tentunya kita tidak dapat menciptakan kendaraan yang sangat baik dikeduanya, diatas air dan di udara. Demikian juga dengan implementasi protokol XMPP. Protokol ini akan sangat baik diimplementasi ketika kita membuat beberapa kebutuhan aplikasi berikut ini:

  • Ketika membutuhkan sebuah informasi tentang kehadiran atau presence sebuah entitas dalam jaringan, entah itu entitas client atau server.
  • Ketika sebuah aplikasi membutuhkan alert dan notifikasi terhadap data baru pada jaringan internet.
  • Ketika komunikasi membutuhkan sebuah channel enkripsi, authentikasi dan trusted identities.
  • Ketika kita membutuhkan komunikasi diantara distributed network yang kita miliki.
  • Ketika kita membutuhkan sebuah signaling channel yang cukup sederhana untuk mengatur interaksi data suara atau video.

Penutup

Pada umumnya, protokol XMPP digunakan untuk interaksi dan komunikasi secara real-time antara entitas-entitas jaringan. Dan ini memang sangat luas sekali pemanfaatannya. Banyak aplikasi-aplikasi keren yang dapat kita bangun dengan memanfaatkan protokol ini seperti social gaming, push notification dan social networking. Perusahaan-perusahaan sekelas google, apple, facebook membangun beberapa servicenya diatas protokol ini. Service-service ini seperti GTalk, Google wave, Facebook Chat, iCloud, dan lain sebagainya. Dengan menguasai dan memahami protokol ini, kita sebagai developer tentunya akan dapat menciptakan service atau aplikasi keren milik kita sendiri. Oke demikian, semoga artikel ini memberikan manfaat bagi anda.

* Artikel ini pernah publis di bisakomputer.com tertanggal 16 Januari 2013 dengan judul "7 Karakteristik Dasar Protokol XMPP"