adhearsion 2.0.0.alpha1 → 2.0.0.alpha2
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/.gitignore +2 -0
- data/.travis.yml +12 -0
- data/CHANGELOG.md +17 -0
- data/adhearsion.gemspec +4 -3
- data/features/app_generator.feature +3 -1
- data/features/cli.feature +7 -7
- data/features/support/env.rb +46 -0
- data/lib/adhearsion.rb +1 -2
- data/lib/adhearsion/call.rb +59 -19
- data/lib/adhearsion/call_controller.rb +20 -24
- data/lib/adhearsion/call_controller/dial.rb +18 -18
- data/lib/adhearsion/cli_commands.rb +26 -9
- data/lib/adhearsion/configuration.rb +39 -10
- data/lib/adhearsion/console.rb +61 -42
- data/lib/adhearsion/foundation/libc.rb +13 -0
- data/lib/adhearsion/generators/app/app_generator.rb +4 -1
- data/lib/adhearsion/generators/app/templates/{Gemfile → Gemfile.erb} +1 -1
- data/lib/adhearsion/generators/app/templates/Rakefile +3 -22
- data/lib/adhearsion/generators/app/templates/gitignore +7 -0
- data/lib/adhearsion/generators/app/templates/lib/simon_game.rb +1 -0
- data/lib/adhearsion/generators/app/templates/script/ahn +1 -0
- data/lib/adhearsion/initializer.rb +24 -12
- data/lib/adhearsion/linux_proc_name.rb +41 -0
- data/lib/adhearsion/outbound_call.rb +10 -5
- data/lib/adhearsion/plugin.rb +29 -132
- data/lib/adhearsion/process.rb +4 -1
- data/lib/adhearsion/punchblock_plugin.rb +14 -5
- data/lib/adhearsion/punchblock_plugin/initializer.rb +8 -1
- data/lib/adhearsion/router/route.rb +1 -3
- data/lib/adhearsion/tasks.rb +6 -12
- data/lib/adhearsion/tasks/configuration.rb +7 -24
- data/lib/adhearsion/tasks/environment.rb +12 -0
- data/lib/adhearsion/tasks/plugins.rb +9 -14
- data/lib/adhearsion/version.rb +1 -1
- data/spec/adhearsion/call_controller/dial_spec.rb +46 -22
- data/spec/adhearsion/call_controller_spec.rb +48 -13
- data/spec/adhearsion/call_spec.rb +144 -23
- data/spec/adhearsion/calls_spec.rb +8 -4
- data/spec/adhearsion/console_spec.rb +24 -0
- data/spec/adhearsion/initializer/logging_spec.rb +0 -3
- data/spec/adhearsion/initializer_spec.rb +52 -37
- data/spec/adhearsion/logging_spec.rb +0 -3
- data/spec/adhearsion/outbound_call_spec.rb +12 -2
- data/spec/adhearsion/plugin_spec.rb +74 -184
- data/spec/adhearsion/process_spec.rb +59 -26
- data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +3 -4
- data/spec/adhearsion/punchblock_plugin_spec.rb +11 -0
- data/spec/adhearsion/router/route_spec.rb +37 -6
- data/spec/adhearsion_spec.rb +31 -8
- data/spec/spec_helper.rb +14 -0
- data/spec/support/call_controller_test_helpers.rb +2 -2
- data/spec/support/logging_helpers.rb +2 -0
- metadata +85 -68
- data/lib/adhearsion/dialplan_controller.rb +0 -9
- data/lib/adhearsion/foundation/synchronized_hash.rb +0 -93
- data/lib/adhearsion/plugin/methods_container.rb +0 -6
- data/spec/adhearsion/dialplan_controller_spec.rb +0 -26
data/.gitignore
CHANGED
data/.travis.yml
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- 1.9.2
|
4
|
+
- 1.9.3
|
5
|
+
- jruby-19mode # JRuby in 1.9 mode
|
6
|
+
- rbx-19mode # currently in active development, may or may not work for your project
|
7
|
+
- ruby-head
|
8
|
+
env: ARUBA_TIMEOUT=120
|
9
|
+
notifications:
|
10
|
+
# irc: "irc.freenode.org#adhearsion"
|
11
|
+
email:
|
12
|
+
- blangfeld@adhearsion.com
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,22 @@
|
|
1
1
|
# develop (2.0.0.head)
|
2
2
|
|
3
|
+
# 2.0.0.alpha2 - 2012-01-30
|
4
|
+
* Change: Plugins no longer load dialplan/event/rpc/console methods using corresponding class methods
|
5
|
+
* Feature: CallController and Console can have modules of methods mixed in using `CallController.mixin` and `Console.mixin`
|
6
|
+
* Feature: Added the ability to override configuration using environment variables. The correct names are given when running `rake adhearsion:config:show`, and are automatically added for all plugins. Plugins may define how the string environment variable is transformed to be useful.
|
7
|
+
* Feature: Rake task adhearsion:config:show improved to make the output copy and paste-able in a configuration file.
|
8
|
+
* Feature: Call variables are aggregated from the headers sent and received during its existence
|
9
|
+
* Feature: Call variables are accessible using `#[]` and `#[]=` on the call
|
10
|
+
* Feature: Router can match against variables on a call using `#[]`
|
11
|
+
* Feature: adhearsion process is named via configuration module
|
12
|
+
* Feature: CallController#dial now takes a `:for` (or `:timeout`) option to specify a timeout on the dial command
|
13
|
+
* Feature: Include a sensible `.gitignore` in generated apps
|
14
|
+
* Feature: CallController can now perform join operations on calls, and take either a call ID, a call object or a mixer name as the target
|
15
|
+
* Bugfix: `Call` and `OutboundCall` now respond to `#to` and `#from` with the correct values from the offer/dial
|
16
|
+
* Bugfix: An `OutboundCall` allows storing call variables just like a `Call`
|
17
|
+
* Bugfix: The console should be shut down when shutting down the process
|
18
|
+
* Rake tasks cleaned up and some initialization bugs fixed
|
19
|
+
|
3
20
|
# 2.0.0.alpha1 - 2012-01-17
|
4
21
|
|
5
22
|
## Major architectural changes
|
data/adhearsion.gemspec
CHANGED
@@ -20,9 +20,9 @@ Gem::Specification.new do |s|
|
|
20
20
|
|
21
21
|
# Runtime dependencies
|
22
22
|
s.add_runtime_dependency "bundler", [">= 1.0.10"]
|
23
|
-
s.add_runtime_dependency 'punchblock', [">= 0.
|
23
|
+
s.add_runtime_dependency 'punchblock', [">= 0.9.1"]
|
24
24
|
s.add_runtime_dependency "logging", [">= 1.6.1"]
|
25
|
-
s.add_runtime_dependency "loquacious", [">= 1.9.0"]
|
25
|
+
s.add_runtime_dependency "adhearsion-loquacious", [">= 1.9.0"]
|
26
26
|
s.add_runtime_dependency "activesupport", [">= 3.0.10"]
|
27
27
|
# i18n is only strictly a dependency for ActiveSupport >= 3.0.0
|
28
28
|
# Since it doesn't conflict with <3.0.0 we'll require it to be
|
@@ -36,9 +36,10 @@ Gem::Specification.new do |s|
|
|
36
36
|
s.add_runtime_dependency "future-resource", [">= 0.0.2"]
|
37
37
|
s.add_runtime_dependency "ruby_speech", [">= 0.4.0"]
|
38
38
|
s.add_runtime_dependency 'countdownlatch'
|
39
|
-
s.add_runtime_dependency 'has-guarded-handlers', [">=
|
39
|
+
s.add_runtime_dependency 'has-guarded-handlers', [">= 1.1.0"]
|
40
40
|
s.add_runtime_dependency 'girl_friday'
|
41
41
|
s.add_runtime_dependency 'jruby-openssl' if RUBY_PLATFORM == 'java'
|
42
|
+
s.add_runtime_dependency "ffi", [">= 1.0.11"]
|
42
43
|
|
43
44
|
# Development dependencies
|
44
45
|
s.add_development_dependency 'rspec', ["~> 2.7.0"]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Feature: Adhearsion App Generator
|
2
2
|
In order to do development on new Adhearsion apps
|
3
|
-
As
|
3
|
+
As an Adhearsion developer
|
4
4
|
I want to generate an Adhearsion app
|
5
5
|
|
6
6
|
Scenario: Generate application with valid layout
|
@@ -12,6 +12,7 @@ Feature: Adhearsion App Generator
|
|
12
12
|
| script |
|
13
13
|
|
14
14
|
And the following files should exist:
|
15
|
+
| .gitignore |
|
15
16
|
| config/adhearsion.rb |
|
16
17
|
| config/environment.rb |
|
17
18
|
| Gemfile |
|
@@ -19,6 +20,7 @@ Feature: Adhearsion App Generator
|
|
19
20
|
| script/ahn |
|
20
21
|
| README.md |
|
21
22
|
| Rakefile |
|
23
|
+
| Procfile |
|
22
24
|
|
23
25
|
And the file "config/adhearsion.rb" should contain each of these content parts:
|
24
26
|
"""
|
data/features/cli.feature
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
Feature: Adhearsion Ahn CLI
|
2
|
-
As
|
2
|
+
As an Adhearsion user
|
3
3
|
I want a cli command (ahn)
|
4
4
|
So that I can create and interact with adhearsion apps
|
5
5
|
|
@@ -45,27 +45,27 @@ Feature: Adhearsion Ahn CLI
|
|
45
45
|
And the exit status should be 1
|
46
46
|
|
47
47
|
Scenario: Command start with no path inside of the app directory
|
48
|
+
Given JRuby skip test
|
48
49
|
Given that I create a valid app under "path/somewhere"
|
49
50
|
When I cd to "path/somewhere"
|
50
51
|
And I run `ahn start` interactively
|
51
|
-
And I wait for output to contain "
|
52
|
+
And I wait for output to contain "Starting connection to server"
|
52
53
|
And I terminate the interactive process
|
53
54
|
Then the output should contain "Loaded config"
|
54
55
|
And the output should contain "Adhearsion::Console: Starting up..."
|
55
56
|
And the output should contain "AHN>"
|
56
|
-
And the output should contain "
|
57
|
-
And the output should contain "Transitioning from running to stopping"
|
57
|
+
And the output should contain "Transitioning from booting to force_stop"
|
58
58
|
|
59
59
|
Scenario: Command start with only path works properly
|
60
|
+
Given JRuby skip test
|
60
61
|
Given that I create a valid app under "path/somewhere"
|
61
62
|
When I run `ahn start path/somewhere` interactively
|
62
|
-
And I wait for output to contain "
|
63
|
+
And I wait for output to contain "Starting connection to server"
|
63
64
|
And I terminate the interactive process
|
64
65
|
Then the output should contain "Loaded config"
|
65
66
|
And the output should contain "Adhearsion::Console: Starting up..."
|
66
67
|
And the output should contain "AHN>"
|
67
|
-
And the output should contain "
|
68
|
-
And the output should contain "Transitioning from running to stopping"
|
68
|
+
And the output should contain "Transitioning from booting to force_stop"
|
69
69
|
|
70
70
|
Scenario: Command daemon with path works correctly
|
71
71
|
Given JRuby skip test
|
data/features/support/env.rb
CHANGED
@@ -18,6 +18,52 @@ require 'cucumber'
|
|
18
18
|
require 'aruba/cucumber'
|
19
19
|
require 'adhearsion'
|
20
20
|
|
21
|
+
module ChildProcess
|
22
|
+
class << self
|
23
|
+
def new(*args)
|
24
|
+
case os
|
25
|
+
when :unix, :macosx, :linux, :solaris, :bsd, :cygwin
|
26
|
+
if posix_spawn?
|
27
|
+
Unix::PosixSpawnProcess.new(args)
|
28
|
+
elsif jruby?
|
29
|
+
JRuby::Process.new(args)
|
30
|
+
else
|
31
|
+
Unix::ForkExecProcess.new(args)
|
32
|
+
end
|
33
|
+
when :windows
|
34
|
+
Windows::Process.new(args)
|
35
|
+
else
|
36
|
+
raise Error, "unsupported OS #{os.inspect}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
alias_method :build, :new
|
40
|
+
|
41
|
+
def os
|
42
|
+
@os ||= (
|
43
|
+
require "rbconfig"
|
44
|
+
host_os = RbConfig::CONFIG['host_os'].downcase
|
45
|
+
|
46
|
+
case host_os
|
47
|
+
when /linux/
|
48
|
+
:linux
|
49
|
+
when /darwin|mac os/
|
50
|
+
:macosx
|
51
|
+
when /mswin|msys|mingw32/
|
52
|
+
:windows
|
53
|
+
when /cygwin/
|
54
|
+
:cygwin
|
55
|
+
when /solaris|sunos/
|
56
|
+
:solaris
|
57
|
+
when /bsd/
|
58
|
+
:bsd
|
59
|
+
else
|
60
|
+
raise Error, "unknown os: #{host_os.inspect}"
|
61
|
+
end
|
62
|
+
)
|
63
|
+
end
|
64
|
+
end # class << self
|
65
|
+
end # ChildProcess
|
66
|
+
|
21
67
|
Before do
|
22
68
|
@aruba_timeout_seconds = ENV['ARUBA_TIMEOUT'] || RUBY_PLATFORM == 'java' ? 60 : 30
|
23
69
|
end
|
data/lib/adhearsion.rb
CHANGED
@@ -14,6 +14,7 @@ abort "ERROR: You are running Adhearsion on an unsupported version of Ruby (Ruby
|
|
14
14
|
girl_friday
|
15
15
|
loquacious
|
16
16
|
|
17
|
+
adhearsion/version
|
17
18
|
adhearsion/foundation/all
|
18
19
|
}.each { |f| require f }
|
19
20
|
|
@@ -27,7 +28,6 @@ module Adhearsion
|
|
27
28
|
autoload :Configuration
|
28
29
|
autoload :Console
|
29
30
|
autoload :Conveniences
|
30
|
-
autoload :DialplanController
|
31
31
|
autoload :Dispatcher
|
32
32
|
autoload :Events
|
33
33
|
autoload :MenuDSL
|
@@ -36,7 +36,6 @@ module Adhearsion
|
|
36
36
|
autoload :OutboundCall
|
37
37
|
autoload :Plugin
|
38
38
|
autoload :Router
|
39
|
-
autoload :Version
|
40
39
|
|
41
40
|
class << self
|
42
41
|
|
data/lib/adhearsion/call.rb
CHANGED
@@ -8,25 +8,25 @@ module Adhearsion
|
|
8
8
|
|
9
9
|
include HasGuardedHandlers
|
10
10
|
|
11
|
-
attr_accessor :offer, :client, :end_reason, :commands
|
11
|
+
attr_accessor :offer, :client, :end_reason, :commands, :variables
|
12
|
+
|
13
|
+
delegate :[], :[]=, :to => :variables
|
14
|
+
delegate :to, :from, :to => :offer, :allow_nil => true
|
12
15
|
|
13
16
|
def initialize(offer = nil)
|
14
|
-
|
15
|
-
@offer = offer
|
16
|
-
@client = offer.client
|
17
|
-
end
|
17
|
+
register_initial_handlers
|
18
18
|
|
19
19
|
@tag_mutex = Mutex.new
|
20
20
|
@tags = []
|
21
21
|
@end_reason_mutex = Mutex.new
|
22
|
-
end_reason = nil
|
23
22
|
@commands = CommandRegistry.new
|
23
|
+
@variables = {}
|
24
24
|
|
25
|
-
|
25
|
+
self << offer if offer
|
26
26
|
end
|
27
27
|
|
28
28
|
def id
|
29
|
-
|
29
|
+
offer.call_id
|
30
30
|
end
|
31
31
|
|
32
32
|
def tags
|
@@ -58,9 +58,21 @@ module Adhearsion
|
|
58
58
|
def deliver_message(message)
|
59
59
|
trigger_handler :event, message
|
60
60
|
end
|
61
|
+
|
61
62
|
alias << deliver_message
|
62
63
|
|
63
64
|
def register_initial_handlers
|
65
|
+
register_event_handler Punchblock::Event::Offer do |offer|
|
66
|
+
@offer = offer
|
67
|
+
@client = offer.client
|
68
|
+
throw :pass
|
69
|
+
end
|
70
|
+
|
71
|
+
register_event_handler Punchblock::HasHeaders do |event|
|
72
|
+
variables.merge! event.headers_hash
|
73
|
+
throw :pass
|
74
|
+
end
|
75
|
+
|
64
76
|
on_end do |event|
|
65
77
|
hangup
|
66
78
|
@end_reason_mutex.synchronize { @end_reason = event.reason }
|
@@ -69,7 +81,7 @@ module Adhearsion
|
|
69
81
|
end
|
70
82
|
|
71
83
|
def on_end(&block)
|
72
|
-
register_event_handler
|
84
|
+
register_event_handler Punchblock::Event::End do |event|
|
73
85
|
block.call event
|
74
86
|
throw :pass
|
75
87
|
end
|
@@ -101,19 +113,51 @@ module Adhearsion
|
|
101
113
|
Adhearsion.active_calls.remove_inactive_call self
|
102
114
|
end
|
103
115
|
|
104
|
-
|
105
|
-
|
116
|
+
##
|
117
|
+
# Joins this call to another call or a mixer
|
118
|
+
#
|
119
|
+
# @param [Call, String, Hash] target the target to join to. May be a Call object, a call ID (String, Hash) or a mixer name (Hash)
|
120
|
+
# @option target [String] call_id The call ID to join to
|
121
|
+
# @option target [String] mixer_name The mixer to join to
|
122
|
+
# @param [Hash, Optional] options further options to be joined with
|
123
|
+
#
|
124
|
+
def join(target, options = {})
|
125
|
+
case target
|
126
|
+
when Call
|
127
|
+
options[:other_call_id] = target.id
|
128
|
+
when String
|
129
|
+
options[:other_call_id] = target
|
130
|
+
when Hash
|
131
|
+
raise ArgumentError, "You cannot specify both a call ID and mixer name" if target.has_key?(:call_id) && target.has_key?(:mixer_name)
|
132
|
+
target.tap do |t|
|
133
|
+
t[:other_call_id] = t[:call_id]
|
134
|
+
t.delete :call_id
|
135
|
+
end
|
136
|
+
|
137
|
+
options.merge! target
|
138
|
+
else
|
139
|
+
raise ArgumentError, "Don't know how to join to #{target.inspect}"
|
140
|
+
end
|
141
|
+
command = Punchblock::Command::Join.new options
|
142
|
+
write_and_await_response command
|
143
|
+
end
|
144
|
+
|
145
|
+
def mute
|
146
|
+
write_and_await_response ::Punchblock::Command::Mute.new
|
147
|
+
end
|
148
|
+
|
149
|
+
def unmute
|
150
|
+
write_and_await_response ::Punchblock::Command::Unmute.new
|
106
151
|
end
|
107
152
|
|
108
|
-
# Lock the socket for a command. Can be used to allow the console to take
|
109
|
-
# control of the thread in between AGI commands coming from the dialplan.
|
110
153
|
def with_command_lock
|
111
154
|
@command_monitor ||= Monitor.new
|
112
155
|
@command_monitor.synchronize { yield }
|
113
156
|
end
|
114
157
|
|
115
158
|
def write_and_await_response(command, timeout = 60)
|
116
|
-
|
159
|
+
# TODO: Put this back once we figure out why it's causing CI to fail
|
160
|
+
# logger.trace "Executing command #{command.inspect}"
|
117
161
|
commands << command
|
118
162
|
write_command command
|
119
163
|
response = command.response timeout
|
@@ -123,18 +167,14 @@ module Adhearsion
|
|
123
167
|
|
124
168
|
def write_command(command)
|
125
169
|
raise Hangup unless active? || command.is_a?(Punchblock::Command::Hangup)
|
170
|
+
variables.merge! command.headers_hash if command.respond_to? :headers_hash
|
126
171
|
client.execute_command command, :call_id => id
|
127
172
|
end
|
128
173
|
|
129
|
-
# Sanitize the offer id
|
130
174
|
def logger_id
|
131
175
|
"#{self.class}: #{id}"
|
132
176
|
end
|
133
177
|
|
134
|
-
def variables
|
135
|
-
offer ? offer.headers_hash : nil or {}
|
136
|
-
end
|
137
|
-
|
138
178
|
def execute_controller(controller, latch = nil)
|
139
179
|
Adhearsion::Process.important_threads << Thread.new do
|
140
180
|
catching_standard_errors do
|
@@ -33,31 +33,34 @@ module Adhearsion
|
|
33
33
|
STOP
|
34
34
|
end
|
35
35
|
|
36
|
-
|
37
|
-
|
36
|
+
class << self
|
37
|
+
def exec(controller, fresh_call = true)
|
38
|
+
return unless controller
|
39
|
+
|
40
|
+
new_controller = catch :pass_controller do
|
41
|
+
controller.skip_accept! unless fresh_call
|
42
|
+
controller.execute!
|
43
|
+
nil
|
44
|
+
end
|
38
45
|
|
39
|
-
|
40
|
-
controller.skip_accept! unless fresh_call
|
41
|
-
controller.execute!
|
42
|
-
nil
|
46
|
+
exec new_controller, false
|
43
47
|
end
|
44
48
|
|
45
|
-
|
49
|
+
##
|
50
|
+
# Include another module into all CallController classes
|
51
|
+
def mixin(mod)
|
52
|
+
include mod
|
53
|
+
end
|
46
54
|
end
|
47
55
|
|
48
|
-
attr_reader :call, :metadata
|
56
|
+
attr_reader :call, :metadata, :block
|
49
57
|
|
50
58
|
delegate :[], :[]=, :to => :@metadata
|
51
59
|
delegate :variables, :logger, :to => :call
|
52
|
-
delegate :write_and_await_response, :accept, :answer, :reject, :to => :call
|
53
|
-
|
54
|
-
def initialize(call, metadata = nil)
|
55
|
-
@call, @metadata = call, metadata || {}
|
56
|
-
setup
|
57
|
-
end
|
60
|
+
delegate :write_and_await_response, :accept, :answer, :reject, :mute, :unmute, :join, :to => :call
|
58
61
|
|
59
|
-
def
|
60
|
-
|
62
|
+
def initialize(call, metadata = nil, &block)
|
63
|
+
@call, @metadata, @block = call, metadata || {}, block
|
61
64
|
end
|
62
65
|
|
63
66
|
def execute!(*options)
|
@@ -73,6 +76,7 @@ module Adhearsion
|
|
73
76
|
end
|
74
77
|
|
75
78
|
def run
|
79
|
+
instance_exec &block if block
|
76
80
|
end
|
77
81
|
|
78
82
|
def invoke(controller_class, metadata = nil)
|
@@ -113,14 +117,6 @@ module Adhearsion
|
|
113
117
|
after_call unless hangup_response == false
|
114
118
|
end
|
115
119
|
|
116
|
-
def mute
|
117
|
-
write_and_await_response ::Punchblock::Command::Mute.new
|
118
|
-
end
|
119
|
-
|
120
|
-
def unmute
|
121
|
-
write_and_await_response ::Punchblock::Command::Unmute.new
|
122
|
-
end
|
123
|
-
|
124
120
|
def execute_component_and_await_completion(component)
|
125
121
|
write_and_await_response component
|
126
122
|
|
@@ -13,34 +13,29 @@ module Adhearsion
|
|
13
13
|
#
|
14
14
|
# @param [Hash] options
|
15
15
|
#
|
16
|
-
# +:
|
16
|
+
# +:from+ - the caller id to be used when the call is placed. It is advised you properly adhere to the
|
17
17
|
# policy of VoIP termination providers with respect to caller id values.
|
18
18
|
#
|
19
|
-
# +:name+ - this is the name which should be passed with the caller ID information
|
20
|
-
# if :name=>"John Doe" and :caller_id => "444-333-1000" then the compelete CID and name would be "John Doe" <4443331000>
|
21
|
-
# support for caller id information varies from country to country and from one VoIP termination provider to another.
|
22
|
-
#
|
23
19
|
# +:for+ - this option can be thought of best as a timeout. i.e. timeout after :for if no one answers the call
|
24
|
-
# For example, dial(
|
20
|
+
# For example, dial(%w{SIP/jay-desk-650 SIP/jay-desk-601 SIP/jay-desk-601-2}, :for => 15.seconds, :from => callerid)
|
25
21
|
# this call will timeout after 15 seconds if 1 of the 3 extensions being dialed do not pick prior to the 15 second time limit
|
26
22
|
#
|
27
|
-
# +:options+ - This is a string of options like "Tr" which are supported by the asterisk DIAL application.
|
28
|
-
# for a complete list of these options and their usage please check the link below.
|
29
|
-
#
|
30
|
-
# +:confirm+ - ?
|
31
|
-
#
|
32
23
|
# @example Make a call to the PSTN using my SIP provider for VoIP termination
|
33
24
|
# dial "SIP/19095551001@my.sip.voip.terminator.us"
|
34
25
|
#
|
35
26
|
# @example Make 3 Simulataneous calls to the SIP extensions, try for 15 seconds and use the callerid
|
36
27
|
# for this call specified by the variable my_callerid
|
37
|
-
# dial
|
28
|
+
# dial %w{SIP/jay-desk-650 SIP/jay-desk-601 SIP/jay-desk-601-2}, :for => 15.seconds, :from => my_callerid
|
38
29
|
#
|
39
30
|
# @example Make a call using the IAX provider to the PSTN
|
40
|
-
# dial "IAX2/my.id@voipjet/19095551234", :
|
31
|
+
# dial "IAX2/my.id@voipjet/19095551234", :from => "John Doe <9095551234>"
|
41
32
|
#
|
42
|
-
def dial(to, options = {})
|
43
|
-
latch
|
33
|
+
def dial(to, options = {}, latch = nil)
|
34
|
+
latch ||= CountDownLatch.new 1
|
35
|
+
|
36
|
+
_for = options.delete :for
|
37
|
+
options[:timeout] ||= _for if _for
|
38
|
+
|
44
39
|
calls = Array(to).map do |target|
|
45
40
|
new_call = OutboundCall.new options
|
46
41
|
|
@@ -48,7 +43,7 @@ module Adhearsion
|
|
48
43
|
calls.each do |call_to_hangup, target|
|
49
44
|
call_to_hangup.hangup! unless call_to_hangup.id == new_call.id
|
50
45
|
end
|
51
|
-
new_call.join call
|
46
|
+
new_call.join call
|
52
47
|
end
|
53
48
|
|
54
49
|
new_call.on_end do |event|
|
@@ -58,11 +53,16 @@ module Adhearsion
|
|
58
53
|
[new_call, target]
|
59
54
|
end
|
60
55
|
|
61
|
-
calls.
|
56
|
+
calls.map! do |call, target|
|
62
57
|
call.dial target, options
|
58
|
+
call
|
63
59
|
end
|
64
60
|
|
65
|
-
latch.wait
|
61
|
+
timeout = latch.wait options[:timeout]
|
62
|
+
|
63
|
+
return timeout unless timeout
|
64
|
+
|
65
|
+
calls.size == 1 ? calls.first : calls
|
66
66
|
end
|
67
67
|
|
68
68
|
end#module Dial
|