8. What is XMPP?
• JID: node@server/Resource
• Open Protocol
• Decentralized - no central server
• RFC 3290 (core), 3291 (messaging)
• XMPP extension protocols (XEP)
9. What is XMPP? (2)
• Bidirectional, streaming XML
• One first level tag: <stream>
• 3 second level tags:
• <presence> - presence, subscribtion
• <message> - asynchronous
• <iq> - synchronous
11. Not only for geeks
• 50 000+ servers, 50+ million users
• Wall Street
• US Department of Defense
• Cisco, Google, Apple
• NTT ?
12. You on XMPP
• Free account - jabber.jp etc.
• GTalk for domains
• Install your own server:
• ejabberd (erlang) - production
• openfire (java) - easy to install / use
13. Libraries
• For a lot of OSes and languages
• loudmouth (C)
• xiff (flash)
• smack (java)
• xmpp4r (ruby)
29. Concurrency
EM.run do
EM::PeriodicTimer.new(1) do
...
EM.spawn do
worker = Worker.new
worker.callback {jabber.deliver(message.from,
quot;Donequot;)}
worker.process
end.notify
...
end
end
class Worker
include EM::Deferrable
def process
...
set_deferred_status :succeeded
end
end
31. Plugins 2/3
class Plugin
include EM::Deferrable
def process( args = {} )
sleep(0.05)
set_deferred_status :succeeded
end
end
32. Plugins 3/3
class NickPlugin < Plugin
def process(args = {})
begin
...
set_deferred_status :succeeded
rescue
set_deferred_status :failed
end
end
end
class NickFactory < PluginFactory
INFO=<<INFO
verb: NICK
author: Stoyan Zhekov
description: Get or set the nickname for some user
INFO
def create()
return NickPlugin.new()
end
end
33. Simple API (json)
• /users - list of users
• /user/<nick>/<secret> - info for user
• /status/<nick>/<secret> - presence
• /micros/<page>/<format> - list of micros
• /micro/<id>/<secret> - micro + comments
34. Web (Ramaze)
class MainController < Ramaze::Controller
def u nick
begin
@user = User.find_by_user(nick)
subset = @user.micros.reverse
@micros, @pager = paginate(subset, :limit => PAGE)
rescue Exception => e
flash[:error] = quot;Error: #{e.to_s}quot;
redirect :/, :status => 302
end
end
end
36. To Do
• Commands parser - Ragel?
• OAuth or http://xmppid.net/
• TokyoCabinet
• XMPP Component - http://github.com/julien51/babylon
• Real PubSub?
37. Conclusion
• XMPP - good, open protocol
• xmpp4r-simple - good, easy to use
• eventmachine - good network library
• sequel - good ORM
• ramaze - good web apps framework