adhearsion 2.3.5 → 2.4.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +0 -1
- data/CHANGELOG.md +14 -0
- data/Gemfile +2 -0
- data/README.markdown +21 -2
- data/adhearsion.gemspec +5 -4
- data/features/cli_plugin.feature +41 -0
- data/features/cli_start.feature +12 -4
- data/features/step_definitions/cli_steps.rb +12 -0
- data/features/support/env.rb +1 -1
- data/features/support/utils.rb +0 -1
- data/lib/adhearsion.rb +4 -1
- data/lib/adhearsion/call.rb +92 -22
- data/lib/adhearsion/call_controller.rb +19 -15
- data/lib/adhearsion/call_controller/dial.rb +157 -25
- data/lib/adhearsion/call_controller/menu_dsl/menu_builder.rb +8 -0
- data/lib/adhearsion/call_controller/output/async_player.rb +1 -1
- data/lib/adhearsion/call_controller/output/formatter.rb +1 -1
- data/lib/adhearsion/call_controller/output/player.rb +1 -1
- data/lib/adhearsion/calls.rb +2 -0
- data/lib/adhearsion/cli_commands.rb +3 -163
- data/lib/adhearsion/cli_commands/ahn_command.rb +141 -0
- data/lib/adhearsion/cli_commands/plugin_command.rb +74 -0
- data/lib/adhearsion/cli_commands/thor_errors.rb +36 -0
- data/lib/adhearsion/console.rb +14 -6
- data/lib/adhearsion/generators/app/templates/spec/call_controllers/simon_game_spec.rb +36 -36
- data/lib/adhearsion/generators/controller/templates/spec/controller_spec.rb +1 -1
- data/lib/adhearsion/generators/plugin/templates/plugin-template.gemspec.tt +0 -1
- data/lib/adhearsion/generators/plugin/templates/spec/plugin-template/controller_methods_spec.rb.tt +1 -1
- data/lib/adhearsion/generators/plugin/templates/spec/spec_helper.rb.tt +0 -1
- data/lib/adhearsion/logging.rb +5 -1
- data/lib/adhearsion/outbound_call.rb +16 -0
- data/lib/adhearsion/punchblock_plugin.rb +0 -2
- data/lib/adhearsion/punchblock_plugin/initializer.rb +7 -12
- data/lib/adhearsion/version.rb +1 -1
- data/spec/adhearsion/call_controller/dial_spec.rb +785 -32
- data/spec/adhearsion/call_controller/menu_dsl/menu_builder_spec.rb +10 -0
- data/spec/adhearsion/call_controller/output/async_player_spec.rb +1 -1
- data/spec/adhearsion/call_controller/output/player_spec.rb +1 -1
- data/spec/adhearsion/call_controller/output_spec.rb +3 -3
- data/spec/adhearsion/call_controller/record_spec.rb +1 -1
- data/spec/adhearsion/call_controller_spec.rb +13 -9
- data/spec/adhearsion/call_spec.rb +216 -51
- data/spec/adhearsion/calls_spec.rb +1 -1
- data/spec/adhearsion/console_spec.rb +20 -9
- data/spec/adhearsion/outbound_call_spec.rb +40 -6
- data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +9 -21
- data/spec/adhearsion/punchblock_plugin_spec.rb +1 -1
- data/spec/adhearsion/router_spec.rb +1 -1
- data/spec/spec_helper.rb +11 -15
- data/spec/support/call_controller_test_helpers.rb +2 -2
- data/spec/support/punchblock_mocks.rb +2 -2
- metadata +41 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0e1b64f1b1643fc319f4203fbf8e6cf2452c444d
|
4
|
+
data.tar.gz: f533f739a9536421599852a4f049407b287b30b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb6cad9f60e451a309f4e98b5cdb61e19835032e44f053cba58598b9dc4b188abc1d089802d9c596566c3ebdc107e2fec1d61e5a4e26c5f0bfca24bb6f6e5ed8
|
7
|
+
data.tar.gz: 803b943cbebf981da00a580e46151dad0fc86bb188ccb89171e759461cbb03f889355c159e9b9ad67f77a2d5bb149717e85ae10ff96428128bdbff43aff528f5
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,19 @@
|
|
1
1
|
# [develop](https://github.com/adhearsion/adhearsion)
|
2
2
|
|
3
|
+
# [2.4.0.beta1](https://github.com/adhearsion/adhearsion/compare/v2.3.5...v2.4.0.beta1) - [2013-08-20](https://rubygems.org/gems/adhearsion/versions/2.4.0.beta1)
|
4
|
+
* Feature: Add Call#wait_for_end, which blocks until the call ends and returns its end reason
|
5
|
+
* Feature: Add joined call attribute to dial status
|
6
|
+
* Feature: Track call start/end time and duration
|
7
|
+
* Feature: Add per-call join duration and disposition to DialStatus
|
8
|
+
* Feature: Add `CallController#dial_and_confirm` which allows parallel confirmation of outbound calls
|
9
|
+
* Feature: Add `#originate` method to console as alias for `Adhearsion::OutboundCall.originate`
|
10
|
+
* Feature: Allow the console to be disabled using `--no-console`
|
11
|
+
* Feature: Add CLI options to generate hooks for a plugin to register on [ahnhub.com](http://www.ahnhub.com)
|
12
|
+
* Bugfix: Removed unnecessary Mocha reference from generated plugin
|
13
|
+
* Bugfix: Call loggers should be deleted after a call finishes
|
14
|
+
* Bugfix: A menu definition's block context is now available
|
15
|
+
* Bugfix: Ensure call's command registry is not leaked outside the actor
|
16
|
+
|
3
17
|
# [2.3.5](https://github.com/adhearsion/adhearsion/compare/v2.3.4...v2.3.5) - [2013-06-06](https://rubygems.org/gems/adhearsion/versions/2.3.5)
|
4
18
|
* Bugfix: Fix race conditions in barging in before output start is acknowledged
|
5
19
|
* Performance enhancement: Use Celluloid's thread pool for call controller threads to reduce thread setup overhead
|
data/Gemfile
CHANGED
data/README.markdown
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
[![Gem Version](https://badge.fury.io/rb/adhearsion.png)](https://rubygems.org/gems/adhearsion)
|
2
|
+
[![Build Status](https://secure.travis-ci.org/adhearsion/adhearsion.png?branch=develop)](http://travis-ci.org/adhearsion/adhearsion)
|
3
|
+
[![Dependency Status](https://gemnasium.com/adhearsion/adhearsion.png?travis)](https://gemnasium.com/adhearsion/adhearsion)
|
4
|
+
[![Code Climate](https://codeclimate.com/github/adhearsion/adhearsion.png)](https://codeclimate.com/github/adhearsion/adhearsion)
|
5
|
+
[![Coverage Status](https://coveralls.io/repos/adhearsion/adhearsion/badge.png?branch=develop)](https://coveralls.io/r/adhearsion/adhearsion)
|
6
|
+
|
1
7
|
# Adhearsion
|
2
8
|
|
3
9
|
Adhearsion is an open-source voice application development framework. Adhearsion users write applications atop the framework with Ruby and **call into their code**.
|
@@ -24,6 +30,12 @@ Adhearsion rests above a lower-level telephony platform, for example [Asterisk](
|
|
24
30
|
* Prism 11+ with rayo-server
|
25
31
|
* An interest in building cool new things
|
26
32
|
|
33
|
+
\* Support for Ruby 1.9.2 is deprecated, and requires locking your application to ActiveSupport 3.x as follows:
|
34
|
+
|
35
|
+
```ruby
|
36
|
+
gem 'active_support', '~> 3.0'
|
37
|
+
```
|
38
|
+
|
27
39
|
## Install
|
28
40
|
|
29
41
|
`gem install adhearsion`
|
@@ -47,7 +59,14 @@ Visit [Adhearsion's website](http://adhearsion.com) for code examples and more i
|
|
47
59
|
|
48
60
|
If you're having trouble, you may want to try asking your question on the IRC channel (#adhearsion on irc.freenode.net), [mailing list](http://groups.google.com/group/adhearsion) or, if you've found a bug, report it on the [bug tracker](https://github.com/adhearsion/adhearsion/issues).
|
49
61
|
|
50
|
-
##
|
62
|
+
## Related Projects
|
63
|
+
|
64
|
+
These Open Source projects are also maintained by members of the Adhearsion team and may be useful when developing Adhearsion apps:
|
65
|
+
|
66
|
+
* [Telephony-Dev-Box](https://github.com/mojolingo/Telephony-Dev-Box) is a system for creating virtual machines that will preconfigure Adhearsion, Asterisk, FreeSWITCH and PRISM together. Just add a SIP client and start calling your app!
|
67
|
+
* [SippyCup](https://github.com/bklang/sippy_cup) makes generating [SIPp](http://sipp.sourceforge.net/) profiles and RTP media easy. Useful for load testing your apps and telephony infrastructure.
|
68
|
+
|
69
|
+
## Authors
|
51
70
|
|
52
71
|
Core team:
|
53
72
|
|
@@ -66,4 +85,4 @@ There is a pre-commit hook that runs encoding checks available in pre-commit. To
|
|
66
85
|
|
67
86
|
### Copyright
|
68
87
|
|
69
|
-
Copyright (c) 2013 Adhearsion Foundation Inc. MIT LICENSE (see LICENSE for details).
|
88
|
+
Copyright (c) 2011-2013 Adhearsion Foundation Inc. MIT LICENSE (see LICENSE for details).
|
data/adhearsion.gemspec
CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
18
|
s.require_paths = ["lib"]
|
19
19
|
|
20
|
-
s.add_runtime_dependency 'activesupport', ["
|
20
|
+
s.add_runtime_dependency 'activesupport', [">= 3.0.0", "< 5.0.0"]
|
21
21
|
s.add_runtime_dependency 'adhearsion-loquacious', ["~> 1.9"]
|
22
22
|
s.add_runtime_dependency 'bundler', ["~> 1.0"]
|
23
23
|
s.add_runtime_dependency 'celluloid', ["~> 0.14"]
|
@@ -29,9 +29,9 @@ Gem::Specification.new do |s|
|
|
29
29
|
s.add_runtime_dependency 'jruby-openssl' if RUBY_PLATFORM == 'java'
|
30
30
|
s.add_runtime_dependency 'logging', ["~> 1.8"]
|
31
31
|
s.add_runtime_dependency 'pry'
|
32
|
-
s.add_runtime_dependency 'punchblock', ["~>
|
32
|
+
s.add_runtime_dependency 'punchblock', ["~> 2.0.0.beta1"]
|
33
33
|
s.add_runtime_dependency 'rake'
|
34
|
-
s.add_runtime_dependency 'ruby_speech', ["~>
|
34
|
+
s.add_runtime_dependency 'ruby_speech', ["~> 2.0"]
|
35
35
|
s.add_runtime_dependency 'thor', "~> 0.18.0"
|
36
36
|
|
37
37
|
s.add_development_dependency 'aruba', "~> 0.5"
|
@@ -40,8 +40,9 @@ Gem::Specification.new do |s|
|
|
40
40
|
s.add_development_dependency 'guard-cucumber'
|
41
41
|
s.add_development_dependency 'guard-rspec'
|
42
42
|
s.add_development_dependency 'rspec', ["~> 2.11"]
|
43
|
-
s.add_development_dependency 'ruby_gntp'
|
44
43
|
s.add_development_dependency 'simplecov'
|
45
44
|
s.add_development_dependency 'simplecov-rcov'
|
46
45
|
s.add_development_dependency 'yard'
|
46
|
+
s.add_development_dependency 'coveralls'
|
47
|
+
s.add_development_dependency 'timecop'
|
47
48
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
Feature: Adhearsion Ahn CLI (Plugin)
|
2
|
+
As an Adhearsion user
|
3
|
+
I want a cli command (ahn plugin)
|
4
|
+
So that I can perform actions for adhearsion plugins
|
5
|
+
|
6
|
+
Scenario: No arguments given
|
7
|
+
When I run `ahn plugin`
|
8
|
+
Then I should see the plugin usage message
|
9
|
+
And the exit status should be 0
|
10
|
+
|
11
|
+
Scenario: Unrecognized commands
|
12
|
+
When I run `ahn plugin alpha beta`
|
13
|
+
Then the output should contain:
|
14
|
+
"""
|
15
|
+
Could not find command "alpha"
|
16
|
+
"""
|
17
|
+
And the exit status should be 1
|
18
|
+
|
19
|
+
Scenario: Command help
|
20
|
+
When I run `ahn plugin help`
|
21
|
+
Then I should see the plugin usage message
|
22
|
+
And the exit status should be 0
|
23
|
+
|
24
|
+
Scenario: Command create_rubygem_hook
|
25
|
+
When I run `ahn plugin create_rubygem_hook` interactively
|
26
|
+
And I type "foobar"
|
27
|
+
And I type "SECRET_CODE"
|
28
|
+
Then the output should contain:
|
29
|
+
"""
|
30
|
+
Access Denied. Please sign up for an account at http://rubygems.org
|
31
|
+
"""
|
32
|
+
|
33
|
+
Scenario: Command create_github_hook
|
34
|
+
When I run `ahn plugin create_github_hook` interactively
|
35
|
+
And I type "username"
|
36
|
+
And I type "SECRET_CODE"
|
37
|
+
And I type "adhearsion/new_plugin"
|
38
|
+
Then the output should contain:
|
39
|
+
"""
|
40
|
+
{"message":
|
41
|
+
"""
|
data/features/cli_start.feature
CHANGED
@@ -12,8 +12,8 @@ Feature: Adhearsion Ahn CLI (start)
|
|
12
12
|
And the exit status should be 1
|
13
13
|
|
14
14
|
Scenario: Command start with no path inside of the app directory
|
15
|
-
Given JRuby skip test
|
16
|
-
|
15
|
+
Given JRuby skip test because the console causes the process to never exit
|
16
|
+
And that I create a valid app under "path/somewhere"
|
17
17
|
When I cd to "path/somewhere"
|
18
18
|
And I run `ahn start` interactively
|
19
19
|
And I wait for output to contain "Starting connection to server"
|
@@ -21,9 +21,17 @@ Feature: Adhearsion Ahn CLI (start)
|
|
21
21
|
And the output should contain "Adhearsion shut down"
|
22
22
|
|
23
23
|
Scenario: Command start with only path works properly
|
24
|
-
Given JRuby skip test
|
25
|
-
|
24
|
+
Given JRuby skip test waiting for https://jira.codehaus.org/browse/JRUBY-6994
|
25
|
+
And that I create a valid app under "path/somewhere"
|
26
26
|
When I run `ahn start path/somewhere` interactively
|
27
27
|
And I wait for output to contain "Starting connection to server"
|
28
28
|
Then the output should contain "Adhearsion::Console: Launching Adhearsion Console"
|
29
29
|
And the output should contain "Adhearsion shut down"
|
30
|
+
|
31
|
+
Scenario: Starting without the console
|
32
|
+
Given that I create a valid app under "path/somewhere"
|
33
|
+
When I cd to "path/somewhere"
|
34
|
+
And I run `ahn start --no-console` interactively
|
35
|
+
And I wait for output to contain "Starting connection to server"
|
36
|
+
Then the output should not contain "Adhearsion::Console: Launching Adhearsion Console"
|
37
|
+
And the output should contain "Adhearsion shut down"
|
@@ -6,10 +6,19 @@ Then /^I should see the usage message$/ do
|
|
6
6
|
Then the output should contain "ahn start"
|
7
7
|
Then the output should contain "ahn daemon"
|
8
8
|
Then the output should contain "ahn version"
|
9
|
+
Then the output should contain "ahn plugin"
|
9
10
|
Then the output should contain "ahn help"
|
10
11
|
}
|
11
12
|
end
|
12
13
|
|
14
|
+
Then /^I should see the plugin usage message$/ do
|
15
|
+
steps %Q{
|
16
|
+
Then the output should contain "ahn plugin create_ahnhub_hooks"
|
17
|
+
Then the output should contain "ahn plugin create_github_hook"
|
18
|
+
Then the output should contain "ahn plugin create_rubygem_hook"
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
13
22
|
When /^I wait (\d+) seconds?$/ do |arg1|
|
14
23
|
sleep arg1.to_i
|
15
24
|
end
|
@@ -19,6 +28,8 @@ Given /^that I create a valid app under "([^"]*)"$/ do |path|
|
|
19
28
|
When I run `ahn create #{path}`
|
20
29
|
Then there should be a valid adhearsion directory named "#{path}"
|
21
30
|
}
|
31
|
+
|
32
|
+
remove_file "#{path}/Gemfile"
|
22
33
|
end
|
23
34
|
|
24
35
|
Then /^there should be a valid adhearsion directory named "([^"]*)"$/ do |path|
|
@@ -55,3 +66,4 @@ When /^I terminate the process using the pid file "([^"]*)"$/ do |pidfile|
|
|
55
66
|
sleep 1
|
56
67
|
end
|
57
68
|
end
|
69
|
+
|
data/features/support/env.rb
CHANGED
@@ -8,7 +8,7 @@ require 'aruba/cucumber'
|
|
8
8
|
require 'adhearsion'
|
9
9
|
|
10
10
|
Before do
|
11
|
-
@aruba_timeout_seconds = ENV['ARUBA_TIMEOUT']
|
11
|
+
@aruba_timeout_seconds = ENV.has_key?('ARUBA_TIMEOUT') ? ENV['ARUBA_TIMEOUT'].to_i : (RUBY_PLATFORM == 'java' ? 60 : 30)
|
12
12
|
ENV['AHN_PUNCHBLOCK_RECONNECT_ATTEMPTS'] = '0'
|
13
13
|
ENV['AHN_PUNCHBLOCK_PORT'] = '1'
|
14
14
|
end
|
data/features/support/utils.rb
CHANGED
data/lib/adhearsion.rb
CHANGED
@@ -73,7 +73,10 @@ module Adhearsion
|
|
73
73
|
_config = Configuration.new
|
74
74
|
env = ENV['AHN_ENV'] || ENV['RAILS_ENV']
|
75
75
|
env = env.to_sym if env.respond_to? :to_sym
|
76
|
-
|
76
|
+
unless _config.valid_environment? env
|
77
|
+
puts "You tried to initialize with an invalid environment name #{env}. Valid values are #{_config.valid_environments}."
|
78
|
+
env = nil
|
79
|
+
end
|
77
80
|
_config.platform.environment = env if env
|
78
81
|
_config
|
79
82
|
end
|
data/lib/adhearsion/call.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'has_guarded_handlers'
|
4
4
|
require 'thread'
|
5
|
+
require 'active_support/hash_with_indifferent_access'
|
5
6
|
|
6
7
|
module Adhearsion
|
7
8
|
##
|
@@ -17,6 +18,7 @@ module Adhearsion
|
|
17
18
|
include HasGuardedHandlers
|
18
19
|
|
19
20
|
execute_block_on_receiver :register_handler, :register_tmp_handler, :register_handler_with_priority, :register_event_handler, :on_joined, :on_unjoined, :on_end, :execute_controller
|
21
|
+
finalizer :finalize
|
20
22
|
|
21
23
|
def self.new(*args, &block)
|
22
24
|
super.tap do |proxy|
|
@@ -28,7 +30,7 @@ module Adhearsion
|
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
31
|
-
attr_reader :end_reason, :
|
33
|
+
attr_reader :end_reason, :controllers, :variables, :start_time, :end_time
|
32
34
|
|
33
35
|
delegate :[], :[]=, :to => :variables
|
34
36
|
delegate :to, :from, :to => :offer, :allow_nil => true
|
@@ -39,10 +41,12 @@ module Adhearsion
|
|
39
41
|
@offer = nil
|
40
42
|
@tags = []
|
41
43
|
@commands = CommandRegistry.new
|
42
|
-
@variables =
|
44
|
+
@variables = HashWithIndifferentAccess.new
|
43
45
|
@controllers = []
|
44
46
|
@end_reason = nil
|
47
|
+
@end_blocker = Celluloid::Condition.new
|
45
48
|
@peers = {}
|
49
|
+
@duration = nil
|
46
50
|
|
47
51
|
self << offer if offer
|
48
52
|
end
|
@@ -54,6 +58,25 @@ module Adhearsion
|
|
54
58
|
offer.target_call_id if offer
|
55
59
|
end
|
56
60
|
|
61
|
+
#
|
62
|
+
# @return [String, nil] The domain on which the call resides
|
63
|
+
#
|
64
|
+
def domain
|
65
|
+
offer.domain if offer
|
66
|
+
end
|
67
|
+
|
68
|
+
#
|
69
|
+
# @return [String, nil] The uri at which the call resides
|
70
|
+
#
|
71
|
+
def uri
|
72
|
+
return nil unless id
|
73
|
+
s = ""
|
74
|
+
s << transport << ":" if transport
|
75
|
+
s << id
|
76
|
+
s << "@" << domain if domain
|
77
|
+
s
|
78
|
+
end
|
79
|
+
|
57
80
|
#
|
58
81
|
# @return [Array] The set of labels with which this call has been tagged.
|
59
82
|
#
|
@@ -97,6 +120,18 @@ module Adhearsion
|
|
97
120
|
@peers.clone
|
98
121
|
end
|
99
122
|
|
123
|
+
#
|
124
|
+
# Wait for the call to end. Returns immediately if the call has already ended, else blocks until it does so.
|
125
|
+
# @return [Symbol] the reason for the call ending
|
126
|
+
#
|
127
|
+
def wait_for_end
|
128
|
+
if end_reason
|
129
|
+
end_reason
|
130
|
+
else
|
131
|
+
@end_blocker.wait
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
100
135
|
def register_event_handler(*guards, &block)
|
101
136
|
register_handler :event, *guards, &block
|
102
137
|
end
|
@@ -107,46 +142,65 @@ module Adhearsion
|
|
107
142
|
end
|
108
143
|
alias << deliver_message
|
109
144
|
|
145
|
+
def commands
|
146
|
+
@commands.clone
|
147
|
+
end
|
148
|
+
|
110
149
|
# @private
|
111
150
|
def register_initial_handlers
|
112
151
|
register_event_handler Punchblock::Event::Offer do |offer|
|
113
152
|
@offer = offer
|
114
153
|
@client = offer.client
|
154
|
+
@start_time = Time.now
|
115
155
|
throw :pass
|
116
156
|
end
|
117
157
|
|
118
158
|
register_event_handler Punchblock::HasHeaders do |event|
|
119
|
-
|
159
|
+
merge_headers event.headers
|
120
160
|
throw :pass
|
121
161
|
end
|
122
162
|
|
123
163
|
on_joined do |event|
|
124
|
-
target = event.
|
164
|
+
target = event.call_uri || event.mixer_name
|
125
165
|
@peers[target] = Adhearsion.active_calls[target]
|
126
166
|
signal :joined, target
|
127
167
|
end
|
128
168
|
|
129
169
|
on_unjoined do |event|
|
130
|
-
target = event.
|
170
|
+
target = event.call_uri || event.mixer_name
|
131
171
|
@peers.delete target
|
132
172
|
signal :unjoined, target
|
133
173
|
end
|
134
174
|
|
135
175
|
on_end do |event|
|
136
|
-
logger.info "Call ended"
|
176
|
+
logger.info "Call ended due to #{event.reason}"
|
177
|
+
@end_time = Time.now
|
178
|
+
@duration = @end_time - @start_time if @start_time
|
137
179
|
clear_from_active_calls
|
138
180
|
@end_reason = event.reason
|
139
|
-
|
181
|
+
@end_blocker.broadcast event.reason
|
182
|
+
@commands.terminate
|
140
183
|
after(Adhearsion.config.platform.after_hangup_lifetime) { terminate }
|
141
184
|
throw :pass
|
142
185
|
end
|
143
186
|
end
|
144
187
|
|
188
|
+
# @return [Float] The call duration until the current time, or until the call was disconnected, whichever is earlier
|
189
|
+
def duration
|
190
|
+
if @duration
|
191
|
+
@duration
|
192
|
+
elsif @start_time
|
193
|
+
Time.now - @start_time
|
194
|
+
else
|
195
|
+
0.0
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
145
199
|
##
|
146
200
|
# Registers a callback for when this call is joined to another call or a mixer
|
147
201
|
#
|
148
202
|
# @param [Call, String, Hash, nil] target the target to guard on. May be a Call object, a call ID (String, Hash) or a mixer name (Hash)
|
149
|
-
# @option target [String]
|
203
|
+
# @option target [String] call_uri The call ID to guard on
|
150
204
|
# @option target [String] mixer_name The mixer name to guard on
|
151
205
|
#
|
152
206
|
def on_joined(target = nil, &block)
|
@@ -160,7 +214,7 @@ module Adhearsion
|
|
160
214
|
# Registers a callback for when this call is unjoined from another call or a mixer
|
161
215
|
#
|
162
216
|
# @param [Call, String, Hash, nil] target the target to guard on. May be a Call object, a call ID (String, Hash) or a mixer name (Hash)
|
163
|
-
# @option target [String]
|
217
|
+
# @option target [String] call_uri The call ID to guard on
|
164
218
|
# @option target [String] mixer_name The mixer name to guard on
|
165
219
|
#
|
166
220
|
def on_unjoined(target = nil, &block)
|
@@ -218,7 +272,7 @@ module Adhearsion
|
|
218
272
|
# Joins this call to another call or a mixer
|
219
273
|
#
|
220
274
|
# @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)
|
221
|
-
# @option target [String]
|
275
|
+
# @option target [String] call_uri The call ID to join to
|
222
276
|
# @option target [String] mixer_name The mixer to join to
|
223
277
|
# @param [Hash, Optional] options further options to be joined with
|
224
278
|
#
|
@@ -231,7 +285,7 @@ module Adhearsion
|
|
231
285
|
# Unjoins this call from another call or a mixer
|
232
286
|
#
|
233
287
|
# @param [Call, String, Hash] target the target to unjoin from. May be a Call object, a call ID (String, Hash) or a mixer name (Hash)
|
234
|
-
# @option target [String]
|
288
|
+
# @option target [String] call_uri The call ID to unjoin from
|
235
289
|
# @option target [String] mixer_name The mixer to unjoin from
|
236
290
|
#
|
237
291
|
def unjoin(target)
|
@@ -243,11 +297,11 @@ module Adhearsion
|
|
243
297
|
def join_options_with_target(target)
|
244
298
|
case target
|
245
299
|
when Call
|
246
|
-
{ :
|
300
|
+
{ :call_uri => target.uri }
|
247
301
|
when String
|
248
|
-
{ :
|
302
|
+
{ :call_uri => "#{transport}:#{target}@#{domain}" }
|
249
303
|
when Hash
|
250
|
-
abort ArgumentError.new "You cannot specify both a call
|
304
|
+
abort ArgumentError.new "You cannot specify both a call URI and mixer name" if target.has_key?(:call_uri) && target.has_key?(:mixer_name)
|
251
305
|
target
|
252
306
|
else
|
253
307
|
abort ArgumentError.new "Don't know how to join to #{target.inspect}"
|
@@ -278,10 +332,11 @@ module Adhearsion
|
|
278
332
|
|
279
333
|
# @private
|
280
334
|
def write_and_await_response(command, timeout = 60)
|
281
|
-
commands << command
|
335
|
+
@commands << command
|
282
336
|
write_command command
|
283
337
|
|
284
|
-
|
338
|
+
response = defer { command.response timeout }
|
339
|
+
case response
|
285
340
|
when Punchblock::ProtocolError
|
286
341
|
if response.name == :item_not_found
|
287
342
|
abort Hangup.new(@end_reason)
|
@@ -295,21 +350,22 @@ module Adhearsion
|
|
295
350
|
command
|
296
351
|
rescue Timeout::Error
|
297
352
|
abort CommandTimeout.new(command.to_s)
|
353
|
+
ensure
|
354
|
+
@commands.delete command
|
298
355
|
end
|
299
356
|
|
300
357
|
# @private
|
301
358
|
def write_command(command)
|
302
359
|
abort Hangup.new(@end_reason) unless active? || command.is_a?(Punchblock::Command::Hangup)
|
303
|
-
|
360
|
+
merge_headers command.headers if command.respond_to? :headers
|
304
361
|
logger.debug "Executing command #{command.inspect}"
|
305
|
-
client.execute_command command, :
|
362
|
+
client.execute_command command, call_id: id, domain: domain, async: true
|
306
363
|
end
|
307
364
|
|
308
365
|
# @private
|
309
366
|
def logger_id
|
310
|
-
"#{self.class}: #{id}"
|
367
|
+
"#{self.class}: #{id}@#{domain}"
|
311
368
|
end
|
312
|
-
|
313
369
|
# @private
|
314
370
|
def to_ary
|
315
371
|
[current_actor]
|
@@ -320,7 +376,7 @@ module Adhearsion
|
|
320
376
|
attrs = [:offer, :end_reason, :commands, :variables, :controllers, :to, :from].map do |attr|
|
321
377
|
"#{attr}=#{send(attr).inspect}"
|
322
378
|
end
|
323
|
-
"#<#{self.class}:#{id} #{attrs.join ', '}>"
|
379
|
+
"#<#{self.class}:#{id}@#{domain} #{attrs.join ', '}>"
|
324
380
|
end
|
325
381
|
|
326
382
|
def execute_controller(controller = nil, completion_callback = nil, &block)
|
@@ -355,8 +411,22 @@ module Adhearsion
|
|
355
411
|
@client
|
356
412
|
end
|
357
413
|
|
414
|
+
def transport
|
415
|
+
offer.transport if offer
|
416
|
+
end
|
417
|
+
|
418
|
+
def merge_headers(headers)
|
419
|
+
headers.each do |name, value|
|
420
|
+
variables[name.to_s.downcase.gsub('-', '_')] = value
|
421
|
+
end
|
422
|
+
end
|
423
|
+
|
424
|
+
def finalize
|
425
|
+
::Logging::Repository.instance.delete logger_id
|
426
|
+
end
|
427
|
+
|
358
428
|
# @private
|
359
|
-
class CommandRegistry <
|
429
|
+
class CommandRegistry < Array
|
360
430
|
def terminate
|
361
431
|
hangup = Hangup.new
|
362
432
|
each { |command| command.response = hangup if command.requested? }
|