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,41 @@
1
+ # encoding: utf-8
2
+
3
+ require 'adhearsion/rayo'
4
+
5
+ module Blather
6
+ class Stanza
7
+ RAYO_NODE_PATH = "(#{Adhearsion::Rayo::RAYO_NAMESPACES.keys.map { |k| "#{k}:*" }.join("|")})".freeze
8
+ ##
9
+ # @return [Adhearsion::Rayo::RayoNode] a child of RayoNode
10
+ # representing the Rayo command/event contained within the stanza
11
+ #
12
+ def rayo_node
13
+ @rayo_node ||= begin
14
+ first_child = at_xpath RAYO_NODE_PATH, Adhearsion::Rayo::RAYO_NAMESPACES
15
+ Adhearsion::Rayo::RayoNode.from_xml first_child, nil, component_id, "xmpp:#{from}", delay_timestamp if first_child
16
+ end
17
+ end
18
+
19
+ ##
20
+ # @return [String] the call ID this stanza applies to
21
+ #
22
+ def call_id
23
+ from.node
24
+ end
25
+
26
+ ##
27
+ # @return [String] the command ID this stanza applies to
28
+ #
29
+ def component_id
30
+ from.resource
31
+ end
32
+
33
+ private
34
+
35
+ def delay_timestamp
36
+ if delay = self.at_xpath('ns:delay', ns: 'urn:xmpp:delay')
37
+ DateTime.parse(delay[:stamp])
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+
3
+ module Blather
4
+ class Stanza
5
+ class Presence
6
+ alias :event :rayo_node
7
+
8
+ def rayo_event?
9
+ event.is_a? Adhearsion::Event
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ # encoding: utf-8
2
+
3
+ module Adhearsion
4
+ Error = Class.new StandardError
5
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ module Adhearsion
4
+ class Event < Rayo::RayoNode
5
+ end
6
+ end
7
+
8
+ %w{
9
+ answered
10
+ asterisk
11
+ complete
12
+ dtmf
13
+ end
14
+ joined
15
+ offer
16
+ ringing
17
+ input_timers_started
18
+ unjoined
19
+ started_speaking
20
+ stopped_speaking
21
+ }.each { |e| require "adhearsion/event/#{e}"}
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+
3
+ module Adhearsion
4
+ class Event
5
+ module ActiveSpeaker
6
+ def self.included(klass)
7
+ klass.attribute :call_id
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+
3
+ module Adhearsion
4
+ class Event
5
+ class Answered < Event
6
+ register :answered, :core
7
+
8
+ include HasHeaders
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ # encoding: utf-8
2
+
3
+ module Adhearsion
4
+ class Event
5
+ module Asterisk
6
+ end
7
+ end
8
+ end
9
+
10
+ require 'adhearsion/event/asterisk/ami'
@@ -0,0 +1,34 @@
1
+ # encoding: utf-8
2
+
3
+ module Adhearsion
4
+ class Event
5
+ module Asterisk
6
+ class AMI < Event
7
+ register :event, :ami
8
+
9
+ attribute :name
10
+ attribute :headers, Hash, default: {}
11
+
12
+ alias :attributes :headers
13
+
14
+ def inherit(xml_node)
15
+ xml_node.xpath('//ns:attribute', ns: self.class.registered_ns).to_a.each do |attribute|
16
+ headers[attribute[:name]] = attribute[:value]
17
+ end
18
+ super
19
+ end
20
+
21
+ def rayo_attributes
22
+ {'name' => name}
23
+ end
24
+
25
+ def rayo_children(root)
26
+ super
27
+ headers.each do |name, value|
28
+ root.attribute name: name, value: value
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,75 @@
1
+ # encoding: utf-8
2
+
3
+ require 'adhearsion/event'
4
+
5
+ module Adhearsion
6
+ class Event
7
+ class Complete < Event
8
+ register :complete, :ext
9
+
10
+ attribute :reason
11
+
12
+ attribute :recording
13
+
14
+ attribute :fax
15
+ attribute :fax_metadata, Hash, default: {}
16
+
17
+ def inherit(xml_node)
18
+ if reason_node = xml_node.at_xpath('*')
19
+ self.reason = Adhearsion::Rayo::RayoNode.from_xml(reason_node).tap do |reason|
20
+ reason.target_call_id = target_call_id
21
+ reason.component_id = component_id
22
+ end
23
+ end
24
+
25
+ if recording_node = xml_node.at_xpath('//ns:recording', ns: Rayo::RAYO_NAMESPACES[:record_complete])
26
+ self.recording = Adhearsion::Rayo::RayoNode.from_xml(recording_node).tap do |recording|
27
+ recording.target_call_id = target_call_id
28
+ recording.component_id = component_id
29
+ end
30
+ end
31
+
32
+ if fax_node = xml_node.at_xpath('//ns:fax', ns: Rayo::RAYO_NAMESPACES[:fax_complete])
33
+ self.fax = Adhearsion::Rayo::RayoNode.from_xml(fax_node).tap do |fax|
34
+ fax.target_call_id = target_call_id
35
+ fax.component_id = component_id
36
+ end
37
+ end
38
+
39
+ xml_node.xpath('//ns:metadata', ns: Rayo::RAYO_NAMESPACES[:fax_complete]).each do |md|
40
+ fax_metadata[md['name']] = md['value']
41
+ end
42
+
43
+ super
44
+ end
45
+
46
+ class Reason < Event
47
+ attribute :name, Symbol, default: ->(node,_) { node.class.registered_name.to_sym }
48
+
49
+ def inherit(xml_node)
50
+ self.name = xml_node.name.to_sym
51
+ super
52
+ end
53
+ end
54
+
55
+ class Stop < Reason
56
+ register :stop, :ext_complete
57
+ end
58
+
59
+ class Hangup < Reason
60
+ register :hangup, :ext_complete
61
+ end
62
+
63
+ class Error < Reason
64
+ register :error, :ext_complete
65
+
66
+ attribute :details
67
+
68
+ def inherit(xml_node)
69
+ self.details = xml_node.text.strip
70
+ super
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+
3
+ module Adhearsion
4
+ class Event
5
+ class DTMF < Event
6
+ register :dtmf, :core
7
+
8
+ attribute :signal
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+
3
+ module Adhearsion
4
+ class Event
5
+ class End < Event
6
+ register :end, :core
7
+
8
+ include HasHeaders
9
+
10
+ attribute :reason, Symbol
11
+ attribute :platform_code, String
12
+
13
+ def inherit(xml_node)
14
+ if reason_node = xml_node.at_xpath('*')
15
+ self.reason = reason_node.name
16
+ self.platform_code = reason_node['platform-code']
17
+ end
18
+ super
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+
3
+ module Adhearsion
4
+ class Event
5
+ class InputTimersStarted < Event
6
+ register :'input-timers-started', :prompt
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ module Adhearsion
4
+ class Event
5
+ class Joined < Event
6
+ register :joined, :core
7
+
8
+ # @return [String] the call ID that was joined
9
+ attribute :call_uri
10
+
11
+ # @return [String] the mixer name that was joined
12
+ attribute :mixer_name
13
+
14
+ alias :call_id :call_uri
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ # encoding: utf-8
2
+
3
+ module Adhearsion
4
+ class Event
5
+ class Offer < Event
6
+ register :offer, :core
7
+
8
+ include HasHeaders
9
+
10
+ attribute :to
11
+ attribute :from
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+
3
+ module Adhearsion
4
+ class Event
5
+ class Ringing < Event
6
+ register :ringing, :core
7
+
8
+ include HasHeaders
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+
3
+ require 'adhearsion/event/active_speaker'
4
+
5
+ module Adhearsion
6
+ class Event
7
+ class StartedSpeaking < Event
8
+ register :'started-speaking', :core
9
+
10
+ include ActiveSpeaker
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+
3
+ require 'adhearsion/event/active_speaker'
4
+
5
+ module Adhearsion
6
+ class Event
7
+ class StoppedSpeaking < Event
8
+ register :'stopped-speaking', :core
9
+
10
+ include ActiveSpeaker
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ module Adhearsion
4
+ class Event
5
+ class Unjoined < Event
6
+ register :unjoined, :core
7
+
8
+ # @return [String] the call ID that was unjoined
9
+ attribute :call_uri
10
+
11
+ # @return [String] the mixer name that was unjoined
12
+ attribute :mixer_name
13
+
14
+ alias :call_id :call_uri
15
+ end
16
+ end
17
+ end
@@ -1,95 +1,76 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require 'has_guarded_handlers'
4
- require 'girl_friday'
4
+ require 'singleton'
5
+ require 'celluloid'
5
6
 
6
7
  module Adhearsion
7
- class Events
8
+ module Events
8
9
 
9
- include HasGuardedHandlers
10
+ class Handler
11
+ include HasGuardedHandlers
12
+ include Singleton
10
13
 
11
- Message = Struct.new :type, :object
12
-
13
- class << self
14
- def method_missing(method_name, *args, &block)
15
- instance.send method_name, *args, &block
14
+ def call_handler(handler, guards, event)
15
+ super
16
+ throw :pass
16
17
  end
17
18
 
18
- def respond_to_missing?(method_name, include_private = false)
19
- instance.respond_to? method_name, include_private
20
- end
19
+ alias :register_callback :register_handler
21
20
 
22
- def instance
23
- @@instance || refresh!
21
+ def method_missing(method_name, *args, &block)
22
+ register_handler method_name, *args, &block
24
23
  end
25
24
 
26
- def refresh!
27
- @@instance = new
25
+ def respond_to_missing?(method_name, include_private = false)
26
+ true
28
27
  end
29
28
  end
30
29
 
31
- refresh!
30
+ class Worker
31
+ include Celluloid
32
32
 
33
- def queue
34
- queue? ? @queue : reinitialize_queue!
35
- end
36
-
37
- def trigger(type, object = nil)
38
- queue.push_async Message.new(type, object)
39
- end
40
-
41
- def trigger_immediately(type, object = nil)
42
- queue.push_immediately Message.new(type, object)
43
- end
44
-
45
- def queue?
46
- instance_variable_defined? :@queue
47
- end
48
-
49
- def reinitialize_queue!
50
- GirlFriday.shutdown! if queue?
51
- # TODO: Extract number of threads to use from Adhearsion.config
52
- @queue = GirlFriday::WorkQueue.new 'main_queue', :error_handler => ErrorHandler do |message|
53
- work message
33
+ def work(type, object)
34
+ Handler.instance.trigger_handler type, object
35
+ rescue => e
36
+ raise if type == :exception
37
+ async.work :exception, e
54
38
  end
55
39
  end
56
40
 
57
- def work(message)
58
- handle_message message
59
- rescue => e
60
- raise if message.type == :exception
61
- trigger :exception, e
62
- end
63
-
64
- def handle_message(message)
65
- trigger_handler message.type, message.object
66
- end
41
+ class << self
42
+ def method_missing(method_name, *args, &block)
43
+ Handler.instance.send method_name, *args, &block
44
+ end
67
45
 
68
- def draw(&block)
69
- instance_exec(&block)
70
- end
46
+ def respond_to_missing?(method_name, include_private = false)
47
+ Handler.instance.respond_to? method_name, include_private
48
+ end
71
49
 
72
- def method_missing(method_name, *args, &block)
73
- register_handler method_name, *args, &block
74
- end
50
+ def trigger(type, object = nil)
51
+ queue.async.work type, object
52
+ end
75
53
 
76
- def respond_to_missing?(method_name, include_private = false)
77
- instance_variable_defined?(:@handlers) && @handlers.has_key?(method_name)
78
- end
54
+ def trigger_immediately(type, object = nil)
55
+ queue.work type, object
56
+ end
79
57
 
80
- alias :register_callback :register_handler
58
+ def draw(&block)
59
+ Handler.instance.instance_exec(&block)
60
+ end
81
61
 
82
- private
62
+ def queue
63
+ @queue || refresh!
64
+ end
83
65
 
84
- def call_handler(handler, guards, event)
85
- super
86
- throw :pass
87
- end
66
+ def init
67
+ @queue = Worker.pool(size: Adhearsion.config.core.event_threads)
68
+ end
88
69
 
89
- class ErrorHandler
90
- def handle(exception)
91
- logger.error "Exception encountered in exception handler!"
92
- logger.error exception
70
+ def refresh!
71
+ @queue = nil
72
+ Handler.instance.clear_handlers
73
+ init
93
74
  end
94
75
  end
95
76