adhearsion 2.0.0.alpha2 → 2.0.0.alpha3
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 +16 -14
- data/CHANGELOG.md +17 -1
- data/adhearsion.gemspec +14 -13
- data/features/cli_basic.feature +30 -0
- data/features/cli_create.feature +24 -0
- data/features/cli_daemon.feature +21 -0
- data/features/cli_generate.feature +9 -0
- data/features/cli_start.feature +33 -0
- data/features/cli_stop.feature +38 -0
- data/features/controller_generator.feature +19 -0
- data/features/plugin_generator.feature +55 -0
- data/lib/adhearsion.rb +5 -1
- data/lib/adhearsion/call.rb +57 -51
- data/lib/adhearsion/call_controller.rb +4 -20
- data/lib/adhearsion/call_controller/dial.rb +34 -4
- data/lib/adhearsion/calls.rb +4 -1
- data/lib/adhearsion/cli_commands.rb +31 -6
- data/lib/adhearsion/configuration.rb +2 -6
- data/lib/adhearsion/console.rb +56 -17
- data/lib/adhearsion/generators.rb +53 -2
- data/lib/adhearsion/generators/app/app_generator.rb +2 -24
- data/lib/adhearsion/generators/app/templates/config/adhearsion.rb +1 -1
- data/lib/adhearsion/generators/controller/controller_generator.rb +18 -0
- data/lib/adhearsion/generators/controller/templates/lib/controller.rb +4 -0
- data/lib/adhearsion/generators/controller/templates/spec/controller_spec.rb +3 -0
- data/lib/adhearsion/generators/generator.rb +77 -0
- data/lib/adhearsion/generators/plugin/plugin_generator.rb +33 -0
- data/lib/adhearsion/generators/plugin/templates/.gitignore +9 -0
- data/lib/adhearsion/generators/plugin/templates/Gemfile.tt +4 -0
- data/lib/adhearsion/generators/plugin/templates/README.md.tt +2 -0
- data/lib/adhearsion/generators/plugin/templates/Rakefile.tt +1 -0
- data/lib/adhearsion/generators/plugin/templates/lib/plugin-template.rb.tt +5 -0
- data/lib/adhearsion/generators/plugin/templates/lib/plugin-template/controller_methods.rb.tt +10 -0
- data/lib/adhearsion/generators/plugin/templates/lib/plugin-template/plugin.rb.tt +29 -0
- data/lib/adhearsion/generators/plugin/templates/lib/plugin-template/version.rb.tt +3 -0
- data/lib/adhearsion/generators/plugin/templates/plugin-template.gemspec.tt +35 -0
- data/lib/adhearsion/generators/plugin/templates/spec/plugin-template/controller_methods_spec.rb.tt +26 -0
- data/lib/adhearsion/generators/plugin/templates/spec/spec_helper.rb.tt +13 -0
- data/lib/adhearsion/initializer.rb +14 -22
- data/lib/adhearsion/logging.rb +25 -16
- data/lib/adhearsion/outbound_call.rb +3 -3
- data/lib/adhearsion/plugin.rb +14 -0
- data/lib/adhearsion/punchblock_plugin.rb +6 -1
- data/lib/adhearsion/punchblock_plugin/initializer.rb +8 -8
- data/lib/adhearsion/tasks/configuration.rb +1 -1
- data/lib/adhearsion/version.rb +1 -1
- data/spec/adhearsion/call_controller/dial_spec.rb +108 -17
- data/spec/adhearsion/call_controller_spec.rb +7 -64
- data/spec/adhearsion/call_spec.rb +48 -29
- data/spec/adhearsion/calls_spec.rb +7 -0
- data/spec/adhearsion/configuration_spec.rb +14 -14
- data/spec/adhearsion/console_spec.rb +124 -4
- data/spec/adhearsion/generators_spec.rb +17 -0
- data/spec/adhearsion/initializer_spec.rb +22 -18
- data/spec/adhearsion/logging_spec.rb +78 -48
- data/spec/adhearsion/outbound_call_spec.rb +6 -15
- data/spec/adhearsion/plugin_spec.rb +18 -0
- data/spec/adhearsion/process_spec.rb +10 -1
- data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +8 -6
- data/spec/spec_helper.rb +5 -2
- data/spec/support/call_controller_test_helpers.rb +1 -1
- data/spec/support/initializer_stubs.rb +1 -1
- metadata +106 -66
- data/features/cli.feature +0 -108
- data/lib/adhearsion/initializer/logging.rb +0 -33
- data/spec/adhearsion/initializer/logging_spec.rb +0 -55
data/.gitignore
CHANGED
@@ -1,25 +1,27 @@
|
|
1
1
|
# Gem related stuff
|
2
2
|
*.gem
|
3
|
-
pkg
|
4
|
-
|
5
|
-
Gemfile.lock
|
6
|
-
vendor
|
3
|
+
/pkg
|
4
|
+
/.bundle
|
5
|
+
/Gemfile.lock
|
6
|
+
/vendor
|
7
7
|
|
8
8
|
# Testing stuff
|
9
|
-
coverage
|
10
|
-
spec/reports
|
11
|
-
|
12
|
-
adhearsion.pid
|
9
|
+
/coverage
|
10
|
+
/spec/reports
|
11
|
+
*.log
|
12
|
+
/adhearsion.pid
|
13
13
|
|
14
14
|
# RBX stuff
|
15
|
+
/.rbx/
|
16
|
+
|
17
|
+
# Editor temp/backup files
|
15
18
|
*~
|
16
19
|
.*.sw?
|
17
|
-
nbproject
|
18
|
-
/.rbx/
|
19
20
|
|
20
21
|
# General
|
22
|
+
/nbproject
|
21
23
|
.DS_Store
|
22
|
-
|
23
|
-
|
24
|
-
doc
|
25
|
-
tmp
|
24
|
+
/.rvmrc
|
25
|
+
/.yardoc
|
26
|
+
/doc
|
27
|
+
/tmp
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,20 @@
|
|
1
|
-
#
|
1
|
+
# 2.0.0.alpha3 - 2012-02-21
|
2
|
+
* Feature: Add `ahn generate` command to allow invocation of generators
|
3
|
+
* Feature: Add simple generator for call controllers
|
4
|
+
* Feature: Add simple generator for plugins
|
5
|
+
* Feature: Allow plugins to register their generator classes
|
6
|
+
* Feature: Add log level helper methods to Console
|
7
|
+
* Feature: Console's shutdown/exit method initiates the shutdown routine
|
8
|
+
* Bugfix: Remove config option for auto-accept - hard-coded to true
|
9
|
+
* Bugfix: AHN_ENV and RAILS_ENV now do not interfere with each other when both are set, and ahn will boot in the RAILS_ENV if AHN_ENV is not set
|
10
|
+
* Feature: The console can take control of a call
|
11
|
+
* Bugfix: CallController#dial now blocks until all outbound calls complete
|
12
|
+
* Bugfix: Call commands timing out now raise a timeout exception in the caller, but do not crash the actor
|
13
|
+
* Bugfix: CallController#dial now unblocks immediately if the original call ends
|
14
|
+
* Bugfix: CallController#dial now unblocks when the connected outbound call unjoins, rather than ending, incase post-processing on the outbound call is required
|
15
|
+
* Bugfix: CallController#dial now hangs up outbound legs when it unblocks
|
16
|
+
* Feature: CallController#dial now defaults the outbound caller ID to that of the controller's call
|
17
|
+
* Change: The command to take control of a call is now 'take' rather than 'use'. 'take' called without a call ID present a list of currently running calls
|
2
18
|
|
3
19
|
# 2.0.0.alpha2 - 2012-01-30
|
4
20
|
* Change: Plugins no longer load dialplan/event/rpc/console methods using corresponding class methods
|
data/adhearsion.gemspec
CHANGED
@@ -19,27 +19,28 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
21
|
# Runtime dependencies
|
22
|
-
s.add_runtime_dependency
|
22
|
+
s.add_runtime_dependency 'bundler', [">= 1.0.10"]
|
23
23
|
s.add_runtime_dependency 'punchblock', [">= 0.9.1"]
|
24
|
-
s.add_runtime_dependency
|
25
|
-
s.add_runtime_dependency
|
26
|
-
s.add_runtime_dependency
|
24
|
+
s.add_runtime_dependency 'logging', [">= 1.6.1"]
|
25
|
+
s.add_runtime_dependency 'adhearsion-loquacious', [">= 1.9.0"]
|
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
|
29
29
|
# on the safe side.
|
30
|
-
s.add_runtime_dependency
|
31
|
-
s.add_runtime_dependency
|
32
|
-
s.add_runtime_dependency
|
33
|
-
s.add_runtime_dependency
|
34
|
-
s.add_runtime_dependency
|
35
|
-
s.add_runtime_dependency
|
36
|
-
s.add_runtime_dependency
|
37
|
-
s.add_runtime_dependency
|
30
|
+
s.add_runtime_dependency 'i18n', [">= 0.5.0"]
|
31
|
+
s.add_runtime_dependency 'json'
|
32
|
+
s.add_runtime_dependency 'thor'
|
33
|
+
s.add_runtime_dependency 'rake'
|
34
|
+
s.add_runtime_dependency 'pry'
|
35
|
+
s.add_runtime_dependency 'uuid'
|
36
|
+
s.add_runtime_dependency 'future-resource', [">= 0.0.2"]
|
37
|
+
s.add_runtime_dependency 'ruby_speech', [">= 0.4.0"]
|
38
38
|
s.add_runtime_dependency 'countdownlatch'
|
39
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
|
42
|
+
s.add_runtime_dependency 'ffi', [">= 1.0.11"]
|
43
|
+
s.add_runtime_dependency 'celluloid', [">= 0.9.0"]
|
43
44
|
|
44
45
|
# Development dependencies
|
45
46
|
s.add_development_dependency 'rspec', ["~> 2.7.0"]
|
@@ -0,0 +1,30 @@
|
|
1
|
+
Feature: Adhearsion Ahn CLI (Basic)
|
2
|
+
As an Adhearsion user
|
3
|
+
I want a cli command (ahn)
|
4
|
+
So that I can perform actions against adhearsion apps and interact with adhearsion
|
5
|
+
|
6
|
+
Scenario: No arguments given
|
7
|
+
When I run `ahn`
|
8
|
+
Then I should see the usage message
|
9
|
+
And the exit status should be 0
|
10
|
+
|
11
|
+
Scenario: Unrecognized commands
|
12
|
+
When I run `ahn alpha beta`
|
13
|
+
Then the output should contain:
|
14
|
+
"""
|
15
|
+
Unknown command: alpha beta
|
16
|
+
"""
|
17
|
+
And the exit status should be 1
|
18
|
+
|
19
|
+
Scenario: Command version should print the version
|
20
|
+
When I run `ahn version`
|
21
|
+
Then the output should contain:
|
22
|
+
"""
|
23
|
+
Adhearsion v
|
24
|
+
"""
|
25
|
+
And the exit status should be 0
|
26
|
+
|
27
|
+
Scenario: Command help
|
28
|
+
When I run `ahn help`
|
29
|
+
Then I should see the usage message
|
30
|
+
And the exit status should be 0
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Feature: Adhearsion Ahn CLI (Create)
|
2
|
+
As an Adhearsion user
|
3
|
+
I want the ahn command to allow creating an app
|
4
|
+
So that I can write an Adhearsion app
|
5
|
+
|
6
|
+
Scenario: Command create with correct arguments
|
7
|
+
When I run `ahn create path/somewhere`
|
8
|
+
And I cd to "path/somewhere"
|
9
|
+
Then the following files should exist:
|
10
|
+
| Gemfile |
|
11
|
+
| README.md |
|
12
|
+
| Rakefile |
|
13
|
+
| config/adhearsion.rb |
|
14
|
+
| config/environment.rb |
|
15
|
+
And the file "config/adhearsion.rb" should contain "Adhearsion.router"
|
16
|
+
Then the exit status should be 0
|
17
|
+
|
18
|
+
Scenario: Running create with no arguments
|
19
|
+
When I run `ahn create`
|
20
|
+
Then the output should contain:
|
21
|
+
"""
|
22
|
+
"create" was called incorrectly. Call as "ahn create /path/to/directory".
|
23
|
+
"""
|
24
|
+
And the exit status should be 1
|
@@ -0,0 +1,21 @@
|
|
1
|
+
Feature: Adhearsion Ahn CLI (daemon)
|
2
|
+
As an Adhearsion user
|
3
|
+
I want the ahn command to provide a 'daemon' command
|
4
|
+
So that I can start my adhearsion app as a daemon
|
5
|
+
|
6
|
+
Scenario: Command daemon with path works correctly
|
7
|
+
Given JRuby skip test
|
8
|
+
Given that I create a valid app under "path/somewhere"
|
9
|
+
When I run `ahn daemon path/somewhere`
|
10
|
+
And I cd to "path/somewhere"
|
11
|
+
And I terminate the process using the pid file "adhearsion.pid"
|
12
|
+
Then the output should contain "Daemonizing now"
|
13
|
+
And the exit status should be 0
|
14
|
+
|
15
|
+
Scenario: Command daemon with pid option
|
16
|
+
Given JRuby skip test
|
17
|
+
Given that I create a valid app under "path/somewhere"
|
18
|
+
When I run `ahn daemon path/somewhere --pid-file=ahn.pid`
|
19
|
+
And I cd to "path/somewhere"
|
20
|
+
And I terminate the process using the pid file "ahn.pid"
|
21
|
+
Then the output should contain "Daemonizing now"
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Feature: Adhearsion Ahn CLI (generate)
|
2
|
+
As an Adhearsion user
|
3
|
+
I want the ahn command to be able to run generators
|
4
|
+
So that I can generate useful code
|
5
|
+
|
6
|
+
Scenario: Listing generators
|
7
|
+
When I run `ahn generate`
|
8
|
+
Then the output should contain "Please choose a generator below."
|
9
|
+
And the output should contain "controller"
|
@@ -0,0 +1,33 @@
|
|
1
|
+
Feature: Adhearsion Ahn CLI (start)
|
2
|
+
As an Adhearsion user
|
3
|
+
I want the ahn command to provide a 'start' command
|
4
|
+
So that I can start an interactive Adhearsion application
|
5
|
+
|
6
|
+
Scenario: Command start with no path outside of the app directory
|
7
|
+
When I run `ahn start`
|
8
|
+
Then the output should contain:
|
9
|
+
"""
|
10
|
+
A valid path is required for start, unless run from an Adhearson app directory
|
11
|
+
"""
|
12
|
+
And the exit status should be 1
|
13
|
+
|
14
|
+
Scenario: Command start with no path inside of the app directory
|
15
|
+
Given JRuby skip test
|
16
|
+
Given that I create a valid app under "path/somewhere"
|
17
|
+
When I cd to "path/somewhere"
|
18
|
+
And I run `ahn start` interactively
|
19
|
+
And I wait for output to contain "Starting connection to server"
|
20
|
+
And I terminate the interactive process
|
21
|
+
Then the output should contain "Adhearsion::Console: Starting up..."
|
22
|
+
And the output should contain "AHN>"
|
23
|
+
And the output should contain "Transitioning from booting to force_stop"
|
24
|
+
|
25
|
+
Scenario: Command start with only path works properly
|
26
|
+
Given JRuby skip test
|
27
|
+
Given that I create a valid app under "path/somewhere"
|
28
|
+
When I run `ahn start path/somewhere` interactively
|
29
|
+
And I wait for output to contain "Starting connection to server"
|
30
|
+
And I terminate the interactive process
|
31
|
+
Then the output should contain "Adhearsion::Console: Starting up..."
|
32
|
+
And the output should contain "AHN>"
|
33
|
+
And the output should contain "Transitioning from booting to force_stop"
|
@@ -0,0 +1,38 @@
|
|
1
|
+
Feature: Adhearsion Ahn CLI (stop)
|
2
|
+
As an Adhearsion user
|
3
|
+
I want the ahn command to provide a 'stop' command
|
4
|
+
So that I can stop a running Adhearsion daemon
|
5
|
+
|
6
|
+
Scenario: Command stop with valid path and pid option
|
7
|
+
Given JRuby skip test
|
8
|
+
Given that I create a valid app under "path/somewhere"
|
9
|
+
When I run `ahn daemon path/somewhere --pid-file=ahn.pid`
|
10
|
+
And I run `ahn stop path/somewhere --pid-file=ahn.pid`
|
11
|
+
Then the output should contain:
|
12
|
+
"""
|
13
|
+
Stopping Adhearsion
|
14
|
+
"""
|
15
|
+
And the file "ahn.pid" should not exist
|
16
|
+
|
17
|
+
Scenario: Command stop with valid path and no pid option
|
18
|
+
Given JRuby skip test
|
19
|
+
Given that I create a valid app under "path/somewhere"
|
20
|
+
When I run `ahn daemon path/somewhere`
|
21
|
+
And I run `ahn stop path/somewhere`
|
22
|
+
Then the output should contain:
|
23
|
+
"""
|
24
|
+
Stopping Adhearsion
|
25
|
+
"""
|
26
|
+
And the file "path/somewhere/adhearsion.pid" should not exist
|
27
|
+
|
28
|
+
Scenario: Command stop with no options inside the app directory
|
29
|
+
Given JRuby skip test
|
30
|
+
Given that I create a valid app under "path/somewhere"
|
31
|
+
And I cd to "path/somewhere"
|
32
|
+
When I run `ahn daemon`
|
33
|
+
And I run `ahn stop`
|
34
|
+
Then the output should contain:
|
35
|
+
"""
|
36
|
+
Stopping Adhearsion
|
37
|
+
"""
|
38
|
+
And the file "adhearsion.pid" should not exist
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Feature: Adhearsion controller generator
|
2
|
+
In order to speed up development of an Adhearsion app
|
3
|
+
As an Adhearsion developer
|
4
|
+
I want to generate a controller and its tests
|
5
|
+
|
6
|
+
Scenario: Generate a controller and a test file
|
7
|
+
When I run `ahn create path/somewhere`
|
8
|
+
And I cd to "path/somewhere"
|
9
|
+
And I run `ahn generate controller TestController`
|
10
|
+
Then the following directories should exist:
|
11
|
+
| lib |
|
12
|
+
| spec |
|
13
|
+
|
14
|
+
And the following files should exist:
|
15
|
+
| lib/test_controller.rb |
|
16
|
+
| spec/test_controller_spec.rb |
|
17
|
+
|
18
|
+
And the file "lib/test_controller.rb" should contain "class TestController < Adhearsion::CallController"
|
19
|
+
And the file "spec/test_controller_spec.rb" should contain "describe TestController"
|
@@ -0,0 +1,55 @@
|
|
1
|
+
Feature: Adhearsion plugin generator
|
2
|
+
In order to speed up development of an Adhearsion plugin
|
3
|
+
As an Adhearsion plugin developer
|
4
|
+
I want to generate a plugin and its basic structure
|
5
|
+
|
6
|
+
Scenario: Generate the basic structure for a plugin
|
7
|
+
When I run `ahn generate plugin TestPlugin`
|
8
|
+
Then the following directories should exist:
|
9
|
+
| test_plugin |
|
10
|
+
| test_plugin/lib |
|
11
|
+
| test_plugin/lib/test_plugin |
|
12
|
+
| test_plugin/spec |
|
13
|
+
And the following files should exist:
|
14
|
+
| test_plugin/test_plugin.gemspec |
|
15
|
+
| test_plugin/Rakefile |
|
16
|
+
| test_plugin/README.md |
|
17
|
+
| test_plugin/Gemfile |
|
18
|
+
| test_plugin/lib/test_plugin.rb |
|
19
|
+
| test_plugin/lib/test_plugin/version.rb |
|
20
|
+
| test_plugin/lib/test_plugin/plugin.rb |
|
21
|
+
| test_plugin/lib/test_plugin/controller_methods.rb |
|
22
|
+
| test_plugin/spec/spec_helper.rb |
|
23
|
+
| test_plugin/spec/test_plugin/controller_methods_spec.rb |
|
24
|
+
And the file "test_plugin/test_plugin.gemspec" should contain "test_plugin/version"
|
25
|
+
And the file "test_plugin/README.md" should contain "TestPlugin"
|
26
|
+
And the file "test_plugin/lib/test_plugin.rb" should contain each of these content parts:
|
27
|
+
"""
|
28
|
+
module TestPlugin
|
29
|
+
test_plugin/version
|
30
|
+
test_plugin/plugin
|
31
|
+
test_plugin/controller_methods
|
32
|
+
"""
|
33
|
+
And the file "test_plugin/lib/test_plugin/version.rb" should contain each of these content parts:
|
34
|
+
"""
|
35
|
+
module TestPlugin
|
36
|
+
VERSION
|
37
|
+
"""
|
38
|
+
And the file "test_plugin/lib/test_plugin/plugin.rb" should contain each of these content parts:
|
39
|
+
"""
|
40
|
+
module TestPlugin
|
41
|
+
init :test_plugin
|
42
|
+
config :test_plugin
|
43
|
+
namespace :test_plugin
|
44
|
+
"""
|
45
|
+
And the file "test_plugin/lib/test_plugin/controller_methods.rb" should contain each of these content parts:
|
46
|
+
"""
|
47
|
+
module TestPlugin
|
48
|
+
def greet
|
49
|
+
"""
|
50
|
+
And the file "test_plugin/spec/spec_helper.rb" should contain "require 'test_plugin'"
|
51
|
+
And the file "test_plugin/spec/test_plugin/controller_methods_spec.rb" should contain each of these content parts:
|
52
|
+
"""
|
53
|
+
module TestPlugin
|
54
|
+
include TestPlugin::ControllerMethods
|
55
|
+
"""
|
data/lib/adhearsion.rb
CHANGED
@@ -13,6 +13,7 @@ abort "ERROR: You are running Adhearsion on an unsupported version of Ruby (Ruby
|
|
13
13
|
has_guarded_handlers
|
14
14
|
girl_friday
|
15
15
|
loquacious
|
16
|
+
celluloid
|
16
17
|
|
17
18
|
adhearsion/version
|
18
19
|
adhearsion/foundation/all
|
@@ -30,6 +31,7 @@ module Adhearsion
|
|
30
31
|
autoload :Conveniences
|
31
32
|
autoload :Dispatcher
|
32
33
|
autoload :Events
|
34
|
+
autoload :Generators
|
33
35
|
autoload :MenuDSL
|
34
36
|
autoload :Initializer
|
35
37
|
autoload :Logging
|
@@ -51,7 +53,7 @@ module Adhearsion
|
|
51
53
|
|
52
54
|
def initialize_config
|
53
55
|
_config = Configuration.new
|
54
|
-
env = ENV['AHN_ENV']
|
56
|
+
env = ENV['AHN_ENV'] || ENV['RAILS_ENV']
|
55
57
|
env = nil unless _config.valid_environment? env
|
56
58
|
_config.platform.environment = env if env
|
57
59
|
_config
|
@@ -87,3 +89,5 @@ module Adhearsion
|
|
87
89
|
RecordError = Class.new StandardError # Represents failure to record such as when a file cannot be written.
|
88
90
|
ConfigurationError = Class.new StandardError # Error raised while trying to configure a non existent plugin
|
89
91
|
end
|
92
|
+
|
93
|
+
Celluloid.exception_handler { |e| Adhearsion::Events.trigger :exception, e }
|
data/lib/adhearsion/call.rb
CHANGED
@@ -1,11 +1,30 @@
|
|
1
1
|
require 'thread'
|
2
2
|
|
3
|
+
module Celluloid
|
4
|
+
module ClassMethods
|
5
|
+
def ===(other)
|
6
|
+
other.kind_of? self
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class ActorProxy
|
11
|
+
def is_a?(klass)
|
12
|
+
Actor.call @mailbox, :is_a?, klass
|
13
|
+
end
|
14
|
+
|
15
|
+
def kind_of?(klass)
|
16
|
+
Actor.call @mailbox, :kind_of?, klass
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
3
21
|
module Adhearsion
|
4
22
|
##
|
5
23
|
# Encapsulates call-related data and behavior.
|
6
24
|
#
|
7
25
|
class Call
|
8
26
|
|
27
|
+
include Celluloid
|
9
28
|
include HasGuardedHandlers
|
10
29
|
|
11
30
|
attr_accessor :offer, :client, :end_reason, :commands, :variables
|
@@ -16,39 +35,35 @@ module Adhearsion
|
|
16
35
|
def initialize(offer = nil)
|
17
36
|
register_initial_handlers
|
18
37
|
|
19
|
-
@
|
20
|
-
@
|
21
|
-
@
|
22
|
-
@commands = CommandRegistry.new
|
23
|
-
@variables = {}
|
38
|
+
@tags = []
|
39
|
+
@commands = CommandRegistry.new
|
40
|
+
@variables = {}
|
24
41
|
|
25
42
|
self << offer if offer
|
26
43
|
end
|
27
44
|
|
28
45
|
def id
|
29
|
-
offer.call_id
|
46
|
+
offer.call_id if offer
|
30
47
|
end
|
31
48
|
|
32
49
|
def tags
|
33
|
-
@
|
50
|
+
@tags.clone
|
34
51
|
end
|
35
52
|
|
36
53
|
# This may still be a symbol, but no longer requires the tag to be a symbol although beware
|
37
54
|
# that using a symbol would create a memory leak if used improperly
|
38
55
|
# @param [String, Symbol] label String or Symbol with which to tag this call
|
39
56
|
def tag(label)
|
40
|
-
|
41
|
-
@
|
57
|
+
abort ArgumentError.new "Tag must be a String or Symbol" unless [String, Symbol].include?(label.class)
|
58
|
+
@tags << label
|
42
59
|
end
|
43
60
|
|
44
61
|
def remove_tag(symbol)
|
45
|
-
@
|
46
|
-
@tags.reject! { |tag| tag == symbol }
|
47
|
-
end
|
62
|
+
@tags.reject! { |tag| tag == symbol }
|
48
63
|
end
|
49
64
|
|
50
65
|
def tagged_with?(symbol)
|
51
|
-
@
|
66
|
+
@tags.include? symbol
|
52
67
|
end
|
53
68
|
|
54
69
|
def register_event_handler(*guards, &block)
|
@@ -56,6 +71,7 @@ module Adhearsion
|
|
56
71
|
end
|
57
72
|
|
58
73
|
def deliver_message(message)
|
74
|
+
logger.debug "Receiving message: #{message.inspect}"
|
59
75
|
trigger_handler :event, message
|
60
76
|
end
|
61
77
|
|
@@ -74,9 +90,10 @@ module Adhearsion
|
|
74
90
|
end
|
75
91
|
|
76
92
|
on_end do |event|
|
77
|
-
|
78
|
-
@
|
93
|
+
clear_from_active_calls
|
94
|
+
@end_reason = event.reason
|
79
95
|
commands.terminate
|
96
|
+
after(5) { current_actor.terminate! }
|
80
97
|
end
|
81
98
|
end
|
82
99
|
|
@@ -88,11 +105,11 @@ module Adhearsion
|
|
88
105
|
end
|
89
106
|
|
90
107
|
def active?
|
91
|
-
|
108
|
+
!end_reason
|
92
109
|
end
|
93
110
|
|
94
111
|
def accept(headers = nil)
|
95
|
-
write_and_await_response Punchblock::Command::Accept.new(:headers => headers)
|
112
|
+
@accept_command ||= write_and_await_response Punchblock::Command::Accept.new(:headers => headers)
|
96
113
|
end
|
97
114
|
|
98
115
|
def answer(headers = nil)
|
@@ -103,14 +120,14 @@ module Adhearsion
|
|
103
120
|
write_and_await_response Punchblock::Command::Reject.new(:reason => reason, :headers => headers)
|
104
121
|
end
|
105
122
|
|
106
|
-
def hangup
|
123
|
+
def hangup(headers = nil)
|
107
124
|
return false unless active?
|
108
|
-
@
|
125
|
+
@end_reason = true
|
109
126
|
write_and_await_response Punchblock::Command::Hangup.new(:headers => headers)
|
110
127
|
end
|
111
128
|
|
112
|
-
def
|
113
|
-
Adhearsion.active_calls.remove_inactive_call
|
129
|
+
def clear_from_active_calls
|
130
|
+
Adhearsion.active_calls.remove_inactive_call current_actor
|
114
131
|
end
|
115
132
|
|
116
133
|
##
|
@@ -128,7 +145,7 @@ module Adhearsion
|
|
128
145
|
when String
|
129
146
|
options[:other_call_id] = target
|
130
147
|
when Hash
|
131
|
-
|
148
|
+
abort ArgumentError.new "You cannot specify both a call ID and mixer name" if target.has_key?(:call_id) && target.has_key?(:mixer_name)
|
132
149
|
target.tap do |t|
|
133
150
|
t[:other_call_id] = t[:call_id]
|
134
151
|
t.delete :call_id
|
@@ -136,7 +153,7 @@ module Adhearsion
|
|
136
153
|
|
137
154
|
options.merge! target
|
138
155
|
else
|
139
|
-
|
156
|
+
abort ArgumentError.new "Don't know how to join to #{target.inspect}"
|
140
157
|
end
|
141
158
|
command = Punchblock::Command::Join.new options
|
142
159
|
write_and_await_response command
|
@@ -150,24 +167,22 @@ module Adhearsion
|
|
150
167
|
write_and_await_response ::Punchblock::Command::Unmute.new
|
151
168
|
end
|
152
169
|
|
153
|
-
def with_command_lock
|
154
|
-
@command_monitor ||= Monitor.new
|
155
|
-
@command_monitor.synchronize { yield }
|
156
|
-
end
|
157
|
-
|
158
170
|
def write_and_await_response(command, timeout = 60)
|
159
|
-
# TODO: Put this back once we figure out why it's causing CI to fail
|
160
|
-
# logger.trace "Executing command #{command.inspect}"
|
161
171
|
commands << command
|
162
172
|
write_command command
|
163
|
-
|
164
|
-
|
173
|
+
begin
|
174
|
+
response = command.response timeout
|
175
|
+
rescue Timeout::Error => e
|
176
|
+
abort e
|
177
|
+
end
|
178
|
+
abort response if response.is_a? Exception
|
165
179
|
command
|
166
180
|
end
|
167
181
|
|
168
182
|
def write_command(command)
|
169
|
-
|
183
|
+
abort Hangup.new unless active? || command.is_a?(Punchblock::Command::Hangup)
|
170
184
|
variables.merge! command.headers_hash if command.respond_to? :headers_hash
|
185
|
+
logger.trace "Executing command #{command.inspect}"
|
171
186
|
client.execute_command command, :call_id => id
|
172
187
|
end
|
173
188
|
|
@@ -175,13 +190,21 @@ module Adhearsion
|
|
175
190
|
"#{self.class}: #{id}"
|
176
191
|
end
|
177
192
|
|
193
|
+
def logger
|
194
|
+
super
|
195
|
+
end
|
196
|
+
|
197
|
+
def to_ary
|
198
|
+
[current_actor]
|
199
|
+
end
|
200
|
+
|
178
201
|
def execute_controller(controller, latch = nil)
|
179
202
|
Adhearsion::Process.important_threads << Thread.new do
|
180
203
|
catching_standard_errors do
|
181
204
|
begin
|
182
205
|
CallController.exec controller
|
183
206
|
ensure
|
184
|
-
hangup
|
207
|
+
hangup
|
185
208
|
end
|
186
209
|
latch.countdown! if latch
|
187
210
|
end
|
@@ -195,22 +218,5 @@ module Adhearsion
|
|
195
218
|
end
|
196
219
|
end
|
197
220
|
|
198
|
-
class Registry
|
199
|
-
@registry = Hash.new
|
200
|
-
@mutex = Mutex.new
|
201
|
-
|
202
|
-
def self.[](k)
|
203
|
-
@mutex.synchronize do
|
204
|
-
@registry[k]
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
def self.[]=(k, value)
|
209
|
-
@mutex.synchronize do
|
210
|
-
@registry[k] = value
|
211
|
-
end
|
212
|
-
end
|
213
|
-
end#Registry
|
214
|
-
|
215
221
|
end#Call
|
216
222
|
end#Adhearsion
|