adhearsion 2.6.4 → 3.0.0.beta1
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.
- checksums.yaml +4 -4
- data/.travis.yml +6 -9
- data/CHANGELOG.md +22 -7
- data/Gemfile +2 -0
- data/README.markdown +4 -5
- data/Rakefile +1 -2
- data/adhearsion.gemspec +19 -8
- data/features/cli_create.feature +19 -3
- data/features/step_definitions/cli_steps.rb +0 -11
- data/features/support/env.rb +3 -4
- data/lib/adhearsion.rb +48 -27
- data/lib/adhearsion/call.rb +34 -50
- data/lib/adhearsion/call_controller.rb +6 -12
- data/lib/adhearsion/call_controller/dial.rb +15 -53
- data/lib/adhearsion/call_controller/input.rb +39 -162
- data/lib/adhearsion/call_controller/input/ask_grammar_builder.rb +44 -0
- data/lib/adhearsion/call_controller/input/menu_builder.rb +136 -0
- data/lib/adhearsion/call_controller/input/prompt_builder.rb +78 -0
- data/lib/adhearsion/call_controller/input/result.rb +46 -0
- data/lib/adhearsion/call_controller/output.rb +48 -67
- data/lib/adhearsion/call_controller/output/abstract_player.rb +3 -3
- data/lib/adhearsion/call_controller/output/async_player.rb +3 -3
- data/lib/adhearsion/call_controller/output/player.rb +1 -1
- data/lib/adhearsion/call_controller/record.rb +23 -8
- data/lib/adhearsion/calls.rb +1 -1
- data/lib/adhearsion/cli_commands/ahn_command.rb +2 -65
- data/lib/adhearsion/cli_commands/thor_errors.rb +0 -6
- data/lib/adhearsion/configuration.rb +91 -39
- data/lib/adhearsion/core_ext/blather/stanza.rb +41 -0
- data/lib/adhearsion/core_ext/blather/stanza/presence.rb +13 -0
- data/lib/adhearsion/error.rb +5 -0
- data/lib/adhearsion/event.rb +21 -0
- data/lib/adhearsion/event/active_speaker.rb +11 -0
- data/lib/adhearsion/event/answered.rb +11 -0
- data/lib/adhearsion/event/asterisk.rb +10 -0
- data/lib/adhearsion/event/asterisk/ami.rb +34 -0
- data/lib/adhearsion/event/complete.rb +75 -0
- data/lib/adhearsion/event/dtmf.rb +11 -0
- data/lib/adhearsion/event/end.rb +22 -0
- data/lib/adhearsion/event/input_timers_started.rb +9 -0
- data/lib/adhearsion/event/joined.rb +17 -0
- data/lib/adhearsion/event/offer.rb +14 -0
- data/lib/adhearsion/event/ringing.rb +11 -0
- data/lib/adhearsion/event/started_speaking.rb +13 -0
- data/lib/adhearsion/event/stopped_speaking.rb +13 -0
- data/lib/adhearsion/event/unjoined.rb +17 -0
- data/lib/adhearsion/events.rb +47 -66
- data/lib/adhearsion/foundation.rb +0 -1
- data/lib/adhearsion/foundation/object.rb +0 -5
- data/lib/adhearsion/generators/app/app_generator.rb +4 -1
- data/lib/adhearsion/generators/app/templates/Gemfile.erb +2 -10
- data/lib/adhearsion/generators/app/templates/adhearsion.erb +9 -9
- data/lib/adhearsion/generators/app/templates/config.ru +7 -0
- data/lib/adhearsion/generators/app/templates/en.yml +4 -0
- data/lib/adhearsion/generators/app/templates/events.erb +2 -2
- data/lib/adhearsion/generators/app/templates/hello_world.wav +0 -0
- data/lib/adhearsion/generators/app/templates/simon_game.rb +2 -1
- data/lib/adhearsion/generators/app/templates/simon_game_spec.rb +2 -2
- data/lib/adhearsion/has_headers.rb +34 -0
- data/lib/adhearsion/http_server.rb +37 -0
- data/lib/adhearsion/initializer.rb +19 -153
- data/lib/adhearsion/logging.rb +6 -25
- data/lib/adhearsion/outbound_call.rb +5 -5
- data/lib/adhearsion/plugin.rb +1 -0
- data/lib/adhearsion/protocol_error.rb +26 -0
- data/lib/adhearsion/rayo.rb +30 -0
- data/lib/adhearsion/rayo/client.rb +62 -0
- data/lib/adhearsion/rayo/client/component_registry.rb +33 -0
- data/lib/adhearsion/rayo/command.rb +21 -0
- data/lib/adhearsion/rayo/command/accept.rb +16 -0
- data/lib/adhearsion/rayo/command/answer.rb +16 -0
- data/lib/adhearsion/rayo/command/dial.rb +57 -0
- data/lib/adhearsion/rayo/command/hangup.rb +16 -0
- data/lib/adhearsion/rayo/command/join.rb +43 -0
- data/lib/adhearsion/rayo/command/mute.rb +13 -0
- data/lib/adhearsion/rayo/command/redirect.rb +23 -0
- data/lib/adhearsion/rayo/command/reject.rb +40 -0
- data/lib/adhearsion/rayo/command/unjoin.rb +24 -0
- data/lib/adhearsion/rayo/command/unmute.rb +13 -0
- data/lib/adhearsion/rayo/command_node.rb +47 -0
- data/lib/adhearsion/rayo/component.rb +21 -0
- data/lib/adhearsion/rayo/component/asterisk.rb +13 -0
- data/lib/adhearsion/rayo/component/asterisk/agi.rb +14 -0
- data/lib/adhearsion/rayo/component/asterisk/agi/command.rb +46 -0
- data/lib/adhearsion/rayo/component/asterisk/ami.rb +14 -0
- data/lib/adhearsion/rayo/component/asterisk/ami/action.rb +61 -0
- data/lib/adhearsion/rayo/component/component_node.rb +90 -0
- data/lib/adhearsion/rayo/component/input.rb +186 -0
- data/lib/adhearsion/rayo/component/output.rb +471 -0
- data/lib/adhearsion/rayo/component/prompt.rb +53 -0
- data/lib/adhearsion/rayo/component/receive_fax.rb +26 -0
- data/lib/adhearsion/rayo/component/record.rb +165 -0
- data/lib/adhearsion/rayo/component/send_fax.rb +64 -0
- data/lib/adhearsion/rayo/component/stop.rb +11 -0
- data/lib/adhearsion/rayo/connection.rb +12 -0
- data/lib/adhearsion/rayo/connection/asterisk.rb +74 -0
- data/lib/adhearsion/rayo/connection/connected.rb +22 -0
- data/lib/adhearsion/rayo/connection/generic_connection.rb +22 -0
- data/lib/adhearsion/rayo/connection/xmpp.rb +198 -0
- data/lib/adhearsion/rayo/disconnected_error.rb +22 -0
- data/lib/adhearsion/{punchblock_plugin → rayo}/initializer.rb +19 -19
- data/lib/adhearsion/rayo/rayo_node.rb +127 -0
- data/lib/adhearsion/rayo/ref.rb +57 -0
- data/lib/adhearsion/statistics.rb +1 -1
- data/lib/adhearsion/tasks.rb +1 -2
- data/lib/adhearsion/tasks/configuration.rb +1 -1
- data/lib/adhearsion/tasks/environment.rb +0 -2
- data/lib/adhearsion/tasks/i18n.rb +49 -0
- data/lib/adhearsion/translator.rb +11 -0
- data/lib/adhearsion/translator/asterisk.rb +234 -0
- data/lib/adhearsion/translator/asterisk/agi_app.rb +17 -0
- data/lib/adhearsion/translator/asterisk/agi_command.rb +45 -0
- data/lib/adhearsion/translator/asterisk/ami_error_converter.rb +20 -0
- data/lib/adhearsion/translator/asterisk/call.rb +416 -0
- data/lib/adhearsion/translator/asterisk/channel.rb +43 -0
- data/lib/adhearsion/translator/asterisk/component.rb +88 -0
- data/lib/adhearsion/translator/asterisk/component/asterisk.rb +15 -0
- data/lib/adhearsion/translator/asterisk/component/asterisk/agi_command.rb +42 -0
- data/lib/adhearsion/translator/asterisk/component/asterisk/ami_action.rb +68 -0
- data/lib/adhearsion/translator/asterisk/component/composed_prompt.rb +76 -0
- data/lib/adhearsion/translator/asterisk/component/dtmf_recognizer.rb +137 -0
- data/lib/adhearsion/translator/asterisk/component/input.rb +34 -0
- data/lib/adhearsion/translator/asterisk/component/input_component.rb +90 -0
- data/lib/adhearsion/translator/asterisk/component/mrcp_native_prompt.rb +71 -0
- data/lib/adhearsion/translator/asterisk/component/mrcp_prompt.rb +55 -0
- data/lib/adhearsion/translator/asterisk/component/mrcp_recog_prompt.rb +165 -0
- data/lib/adhearsion/translator/asterisk/component/output.rb +233 -0
- data/lib/adhearsion/translator/asterisk/component/record.rb +101 -0
- data/lib/adhearsion/translator/asterisk/component/stop_by_redirect.rb +30 -0
- data/lib/adhearsion/translator/asterisk/unimrcp_app.rb +28 -0
- data/lib/adhearsion/uri_list.rb +21 -0
- data/lib/adhearsion/version.rb +1 -1
- data/spec/adhearsion/call_controller/dial_spec.rb +79 -1420
- data/spec/adhearsion/call_controller/input_spec.rb +1141 -237
- data/spec/adhearsion/call_controller/output/async_player_spec.rb +10 -10
- data/spec/adhearsion/call_controller/output/player_spec.rb +8 -8
- data/spec/adhearsion/call_controller/output_spec.rb +162 -215
- data/spec/adhearsion/call_controller/record_spec.rb +15 -16
- data/spec/adhearsion/call_controller_spec.rb +23 -40
- data/spec/adhearsion/call_spec.rb +123 -129
- data/spec/adhearsion/calls_spec.rb +3 -3
- data/spec/adhearsion/configuration_spec.rb +94 -108
- data/spec/adhearsion/event/answered_spec.rb +50 -0
- data/spec/adhearsion/event/asterisk/Find Results +402 -0
- data/spec/adhearsion/event/asterisk/ami_spec.rb +81 -0
- data/spec/adhearsion/event/complete_spec.rb +176 -0
- data/spec/adhearsion/event/dtmf_spec.rb +35 -0
- data/spec/adhearsion/event/end_spec.rb +85 -0
- data/spec/adhearsion/event/input_timers_started_spec.rb +19 -0
- data/spec/adhearsion/event/joined_spec.rb +53 -0
- data/spec/adhearsion/event/offer_spec.rb +106 -0
- data/spec/adhearsion/event/ringing_spec.rb +50 -0
- data/spec/adhearsion/event/started_speaking_spec.rb +37 -0
- data/spec/adhearsion/event/stopped_speaking_spec.rb +37 -0
- data/spec/adhearsion/event/unjoined_spec.rb +48 -0
- data/spec/adhearsion/event/untitled +0 -0
- data/spec/adhearsion/events_spec.rb +19 -45
- data/spec/adhearsion/initializer_spec.rb +12 -184
- data/spec/adhearsion/logging_spec.rb +5 -20
- data/spec/adhearsion/outbound_call_spec.rb +13 -13
- data/spec/adhearsion/plugin_spec.rb +3 -4
- data/spec/adhearsion/protocol_error_spec.rb +91 -0
- data/spec/adhearsion/rayo/client/component_registry_spec.rb +26 -0
- data/spec/adhearsion/rayo/client_spec.rb +134 -0
- data/spec/adhearsion/rayo/command/accept_spec.rb +63 -0
- data/spec/adhearsion/rayo/command/answer_spec.rb +73 -0
- data/spec/adhearsion/rayo/command/dial_spec.rb +156 -0
- data/spec/adhearsion/rayo/command/hangup_spec.rb +63 -0
- data/spec/adhearsion/rayo/command/join_spec.rb +158 -0
- data/spec/adhearsion/rayo/command/mute_spec.rb +32 -0
- data/spec/adhearsion/rayo/command/redirect_spec.rb +89 -0
- data/spec/adhearsion/rayo/command/reject_spec.rb +117 -0
- data/spec/adhearsion/rayo/command/unjoin_spec.rb +82 -0
- data/spec/adhearsion/rayo/command/unmute_spec.rb +32 -0
- data/spec/adhearsion/rayo/command_node_spec.rb +101 -0
- data/spec/adhearsion/rayo/component/asterisk/agi/command_spec.rb +111 -0
- data/spec/adhearsion/rayo/component/asterisk/ami/action_spec.rb +173 -0
- data/spec/adhearsion/rayo/component/component_node_spec.rb +110 -0
- data/spec/adhearsion/rayo/component/input_spec.rb +715 -0
- data/spec/adhearsion/rayo/component/output_spec.rb +1030 -0
- data/spec/adhearsion/rayo/component/prompt_spec.rb +171 -0
- data/spec/adhearsion/rayo/component/receive_fax_spec.rb +136 -0
- data/spec/adhearsion/rayo/component/record_spec.rb +497 -0
- data/spec/adhearsion/rayo/component/send_fax_spec.rb +144 -0
- data/spec/adhearsion/rayo/connection/asterisk_spec.rb +118 -0
- data/spec/adhearsion/rayo/connection/xmpp_spec.rb +449 -0
- data/spec/adhearsion/rayo/initializer_spec.rb +353 -0
- data/spec/adhearsion/rayo/ref_spec.rb +168 -0
- data/spec/adhearsion/rayo_spec.rb +7 -0
- data/spec/adhearsion/router/route_spec.rb +1 -1
- data/spec/adhearsion/statistics_spec.rb +2 -5
- data/spec/adhearsion/translator/asterisk/call_spec.rb +2047 -0
- data/spec/adhearsion/translator/asterisk/component/asterisk/agi_command_spec.rb +256 -0
- data/spec/adhearsion/translator/asterisk/component/asterisk/ami_action_spec.rb +151 -0
- data/spec/adhearsion/translator/asterisk/component/composed_prompt_spec.rb +257 -0
- data/spec/adhearsion/translator/asterisk/component/input_spec.rb +571 -0
- data/spec/adhearsion/translator/asterisk/component/mrcp_native_prompt_spec.rb +774 -0
- data/spec/adhearsion/translator/asterisk/component/mrcp_prompt_spec.rb +1244 -0
- data/spec/adhearsion/translator/asterisk/component/output_spec.rb +1850 -0
- data/spec/adhearsion/translator/asterisk/component/record_spec.rb +426 -0
- data/spec/adhearsion/translator/asterisk/component/stop_by_redirect_spec.rb +62 -0
- data/spec/adhearsion/translator/asterisk/component_spec.rb +83 -0
- data/spec/adhearsion/translator/asterisk_spec.rb +685 -0
- data/spec/adhearsion/uri_list_spec.rb +88 -0
- data/spec/adhearsion_spec.rb +89 -14
- data/spec/fixtures/locale/en.yml +13 -0
- data/spec/fixtures/locale/it.yml +13 -0
- data/spec/spec_helper.rb +18 -5
- data/spec/support/call_controller_test_helpers.rb +3 -2
- data/spec/support/initializer_stubs.rb +3 -1
- data/spec/support/punchblock_examples.rb +65 -0
- data/spec/support/punchblock_mocks.rb +12 -0
- metadata +412 -70
- data/features/cli_daemon.feature +0 -20
- data/features/cli_restart.feature +0 -52
- data/features/cli_stop.feature +0 -50
- data/lib/adhearsion/call_controller/menu_dsl.rb +0 -21
- data/lib/adhearsion/call_controller/menu_dsl/array_match_calculator.rb +0 -26
- data/lib/adhearsion/call_controller/menu_dsl/calculated_match.rb +0 -43
- data/lib/adhearsion/call_controller/menu_dsl/calculated_match_collection.rb +0 -45
- data/lib/adhearsion/call_controller/menu_dsl/fixnum_match_calculator.rb +0 -11
- data/lib/adhearsion/call_controller/menu_dsl/match_calculator.rb +0 -40
- data/lib/adhearsion/call_controller/menu_dsl/menu.rb +0 -207
- data/lib/adhearsion/call_controller/menu_dsl/menu_builder.rb +0 -92
- data/lib/adhearsion/call_controller/menu_dsl/range_match_calculator.rb +0 -60
- data/lib/adhearsion/call_controller/menu_dsl/string_match_calculator.rb +0 -25
- data/lib/adhearsion/call_controller/utility.rb +0 -77
- data/lib/adhearsion/foundation/custom_daemonizer.rb +0 -52
- data/lib/adhearsion/punchblock_plugin.rb +0 -63
- data/scripts/cloc-1.64.pl +0 -10483
- data/spec/adhearsion/call_controller/menu_dsl/array_match_calculator_spec.rb +0 -76
- data/spec/adhearsion/call_controller/menu_dsl/calculated_match_collection_spec.rb +0 -60
- data/spec/adhearsion/call_controller/menu_dsl/calculated_match_spec.rb +0 -61
- data/spec/adhearsion/call_controller/menu_dsl/fixnum_match_calculator_spec.rb +0 -39
- data/spec/adhearsion/call_controller/menu_dsl/match_calculator_spec.rb +0 -17
- data/spec/adhearsion/call_controller/menu_dsl/menu_builder_spec.rb +0 -165
- data/spec/adhearsion/call_controller/menu_dsl/menu_spec.rb +0 -420
- data/spec/adhearsion/call_controller/menu_dsl/range_match_calculator_spec.rb +0 -32
- data/spec/adhearsion/call_controller/menu_dsl/string_match_calculator_spec.rb +0 -40
- data/spec/adhearsion/call_controller/utility_spec.rb +0 -90
- data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +0 -356
- data/spec/adhearsion/punchblock_plugin_spec.rb +0 -59
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Adhearsion
|
|
4
|
+
module Rayo
|
|
5
|
+
module Component
|
|
6
|
+
class Prompt < ComponentNode
|
|
7
|
+
register :prompt, :prompt
|
|
8
|
+
|
|
9
|
+
attribute :barge_in, Boolean
|
|
10
|
+
attribute :output, Output
|
|
11
|
+
attribute :input, Input
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# Create a prompt command
|
|
15
|
+
#
|
|
16
|
+
# @param [Output] output
|
|
17
|
+
# @param [Input] input
|
|
18
|
+
# @param [Hash] options
|
|
19
|
+
# @option options [true, false, optional] :barge_in Indicates wether or not the input should interrupt then output
|
|
20
|
+
#
|
|
21
|
+
# @return [Component::Prompt] a formatted Rayo prompt command
|
|
22
|
+
#
|
|
23
|
+
def initialize(output = nil, input = nil, options = {})
|
|
24
|
+
super options
|
|
25
|
+
self.output = output
|
|
26
|
+
self.input = input
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def inherit(xml_node)
|
|
30
|
+
input_node = xml_node.at_xpath('ns:input', ns: Input.registered_ns)
|
|
31
|
+
self.input = Input.from_xml input_node if input_node
|
|
32
|
+
|
|
33
|
+
output_node = xml_node.at_xpath('ns:output', ns: Output.registered_ns)
|
|
34
|
+
self.output = Output.from_xml output_node if output_node
|
|
35
|
+
|
|
36
|
+
super
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def rayo_attributes
|
|
40
|
+
{
|
|
41
|
+
'barge-in' => barge_in
|
|
42
|
+
}
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def rayo_children(root)
|
|
46
|
+
input.to_rayo(root) if input
|
|
47
|
+
output.to_rayo(root) if output
|
|
48
|
+
super
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Adhearsion
|
|
4
|
+
module Rayo
|
|
5
|
+
module Component
|
|
6
|
+
class ReceiveFax < ComponentNode
|
|
7
|
+
register :receivefax, :fax
|
|
8
|
+
|
|
9
|
+
class Fax < RayoNode
|
|
10
|
+
register :fax, :fax_complete
|
|
11
|
+
|
|
12
|
+
attribute :url, String
|
|
13
|
+
attribute :resolution, String
|
|
14
|
+
attribute :pages, Integer
|
|
15
|
+
attribute :size, Integer
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class Complete
|
|
19
|
+
class Finish < Event::Complete::Reason
|
|
20
|
+
register :finish, :fax_complete
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Adhearsion
|
|
4
|
+
module Rayo
|
|
5
|
+
module Component
|
|
6
|
+
class Record < ComponentNode
|
|
7
|
+
register :record, :record
|
|
8
|
+
|
|
9
|
+
VALID_DIRECTIONS = [:duplex, :send, :recv].freeze
|
|
10
|
+
|
|
11
|
+
# @return [String] the codec to use for recording
|
|
12
|
+
attribute :format
|
|
13
|
+
|
|
14
|
+
# @return [Integer] Controls how long the recognizer should wait after the end of the prompt for the caller to speak before sending a Recorder event.
|
|
15
|
+
attribute :initial_timeout, Integer
|
|
16
|
+
|
|
17
|
+
# @return [Integer] Controls the length of a period of silence after callers have spoken to conclude they finished.
|
|
18
|
+
attribute :final_timeout, Integer
|
|
19
|
+
|
|
20
|
+
# @return [Integer] Indicates the maximum duration for the recording.
|
|
21
|
+
attribute :max_duration, Integer
|
|
22
|
+
|
|
23
|
+
# @return [true, false] Indicates whether record will be preceded with a beep.
|
|
24
|
+
attribute :start_beep, Boolean
|
|
25
|
+
|
|
26
|
+
# @return [true, false] Indicates whether record will be followed by a beep.
|
|
27
|
+
attribute :stop_beep, Boolean
|
|
28
|
+
|
|
29
|
+
# @return [true, false] Whether subsequent record will start in PAUSE mode.
|
|
30
|
+
attribute :start_paused, Boolean
|
|
31
|
+
|
|
32
|
+
# @return [Symbol] the direction of media to be recorded.
|
|
33
|
+
attribute :direction, Symbol
|
|
34
|
+
def direction=(direction)
|
|
35
|
+
if direction && !VALID_DIRECTIONS.include?(direction.to_sym)
|
|
36
|
+
raise ArgumentError, "Invalid Direction (#{direction}), use: #{VALID_DIRECTIONS*' '}"
|
|
37
|
+
end
|
|
38
|
+
super
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @return [true, false] wether to mix audio down or not
|
|
42
|
+
attribute :mix, Boolean
|
|
43
|
+
|
|
44
|
+
def rayo_attributes
|
|
45
|
+
{
|
|
46
|
+
'format' => format,
|
|
47
|
+
'initial-timeout' => initial_timeout,
|
|
48
|
+
'final-timeout' => final_timeout,
|
|
49
|
+
'max-duration' => max_duration,
|
|
50
|
+
'start-beep' => start_beep,
|
|
51
|
+
'stop-beep' => stop_beep,
|
|
52
|
+
'start-paused' => start_paused,
|
|
53
|
+
'direction' => direction,
|
|
54
|
+
'mix' => mix
|
|
55
|
+
}
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
state_machine :state do
|
|
59
|
+
event :paused do
|
|
60
|
+
transition :executing => :paused
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
event :resumed do
|
|
64
|
+
transition :paused => :executing
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Pauses a running Record
|
|
69
|
+
#
|
|
70
|
+
# @return [Command::Record::Pause] an Rayo pause message for the current Record
|
|
71
|
+
#
|
|
72
|
+
# @example
|
|
73
|
+
# record_obj.pause_action.to_xml
|
|
74
|
+
#
|
|
75
|
+
# returns:
|
|
76
|
+
# <pause xmlns="urn:xmpp:rayo:record:1"/>
|
|
77
|
+
def pause_action
|
|
78
|
+
Pause.new :component_id => component_id, :target_call_id => target_call_id
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
##
|
|
82
|
+
# Sends an Rayo pause message for the current Record
|
|
83
|
+
#
|
|
84
|
+
def pause!
|
|
85
|
+
raise InvalidActionError, "Cannot pause a Record that is not executing" unless executing?
|
|
86
|
+
pause_action.tap do |action|
|
|
87
|
+
result = write_action action
|
|
88
|
+
paused! if result
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
##
|
|
93
|
+
# Create an Rayo resume message for the current Record
|
|
94
|
+
#
|
|
95
|
+
# @return [Command::Record::Resume] an Rayo resume message
|
|
96
|
+
#
|
|
97
|
+
# @example
|
|
98
|
+
# record_obj.resume_action.to_xml
|
|
99
|
+
#
|
|
100
|
+
# returns:
|
|
101
|
+
# <resume xmlns="urn:xmpp:rayo:record:1"/>
|
|
102
|
+
def resume_action
|
|
103
|
+
Resume.new :component_id => component_id, :target_call_id => target_call_id
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
##
|
|
107
|
+
# Sends an Rayo resume message for the current Record
|
|
108
|
+
#
|
|
109
|
+
def resume!
|
|
110
|
+
raise InvalidActionError, "Cannot resume a Record that is not paused." unless paused?
|
|
111
|
+
resume_action.tap do |action|
|
|
112
|
+
result = write_action action
|
|
113
|
+
resumed! if result
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
##
|
|
118
|
+
# Directly returns the recording for the component
|
|
119
|
+
# @return [Adhearsion::Rayo::Component::Record::Recording] The recording object
|
|
120
|
+
#
|
|
121
|
+
def recording
|
|
122
|
+
complete_event.recording
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
##
|
|
126
|
+
# Directly returns the recording URI for the component
|
|
127
|
+
# @return [String] The recording URI
|
|
128
|
+
#
|
|
129
|
+
def recording_uri
|
|
130
|
+
recording.uri
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
class Pause < CommandNode # :nodoc:
|
|
134
|
+
register :pause, :record
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
class Resume < CommandNode # :nodoc:
|
|
138
|
+
register :resume, :record
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
class Recording < Event
|
|
142
|
+
register :recording, :record_complete
|
|
143
|
+
|
|
144
|
+
attribute :uri
|
|
145
|
+
attribute :duration, Integer
|
|
146
|
+
attribute :size, Integer
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
class Complete
|
|
150
|
+
class MaxDuration < Event::Complete::Reason
|
|
151
|
+
register :'max-duration', :record_complete
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
class InitialTimeout < Event::Complete::Reason
|
|
155
|
+
register :'initial-timeout', :record_complete
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
class FinalTimeout < Event::Complete::Reason
|
|
159
|
+
register :'final-timeout', :record_complete
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Adhearsion
|
|
4
|
+
module Rayo
|
|
5
|
+
module Component
|
|
6
|
+
class SendFax < ComponentNode
|
|
7
|
+
register :sendfax, :fax
|
|
8
|
+
|
|
9
|
+
class FaxDocument < RayoNode
|
|
10
|
+
register :document, :fax
|
|
11
|
+
|
|
12
|
+
attribute :url, String
|
|
13
|
+
attribute :identity, String
|
|
14
|
+
attribute :header, String
|
|
15
|
+
attribute :pages, String
|
|
16
|
+
|
|
17
|
+
def inherit(xml_node)
|
|
18
|
+
super
|
|
19
|
+
if pages = xml_node[:pages]
|
|
20
|
+
self.pages = pages.split(',').map { |p| p.include?('-') ? Range.new(*p.split('-').map(&:to_i)) : p.to_i }
|
|
21
|
+
end
|
|
22
|
+
self
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def rayo_attributes
|
|
26
|
+
{
|
|
27
|
+
'url' => url,
|
|
28
|
+
'identity' => identity,
|
|
29
|
+
'header' => header,
|
|
30
|
+
'pages' => rayo_pages
|
|
31
|
+
}
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def rayo_pages
|
|
37
|
+
pages ? pages.map { |p| p.is_a?(Range) ? "#{p.min}-#{p.max}" : p }.join(',') : nil
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def inherit(xml_node)
|
|
42
|
+
document_nodes = xml_node.xpath 'ns:document', ns: self.class.registered_ns
|
|
43
|
+
self.render_documents = document_nodes.to_a.map { |node| FaxDocument.from_xml node }
|
|
44
|
+
|
|
45
|
+
super
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def rayo_children(root)
|
|
49
|
+
render_documents.each do |render_document|
|
|
50
|
+
render_document.to_rayo root.parent
|
|
51
|
+
end
|
|
52
|
+
super
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# @return [Document] the document to render
|
|
56
|
+
attribute :render_documents, Array[FaxDocument], default: []
|
|
57
|
+
|
|
58
|
+
def render_document=(other)
|
|
59
|
+
self.render_documents = [other].compact
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'ruby_ami'
|
|
4
|
+
require 'adhearsion/rayo/connection/generic_connection'
|
|
5
|
+
require 'adhearsion/translator'
|
|
6
|
+
|
|
7
|
+
module Adhearsion
|
|
8
|
+
module Rayo
|
|
9
|
+
module Connection
|
|
10
|
+
class Asterisk < GenericConnection
|
|
11
|
+
attr_reader :ami_client, :translator
|
|
12
|
+
attr_accessor :event_handler
|
|
13
|
+
|
|
14
|
+
def initialize(options = {})
|
|
15
|
+
@stream_options = options.values_at(:host, :port, :username, :password)
|
|
16
|
+
@ami_client = new_ami_stream
|
|
17
|
+
@translator = Translator::Asterisk.new @ami_client, self
|
|
18
|
+
super()
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def run
|
|
22
|
+
start_ami_client
|
|
23
|
+
raise DisconnectedError
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def stop
|
|
27
|
+
translator.terminate
|
|
28
|
+
ami_client.terminate
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def write(command, options)
|
|
32
|
+
translator.async.execute_command command, options
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def send_message(*args)
|
|
36
|
+
translator.send_message *args
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def handle_event(event)
|
|
40
|
+
event_handler.call event
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def new_ami_stream
|
|
44
|
+
stream = RubyAMI::Stream.new(*@stream_options, ->(event) { translator.async.handle_ami_event event }, logger)
|
|
45
|
+
client = (ami_client || RubyAMIStreamProxy.new(stream))
|
|
46
|
+
client.stream = stream
|
|
47
|
+
client
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def start_ami_client
|
|
51
|
+
@ami_client = new_ami_stream unless ami_client.alive?
|
|
52
|
+
ami_client.async.run
|
|
53
|
+
Celluloid::Actor.join(ami_client)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def new_call_uri
|
|
57
|
+
Adhearsion.new_uuid
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
class RubyAMIStreamProxy
|
|
61
|
+
attr_accessor :stream
|
|
62
|
+
|
|
63
|
+
def initialize(ami)
|
|
64
|
+
@stream = ami
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def method_missing(method, *args, &block)
|
|
68
|
+
stream.__send__(method, *args, &block)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Adhearsion
|
|
4
|
+
module Rayo
|
|
5
|
+
module Connection
|
|
6
|
+
Connected = Class.new do
|
|
7
|
+
def source
|
|
8
|
+
nil
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def client=(other)
|
|
12
|
+
nil
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def eql?(other)
|
|
16
|
+
other.is_a? self.class
|
|
17
|
+
end
|
|
18
|
+
alias :== :eql?
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Adhearsion
|
|
4
|
+
module Rayo
|
|
5
|
+
module Connection
|
|
6
|
+
class GenericConnection
|
|
7
|
+
def initialize
|
|
8
|
+
@event_handler = lambda { |event| raise 'No event handler set' }
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def ready!
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def not_ready!
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def connected?
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|