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.
Files changed (242) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +6 -9
  3. data/CHANGELOG.md +22 -7
  4. data/Gemfile +2 -0
  5. data/README.markdown +4 -5
  6. data/Rakefile +1 -2
  7. data/adhearsion.gemspec +19 -8
  8. data/features/cli_create.feature +19 -3
  9. data/features/step_definitions/cli_steps.rb +0 -11
  10. data/features/support/env.rb +3 -4
  11. data/lib/adhearsion.rb +48 -27
  12. data/lib/adhearsion/call.rb +34 -50
  13. data/lib/adhearsion/call_controller.rb +6 -12
  14. data/lib/adhearsion/call_controller/dial.rb +15 -53
  15. data/lib/adhearsion/call_controller/input.rb +39 -162
  16. data/lib/adhearsion/call_controller/input/ask_grammar_builder.rb +44 -0
  17. data/lib/adhearsion/call_controller/input/menu_builder.rb +136 -0
  18. data/lib/adhearsion/call_controller/input/prompt_builder.rb +78 -0
  19. data/lib/adhearsion/call_controller/input/result.rb +46 -0
  20. data/lib/adhearsion/call_controller/output.rb +48 -67
  21. data/lib/adhearsion/call_controller/output/abstract_player.rb +3 -3
  22. data/lib/adhearsion/call_controller/output/async_player.rb +3 -3
  23. data/lib/adhearsion/call_controller/output/player.rb +1 -1
  24. data/lib/adhearsion/call_controller/record.rb +23 -8
  25. data/lib/adhearsion/calls.rb +1 -1
  26. data/lib/adhearsion/cli_commands/ahn_command.rb +2 -65
  27. data/lib/adhearsion/cli_commands/thor_errors.rb +0 -6
  28. data/lib/adhearsion/configuration.rb +91 -39
  29. data/lib/adhearsion/core_ext/blather/stanza.rb +41 -0
  30. data/lib/adhearsion/core_ext/blather/stanza/presence.rb +13 -0
  31. data/lib/adhearsion/error.rb +5 -0
  32. data/lib/adhearsion/event.rb +21 -0
  33. data/lib/adhearsion/event/active_speaker.rb +11 -0
  34. data/lib/adhearsion/event/answered.rb +11 -0
  35. data/lib/adhearsion/event/asterisk.rb +10 -0
  36. data/lib/adhearsion/event/asterisk/ami.rb +34 -0
  37. data/lib/adhearsion/event/complete.rb +75 -0
  38. data/lib/adhearsion/event/dtmf.rb +11 -0
  39. data/lib/adhearsion/event/end.rb +22 -0
  40. data/lib/adhearsion/event/input_timers_started.rb +9 -0
  41. data/lib/adhearsion/event/joined.rb +17 -0
  42. data/lib/adhearsion/event/offer.rb +14 -0
  43. data/lib/adhearsion/event/ringing.rb +11 -0
  44. data/lib/adhearsion/event/started_speaking.rb +13 -0
  45. data/lib/adhearsion/event/stopped_speaking.rb +13 -0
  46. data/lib/adhearsion/event/unjoined.rb +17 -0
  47. data/lib/adhearsion/events.rb +47 -66
  48. data/lib/adhearsion/foundation.rb +0 -1
  49. data/lib/adhearsion/foundation/object.rb +0 -5
  50. data/lib/adhearsion/generators/app/app_generator.rb +4 -1
  51. data/lib/adhearsion/generators/app/templates/Gemfile.erb +2 -10
  52. data/lib/adhearsion/generators/app/templates/adhearsion.erb +9 -9
  53. data/lib/adhearsion/generators/app/templates/config.ru +7 -0
  54. data/lib/adhearsion/generators/app/templates/en.yml +4 -0
  55. data/lib/adhearsion/generators/app/templates/events.erb +2 -2
  56. data/lib/adhearsion/generators/app/templates/hello_world.wav +0 -0
  57. data/lib/adhearsion/generators/app/templates/simon_game.rb +2 -1
  58. data/lib/adhearsion/generators/app/templates/simon_game_spec.rb +2 -2
  59. data/lib/adhearsion/has_headers.rb +34 -0
  60. data/lib/adhearsion/http_server.rb +37 -0
  61. data/lib/adhearsion/initializer.rb +19 -153
  62. data/lib/adhearsion/logging.rb +6 -25
  63. data/lib/adhearsion/outbound_call.rb +5 -5
  64. data/lib/adhearsion/plugin.rb +1 -0
  65. data/lib/adhearsion/protocol_error.rb +26 -0
  66. data/lib/adhearsion/rayo.rb +30 -0
  67. data/lib/adhearsion/rayo/client.rb +62 -0
  68. data/lib/adhearsion/rayo/client/component_registry.rb +33 -0
  69. data/lib/adhearsion/rayo/command.rb +21 -0
  70. data/lib/adhearsion/rayo/command/accept.rb +16 -0
  71. data/lib/adhearsion/rayo/command/answer.rb +16 -0
  72. data/lib/adhearsion/rayo/command/dial.rb +57 -0
  73. data/lib/adhearsion/rayo/command/hangup.rb +16 -0
  74. data/lib/adhearsion/rayo/command/join.rb +43 -0
  75. data/lib/adhearsion/rayo/command/mute.rb +13 -0
  76. data/lib/adhearsion/rayo/command/redirect.rb +23 -0
  77. data/lib/adhearsion/rayo/command/reject.rb +40 -0
  78. data/lib/adhearsion/rayo/command/unjoin.rb +24 -0
  79. data/lib/adhearsion/rayo/command/unmute.rb +13 -0
  80. data/lib/adhearsion/rayo/command_node.rb +47 -0
  81. data/lib/adhearsion/rayo/component.rb +21 -0
  82. data/lib/adhearsion/rayo/component/asterisk.rb +13 -0
  83. data/lib/adhearsion/rayo/component/asterisk/agi.rb +14 -0
  84. data/lib/adhearsion/rayo/component/asterisk/agi/command.rb +46 -0
  85. data/lib/adhearsion/rayo/component/asterisk/ami.rb +14 -0
  86. data/lib/adhearsion/rayo/component/asterisk/ami/action.rb +61 -0
  87. data/lib/adhearsion/rayo/component/component_node.rb +90 -0
  88. data/lib/adhearsion/rayo/component/input.rb +186 -0
  89. data/lib/adhearsion/rayo/component/output.rb +471 -0
  90. data/lib/adhearsion/rayo/component/prompt.rb +53 -0
  91. data/lib/adhearsion/rayo/component/receive_fax.rb +26 -0
  92. data/lib/adhearsion/rayo/component/record.rb +165 -0
  93. data/lib/adhearsion/rayo/component/send_fax.rb +64 -0
  94. data/lib/adhearsion/rayo/component/stop.rb +11 -0
  95. data/lib/adhearsion/rayo/connection.rb +12 -0
  96. data/lib/adhearsion/rayo/connection/asterisk.rb +74 -0
  97. data/lib/adhearsion/rayo/connection/connected.rb +22 -0
  98. data/lib/adhearsion/rayo/connection/generic_connection.rb +22 -0
  99. data/lib/adhearsion/rayo/connection/xmpp.rb +198 -0
  100. data/lib/adhearsion/rayo/disconnected_error.rb +22 -0
  101. data/lib/adhearsion/{punchblock_plugin → rayo}/initializer.rb +19 -19
  102. data/lib/adhearsion/rayo/rayo_node.rb +127 -0
  103. data/lib/adhearsion/rayo/ref.rb +57 -0
  104. data/lib/adhearsion/statistics.rb +1 -1
  105. data/lib/adhearsion/tasks.rb +1 -2
  106. data/lib/adhearsion/tasks/configuration.rb +1 -1
  107. data/lib/adhearsion/tasks/environment.rb +0 -2
  108. data/lib/adhearsion/tasks/i18n.rb +49 -0
  109. data/lib/adhearsion/translator.rb +11 -0
  110. data/lib/adhearsion/translator/asterisk.rb +234 -0
  111. data/lib/adhearsion/translator/asterisk/agi_app.rb +17 -0
  112. data/lib/adhearsion/translator/asterisk/agi_command.rb +45 -0
  113. data/lib/adhearsion/translator/asterisk/ami_error_converter.rb +20 -0
  114. data/lib/adhearsion/translator/asterisk/call.rb +416 -0
  115. data/lib/adhearsion/translator/asterisk/channel.rb +43 -0
  116. data/lib/adhearsion/translator/asterisk/component.rb +88 -0
  117. data/lib/adhearsion/translator/asterisk/component/asterisk.rb +15 -0
  118. data/lib/adhearsion/translator/asterisk/component/asterisk/agi_command.rb +42 -0
  119. data/lib/adhearsion/translator/asterisk/component/asterisk/ami_action.rb +68 -0
  120. data/lib/adhearsion/translator/asterisk/component/composed_prompt.rb +76 -0
  121. data/lib/adhearsion/translator/asterisk/component/dtmf_recognizer.rb +137 -0
  122. data/lib/adhearsion/translator/asterisk/component/input.rb +34 -0
  123. data/lib/adhearsion/translator/asterisk/component/input_component.rb +90 -0
  124. data/lib/adhearsion/translator/asterisk/component/mrcp_native_prompt.rb +71 -0
  125. data/lib/adhearsion/translator/asterisk/component/mrcp_prompt.rb +55 -0
  126. data/lib/adhearsion/translator/asterisk/component/mrcp_recog_prompt.rb +165 -0
  127. data/lib/adhearsion/translator/asterisk/component/output.rb +233 -0
  128. data/lib/adhearsion/translator/asterisk/component/record.rb +101 -0
  129. data/lib/adhearsion/translator/asterisk/component/stop_by_redirect.rb +30 -0
  130. data/lib/adhearsion/translator/asterisk/unimrcp_app.rb +28 -0
  131. data/lib/adhearsion/uri_list.rb +21 -0
  132. data/lib/adhearsion/version.rb +1 -1
  133. data/spec/adhearsion/call_controller/dial_spec.rb +79 -1420
  134. data/spec/adhearsion/call_controller/input_spec.rb +1141 -237
  135. data/spec/adhearsion/call_controller/output/async_player_spec.rb +10 -10
  136. data/spec/adhearsion/call_controller/output/player_spec.rb +8 -8
  137. data/spec/adhearsion/call_controller/output_spec.rb +162 -215
  138. data/spec/adhearsion/call_controller/record_spec.rb +15 -16
  139. data/spec/adhearsion/call_controller_spec.rb +23 -40
  140. data/spec/adhearsion/call_spec.rb +123 -129
  141. data/spec/adhearsion/calls_spec.rb +3 -3
  142. data/spec/adhearsion/configuration_spec.rb +94 -108
  143. data/spec/adhearsion/event/answered_spec.rb +50 -0
  144. data/spec/adhearsion/event/asterisk/Find Results +402 -0
  145. data/spec/adhearsion/event/asterisk/ami_spec.rb +81 -0
  146. data/spec/adhearsion/event/complete_spec.rb +176 -0
  147. data/spec/adhearsion/event/dtmf_spec.rb +35 -0
  148. data/spec/adhearsion/event/end_spec.rb +85 -0
  149. data/spec/adhearsion/event/input_timers_started_spec.rb +19 -0
  150. data/spec/adhearsion/event/joined_spec.rb +53 -0
  151. data/spec/adhearsion/event/offer_spec.rb +106 -0
  152. data/spec/adhearsion/event/ringing_spec.rb +50 -0
  153. data/spec/adhearsion/event/started_speaking_spec.rb +37 -0
  154. data/spec/adhearsion/event/stopped_speaking_spec.rb +37 -0
  155. data/spec/adhearsion/event/unjoined_spec.rb +48 -0
  156. data/spec/adhearsion/event/untitled +0 -0
  157. data/spec/adhearsion/events_spec.rb +19 -45
  158. data/spec/adhearsion/initializer_spec.rb +12 -184
  159. data/spec/adhearsion/logging_spec.rb +5 -20
  160. data/spec/adhearsion/outbound_call_spec.rb +13 -13
  161. data/spec/adhearsion/plugin_spec.rb +3 -4
  162. data/spec/adhearsion/protocol_error_spec.rb +91 -0
  163. data/spec/adhearsion/rayo/client/component_registry_spec.rb +26 -0
  164. data/spec/adhearsion/rayo/client_spec.rb +134 -0
  165. data/spec/adhearsion/rayo/command/accept_spec.rb +63 -0
  166. data/spec/adhearsion/rayo/command/answer_spec.rb +73 -0
  167. data/spec/adhearsion/rayo/command/dial_spec.rb +156 -0
  168. data/spec/adhearsion/rayo/command/hangup_spec.rb +63 -0
  169. data/spec/adhearsion/rayo/command/join_spec.rb +158 -0
  170. data/spec/adhearsion/rayo/command/mute_spec.rb +32 -0
  171. data/spec/adhearsion/rayo/command/redirect_spec.rb +89 -0
  172. data/spec/adhearsion/rayo/command/reject_spec.rb +117 -0
  173. data/spec/adhearsion/rayo/command/unjoin_spec.rb +82 -0
  174. data/spec/adhearsion/rayo/command/unmute_spec.rb +32 -0
  175. data/spec/adhearsion/rayo/command_node_spec.rb +101 -0
  176. data/spec/adhearsion/rayo/component/asterisk/agi/command_spec.rb +111 -0
  177. data/spec/adhearsion/rayo/component/asterisk/ami/action_spec.rb +173 -0
  178. data/spec/adhearsion/rayo/component/component_node_spec.rb +110 -0
  179. data/spec/adhearsion/rayo/component/input_spec.rb +715 -0
  180. data/spec/adhearsion/rayo/component/output_spec.rb +1030 -0
  181. data/spec/adhearsion/rayo/component/prompt_spec.rb +171 -0
  182. data/spec/adhearsion/rayo/component/receive_fax_spec.rb +136 -0
  183. data/spec/adhearsion/rayo/component/record_spec.rb +497 -0
  184. data/spec/adhearsion/rayo/component/send_fax_spec.rb +144 -0
  185. data/spec/adhearsion/rayo/connection/asterisk_spec.rb +118 -0
  186. data/spec/adhearsion/rayo/connection/xmpp_spec.rb +449 -0
  187. data/spec/adhearsion/rayo/initializer_spec.rb +353 -0
  188. data/spec/adhearsion/rayo/ref_spec.rb +168 -0
  189. data/spec/adhearsion/rayo_spec.rb +7 -0
  190. data/spec/adhearsion/router/route_spec.rb +1 -1
  191. data/spec/adhearsion/statistics_spec.rb +2 -5
  192. data/spec/adhearsion/translator/asterisk/call_spec.rb +2047 -0
  193. data/spec/adhearsion/translator/asterisk/component/asterisk/agi_command_spec.rb +256 -0
  194. data/spec/adhearsion/translator/asterisk/component/asterisk/ami_action_spec.rb +151 -0
  195. data/spec/adhearsion/translator/asterisk/component/composed_prompt_spec.rb +257 -0
  196. data/spec/adhearsion/translator/asterisk/component/input_spec.rb +571 -0
  197. data/spec/adhearsion/translator/asterisk/component/mrcp_native_prompt_spec.rb +774 -0
  198. data/spec/adhearsion/translator/asterisk/component/mrcp_prompt_spec.rb +1244 -0
  199. data/spec/adhearsion/translator/asterisk/component/output_spec.rb +1850 -0
  200. data/spec/adhearsion/translator/asterisk/component/record_spec.rb +426 -0
  201. data/spec/adhearsion/translator/asterisk/component/stop_by_redirect_spec.rb +62 -0
  202. data/spec/adhearsion/translator/asterisk/component_spec.rb +83 -0
  203. data/spec/adhearsion/translator/asterisk_spec.rb +685 -0
  204. data/spec/adhearsion/uri_list_spec.rb +88 -0
  205. data/spec/adhearsion_spec.rb +89 -14
  206. data/spec/fixtures/locale/en.yml +13 -0
  207. data/spec/fixtures/locale/it.yml +13 -0
  208. data/spec/spec_helper.rb +18 -5
  209. data/spec/support/call_controller_test_helpers.rb +3 -2
  210. data/spec/support/initializer_stubs.rb +3 -1
  211. data/spec/support/punchblock_examples.rb +65 -0
  212. data/spec/support/punchblock_mocks.rb +12 -0
  213. metadata +412 -70
  214. data/features/cli_daemon.feature +0 -20
  215. data/features/cli_restart.feature +0 -52
  216. data/features/cli_stop.feature +0 -50
  217. data/lib/adhearsion/call_controller/menu_dsl.rb +0 -21
  218. data/lib/adhearsion/call_controller/menu_dsl/array_match_calculator.rb +0 -26
  219. data/lib/adhearsion/call_controller/menu_dsl/calculated_match.rb +0 -43
  220. data/lib/adhearsion/call_controller/menu_dsl/calculated_match_collection.rb +0 -45
  221. data/lib/adhearsion/call_controller/menu_dsl/fixnum_match_calculator.rb +0 -11
  222. data/lib/adhearsion/call_controller/menu_dsl/match_calculator.rb +0 -40
  223. data/lib/adhearsion/call_controller/menu_dsl/menu.rb +0 -207
  224. data/lib/adhearsion/call_controller/menu_dsl/menu_builder.rb +0 -92
  225. data/lib/adhearsion/call_controller/menu_dsl/range_match_calculator.rb +0 -60
  226. data/lib/adhearsion/call_controller/menu_dsl/string_match_calculator.rb +0 -25
  227. data/lib/adhearsion/call_controller/utility.rb +0 -77
  228. data/lib/adhearsion/foundation/custom_daemonizer.rb +0 -52
  229. data/lib/adhearsion/punchblock_plugin.rb +0 -63
  230. data/scripts/cloc-1.64.pl +0 -10483
  231. data/spec/adhearsion/call_controller/menu_dsl/array_match_calculator_spec.rb +0 -76
  232. data/spec/adhearsion/call_controller/menu_dsl/calculated_match_collection_spec.rb +0 -60
  233. data/spec/adhearsion/call_controller/menu_dsl/calculated_match_spec.rb +0 -61
  234. data/spec/adhearsion/call_controller/menu_dsl/fixnum_match_calculator_spec.rb +0 -39
  235. data/spec/adhearsion/call_controller/menu_dsl/match_calculator_spec.rb +0 -17
  236. data/spec/adhearsion/call_controller/menu_dsl/menu_builder_spec.rb +0 -165
  237. data/spec/adhearsion/call_controller/menu_dsl/menu_spec.rb +0 -420
  238. data/spec/adhearsion/call_controller/menu_dsl/range_match_calculator_spec.rb +0 -32
  239. data/spec/adhearsion/call_controller/menu_dsl/string_match_calculator_spec.rb +0 -40
  240. data/spec/adhearsion/call_controller/utility_spec.rb +0 -90
  241. data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +0 -356
  242. 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,11 @@
1
+ # encoding: utf-8
2
+
3
+ module Adhearsion
4
+ module Rayo
5
+ module Component
6
+ class Stop < CommandNode # :nodoc:
7
+ register :stop, :ext
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ module Adhearsion
4
+ module Rayo
5
+ module Connection
6
+ end
7
+ end
8
+ end
9
+
10
+ require 'adhearsion/rayo/connection/asterisk'
11
+ require 'adhearsion/rayo/connection/connected'
12
+ require 'adhearsion/rayo/connection/xmpp'
@@ -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