freeswitcher 0.4.7 → 0.4.8
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/fsr/listener/inbound.rb +39 -12
- data/spec/fsr/listener/inbound.rb +10 -3
- metadata +1 -1
data/lib/fsr/listener/inbound.rb
CHANGED
@@ -6,7 +6,7 @@ require 'fsr/listener/header_and_content_response.rb'
|
|
6
6
|
module FSR
|
7
7
|
module Listener
|
8
8
|
class Inbound < EventMachine::Protocols::HeaderAndContentProtocol
|
9
|
-
attr_reader :auth, :hooks, :server, :port
|
9
|
+
attr_reader :auth, :hooks, :server, :port, :subscribed_events, :subscribed_sub_events
|
10
10
|
|
11
11
|
HOOKS = {}
|
12
12
|
|
@@ -15,6 +15,8 @@ module FSR
|
|
15
15
|
@auth = args[:auth] || "ClueCon"
|
16
16
|
@host = args[:host]
|
17
17
|
@port = args[:port]
|
18
|
+
@subscribed_events = []
|
19
|
+
@subscribed_sub_events = []
|
18
20
|
@hooks = {}
|
19
21
|
end
|
20
22
|
|
@@ -47,19 +49,13 @@ module FSR
|
|
47
49
|
def authorize_and_register_for_events
|
48
50
|
FSR::Log.info "Connection established. Authorizing..."
|
49
51
|
say("auth #{@auth}")
|
50
|
-
add_class_hooks
|
51
52
|
before_session
|
52
53
|
end
|
53
54
|
|
54
55
|
def before_session
|
55
56
|
end
|
56
57
|
|
57
|
-
|
58
|
-
HOOKS.each do |(key, value)|
|
59
|
-
add_event(key, &value)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
private :before_session, :add_class_hooks
|
58
|
+
private :before_session
|
63
59
|
|
64
60
|
# receive_request is the callback method when data is recieved from the socket
|
65
61
|
#
|
@@ -71,12 +67,30 @@ module FSR
|
|
71
67
|
event = HeaderAndContentResponse.new({:headers => hash_header, :content => hash_content})
|
72
68
|
event_name = event.content[:event_name].to_s.strip
|
73
69
|
unless event_name.empty?
|
70
|
+
# Special case for ALL in instance level @hooks
|
71
|
+
if hook = @hooks[:ALL]
|
72
|
+
hook.call(event)
|
73
|
+
end
|
74
|
+
# Special case for ALL in class level HOOKS
|
75
|
+
if hook = HOOKS[:ALL]
|
76
|
+
case hook.arity
|
77
|
+
when 1
|
78
|
+
hook.call(event)
|
79
|
+
when 2
|
80
|
+
hook.call(self, event)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
# General event matching, only on Event-Name, for instance level @hooks
|
74
84
|
if hook = @hooks[event_name.to_sym]
|
85
|
+
hook.call(event)
|
86
|
+
end
|
87
|
+
# General event matching, only on Event-Name, for class-level HOOKS
|
88
|
+
if hook = HOOKS[event_name.to_sym]
|
75
89
|
case hook.arity
|
76
90
|
when 1
|
77
|
-
|
91
|
+
hook.call(event)
|
78
92
|
when 2
|
79
|
-
|
93
|
+
hook.call(self, event)
|
80
94
|
end
|
81
95
|
end
|
82
96
|
end
|
@@ -90,6 +104,17 @@ module FSR
|
|
90
104
|
send_data("#{line}\r\n\r\n")
|
91
105
|
end
|
92
106
|
|
107
|
+
def subscribe_to_event(event, sub_events = [])
|
108
|
+
sub_events = [sub_events] unless sub_events.respond_to?(:each)
|
109
|
+
@subscribed_events << event
|
110
|
+
@subscribed_sub_events += sub_events
|
111
|
+
if custom = @subscribed_events.delete(:CUSTOM)
|
112
|
+
say "event plain #{@subscribed_events.join(" ")} CUSTOM #{@subscribed_sub_events.join(" ")}"
|
113
|
+
else
|
114
|
+
say "event plain #{@subscribed_events.join(" ")}"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
93
118
|
# api encapsulates #say("api blah") for the user
|
94
119
|
#
|
95
120
|
# param line Line of text to send to the socket proceeding api
|
@@ -109,7 +134,8 @@ module FSR
|
|
109
134
|
#
|
110
135
|
# @param event The event to trigger the block on. Examples, :CHANNEL_CREATE, :CHANNEL_DESTROY, etc
|
111
136
|
# @param block The block to execute when the event is triggered
|
112
|
-
def self.add_event_hook(event, &block)
|
137
|
+
def self.add_event_hook(event, sub_events = [], &block)
|
138
|
+
ObjectSpace.each_object { |e| e.subscribe_to_event(event, sub_events) if e.class.ancestors.include?(FSR::Listener::Inbound) }
|
113
139
|
HOOKS[event] = block
|
114
140
|
end
|
115
141
|
|
@@ -124,7 +150,8 @@ module FSR
|
|
124
150
|
#
|
125
151
|
# @param event The event to trigger the block on. Examples, :CHANNEL_CREATE, :CHANNEL_DESTROY, etc
|
126
152
|
# @param block The block to execute when the event is triggered
|
127
|
-
def add_event(event, &block)
|
153
|
+
def add_event(event, sub_events = [], &block)
|
154
|
+
subscribe_to_event(event, sub_events)
|
128
155
|
@hooks[event] = block
|
129
156
|
end
|
130
157
|
|
@@ -64,7 +64,7 @@ EM.describe InboundListener do
|
|
64
64
|
done
|
65
65
|
end
|
66
66
|
|
67
|
-
should "be able to add custom event hooks in the pre_session" do
|
67
|
+
should "be able to add custom event hooks on instances in the pre_session (before_session)" do
|
68
68
|
@listener.receive_data("Content-Length: 22\n\nEvent-Name: CUSTOM\n\n")
|
69
69
|
@listener.custom_event.should.equal @listener.recvd_event.first
|
70
70
|
@listener2.receive_data("Content-Length: 22\n\nEvent-Name: TEST_EVENT\n\n")
|
@@ -72,10 +72,17 @@ EM.describe InboundListener do
|
|
72
72
|
done
|
73
73
|
end
|
74
74
|
|
75
|
-
should "be able to add custom event hooks" do
|
75
|
+
should "be able to add custom event hooks on classes, before instantiation" do
|
76
76
|
FSL::Inbound.add_event_hook(:HANGUP_EVENT) { |instance, event| instance.test_event = event }
|
77
77
|
listener = InboundListener2.new(1234, {:auth => 'SecretPassword'})
|
78
|
-
listener.
|
78
|
+
listener.receive_data("Content-Length: 24\n\nEvent-Name: HANGUP_EVENT\n\n")
|
79
|
+
listener.test_event.content[:event_name].should.equal "HANGUP_EVENT"
|
80
|
+
done
|
81
|
+
end
|
82
|
+
|
83
|
+
should "be able to add custom event hooks on classes, after instantiation" do
|
84
|
+
listener = InboundListener2.new(1234, {:auth => 'SecretPassword'})
|
85
|
+
FSL::Inbound.add_event_hook(:HANGUP_EVENT) { |instance, event| instance.test_event = event }
|
79
86
|
listener.receive_data("Content-Length: 24\n\nEvent-Name: HANGUP_EVENT\n\n")
|
80
87
|
listener.test_event.content[:event_name].should.equal "HANGUP_EVENT"
|
81
88
|
done
|