blather 0.4.7 → 0.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +162 -0
- data/examples/{print_heirarchy.rb → print_hierarchy.rb} +5 -5
- data/examples/stream_only.rb +27 -0
- data/lib/blather.rb +4 -0
- data/lib/blather/client/client.rb +91 -73
- data/lib/blather/client/dsl.rb +156 -32
- data/lib/blather/client/dsl/pubsub.rb +86 -54
- data/lib/blather/core_ext/active_support.rb +9 -9
- data/lib/blather/core_ext/active_support/inheritable_attributes.rb +2 -2
- data/lib/blather/core_ext/nokogiri.rb +12 -7
- data/lib/blather/errors.rb +25 -14
- data/lib/blather/errors/sasl_error.rb +21 -3
- data/lib/blather/errors/stanza_error.rb +37 -21
- data/lib/blather/errors/stream_error.rb +27 -17
- data/lib/blather/jid.rb +79 -24
- data/lib/blather/roster.rb +39 -21
- data/lib/blather/roster_item.rb +43 -21
- data/lib/blather/stanza.rb +88 -40
- data/lib/blather/stanza/disco.rb +12 -2
- data/lib/blather/stanza/disco/disco_info.rb +112 -20
- data/lib/blather/stanza/disco/disco_items.rb +81 -12
- data/lib/blather/stanza/iq.rb +94 -38
- data/lib/blather/stanza/iq/query.rb +16 -22
- data/lib/blather/stanza/iq/roster.rb +98 -20
- data/lib/blather/stanza/message.rb +266 -111
- data/lib/blather/stanza/presence.rb +118 -42
- data/lib/blather/stanza/presence/status.rb +140 -60
- data/lib/blather/stanza/presence/subscription.rb +44 -10
- data/lib/blather/stanza/pubsub.rb +70 -15
- data/lib/blather/stanza/pubsub/affiliations.rb +36 -7
- data/lib/blather/stanza/pubsub/create.rb +26 -4
- data/lib/blather/stanza/pubsub/errors.rb +13 -4
- data/lib/blather/stanza/pubsub/event.rb +56 -10
- data/lib/blather/stanza/pubsub/items.rb +46 -6
- data/lib/blather/stanza/pubsub/publish.rb +52 -7
- data/lib/blather/stanza/pubsub/retract.rb +45 -6
- data/lib/blather/stanza/pubsub/subscribe.rb +30 -4
- data/lib/blather/stanza/pubsub/subscription.rb +74 -6
- data/lib/blather/stanza/pubsub/subscriptions.rb +35 -9
- data/lib/blather/stanza/pubsub/unsubscribe.rb +30 -4
- data/lib/blather/stanza/pubsub_owner.rb +17 -7
- data/lib/blather/stanza/pubsub_owner/delete.rb +23 -5
- data/lib/blather/stanza/pubsub_owner/purge.rb +23 -5
- data/lib/blather/stream.rb +96 -29
- data/lib/blather/stream/parser.rb +6 -9
- data/lib/blather/xmpp_node.rb +101 -153
- data/spec/blather/client/client_spec.rb +1 -1
- data/spec/blather/errors_spec.rb +5 -5
- data/spec/blather/stanza/message_spec.rb +56 -0
- data/spec/blather/stanza/presence/status_spec.rb +1 -1
- data/spec/blather/stanza_spec.rb +3 -3
- data/spec/blather/xmpp_node_spec.rb +19 -74
- metadata +6 -10
- data/README.rdoc +0 -185
- data/examples/drb_client.rb +0 -5
- data/examples/ping.rb +0 -11
- data/examples/pong.rb +0 -6
- data/examples/pubsub/cli.rb +0 -64
- data/examples/pubsub/ping_pong.rb +0 -18
data/README.md
ADDED
@@ -0,0 +1,162 @@
|
|
1
|
+
# Blather
|
2
|
+
|
3
|
+
XMPP DSL (and more) for Ruby written on EventMachine and Nokogiri.
|
4
|
+
|
5
|
+
## Features
|
6
|
+
|
7
|
+
* evented architecture
|
8
|
+
* uses Nokogiri
|
9
|
+
* simplified starting point
|
10
|
+
|
11
|
+
## Project Pages
|
12
|
+
|
13
|
+
* [Docs](http://blather.squishtech.com)
|
14
|
+
* [GitHub](https://github.com/sprsquish/blather)
|
15
|
+
* [Gemcutter](http://gemcutter.org/gems/blather)
|
16
|
+
* [Google Group](http://groups.google.com/group/xmpp-blather)
|
17
|
+
|
18
|
+
# Usage
|
19
|
+
|
20
|
+
## Installation
|
21
|
+
|
22
|
+
sudo gem install blather
|
23
|
+
|
24
|
+
## Example
|
25
|
+
|
26
|
+
See the examples directory for more advanced examples.
|
27
|
+
|
28
|
+
This will auto-accept any subscription requests and echo back any chat messages.
|
29
|
+
|
30
|
+
require 'rubygems'
|
31
|
+
require 'blather/client'
|
32
|
+
|
33
|
+
setup 'echo@jabber.local', 'echo'
|
34
|
+
|
35
|
+
# Auto approve subscription requests
|
36
|
+
subscription :request? do |s|
|
37
|
+
write_to_stream s.approve!
|
38
|
+
end
|
39
|
+
|
40
|
+
# Echo back what was said
|
41
|
+
message :chat?, :body do |m|
|
42
|
+
write_to_stream m.reply
|
43
|
+
end
|
44
|
+
|
45
|
+
## Handlers
|
46
|
+
|
47
|
+
Setup handlers by calling their names as methods.
|
48
|
+
|
49
|
+
# Will only be called for messages where #chat? responds positively
|
50
|
+
# and #body == 'exit'
|
51
|
+
message :chat?, :body => 'exit'
|
52
|
+
|
53
|
+
### Non-Stanza Handlers
|
54
|
+
|
55
|
+
So far there are two non-stanza related handlers.
|
56
|
+
|
57
|
+
# Called after the connection has been connected. It's good for initializing
|
58
|
+
# your system.
|
59
|
+
# DSL:
|
60
|
+
when_ready {}
|
61
|
+
# Client:
|
62
|
+
client.register_handler(:ready) {}
|
63
|
+
|
64
|
+
# Called after the connection has been terminated. Good for teardown or
|
65
|
+
# automatic reconnection.
|
66
|
+
# DSL:
|
67
|
+
disconnected {}
|
68
|
+
# Client
|
69
|
+
client.register_handler(:disconnected) {}
|
70
|
+
# The following will reconnect every time the connection is lost:
|
71
|
+
disconnected { client.connect }
|
72
|
+
|
73
|
+
### Handler Guards
|
74
|
+
|
75
|
+
Guards act like AND statements. Each condition must be met if the handler is to
|
76
|
+
be used.
|
77
|
+
|
78
|
+
# Equivalent to saying (stanza.chat? && stanza.body)
|
79
|
+
message :chat?, :body
|
80
|
+
|
81
|
+
The different types of guards are:
|
82
|
+
|
83
|
+
# Symbol
|
84
|
+
# Checks for a non-false reply to calling the symbol on the stanza
|
85
|
+
# Equivalent to stanza.chat?
|
86
|
+
message :chat?
|
87
|
+
|
88
|
+
# Hash with any value (:body => 'exit')
|
89
|
+
# Calls the key on the stanza and checks for equality
|
90
|
+
# Equivalent to stanza.body == 'exit'
|
91
|
+
message :body => 'exit'
|
92
|
+
|
93
|
+
# Hash with regular expression (:body => /exit/)
|
94
|
+
# Calls the key on the stanza and checks for a match
|
95
|
+
# Equivalent to stanza.body.match /exit/
|
96
|
+
message :body => /exit/
|
97
|
+
|
98
|
+
# Hash with array (:name => [:gone, :forbidden])
|
99
|
+
# Calls the key on the stanza and check for inclusion in the array
|
100
|
+
# Equivalent to [:gone, :forbidden].include?(stanza.name)
|
101
|
+
stanza_error :name => [:gone, :fobidden]
|
102
|
+
|
103
|
+
# Proc
|
104
|
+
# Calls the proc passing in the stanza
|
105
|
+
# Checks that the ID is modulo 3
|
106
|
+
message proc { |m| m.id % 3 == 0 }
|
107
|
+
|
108
|
+
# Array
|
109
|
+
# Use arrays with the previous types effectively turns the guard into
|
110
|
+
# an OR statement.
|
111
|
+
# Equivalent to stanza.body == 'foo' || stanza.body == 'baz'
|
112
|
+
message [{:body => 'foo'}, {:body => 'baz'}]
|
113
|
+
|
114
|
+
# XPath
|
115
|
+
# Runs the xpath query on the stanza and checks for results
|
116
|
+
# This guard type cannot be combined with other guards
|
117
|
+
# Equivalent to !stanza.find('/iq/ns:pubsub', :ns => 'pubsub:namespace').empty?
|
118
|
+
iq '/iq/ns:pubsub', :ns => 'pubsub:namespace'
|
119
|
+
|
120
|
+
### Filters
|
121
|
+
|
122
|
+
Blather provides before and after filters that work much the way regular
|
123
|
+
handlers work. Filters come in a before and after flavor. They're called in
|
124
|
+
order of definition and can be guarded like handlers.
|
125
|
+
|
126
|
+
before { |s| "I'm run before any handler" }
|
127
|
+
before { |s| "I'm run next" }
|
128
|
+
|
129
|
+
before(:message) { |s| "I'm only run in front of message stanzas" }
|
130
|
+
before(nil, :id => 1) { |s| "I'll only be run when the stanza's ID == 1" }
|
131
|
+
|
132
|
+
# ... handlers
|
133
|
+
|
134
|
+
after { |s| "I'm run after everything" }
|
135
|
+
|
136
|
+
## On the Command Line:
|
137
|
+
|
138
|
+
Default usage is:
|
139
|
+
|
140
|
+
[blather_script] [options] node@domain.com/resource password [host] [port]
|
141
|
+
|
142
|
+
Command line options:
|
143
|
+
|
144
|
+
-D, --debug Run in debug mode (you will see all XMPP communication)
|
145
|
+
-d, --daemonize Daemonize the process
|
146
|
+
--pid=[PID] Write the PID to this file
|
147
|
+
--log=[LOG] Write to the [LOG] file instead of stdout/stderr
|
148
|
+
-h, --help Show this message
|
149
|
+
-v, --version Show version
|
150
|
+
|
151
|
+
|
152
|
+
# Author
|
153
|
+
|
154
|
+
[Jeff Smick](http://github.com/sprsquish)
|
155
|
+
|
156
|
+
### Contributors
|
157
|
+
|
158
|
+
[Nolan Darilek](http://github.com/thewordnerd)
|
159
|
+
|
160
|
+
# Copyright
|
161
|
+
|
162
|
+
Copyright (c) 2009 Jeff Smick. See LICENSE for details.
|
@@ -8,7 +8,7 @@ class Object
|
|
8
8
|
# We check defined? in case we find a removed class that has yet to be
|
9
9
|
# garbage collected. This also fails for anonymous classes -- please
|
10
10
|
# submit a patch if you have a workaround.
|
11
|
-
def subclasses_of(*superclasses)
|
11
|
+
def subclasses_of(*superclasses)
|
12
12
|
subclasses = []
|
13
13
|
|
14
14
|
superclasses.each do |sup|
|
@@ -24,7 +24,7 @@ class Object
|
|
24
24
|
rescue RuntimeError
|
25
25
|
# JRuby and any implementations which cannot handle the objectspace traversal
|
26
26
|
# above fall back to this implementation
|
27
|
-
def subclasses_of(*superclasses)
|
27
|
+
def subclasses_of(*superclasses)
|
28
28
|
subclasses = []
|
29
29
|
|
30
30
|
superclasses.each do |sup|
|
@@ -52,7 +52,7 @@ end
|
|
52
52
|
|
53
53
|
handlers = {}
|
54
54
|
(Object.subclasses_of(Blather::Stanza) + Object.subclasses_of(Blather::BlatherError)).each do |klass|
|
55
|
-
handlers = handlers.deep_merge klass.
|
55
|
+
handlers = handlers.deep_merge klass.handler_hierarchy.inject('klass' => klass.to_s.gsub('Blather::', '')) { |h,k| {k.to_s => h} }
|
56
56
|
end
|
57
57
|
|
58
58
|
level = 0
|
@@ -61,8 +61,8 @@ runner = proc do |k,v|
|
|
61
61
|
|
62
62
|
str = ''
|
63
63
|
if level > 0
|
64
|
-
(level - 1).times { str << '|
|
65
|
-
str << '
|
64
|
+
(level - 1).times { str << '| ' }
|
65
|
+
str << '|- '
|
66
66
|
end
|
67
67
|
|
68
68
|
puts str+k
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'blather'
|
4
|
+
|
5
|
+
trap(:INT) { EM.stop }
|
6
|
+
trap(:TERM) { EM.stop }
|
7
|
+
EM.run do
|
8
|
+
Blather::Stream::Client.start(Class.new {
|
9
|
+
attr_accessor :jid
|
10
|
+
|
11
|
+
def post_init(stream, jid = nil)
|
12
|
+
@stream = stream
|
13
|
+
self.jid = jid
|
14
|
+
|
15
|
+
@stream.send_data Blather::Stanza::Presence::Status.new
|
16
|
+
puts "Stream started!"
|
17
|
+
end
|
18
|
+
|
19
|
+
def receive_data(stanza)
|
20
|
+
@stream.send_data stanza.reply!
|
21
|
+
end
|
22
|
+
|
23
|
+
def unbind
|
24
|
+
puts "Stream ended!"
|
25
|
+
end
|
26
|
+
}.new, 'echo@jabber.local', 'echo')
|
27
|
+
end
|
data/lib/blather.rb
CHANGED
@@ -58,7 +58,10 @@
|
|
58
58
|
].each { |r| require r }
|
59
59
|
|
60
60
|
module Blather
|
61
|
+
# @private
|
61
62
|
@@logger = nil
|
63
|
+
|
64
|
+
# Get or create an instance of Logger
|
62
65
|
def self.logger
|
63
66
|
unless @@logger
|
64
67
|
self.logger = Logger.new($stdout)
|
@@ -67,6 +70,7 @@ module Blather
|
|
67
70
|
@@logger
|
68
71
|
end
|
69
72
|
|
73
|
+
# Set the Logger
|
70
74
|
def self.logger=(logger)
|
71
75
|
@@logger = logger
|
72
76
|
end
|
@@ -1,48 +1,54 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), *%w[.. .. blather])
|
2
2
|
|
3
|
-
module Blather
|
4
|
-
|
5
|
-
# = Blather Client
|
3
|
+
module Blather
|
4
|
+
# # Blather Client
|
6
5
|
#
|
7
|
-
# Blather's Client class provides a set of helpers for working with common
|
8
|
-
#
|
6
|
+
# Blather's Client class provides a set of helpers for working with common
|
7
|
+
# XMPP tasks such as setting up and starting the connection, settings
|
8
|
+
# status, registering and dispatching filters and handlers and roster
|
9
|
+
# management.
|
9
10
|
#
|
10
|
-
# Client can be used separately from the DSL if you'd like to implement your
|
11
|
-
# Here's the echo example using the client without the DSL:
|
11
|
+
# Client can be used separately from the DSL if you'd like to implement your
|
12
|
+
# own DSL Here's the echo example using the client without the DSL:
|
12
13
|
#
|
13
|
-
#
|
14
|
-
#
|
14
|
+
# require 'blather/client/client'
|
15
|
+
# client = Client.setup 'echo@jabber.local', 'echo'
|
15
16
|
#
|
16
|
-
#
|
17
|
+
# client.register_handler(:ready) do
|
18
|
+
# puts "Connected ! send messages to #{client.jid.stripped}."
|
19
|
+
# end
|
17
20
|
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
+
# client.register_handler :subscription, :request? do |s|
|
22
|
+
# client.write s.approve!
|
23
|
+
# end
|
21
24
|
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
25
|
+
# client.register_handler :message, :chat?, :body => 'exit' do |m|
|
26
|
+
# client.write Blather::Stanza::Message.new(m.from, 'Exiting...')
|
27
|
+
# client.close
|
28
|
+
# end
|
26
29
|
#
|
27
|
-
#
|
28
|
-
#
|
29
|
-
#
|
30
|
+
# client.register_handler :message, :chat?, :body do |m|
|
31
|
+
# client.write Blather::Stanza::Message.new(m.from, "You sent: #{m.body}")
|
32
|
+
# end
|
30
33
|
#
|
31
34
|
class Client
|
32
35
|
attr_reader :jid,
|
33
36
|
:roster
|
34
37
|
|
35
|
-
|
36
|
-
#
|
37
|
-
#
|
38
|
-
#
|
39
|
-
#
|
40
|
-
#
|
38
|
+
# Create a new client and set it up
|
39
|
+
#
|
40
|
+
# @param [Blather::JID, #to_s] jid the JID to authorize with
|
41
|
+
# @param [String] password the password to authorize with
|
42
|
+
# @param [String] host if this isn't set it'll be resolved off the JID's
|
43
|
+
# domain
|
44
|
+
# @param [Fixnum, String] port the port to connect to.
|
45
|
+
#
|
46
|
+
# @return [Blather::Client]
|
41
47
|
def self.setup(jid, password, host = nil, port = nil)
|
42
48
|
self.new.setup(jid, password, host, port)
|
43
49
|
end
|
44
50
|
|
45
|
-
def initialize
|
51
|
+
def initialize # @private
|
46
52
|
@state = :initializing
|
47
53
|
|
48
54
|
@status = Stanza::Presence::Status.new
|
@@ -54,14 +60,14 @@ module Blather #:nodoc:
|
|
54
60
|
setup_initial_handlers
|
55
61
|
end
|
56
62
|
|
57
|
-
|
58
|
-
# Get the current status. Taken from the +state+ attribute of Status
|
63
|
+
# Get the current status. Taken from the `state` attribute of Status
|
59
64
|
def status
|
60
65
|
@status.state
|
61
66
|
end
|
62
67
|
|
63
|
-
|
64
|
-
#
|
68
|
+
# Set the status. Status can be set with either a single value or an array
|
69
|
+
# containing
|
70
|
+
#
|
65
71
|
# [state, message, to].
|
66
72
|
def status=(state)
|
67
73
|
state, msg, to = state
|
@@ -73,8 +79,10 @@ module Blather #:nodoc:
|
|
73
79
|
write status
|
74
80
|
end
|
75
81
|
|
76
|
-
##
|
77
82
|
# Start the connection.
|
83
|
+
#
|
84
|
+
# The stream type used is based on the JID. If a node exists it uses
|
85
|
+
# Blather::Stream::Client otherwise Blather::Stream::Component
|
78
86
|
def run
|
79
87
|
raise 'not setup!' unless setup?
|
80
88
|
klass = @setup[0].node ? Blather::Stream::Client : Blather::Stream::Component
|
@@ -82,70 +90,79 @@ module Blather #:nodoc:
|
|
82
90
|
end
|
83
91
|
alias_method :connect, :run
|
84
92
|
|
85
|
-
##
|
86
93
|
# Register a filter to be run before or after the handler chain is run.
|
87
|
-
#
|
88
|
-
#
|
94
|
+
#
|
95
|
+
# @param [<:before, :after>] type the filter type
|
96
|
+
# @param [Symbol, nil] handler set the filter on a specific handler
|
97
|
+
# @param [guards] guards take a look at the guards documentation
|
98
|
+
# @yield [Blather::Stanza] stanza the incomming stanza
|
89
99
|
def register_filter(type, handler = nil, *guards, &filter)
|
90
|
-
|
100
|
+
unless [:before, :after].include?(type)
|
101
|
+
raise "Invalid filter: #{type}. Must be :before or :after"
|
102
|
+
end
|
91
103
|
@filters[type] << [guards, handler, filter]
|
92
104
|
end
|
93
105
|
|
94
|
-
|
95
|
-
#
|
96
|
-
#
|
97
|
-
#
|
106
|
+
# Register a temporary handler. Temporary handlers are based on the ID of
|
107
|
+
# the JID and live only until a stanza with said ID is received.
|
108
|
+
#
|
109
|
+
# @param [#to_s] id the ID of the stanza that should be handled
|
110
|
+
# @yield [Blather::Stanza] stanza the incomming stanza
|
98
111
|
def register_tmp_handler(id, &handler)
|
99
|
-
@tmp_handlers[id] = handler
|
112
|
+
@tmp_handlers[id.to_s] = handler
|
100
113
|
end
|
101
114
|
|
102
|
-
##
|
103
115
|
# Register a handler
|
104
|
-
#
|
105
|
-
#
|
116
|
+
#
|
117
|
+
# @param [Symbol, nil] handler set the filter on a specific handler
|
118
|
+
# @param [guards] guards take a look at the guards documentation
|
119
|
+
# @yield [Blather::Stanza] stanza the incomming stanza
|
106
120
|
def register_handler(type, *guards, &handler)
|
107
121
|
check_handler type, guards
|
108
122
|
@handlers[type] ||= []
|
109
123
|
@handlers[type] << [guards, handler]
|
110
124
|
end
|
111
125
|
|
112
|
-
##
|
113
126
|
# Write data to the stream
|
127
|
+
#
|
128
|
+
# @param [#to_xml, #to_s] stanza the content to send down the wire
|
114
129
|
def write(stanza)
|
115
130
|
self.stream.send(stanza)
|
116
131
|
end
|
117
132
|
|
118
|
-
|
119
|
-
#
|
133
|
+
# Helper that will create a temporary handler for the stanza being sent
|
134
|
+
# before writing it to the stream.
|
120
135
|
#
|
121
|
-
#
|
136
|
+
# client.write_with_handler(stanza) { |s| "handle stanza here" }
|
122
137
|
#
|
123
138
|
# is equivalent to:
|
124
139
|
#
|
125
|
-
#
|
126
|
-
#
|
140
|
+
# client.register_tmp_handler(stanza.id) { |s| "handle stanza here" }
|
141
|
+
# client.write stanza
|
142
|
+
#
|
143
|
+
# @param [Blather::Stanza] stanza the stanza to send down the wire
|
144
|
+
# @yield [Blather::Stanza] stanza the reply stanza
|
127
145
|
def write_with_handler(stanza, &handler)
|
128
146
|
register_tmp_handler stanza.id, &handler
|
129
147
|
write stanza
|
130
148
|
end
|
131
149
|
|
132
|
-
##
|
133
150
|
# Close the connection
|
134
151
|
def close
|
135
152
|
self.stream.close_connection_after_writing
|
136
153
|
end
|
137
154
|
|
138
|
-
def post_init(stream, jid = nil)
|
155
|
+
def post_init(stream, jid = nil) # @private
|
139
156
|
@stream = stream
|
140
157
|
@jid = JID.new(jid) if jid
|
141
158
|
self.jid.node ? client_post_init : ready!
|
142
159
|
end
|
143
160
|
|
144
|
-
def unbind
|
161
|
+
def unbind # @private
|
145
162
|
call_handler_for(:disconnected, nil) || (EM.reactor_running? && EM.stop)
|
146
163
|
end
|
147
164
|
|
148
|
-
def receive_data(stanza)
|
165
|
+
def receive_data(stanza) # @private
|
149
166
|
catch(:halt) do
|
150
167
|
run_filters :before, stanza
|
151
168
|
handle_stanza stanza
|
@@ -153,11 +170,11 @@ module Blather #:nodoc:
|
|
153
170
|
end
|
154
171
|
end
|
155
172
|
|
156
|
-
def setup?
|
173
|
+
def setup? # @private
|
157
174
|
@setup.is_a? Array
|
158
175
|
end
|
159
176
|
|
160
|
-
def setup(jid, password, host = nil, port = nil)
|
177
|
+
def setup(jid, password, host = nil, port = nil) # @private
|
161
178
|
@jid = JID.new(jid)
|
162
179
|
@setup = [@jid, password]
|
163
180
|
@setup << host if host
|
@@ -166,20 +183,20 @@ module Blather #:nodoc:
|
|
166
183
|
end
|
167
184
|
|
168
185
|
protected
|
169
|
-
def stream
|
186
|
+
def stream # @private
|
170
187
|
@stream || raise('Stream not ready!')
|
171
188
|
end
|
172
189
|
|
173
|
-
def check_handler(type, guards)
|
190
|
+
def check_handler(type, guards) # @private
|
174
191
|
Blather.logger.warn "Handler for type \"#{type}\" will never be called as it's not a registered type" unless current_handlers.include?(type)
|
175
192
|
check_guards guards
|
176
193
|
end
|
177
194
|
|
178
|
-
def current_handlers
|
195
|
+
def current_handlers # @private
|
179
196
|
[:ready, :disconnected] + Stanza.handler_list + BlatherError.handler_list
|
180
197
|
end
|
181
198
|
|
182
|
-
def setup_initial_handlers
|
199
|
+
def setup_initial_handlers # @private
|
183
200
|
register_handler :error do |err|
|
184
201
|
raise err
|
185
202
|
end
|
@@ -198,12 +215,12 @@ module Blather #:nodoc:
|
|
198
215
|
end
|
199
216
|
end
|
200
217
|
|
201
|
-
def ready!
|
218
|
+
def ready! # @private
|
202
219
|
@state = :ready
|
203
220
|
call_handler_for :ready, nil
|
204
221
|
end
|
205
222
|
|
206
|
-
def client_post_init
|
223
|
+
def client_post_init # @private
|
207
224
|
write_with_handler Stanza::Iq::Roster.new do |node|
|
208
225
|
roster.process node
|
209
226
|
write @status
|
@@ -211,31 +228,31 @@ module Blather #:nodoc:
|
|
211
228
|
end
|
212
229
|
end
|
213
230
|
|
214
|
-
def run_filters(type, stanza)
|
231
|
+
def run_filters(type, stanza) # @private
|
215
232
|
@filters[type].each do |guards, handler, filter|
|
216
|
-
next if handler && !stanza.
|
233
|
+
next if handler && !stanza.handler_hierarchy.include?(handler)
|
217
234
|
catch(:pass) { call_handler filter, guards, stanza }
|
218
235
|
end
|
219
236
|
end
|
220
237
|
|
221
|
-
def handle_stanza(stanza)
|
238
|
+
def handle_stanza(stanza) # @private
|
222
239
|
if handler = @tmp_handlers.delete(stanza.id)
|
223
240
|
handler.call stanza
|
224
241
|
else
|
225
|
-
stanza.
|
242
|
+
stanza.handler_hierarchy.each do |type|
|
226
243
|
break if call_handler_for(type, stanza)
|
227
244
|
end
|
228
245
|
end
|
229
246
|
end
|
230
247
|
|
231
|
-
def call_handler_for(type, stanza)
|
248
|
+
def call_handler_for(type, stanza) # @private
|
232
249
|
return unless handler = @handlers[type]
|
233
250
|
handler.find do |guards, handler|
|
234
251
|
catch(:pass) { call_handler handler, guards, stanza }
|
235
252
|
end
|
236
253
|
end
|
237
254
|
|
238
|
-
def call_handler(handler, guards, stanza)
|
255
|
+
def call_handler(handler, guards, stanza) # @private
|
239
256
|
if guards.first.respond_to?(:to_str)
|
240
257
|
result = stanza.find(*guards)
|
241
258
|
handler.call(stanza, result) unless result.empty?
|
@@ -244,11 +261,12 @@ module Blather #:nodoc:
|
|
244
261
|
end
|
245
262
|
end
|
246
263
|
|
247
|
-
##
|
248
264
|
# If any of the guards returns FALSE this returns true
|
249
265
|
# the logic is reversed to allow short circuiting
|
250
266
|
# (why would anyone want to loop over more values than necessary?)
|
251
|
-
|
267
|
+
#
|
268
|
+
# @private
|
269
|
+
def guarded?(guards, stanza)
|
252
270
|
guards.find do |guard|
|
253
271
|
case guard
|
254
272
|
when Symbol
|
@@ -275,7 +293,7 @@ module Blather #:nodoc:
|
|
275
293
|
end
|
276
294
|
end
|
277
295
|
|
278
|
-
def check_guards(guards)
|
296
|
+
def check_guards(guards) # @private
|
279
297
|
guards.each do |guard|
|
280
298
|
case guard
|
281
299
|
when Array
|
@@ -287,6 +305,6 @@ module Blather #:nodoc:
|
|
287
305
|
end
|
288
306
|
end
|
289
307
|
end
|
308
|
+
end # Client
|
290
309
|
|
291
|
-
|
292
|
-
end #Blather
|
310
|
+
end # Blather
|