adhearsion 2.0.1 → 2.1.0
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/.travis.yml +4 -3
- data/CHANGELOG.md +30 -0
- data/README.markdown +1 -0
- data/adhearsion.gemspec +3 -4
- data/bin/ahn +0 -20
- data/features/cli_create.feature +1 -1
- data/features/cli_restart.feature +25 -1
- data/features/cli_start.feature +0 -2
- data/features/plugin_generator.feature +66 -15
- data/features/support/env.rb +0 -13
- data/lib/adhearsion.rb +26 -6
- data/lib/adhearsion/call.rb +42 -7
- data/lib/adhearsion/call_controller.rb +5 -2
- data/lib/adhearsion/call_controller/dial.rb +92 -50
- data/lib/adhearsion/call_controller/input.rb +19 -6
- data/lib/adhearsion/call_controller/menu_dsl/menu.rb +4 -0
- data/lib/adhearsion/call_controller/output.rb +143 -161
- data/lib/adhearsion/call_controller/output/abstract_player.rb +30 -0
- data/lib/adhearsion/call_controller/output/async_player.rb +26 -0
- data/lib/adhearsion/call_controller/output/formatter.rb +81 -0
- data/lib/adhearsion/call_controller/output/player.rb +25 -0
- data/lib/adhearsion/call_controller/record.rb +19 -2
- data/lib/adhearsion/events.rb +3 -0
- data/lib/adhearsion/foundation.rb +12 -6
- data/lib/adhearsion/foundation/exception_handler.rb +8 -6
- data/lib/adhearsion/generators/app/templates/README.md +13 -0
- data/lib/adhearsion/generators/app/templates/config/adhearsion.rb +7 -1
- data/lib/adhearsion/generators/plugin/plugin_generator.rb +1 -0
- data/lib/adhearsion/generators/plugin/templates/plugin-template.gemspec.tt +3 -7
- data/lib/adhearsion/generators/plugin/templates/spec/spec_helper.rb.tt +0 -1
- data/lib/adhearsion/outbound_call.rb +15 -5
- data/lib/adhearsion/punchblock_plugin.rb +13 -2
- data/lib/adhearsion/punchblock_plugin/initializer.rb +13 -12
- data/lib/adhearsion/router.rb +43 -2
- data/lib/adhearsion/router/evented_route.rb +15 -0
- data/lib/adhearsion/router/openended_route.rb +16 -0
- data/lib/adhearsion/router/route.rb +31 -13
- data/lib/adhearsion/router/unaccepting_route.rb +11 -0
- data/lib/adhearsion/version.rb +1 -1
- data/pre-commit +14 -1
- data/spec/adhearsion/call_controller/dial_spec.rb +105 -10
- data/spec/adhearsion/call_controller/input_spec.rb +19 -21
- data/spec/adhearsion/call_controller/output/async_player_spec.rb +67 -0
- data/spec/adhearsion/call_controller/output/formatter_spec.rb +90 -0
- data/spec/adhearsion/call_controller/output/player_spec.rb +65 -0
- data/spec/adhearsion/call_controller/output_spec.rb +436 -190
- data/spec/adhearsion/call_controller/record_spec.rb +49 -6
- data/spec/adhearsion/call_controller_spec.rb +10 -2
- data/spec/adhearsion/call_spec.rb +138 -0
- data/spec/adhearsion/calls_spec.rb +1 -1
- data/spec/adhearsion/outbound_call_spec.rb +48 -8
- data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +34 -23
- data/spec/adhearsion/router/evented_route_spec.rb +34 -0
- data/spec/adhearsion/router/openended_route_spec.rb +61 -0
- data/spec/adhearsion/router/route_spec.rb +26 -4
- data/spec/adhearsion/router/unaccepting_route_spec.rb +72 -0
- data/spec/adhearsion/router_spec.rb +107 -2
- data/spec/adhearsion_spec.rb +19 -0
- data/spec/capture_warnings.rb +28 -21
- data/spec/spec_helper.rb +2 -3
- data/spec/support/call_controller_test_helpers.rb +31 -30
- metadata +32 -29
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Adhearsion
|
4
|
+
class CallController
|
5
|
+
module Output
|
6
|
+
class AbstractPlayer
|
7
|
+
|
8
|
+
attr_accessor :controller
|
9
|
+
|
10
|
+
def initialize(controller)
|
11
|
+
@controller = controller
|
12
|
+
end
|
13
|
+
|
14
|
+
def play_ssml(ssml, options = {})
|
15
|
+
if [RubySpeech::SSML::Speak, Nokogiri::XML::Document].include? ssml.class
|
16
|
+
output ssml, options
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def play_ssml_for(*args)
|
21
|
+
play_ssml Formatter.ssml_for(args)
|
22
|
+
end
|
23
|
+
|
24
|
+
def new_output(options)
|
25
|
+
Punchblock::Component::Output.new options
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Adhearsion
|
4
|
+
class CallController
|
5
|
+
module Output
|
6
|
+
class AsyncPlayer < AbstractPlayer
|
7
|
+
|
8
|
+
#
|
9
|
+
# @yields The output component before executing it
|
10
|
+
# @raises [PlaybackError] if (one of) the given argument(s) could not be played
|
11
|
+
#
|
12
|
+
def output(content, options = {})
|
13
|
+
options.merge! :ssml => content.to_s
|
14
|
+
component = new_output options
|
15
|
+
component.register_event_handler Punchblock::Event::Complete do |event|
|
16
|
+
controller.logger.error event if event.reason.is_a?(Punchblock::Event::Complete::Error)
|
17
|
+
end
|
18
|
+
controller.write_and_await_response component
|
19
|
+
component
|
20
|
+
rescue Punchblock::ProtocolError => e
|
21
|
+
raise PlaybackError, "Async output failed due to #{e.inspect}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Adhearsion
|
4
|
+
class CallController
|
5
|
+
module Output
|
6
|
+
module Formatter
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def ssml_for_collection(collection)
|
10
|
+
collection.inject RubySpeech::SSML::Speak.new do |doc, argument|
|
11
|
+
doc + case argument
|
12
|
+
when Hash
|
13
|
+
Formatter.ssml_for argument.delete(:value), argument
|
14
|
+
when RubySpeech::SSML::Speak
|
15
|
+
argument
|
16
|
+
else
|
17
|
+
Formatter.ssml_for argument
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def detect_type(output)
|
23
|
+
result = nil
|
24
|
+
result = :time if [Date, Time, DateTime].include? output.class
|
25
|
+
result = :numeric if output.kind_of?(Numeric) || output =~ /^\d+$/
|
26
|
+
result = :audio if !result && (/^\//.match(output.to_s) || URI::regexp.match(output.to_s))
|
27
|
+
result ||= :text
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
# Generates SSML for the argument and options passed, using automatic detection
|
32
|
+
# Directly returns the argument if it is already an SSML document
|
33
|
+
#
|
34
|
+
# @param [String, Hash, RubySpeech::SSML::Speak] the argument with options as accepted by the play_ methods, or an SSML document
|
35
|
+
# @return [RubySpeech::SSML::Speak] an SSML document
|
36
|
+
#
|
37
|
+
def ssml_for(*args)
|
38
|
+
return args[0] if args.size == 1 && args[0].is_a?(RubySpeech::SSML::Speak)
|
39
|
+
argument, options = args.flatten
|
40
|
+
options ||= {}
|
41
|
+
type = detect_type argument
|
42
|
+
send "ssml_for_#{type}", argument, options
|
43
|
+
end
|
44
|
+
|
45
|
+
def ssml_for_text(argument, options = {})
|
46
|
+
RubySpeech::SSML.draw { argument }
|
47
|
+
end
|
48
|
+
|
49
|
+
def ssml_for_time(argument, options = {})
|
50
|
+
interpretation = case argument
|
51
|
+
when Date then 'date'
|
52
|
+
when Time then 'time'
|
53
|
+
end
|
54
|
+
|
55
|
+
format = options.delete :format
|
56
|
+
strftime = options.delete :strftime
|
57
|
+
|
58
|
+
time_to_say = strftime ? argument.strftime(strftime) : argument.to_s
|
59
|
+
|
60
|
+
RubySpeech::SSML.draw do
|
61
|
+
say_as(:interpret_as => interpretation, :format => format) { time_to_say }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def ssml_for_numeric(argument, options = {})
|
66
|
+
RubySpeech::SSML.draw do
|
67
|
+
say_as(:interpret_as => 'cardinal') { argument.to_s }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def ssml_for_audio(argument, options = {})
|
72
|
+
fallback = (options || {}).delete :fallback
|
73
|
+
RubySpeech::SSML.draw do
|
74
|
+
audio(:src => argument) { fallback }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Adhearsion
|
4
|
+
class CallController
|
5
|
+
module Output
|
6
|
+
class Player < AbstractPlayer
|
7
|
+
|
8
|
+
#
|
9
|
+
# @yields The output component before executing it
|
10
|
+
# @raises [PlaybackError] if (one of) the given argument(s) could not be played
|
11
|
+
#
|
12
|
+
def output(content, options = {})
|
13
|
+
options.merge! :ssml => content.to_s
|
14
|
+
component = new_output options
|
15
|
+
yield component if block_given?
|
16
|
+
controller.execute_component_and_await_completion component
|
17
|
+
rescue Call::Hangup
|
18
|
+
raise
|
19
|
+
rescue Adhearsion::Error, Punchblock::ProtocolError => e
|
20
|
+
raise PlaybackError, "Output failed due to #{e.inspect}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -26,22 +26,39 @@ module Adhearsion
|
|
26
26
|
# @option options [String, Optional] :format File format used during recording.
|
27
27
|
# @option options [String, Optional] :initial_timeout Controls how long (milliseconds) the recognizer should wait after the end of the prompt for the caller to speak before sending a Recorder event.
|
28
28
|
# @option options [String, Optional] :final_timeout Controls the length (milliseconds) of a period of silence after callers have spoken to conclude they finished.
|
29
|
+
# @option options [Boolean, Optional] :interruptible Allows the recording to be terminated by any single DTMF key, default is false
|
29
30
|
#
|
30
31
|
# @return Punchblock::Component::Record
|
31
32
|
#
|
32
33
|
def record(options = {})
|
33
34
|
async = options.delete :async
|
35
|
+
interruptible = options.delete :interruptible
|
36
|
+
interrupt_key = '0123456789#*'
|
37
|
+
stopper_component = nil
|
34
38
|
|
35
|
-
component =
|
36
|
-
component.register_event_handler
|
39
|
+
component = Punchblock::Component::Record.new options
|
40
|
+
component.register_event_handler Punchblock::Event::Complete do |event|
|
37
41
|
catching_standard_errors { yield event if block_given? }
|
38
42
|
end
|
39
43
|
|
44
|
+
if interruptible
|
45
|
+
stopper_component = Punchblock::Component::Input.new :mode => :dtmf,
|
46
|
+
:grammar => {
|
47
|
+
:value => grammar_accept(interrupt_key)
|
48
|
+
}
|
49
|
+
stopper_component.register_event_handler Punchblock::Event::Complete do |event|
|
50
|
+
component.stop! unless component.complete?
|
51
|
+
end
|
52
|
+
write_and_await_response stopper_component
|
53
|
+
end
|
54
|
+
|
40
55
|
if async
|
41
56
|
write_and_await_response component
|
42
57
|
else
|
43
58
|
execute_component_and_await_completion component
|
44
59
|
end
|
60
|
+
stopper_component.stop! if stopper_component && stopper_component.executing?
|
61
|
+
component
|
45
62
|
end
|
46
63
|
end
|
47
64
|
end
|
data/lib/adhearsion/events.rb
CHANGED
@@ -1,9 +1,15 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
%w{
|
4
|
+
English
|
5
|
+
tmpdir
|
6
|
+
tempfile
|
7
|
+
}.each { |f| require f }
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
-
|
9
|
+
%w{
|
10
|
+
custom_daemonizer
|
11
|
+
exception_handler
|
12
|
+
libc
|
13
|
+
object
|
14
|
+
thread_safety
|
15
|
+
}.each { |f| require "adhearsion/foundation/#{f}" }
|
@@ -1,11 +1,13 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
|
3
|
+
module Adhearsion::Safely
|
4
4
|
def catching_standard_errors(l = logger, &block)
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
Adhearsion::Events.trigger :exception, [e, l]
|
9
|
-
end
|
5
|
+
yield
|
6
|
+
rescue StandardError => e
|
7
|
+
Adhearsion::Events.trigger :exception, [e, l]
|
10
8
|
end
|
11
9
|
end
|
10
|
+
|
11
|
+
class Object
|
12
|
+
include Adhearsion::Safely
|
13
|
+
end
|
@@ -15,6 +15,19 @@ and setup a user in `manager.conf` with read/write access to `all`.
|
|
15
15
|
|
16
16
|
If you are using Asterisk 1.8, you will need to add an additional context with the name `adhearsion-redirect`. On Asterisk 10 and above this is auto-provisioned.
|
17
17
|
|
18
|
+
## FreeSWITCH
|
19
|
+
|
20
|
+
* Ensure that mod_event_socket is installed, and configure it in autoload_configs/event_socket.conf.xml to taste
|
21
|
+
* Add an extension to your dialplan like so:
|
22
|
+
|
23
|
+
```xml
|
24
|
+
<extension name='Adhearsion'>
|
25
|
+
<condition field="destination_number" expression="^10$">
|
26
|
+
<action application='park'/>
|
27
|
+
</condition>
|
28
|
+
</extension>
|
29
|
+
```
|
30
|
+
|
18
31
|
## Voxeo PRISM
|
19
32
|
|
20
33
|
Install the [rayo-server](https://github.com/rayo/rayo-server) app into PRISM 11 and follow the [configuration guide](https://github.com/rayo/rayo-server/wiki/Single-node-and-cluster-configuration-reference).
|
@@ -34,7 +34,13 @@ Adhearsion.config do |config|
|
|
34
34
|
# config.punchblock.username = "" # Your AMI username
|
35
35
|
# config.punchblock.password = "" # Your AMI password
|
36
36
|
# config.punchblock.host = "127.0.0.1" # Your AMI host
|
37
|
-
|
37
|
+
|
38
|
+
##
|
39
|
+
# Use with FreeSWITCH
|
40
|
+
#
|
41
|
+
# config.punchblock.platform = :freeswitch # Use FreeSWITCH
|
42
|
+
# config.punchblock.password = "" # Your Inbound EventSocket password
|
43
|
+
# config.punchblock.host = "127.0.0.1" # Your IES host
|
38
44
|
end
|
39
45
|
|
40
46
|
Adhearsion::Events.draw do
|
@@ -20,15 +20,11 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.test_files = Dir.glob("{spec}/**/*")
|
21
21
|
s.require_paths = ["lib"]
|
22
22
|
|
23
|
-
s.add_runtime_dependency %q<adhearsion>, ["
|
23
|
+
s.add_runtime_dependency %q<adhearsion>, ["~> <%= Adhearsion::VERSION.split('.')[0..1].join('.') %>"]
|
24
24
|
s.add_runtime_dependency %q<activesupport>, [">= 3.0.10"]
|
25
25
|
|
26
|
-
s.add_development_dependency %q<bundler>, ["~> 1.0
|
27
|
-
s.add_development_dependency %q<rspec>, ["
|
28
|
-
s.add_development_dependency %q<ci_reporter>, [">= 1.6.3"]
|
29
|
-
s.add_development_dependency %q<simplecov>, [">= 0"]
|
30
|
-
s.add_development_dependency %q<simplecov-rcov>, [">= 0"]
|
31
|
-
s.add_development_dependency %q<yard>, ["~> 0.6.0"]
|
26
|
+
s.add_development_dependency %q<bundler>, ["~> 1.0"]
|
27
|
+
s.add_development_dependency %q<rspec>, ["~> 2.5"]
|
32
28
|
s.add_development_dependency %q<rake>, [">= 0"]
|
33
29
|
s.add_development_dependency %q<mocha>, [">= 0"]
|
34
30
|
s.add_development_dependency %q<guard-rspec>
|
@@ -7,9 +7,9 @@ module Adhearsion
|
|
7
7
|
delegate :to, :from, :to => :dial_command, :allow_nil => true
|
8
8
|
|
9
9
|
class << self
|
10
|
-
def originate(to, opts = {})
|
10
|
+
def originate(to, opts = {}, &controller_block)
|
11
11
|
new.tap do |call|
|
12
|
-
call.
|
12
|
+
call.execute_controller_or_router_on_answer opts.delete(:controller), &controller_block
|
13
13
|
call.dial to, opts
|
14
14
|
end
|
15
15
|
end
|
@@ -33,7 +33,8 @@ module Adhearsion
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def dial(to, options = {})
|
36
|
-
options
|
36
|
+
options = options.dup
|
37
|
+
options[:to] = to
|
37
38
|
if options[:timeout]
|
38
39
|
wait_timeout = options[:timeout]
|
39
40
|
options[:timeout] = options[:timeout] * 1000
|
@@ -55,17 +56,26 @@ module Adhearsion
|
|
55
56
|
end
|
56
57
|
|
57
58
|
def run_router_on_answer
|
58
|
-
register_event_handler
|
59
|
+
register_event_handler Punchblock::Event::Answered do |event|
|
59
60
|
run_router
|
60
61
|
throw :pass
|
61
62
|
end
|
62
63
|
end
|
63
64
|
|
64
65
|
def on_answer(&block)
|
65
|
-
register_event_handler
|
66
|
+
register_event_handler Punchblock::Event::Answered do |event|
|
66
67
|
block.call event
|
67
68
|
throw :pass
|
68
69
|
end
|
69
70
|
end
|
71
|
+
|
72
|
+
def execute_controller_or_router_on_answer(controller, &controller_block)
|
73
|
+
if controller || controller_block
|
74
|
+
route = Router::Route.new 'inbound', controller, &controller_block
|
75
|
+
on_answer { route.dispatch current_actor }
|
76
|
+
else
|
77
|
+
run_router_on_answer
|
78
|
+
end
|
79
|
+
end
|
70
80
|
end
|
71
81
|
end
|
@@ -11,11 +11,12 @@ module Adhearsion
|
|
11
11
|
Platform punchblock shall use to connect to the Telephony provider. Currently supported values:
|
12
12
|
- :xmpp
|
13
13
|
- :asterisk
|
14
|
+
- :freeswitch
|
14
15
|
__
|
15
16
|
username "usera@127.0.0.1", :desc => "Authentication credentials"
|
16
17
|
password "1" , :desc => "Authentication credentials"
|
17
|
-
host nil , :desc => "Host punchblock needs to connect (where rayo
|
18
|
-
port
|
18
|
+
host nil , :desc => "Host punchblock needs to connect (where rayo/asterisk/freeswitch is located)"
|
19
|
+
port Proc.new { PunchblockPlugin.default_port_for_platform platform }, :transform => Proc.new { |v| PunchblockPlugin.validate_number v }, :desc => "Port punchblock needs to connect"
|
19
20
|
root_domain nil , :desc => "The root domain at which to address the server"
|
20
21
|
calls_domain nil , :desc => "The domain at which to address calls"
|
21
22
|
mixers_domain nil , :desc => "The domain at which to address mixers"
|
@@ -23,6 +24,7 @@ module Adhearsion
|
|
23
24
|
reconnect_attempts 1.0/0.0 , :transform => Proc.new { |v| PunchblockPlugin.validate_number v }, :desc => "The number of times to (re)attempt connection to the server"
|
24
25
|
reconnect_timer 5 , :transform => Proc.new { |v| PunchblockPlugin.validate_number v }, :desc => "Delay between connection attempts"
|
25
26
|
media_engine nil , :transform => Proc.new { |v| v.to_sym }, :desc => "The media engine to use. Defaults to platform default."
|
27
|
+
default_voice nil , :transform => Proc.new { |v| v.to_sym }, :desc => "The default TTS voice to use."
|
26
28
|
end
|
27
29
|
|
28
30
|
init :punchblock do
|
@@ -42,6 +44,15 @@ module Adhearsion
|
|
42
44
|
value.to_i
|
43
45
|
end
|
44
46
|
|
47
|
+
def default_port_for_platform(platform)
|
48
|
+
case platform
|
49
|
+
when :freeswitch then 8021
|
50
|
+
when :asterisk then 5038
|
51
|
+
when :xmpp then 5222
|
52
|
+
else nil
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
45
56
|
def execute_component(command, timeout = 60)
|
46
57
|
client.execute_command command, :async => true
|
47
58
|
response = command.response timeout
|
@@ -19,9 +19,11 @@ module Adhearsion
|
|
19
19
|
username = Blather::JID.new username
|
20
20
|
username = Blather::JID.new username.node, username.domain, resource unless username.resource
|
21
21
|
username = username.to_s
|
22
|
-
|
22
|
+
Punchblock::Connection::XMPP
|
23
23
|
when :asterisk
|
24
|
-
|
24
|
+
Punchblock::Connection::Asterisk
|
25
|
+
when :freeswitch
|
26
|
+
Punchblock::Connection::Freeswitch
|
25
27
|
end
|
26
28
|
|
27
29
|
connection_options = {
|
@@ -33,11 +35,12 @@ module Adhearsion
|
|
33
35
|
:root_domain => self.config.root_domain,
|
34
36
|
:calls_domain => self.config.calls_domain,
|
35
37
|
:mixers_domain => self.config.mixers_domain,
|
36
|
-
:media_engine => self.config.media_engine
|
38
|
+
:media_engine => self.config.media_engine,
|
39
|
+
:default_voice => self.config.default_voice
|
37
40
|
}
|
38
41
|
|
39
42
|
self.connection = connection_class.new connection_options
|
40
|
-
self.client =
|
43
|
+
self.client = Punchblock::Client.new :connection => connection
|
41
44
|
|
42
45
|
# Tell the Punchblock connection that we are ready to process calls.
|
43
46
|
Events.register_callback :after_initialization do
|
@@ -60,12 +63,12 @@ module Adhearsion
|
|
60
63
|
handle_event event
|
61
64
|
end
|
62
65
|
|
63
|
-
Events.punchblock
|
66
|
+
Events.punchblock Punchblock::Connection::Connected do |event|
|
64
67
|
logger.info "Connected to Punchblock server"
|
65
68
|
self.attempts = 0
|
66
69
|
end
|
67
70
|
|
68
|
-
Events.punchblock
|
71
|
+
Events.punchblock Punchblock::Event::Offer do |offer|
|
69
72
|
dispatch_offer offer
|
70
73
|
end
|
71
74
|
|
@@ -87,7 +90,7 @@ module Adhearsion
|
|
87
90
|
m = Mutex.new
|
88
91
|
blocker = ConditionVariable.new
|
89
92
|
|
90
|
-
Events.punchblock
|
93
|
+
Events.punchblock Punchblock::Connection::Connected do
|
91
94
|
Adhearsion::Process.booted
|
92
95
|
m.synchronize { blocker.broadcast }
|
93
96
|
end
|
@@ -109,7 +112,7 @@ module Adhearsion
|
|
109
112
|
begin
|
110
113
|
logger.info "Starting connection to server"
|
111
114
|
client.run
|
112
|
-
rescue
|
115
|
+
rescue Punchblock::DisconnectedError => e
|
113
116
|
# We only care about disconnects if the process is up or booting
|
114
117
|
return unless [:booting, :running].include? Adhearsion::Process.state_name
|
115
118
|
|
@@ -126,7 +129,7 @@ module Adhearsion
|
|
126
129
|
logger.error "Connection lost. Attempting reconnect #{self.attempts} of #{self.config.reconnect_attempts}"
|
127
130
|
sleep self.config.reconnect_timer
|
128
131
|
retry
|
129
|
-
rescue
|
132
|
+
rescue Punchblock::ProtocolError => e
|
130
133
|
logger.fatal "The connection failed due to a protocol error: #{e.name}."
|
131
134
|
raise e
|
132
135
|
end
|
@@ -140,9 +143,7 @@ module Adhearsion
|
|
140
143
|
logger.info "Declining call because the process is not yet running."
|
141
144
|
call.reject :decline
|
142
145
|
when :running
|
143
|
-
call
|
144
|
-
dispatcher = Adhearsion.router.handle call
|
145
|
-
dispatcher.call call
|
146
|
+
Adhearsion.router.handle call
|
146
147
|
else
|
147
148
|
call.reject :error
|
148
149
|
end
|