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
@@ -48,39 +48,32 @@ module Adhearsion
48
48
 
49
49
  # Restore the default configured logging level
50
50
  def unsilence!
51
- self.logging_level = Adhearsion.config.platform.logging['level']
51
+ self.logging_level = Adhearsion.config.core.logging['level']
52
52
  end
53
53
 
54
54
  # Toggle between the configured log level and :trace
55
55
  # Useful for debugging a live Adhearsion instance
56
56
  def toggle_trace!
57
- if level == ::Logging.level_num(Adhearsion.config.platform.logging['level'])
57
+ if level == ::Logging.level_num(Adhearsion.config.core.logging['level'])
58
58
  logger.warn "Turning TRACE logging ON."
59
59
  self.level = :trace
60
60
  else
61
61
  logger.warn "Turning TRACE logging OFF."
62
- self.level = Adhearsion.config.platform.logging['level']
62
+ self.level = Adhearsion.config.core.logging['level']
63
63
  end
64
64
  end
65
65
 
66
- # Close logfiles and reopen them. Useful for log rotation.
67
- def reopen_logs
68
- logger.info "Closing logfiles."
69
- ::Logging.reopen
70
- logger.info "Logfiles reopened."
71
- end
72
-
73
66
  def init
74
67
  ::Logging.init LOG_LEVELS
75
68
 
76
69
  LOG_LEVELS.each do |level|
77
70
  Adhearsion::Logging.const_defined?(level) or Adhearsion::Logging.const_set(level, ::Logging::LEVELS[::Logging.levelify(level)])
78
71
  end
79
- end
80
72
 
81
- def start(_appenders = nil, level = :info, formatter = nil)
82
- ::Logging.logger.root.appenders = _appenders.nil? ? default_appenders : _appenders
73
+ ::Logging.logger.root.appenders = default_appenders
74
+ end
83
75
 
76
+ def start(level = :info, formatter = nil)
84
77
  ::Logging.logger.root.level = level
85
78
 
86
79
  self.formatter = formatter if formatter
@@ -119,18 +112,6 @@ module Adhearsion
119
112
  name.to_s.gsub(/\W/, '').downcase
120
113
  end
121
114
 
122
- def outputters=(outputters)
123
- ::Logging.logger.root.appenders = outputters
124
- end
125
-
126
- alias :appenders= :outputters=
127
-
128
- def outputters
129
- ::Logging.logger.root.appenders
130
- end
131
-
132
- alias :appenders :outputters
133
-
134
115
  def formatter=(formatter)
135
116
  ::Logging.logger.root.appenders.each do |appender|
136
117
  appender.layout = formatter
@@ -49,7 +49,7 @@ module Adhearsion
49
49
  end
50
50
 
51
51
  def client
52
- PunchblockPlugin::Initializer.client
52
+ Adhearsion::Rayo::Initializer.client
53
53
  end
54
54
 
55
55
  def accept(*args)
@@ -84,9 +84,9 @@ module Adhearsion
84
84
  uri = client.new_call_uri
85
85
  options[:uri] = uri
86
86
 
87
- @dial_command = Punchblock::Command::Dial.new(options)
87
+ @dial_command = Adhearsion::Rayo::Command::Dial.new(options)
88
88
 
89
- ref = Punchblock::Ref.new uri: uri
89
+ ref = Adhearsion::Rayo::Ref.new uri: uri
90
90
  @transport = ref.scheme
91
91
  @id = ref.call_id
92
92
  @domain = ref.domain
@@ -119,13 +119,13 @@ module Adhearsion
119
119
  end
120
120
 
121
121
  def run_router_on_answer
122
- register_event_handler Punchblock::Event::Answered do |event|
122
+ register_event_handler Adhearsion::Event::Answered do |event|
123
123
  run_router
124
124
  end
125
125
  end
126
126
 
127
127
  def on_answer(&block)
128
- register_event_handler Punchblock::Event::Answered, &block
128
+ register_event_handler Adhearsion::Event::Answered, &block
129
129
  end
130
130
 
131
131
  def execute_controller_or_router_on_answer(controller, metadata = {}, &controller_block)
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'loquacious'
4
4
  require 'active_support/inflector'
5
+ require 'adhearsion/foundation/object'
5
6
  require 'adhearsion/configuration'
6
7
  %w(
7
8
  collection
@@ -0,0 +1,26 @@
1
+ # encoding: utf-8
2
+
3
+ require 'adhearsion/error'
4
+
5
+ module Adhearsion
6
+ ##
7
+ # This exception may be raised if a transport error is detected.
8
+ class ProtocolError < Error
9
+ attr_accessor :name, :text, :call_id, :component_id
10
+
11
+ def setup(name = nil, text = nil, call_id = nil, component_id = nil)
12
+ @name, @text, @call_id, @component_id = name, text, call_id, component_id
13
+ self
14
+ end
15
+
16
+ def to_s
17
+ "#<#{self.class}: name=#{name.inspect} text=#{text.inspect} call_id=#{call_id.inspect} component_id=#{component_id.inspect}>"
18
+ end
19
+ alias :inspect :to_s
20
+
21
+ def eql?(other)
22
+ other.is_a?(self.class) && [:name, :text, :call_id, :component_id].all? { |f| self.__send__(f) == other.__send__(f) }
23
+ end
24
+ alias :== :eql?
25
+ end
26
+ end
@@ -0,0 +1,30 @@
1
+ # encoding: utf-8
2
+
3
+ module Adhearsion
4
+ module Rayo
5
+ BASE_RAYO_NAMESPACE = 'urn:xmpp:rayo'
6
+ BASE_ASTERISK_NAMESPACE = 'urn:xmpp:rayo:asterisk'
7
+ RAYO_VERSION = '1'
8
+ RAYO_NAMESPACES = {:core => [BASE_RAYO_NAMESPACE, RAYO_VERSION].compact.join(':')}
9
+
10
+ [:ext, :record, :output, :input, :prompt, :cpa, :fax].each do |ns|
11
+ RAYO_NAMESPACES[ns] = [BASE_RAYO_NAMESPACE, ns.to_s, RAYO_VERSION].compact.join(':')
12
+ RAYO_NAMESPACES[:"#{ns}_complete"] = [BASE_RAYO_NAMESPACE, ns.to_s, 'complete', RAYO_VERSION].compact.join(':')
13
+ end
14
+
15
+ [:agi, :ami].each do |ns|
16
+ RAYO_NAMESPACES[ns] = [BASE_ASTERISK_NAMESPACE, ns.to_s, RAYO_VERSION].compact.join(':')
17
+ RAYO_NAMESPACES[:"#{ns}_complete"] = [BASE_ASTERISK_NAMESPACE, ns.to_s, 'complete', RAYO_VERSION].compact.join(':')
18
+ end
19
+ end
20
+ end
21
+
22
+ require 'adhearsion/rayo/client'
23
+ require 'adhearsion/rayo/connection'
24
+ require 'adhearsion/rayo/command'
25
+ require 'adhearsion/rayo/command_node'
26
+ require 'adhearsion/rayo/component'
27
+ require 'adhearsion/rayo/disconnected_error'
28
+ require 'adhearsion/rayo/initializer'
29
+ require 'adhearsion/rayo/rayo_node'
30
+ require 'adhearsion/rayo/ref'
@@ -0,0 +1,62 @@
1
+ # encoding: utf-8
2
+
3
+ require 'has_guarded_handlers'
4
+ require 'active_support/core_ext/module/delegation'
5
+
6
+ module Adhearsion
7
+ module Rayo
8
+ class Client
9
+ include HasGuardedHandlers
10
+
11
+ attr_reader :connection, :component_registry
12
+
13
+ delegate :run, :stop, :send_message, :new_call_uri, :to => :connection
14
+
15
+ # @param [Hash] options
16
+ # @option options [Connection::XMPP] :connection The connection to use for this session
17
+ #
18
+ def initialize(options = {})
19
+ @connection = options[:connection]
20
+ @connection.event_handler = lambda { |event| self.handle_event event } if @connection
21
+ @component_registry = ComponentRegistry.new
22
+ end
23
+
24
+ def handle_event(event)
25
+ event.client = self
26
+ if event.source
27
+ event.source.add_event event
28
+ else
29
+ trigger_handler :event, event
30
+ end
31
+ end
32
+
33
+ def register_event_handler(*guards, &block)
34
+ register_handler :event, *guards, &block
35
+ end
36
+
37
+ def register_component(component)
38
+ component_registry << component
39
+ end
40
+
41
+ def find_component_by_uri(uri)
42
+ component_registry.find_by_uri uri
43
+ end
44
+
45
+ def delete_component_registration(component)
46
+ component_registry.delete component
47
+ end
48
+
49
+ def execute_command(command, options = {})
50
+ command.client = self
51
+ if command.respond_to?(:register_handler)
52
+ command.register_handler :internal do |event|
53
+ trigger_handler :event, event
54
+ end
55
+ end
56
+ connection.write command, options
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ require 'adhearsion/rayo/client/component_registry'
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+
3
+ module Adhearsion
4
+ module Rayo
5
+ class Client
6
+ class ComponentRegistry
7
+ def initialize
8
+ @mutex = Mutex.new
9
+ @components = Hash.new
10
+ end
11
+
12
+ def <<(component)
13
+ @mutex.synchronize do
14
+ @components[component.source_uri] = component
15
+ end
16
+ end
17
+
18
+ def find_by_uri(uri)
19
+ @mutex.synchronize do
20
+ @components[uri]
21
+ end
22
+ end
23
+
24
+ def delete(component)
25
+ @mutex.synchronize do
26
+ uri = @components.key component
27
+ @components.delete uri
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ module Adhearsion
4
+ module Rayo
5
+ module Command
6
+ end
7
+ end
8
+ end
9
+
10
+ %w{
11
+ accept
12
+ answer
13
+ dial
14
+ hangup
15
+ join
16
+ mute
17
+ redirect
18
+ reject
19
+ unjoin
20
+ unmute
21
+ }.each { |event| require "adhearsion/rayo/command/#{event}" }
@@ -0,0 +1,16 @@
1
+ # encoding: utf-8
2
+
3
+ require 'adhearsion/rayo/command_node'
4
+ require 'adhearsion/has_headers'
5
+
6
+ module Adhearsion
7
+ module Rayo
8
+ module Command
9
+ class Accept < CommandNode
10
+ register :accept, :core
11
+
12
+ include HasHeaders
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # encoding: utf-8
2
+
3
+ require 'adhearsion/rayo/command_node'
4
+ require 'adhearsion/has_headers'
5
+
6
+ module Adhearsion
7
+ module Rayo
8
+ module Command
9
+ class Answer < CommandNode
10
+ register :answer, :core
11
+
12
+ include HasHeaders
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,57 @@
1
+ # encoding: utf-8
2
+
3
+ require 'adhearsion/rayo/command_node'
4
+ require 'adhearsion/has_headers'
5
+ require 'adhearsion/rayo/command/join'
6
+
7
+ module Adhearsion
8
+ module Rayo
9
+ module Command
10
+ class Dial < CommandNode
11
+ register :dial, :core
12
+
13
+ include HasHeaders
14
+
15
+ # @return [String] destination to dial
16
+ attribute :to
17
+
18
+ # @return [String] the caller ID
19
+ attribute :from
20
+
21
+ # @return [String] the requested URI for the resulting call
22
+ attribute :uri
23
+
24
+ # @return [Integer] timeout in milliseconds
25
+ attribute :timeout, Integer
26
+
27
+ # @return [Join] the nested join
28
+ attribute :join, Join
29
+
30
+ def inherit(xml_node)
31
+ if join_element = xml_node.at_xpath('ns:join', ns: Join.registered_ns)
32
+ self.join = Join.from_xml(join_element)
33
+ end
34
+ super
35
+ end
36
+
37
+ def rayo_attributes
38
+ {to: to, from: from, uri: uri, timeout: timeout}
39
+ end
40
+
41
+ def rayo_children(root)
42
+ join.to_rayo(root.parent) if join
43
+ super
44
+ end
45
+
46
+ def response=(other)
47
+ if other.is_a?(Ref)
48
+ @transport = other.scheme
49
+ @target_call_id = other.call_id
50
+ @domain = other.domain
51
+ end
52
+ super
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,16 @@
1
+ # encoding: utf-8
2
+
3
+ require 'adhearsion/rayo/command_node'
4
+ require 'adhearsion/has_headers'
5
+
6
+ module Adhearsion
7
+ module Rayo
8
+ module Command
9
+ class Hangup < CommandNode
10
+ register :hangup, :core
11
+
12
+ include HasHeaders
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,43 @@
1
+ # encoding: utf-8
2
+
3
+ require 'adhearsion/rayo/command_node'
4
+
5
+ module Adhearsion
6
+ module Rayo
7
+ module Command
8
+ class Join < CommandNode
9
+ register :join, :core
10
+
11
+ VALID_DIRECTIONS = [:duplex, :send, :recv].freeze
12
+
13
+ # @return [String] the call ID to join
14
+ attribute :call_uri
15
+ alias :call_id= :call_uri=
16
+
17
+ # @return [String] the mixer name to join
18
+ attribute :mixer_name
19
+
20
+ # @param [#to_sym] other the direction in which media should flow. Can be :duplex, :recv or :send
21
+ attribute :direction, Symbol
22
+ def direction=(other)
23
+ if other && !VALID_DIRECTIONS.include?(other.to_sym)
24
+ raise ArgumentError, "Invalid Direction (#{other.inspect}), use: #{VALID_DIRECTIONS*' '}"
25
+ end
26
+ super
27
+ end
28
+
29
+ # @return [#to_sym] the method by which to negotiate media
30
+ attribute :media, Symbol
31
+
32
+ def rayo_attributes
33
+ {
34
+ 'call-uri' => call_uri,
35
+ 'mixer-name' => mixer_name,
36
+ 'direction' => direction,
37
+ 'media' => media
38
+ }
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+
3
+ require 'adhearsion/rayo/command_node'
4
+
5
+ module Adhearsion
6
+ module Rayo
7
+ module Command
8
+ class Mute < CommandNode
9
+ register :mute, :core
10
+ end
11
+ end
12
+ end
13
+ end