signalwire 2.2.0 → 2.3.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.drone.yml +2 -1
  3. data/CHANGELOG.md +31 -1
  4. data/examples/relay/outbound_amd.rb +30 -0
  5. data/examples/relay/outbound_collect_speech.rb +26 -0
  6. data/examples/relay/outbound_record.rb +1 -0
  7. data/lib/signalwire.rb +1 -0
  8. data/lib/signalwire/blade.rb +1 -0
  9. data/lib/signalwire/blade/connection.rb +38 -16
  10. data/lib/signalwire/blade/message/connect.rb +2 -1
  11. data/lib/signalwire/blade/message/ping.rb +16 -0
  12. data/lib/signalwire/relay.rb +7 -0
  13. data/lib/signalwire/relay/calling/action/connect_action.rb +1 -1
  14. data/lib/signalwire/relay/calling/action/detect_action.rb +1 -1
  15. data/lib/signalwire/relay/calling/action/fax_action.rb +1 -1
  16. data/lib/signalwire/relay/calling/action/play_action.rb +13 -1
  17. data/lib/signalwire/relay/calling/action/prompt_action.rb +5 -1
  18. data/lib/signalwire/relay/calling/action/record_action.rb +5 -1
  19. data/lib/signalwire/relay/calling/action/send_digits_action.rb +1 -1
  20. data/lib/signalwire/relay/calling/action/tap_action.rb +1 -1
  21. data/lib/signalwire/relay/calling/call.rb +32 -16
  22. data/lib/signalwire/relay/calling/call_convenience_methods.rb +58 -23
  23. data/lib/signalwire/relay/calling/call_detect_methods.rb +1 -2
  24. data/lib/signalwire/relay/calling/component.rb +7 -2
  25. data/lib/signalwire/relay/calling/component/connect.rb +6 -2
  26. data/lib/signalwire/relay/calling/component/detect.rb +33 -31
  27. data/lib/signalwire/relay/calling/component/play.rb +18 -2
  28. data/lib/signalwire/relay/calling/component/prompt.rb +9 -2
  29. data/lib/signalwire/relay/calling/component/record.rb +4 -0
  30. data/lib/signalwire/relay/calling/control_component.rb +9 -5
  31. data/lib/signalwire/relay/calling/result/base_action_result.rb +10 -0
  32. data/lib/signalwire/relay/calling/result/play_pause_result.rb +6 -0
  33. data/lib/signalwire/relay/calling/result/play_resume_result.rb +6 -0
  34. data/lib/signalwire/relay/calling/result/play_volume_result.rb +6 -0
  35. data/lib/signalwire/relay/calling/result/prompt_volume_result.rb +6 -0
  36. data/lib/signalwire/relay/calling/result/stop_result.rb +6 -0
  37. data/lib/signalwire/relay/constants.rb +1 -1
  38. data/lib/signalwire/version.rb +1 -1
  39. data/signalwire.gemspec +13 -13
  40. metadata +38 -29
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 325c0f2a81d0a8486fdb356dc91c78284228b30440129ee2a60c3332b1e725b5
4
- data.tar.gz: 1f5f8d9227de1b684f05e88d6b1b53246de7f29479c0e11cef94cd792dc8171c
3
+ metadata.gz: d31f18c614ab0890b0c3000c45f607b636c8c3a3b7ad51d1e9dffae4c3b30165
4
+ data.tar.gz: 6ef1eeb8106c935d12beb8edafb67004d14c012761c43c675a9ce4d430c794d6
5
5
  SHA512:
6
- metadata.gz: 6362ec6503c1a04505f72b13edfbb29c2bb7ca4002f7e13fd7926099dbac08142254d0a41447c96f2b44a54639fdfb367d12ab710c6a6e628c39143a823e9028
7
- data.tar.gz: e8dce6ff15120bc77452aa97667a0aa468d923cd744e0e4ec15c74db0100424b321e9d86438710750d1cb4285f04db4aa3ab1f09f5e93352a2ebfa7c59874edd
6
+ metadata.gz: 4535d5d33d7d8152ffd349d0fbeb4cb544fc71931fb72f93c2c866eda4957249ace7b5337472193ebd58f0f6a987f546a226edc97618fb8bef03652162b534db
7
+ data.tar.gz: 6887060feada342534a3b4a365eb058e93276aa50ecd8e88456d1b4495e6aee7aa47be22e26adc22dfb292e24a0291ffe3376e06b6359d27fa6d0aaffeaba457
data/.drone.yml CHANGED
@@ -3,8 +3,9 @@ name: default
3
3
 
4
4
  steps:
5
5
  - name: test
6
- image: ruby:2.5
6
+ image: ruby:2.6
7
7
  commands:
8
+ - gem install bundler
8
9
  - bundle install --jobs=3 --retry=3
9
10
  - bundle exec rspec
10
11
 
@@ -3,7 +3,37 @@ All notable changes to this project will be documented in this file.
3
3
 
4
4
  This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
5
5
 
6
- ## [Unreleased]
6
+ ## [Unreleased]
7
+
8
+ ## [2.3.4] - 2020-09-09
9
+ ### Fixed
10
+ - Correctly ignore non-call events and clear handlers on call end
11
+ - Async method arguments fixed
12
+ - Fix ping race condition
13
+
14
+ ## [2.3.3] - 2020-03-09
15
+ ### Fixed
16
+ - `record` correctly set up for terminators now.
17
+ - Make AMD more usable and less complex.
18
+ - AMD now returns immediately in `wait_for_beep` mode if it detects a human.
19
+ - Relax `gemspec` dependencies.
20
+
21
+ ## [2.3.2] - 2020-01-29
22
+ ### Fixed
23
+ - Correctly return AMD result in Relay.
24
+
25
+ ## [2.3.1] - 2019-12-20
26
+ ### Changed
27
+ - Keepalive now uses `blade.ping`.
28
+
29
+ ## [2.3.0] - 2019-10-22
30
+ ### Added
31
+ - Add `pause` and `resume` on `PlayAction`.
32
+ - Add `volume` optional parameter to `play` and `prompt` methods
33
+ - Add `volume` method to `Play` and `Prompt` components
34
+ - Add `play_ringtone` and `play_ringtone!` for ringback.
35
+ - Add `prompt_ringtone` and `prompt_ringtone!` for ringback on a prompt.
36
+ - Added `ringback` parameter to the `connect` and `connect!` methods.
7
37
 
8
38
  ## [2.2.0] - 2019-09-09
9
39
  ### Added
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
4
+ %w[
5
+ bundler/setup
6
+ signalwire
7
+ ].each { |f| require f }
8
+
9
+ # Set logging to debug for testing
10
+ Signalwire::Logger.logger.level = ::Logger::DEBUG
11
+
12
+ class OutboundConsumer < Signalwire::Relay::Consumer
13
+ def ready
14
+ logger.info 'Dialing out'
15
+ call = client.calling.new_call(from: ENV['FROM_NUMBER'], to: ENV['TO_NUMBER'])
16
+ call.dial
17
+ result = call.amd(timeout: 10, wait_for_beep: true)
18
+ pp "---------------------------------- Detect AM result was:"
19
+ pp result.type
20
+ pp result.result
21
+ pp result.successful
22
+
23
+ call.hangup
24
+ rescue StandardError => e
25
+ logger.error e.inspect
26
+ logger.error e.backtrace
27
+ end
28
+ end
29
+
30
+ OutboundConsumer.new.run
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
4
+ %w[
5
+ bundler/setup
6
+ signalwire
7
+ ].each { |f| require f }
8
+
9
+ # Set logging to debug for testing
10
+ Signalwire::Logger.logger.level = ::Logger::DEBUG
11
+
12
+ class OutboundConsumer < Signalwire::Relay::Consumer
13
+ def ready
14
+ dial_result = client.calling.new_call(from: ENV['FROM_NUMBER'], to: ENV['TO_NUMBER']).dial
15
+ tts = [{ type: 'tts', params: { text: 'Say something funny!' } }]
16
+ result = dial_result.call.prompt collect: {speech: {language: 'en-US'}}, play: tts
17
+ dial_result.call.play_tts text: "You ordered #{result.result} hamburgers. Thank you!"
18
+ dial_result.call.hangup
19
+ # this makes it so the errors don't stop the process
20
+ rescue StandardError => e
21
+ logger.error e.inspect
22
+ logger.error e.backtrace
23
+ end
24
+ end
25
+
26
+ OutboundConsumer.new.run
@@ -16,6 +16,7 @@ class OutboundConsumer < Signalwire::Relay::Consumer
16
16
  call.dial
17
17
  call.play_tts text: 'please leave your message after the beep. Press pound when done.'
18
18
  result = call.record(beep: true, terminators: "#")
19
+ sleep 1 # wait for recording to be uploaded
19
20
  call.play_tts text: 'you said:'
20
21
  call.play_audio result.url
21
22
  call.hangup
@@ -3,6 +3,7 @@
3
3
  module Signalwire
4
4
  end
5
5
 
6
+ require 'signalwire/version'
6
7
  require 'signalwire/sdk'
7
8
  require 'signalwire/logger'
8
9
  require 'signalwire/common'
@@ -9,4 +9,5 @@ require 'signalwire/blade/connection'
9
9
  require 'signalwire/blade/message'
10
10
  require 'signalwire/blade/message/connect'
11
11
  require 'signalwire/blade/message/execute'
12
+ require 'signalwire/blade/message/ping'
12
13
  require 'signalwire/blade/message/subscribe'
@@ -4,6 +4,7 @@ require 'has_guarded_handlers'
4
4
  require 'eventmachine'
5
5
  require 'faye/websocket'
6
6
  require 'json'
7
+ require 'concurrent-ruby'
7
8
 
8
9
  module Signalwire::Blade
9
10
  class Connection
@@ -22,9 +23,15 @@ module Signalwire::Blade
22
23
  @log_traffic = options.fetch(:log_traffic, true)
23
24
  @authentication = options.fetch(:authentication, nil)
24
25
 
26
+
27
+
25
28
  @inbound_queue = EM::Queue.new
26
29
  @outbound_queue = EM::Queue.new
27
30
 
31
+ @pong = Concurrent::AtomicBoolean.new
32
+ @keep_alive_timer = nil
33
+ @ping_is_sent = Concurrent::AtomicBoolean.new
34
+
28
35
  @shutdown_list = []
29
36
  end
30
37
 
@@ -37,7 +44,7 @@ module Signalwire::Blade
37
44
  end
38
45
 
39
46
  def reconnect!
40
- @connected = false
47
+ clear_connections
41
48
  return if @shutdown
42
49
  sleep Signalwire::Blade::RECONNECT_PERIOD
43
50
  logger.info "Attempting reconnection"
@@ -46,6 +53,7 @@ module Signalwire::Blade
46
53
 
47
54
  def main_loop!
48
55
  EM.run do
56
+ logger.info "CREATING SOCKET"
49
57
  @ws = Faye::WebSocket::Client.new(@url)
50
58
 
51
59
  @ws.on(:open) { |event| broadcast :started, event }
@@ -69,13 +77,14 @@ module Signalwire::Blade
69
77
  begin
70
78
  @connected = true
71
79
  myreq = connect_request
72
- start_periodic_timer
80
+ @pong.make_false
73
81
 
74
82
  write_command(myreq) do |event|
75
83
  @session_id = event.dig(:result, :sessionid) unless @session_id
76
84
  @node_id = event.dig(:result, :nodeid) unless @node_d
77
85
  logger.info "Blade Session connected with id: #{@session_id}"
78
86
  broadcast :connected, event
87
+ keep_alive
79
88
  end
80
89
 
81
90
  rescue StandardError => e
@@ -127,18 +136,29 @@ module Signalwire::Blade
127
136
  block_given? ? write_command(Execute.new(params), &block) : write_command(Execute.new(params))
128
137
  end
129
138
 
139
+ def ping(&block)
140
+ ping_cmd = Ping.new
141
+ block_given? ? write_command(ping_cmd, &block) : write_command(ping_cmd)
142
+ ping_cmd
143
+ end
144
+
130
145
  def subscribe(params, &block)
131
146
  block_given? ? write_command(Subscribe.new(params), &block) : write_command(Subscribe.new(params))
132
147
  end
133
148
 
134
149
  def handle_close
150
+ logger.warn "WS Socket closed!"
135
151
  reconnect!
136
152
  end
137
153
 
138
- def disconnect!
139
- # logger.info 'Stopping Blade event loop'
154
+ def clear_connections
140
155
  @ws = nil
141
156
  @connected = false
157
+ @keep_alive_timer.cancel if @keep_alive_timer
158
+ end
159
+
160
+ def disconnect!
161
+ clear_connections
142
162
  EM.stop
143
163
  end
144
164
 
@@ -169,20 +189,22 @@ module Signalwire::Blade
169
189
  @connected == true
170
190
  end
171
191
 
172
- def start_periodic_timer
173
- pinger = EventMachine::PeriodicTimer.new(Signalwire::Relay::PING_TIMEOUT) do
174
- timeouter = EventMachine::Timer.new(2) do
175
- # reconnect logic goes here
176
- logger.error "We got disconnected!"
177
- pinger.cancel
178
- reconnect! if connected?
192
+ def keep_alive
193
+ if @ping_is_sent.false?
194
+ ping do
195
+ @pong.make_true
179
196
  end
180
-
181
- if @connected
182
- @ws.ping 'detecting presence' do
183
- timeouter.cancel
184
- end
197
+ @ping_is_sent.make_true
198
+ else
199
+ if @pong.false?
200
+ logger.error "KEEPALIVE: Ping failed"
201
+ reconnect! if connected?
185
202
  end
203
+ @ping_is_sent.make_false
204
+ end
205
+
206
+ @keep_alive_timer = EventMachine::Timer.new(Signalwire::Relay::PING_TIMEOUT) do
207
+ keep_alive
186
208
  end
187
209
  end
188
210
 
@@ -10,7 +10,8 @@ module Signalwire::Blade
10
10
  major: 2,
11
11
  minor: 1,
12
12
  revision: 0
13
- }
13
+ },
14
+ agent: "Ruby SDK/#{Signalwire::VERSION}"
14
15
  }
15
16
  }
16
17
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Signalwire::Blade
4
+ class Ping < Message
5
+ # Creates a Ping message
6
+ #
7
+
8
+ def initialize
9
+ @payload = {
10
+ method: 'blade.ping',
11
+ params: {}
12
+ }
13
+ end
14
+ end
15
+ end
16
+
@@ -28,17 +28,24 @@ require 'signalwire/relay/calling/action/send_digits_action'
28
28
 
29
29
  require 'signalwire/relay/calling/result'
30
30
  require 'signalwire/relay/calling/result/answer_result'
31
+ require 'signalwire/relay/calling/result/base_action_result'
31
32
  require 'signalwire/relay/calling/result/connect_result'
32
33
  require 'signalwire/relay/calling/result/detect_result'
33
34
  require 'signalwire/relay/calling/result/dial_result'
34
35
  require 'signalwire/relay/calling/result/hangup_result'
35
36
  require 'signalwire/relay/calling/result/play_result'
37
+ require 'signalwire/relay/calling/result/play_pause_result'
38
+ require 'signalwire/relay/calling/result/play_resume_result'
39
+ require 'signalwire/relay/calling/result/play_volume_result'
36
40
  require 'signalwire/relay/calling/result/prompt_result'
41
+ require 'signalwire/relay/calling/result/prompt_volume_result'
37
42
  require 'signalwire/relay/calling/result/record_result'
38
43
  require 'signalwire/relay/calling/result/fax_result'
39
44
  require 'signalwire/relay/calling/result/tap_result'
40
45
  require 'signalwire/relay/calling/result/send_digits_result'
41
46
 
47
+ require 'signalwire/relay/calling/result/stop_result'
48
+
42
49
  require 'signalwire/relay/calling/component'
43
50
  require 'signalwire/relay/calling/control_component'
44
51
  require 'signalwire/relay/calling/component/answer'
@@ -5,7 +5,7 @@ require 'forwardable'
5
5
  module Signalwire::Relay::Calling
6
6
  class ConnectAction < Action
7
7
  def result
8
- ConnectResult.new(@component)
8
+ ConnectResult.new(component: @component)
9
9
  end
10
10
  end
11
11
  end
@@ -5,7 +5,7 @@ require 'forwardable'
5
5
  module Signalwire::Relay::Calling
6
6
  class DetectAction < Action
7
7
  def result
8
- DetectResult.new(@component)
8
+ DetectResult.new(component: @component)
9
9
  end
10
10
 
11
11
  def stop
@@ -5,7 +5,7 @@ require 'forwardable'
5
5
  module Signalwire::Relay::Calling
6
6
  class FaxAction < Action
7
7
  def result
8
- FaxResult.new(@component)
8
+ FaxResult.new(component: @component)
9
9
  end
10
10
 
11
11
  def stop
@@ -5,11 +5,23 @@ require 'forwardable'
5
5
  module Signalwire::Relay::Calling
6
6
  class PlayAction < Action
7
7
  def result
8
- PlayResult.new(@component)
8
+ PlayResult.new(component: @component)
9
9
  end
10
10
 
11
11
  def stop
12
12
  @component.stop
13
13
  end
14
+
15
+ def pause
16
+ @component.pause
17
+ end
18
+
19
+ def resume
20
+ @component.resume
21
+ end
22
+
23
+ def volume(setting)
24
+ @component.volume setting
25
+ end
14
26
  end
15
27
  end
@@ -5,11 +5,15 @@ require 'forwardable'
5
5
  module Signalwire::Relay::Calling
6
6
  class PromptAction < Action
7
7
  def result
8
- PromptResult.new(@component)
8
+ PromptResult.new(component: @component)
9
9
  end
10
10
 
11
11
  def stop
12
12
  @component.stop
13
13
  end
14
+
15
+ def volume(setting)
16
+ @component.volume setting
17
+ end
14
18
  end
15
19
  end
@@ -5,11 +5,15 @@ require 'forwardable'
5
5
  module Signalwire::Relay::Calling
6
6
  class RecordAction < Action
7
7
  def result
8
- RecordResult.new(@component)
8
+ RecordResult.new(component: @component)
9
9
  end
10
10
 
11
11
  def stop
12
12
  @component.stop
13
13
  end
14
+
15
+ def url
16
+ @component.url
17
+ end
14
18
  end
15
19
  end
@@ -5,7 +5,7 @@ require 'forwardable'
5
5
  module Signalwire::Relay::Calling
6
6
  class SendDigitsAction < Action
7
7
  def result
8
- SendDigitsResult.new(@component)
8
+ SendDigitsResult.new(component: @component)
9
9
  end
10
10
  end
11
11
  end
@@ -7,7 +7,7 @@ module Signalwire::Relay::Calling
7
7
  def_delegators :@component, :source_device
8
8
 
9
9
  def result
10
- TapResult.new(@component)
10
+ TapResult.new(component: @component)
11
11
  end
12
12
 
13
13
  def stop
@@ -45,7 +45,7 @@ module Signalwire::Relay::Calling
45
45
  end
46
46
 
47
47
  def setup_call_event_handlers
48
- @client.on(:event, proc { |evt| call_match_event(evt) }) do |event|
48
+ @call_event_handler = @client.on(:event, proc { |evt| call_match_event(evt) }) do |event|
49
49
  case event.event_type
50
50
  when 'calling.call.connect'
51
51
  change_connect_state(event.call_params[:connect_state])
@@ -81,7 +81,8 @@ module Signalwire::Relay::Calling
81
81
  end
82
82
 
83
83
  def call_match_event(event)
84
- event.event_type.match(/calling\.call/) &&
84
+ event.event_type &&
85
+ event.event_type.match(/calling\.call/) &&
85
86
  !event.event_type.match(/receive/) &&
86
87
  (event.call_id == id || event.call_params[:tag] == tag)
87
88
  end
@@ -112,50 +113,64 @@ module Signalwire::Relay::Calling
112
113
  AnswerResult.new(component: answer_component)
113
114
  end
114
115
 
115
- def play(play_object)
116
- play_component = Signalwire::Relay::Calling::Play.new(call: self, play: play_object)
116
+ def play(play_p = nil, volume_p = nil, **args)
117
+ play = args.delete(:play)
118
+ volume = args.delete(:volume)
119
+ set_parameters(binding, %i{play volume}, %i{play})
120
+
121
+ play_component = Signalwire::Relay::Calling::Play.new(call: self, play: play, volume: volume)
117
122
  play_component.wait_for(Relay::CallPlayState::FINISHED, Relay::CallPlayState::ERROR)
118
123
  PlayResult.new(component: play_component)
119
124
  end
120
125
 
121
- def play!(play_object)
122
- play_component = Signalwire::Relay::Calling::Play.new(call: self, play: play_object)
126
+ def play!(play_p = nil, volume_p = nil, **args)
127
+ play = args.delete(:play)
128
+ volume = args.delete(:volume)
129
+ set_parameters(binding, %i{play volume}, %i{play})
130
+
131
+ play_component = Signalwire::Relay::Calling::Play.new(call: self, play: play, volume: volume)
123
132
  play_component.execute
124
133
  PlayAction.new(component: play_component)
125
134
  end
126
135
 
127
- def prompt(collect_p = nil, play_p = nil, **args)
128
-
136
+ def prompt(collect_p = nil, play_p = nil, volume_p = nil, **args)
129
137
  collect = args.delete(:collect)
130
138
  play = args.delete(:play)
139
+ volume = args.delete(:volume)
131
140
 
132
141
  collect = compile_collect_arguments(args) if collect.nil? && collect_p.nil?
133
142
  set_parameters(binding, %i{collect play}, %i{collect play})
134
143
 
135
- component = Prompt.new(call: self, collect: collect, play: play)
144
+ component = Prompt.new(call: self, collect: collect, play: play, volume: volume)
136
145
  component.wait_for(Relay::CallPromptState::ERROR, Relay::CallPromptState::NO_INPUT,
137
146
  Relay::CallPromptState::NO_MATCH, Relay::CallPromptState::DIGIT,
138
147
  Relay::CallPromptState::SPEECH)
139
148
  PromptResult.new(component: component)
140
149
  end
141
150
 
142
- def prompt!(collect_p = nil, play_p = nil, **args)
151
+ def prompt!(collect_p = nil, play_p = nil, volume_p = nil, **args)
152
+ collect = args.delete(:collect)
153
+ play = args.delete(:play)
154
+ volume = args.delete(:volume)
155
+
143
156
  collect = compile_collect_arguments(args) if collect.nil? && collect_p.nil?
144
157
  set_parameters(binding, %i{collect play}, %i{collect play})
145
158
 
146
- component = Prompt,new(call: self, collect: collect, play: play)
159
+ component = Prompt.new(call: self, collect: collect, play: play, volume: volume)
147
160
  component.execute
148
161
  PromptAction.new(component: component)
149
162
  end
150
163
 
151
- def connect(devices_object)
152
- component = Connect.new(call: self, devices: devices_object)
164
+ def connect(devices_p = nil, ringback_p = nil, devices: nil, ringback: nil)
165
+ set_parameters(binding, %i{devices ringback}, %i{devices})
166
+ component = ringback.nil? ? Connect.new(call: self, devices: devices) : Connect.new(call: self, devices: devices, ringback: ringback)
153
167
  component.wait_for(Relay::CallConnectState::CONNECTED, Relay::CallConnectState::FAILED)
154
168
  ConnectResult.new(component: component)
155
169
  end
156
170
 
157
- def connect!(devices_object)
158
- component = Connect.new(call: self, devices: devices_object)
171
+ def connect!(devices_p = nil, ringback_p = nil, devices: nil, ringback: nil)
172
+ set_parameters(binding, %i{devices ringback}, %i{devices})
173
+ component = ringback.nil? ? Connect.new(call: self, devices: devices) : Connect.new(call: self, devices: devices, ringback: ringback)
159
174
  component.execute
160
175
  ConnectAction.new(component: component)
161
176
  end
@@ -302,6 +317,7 @@ module Signalwire::Relay::Calling
302
317
  end
303
318
 
304
319
  def finish_call(params)
320
+ @client.unregister_handler(:event, @call_event_handler)
305
321
  terminate_components(params)
306
322
  client.calling.end_call(id)
307
323
  @busy = true if params[:reason] == Relay::DisconnectReason::BUSY
@@ -375,7 +391,7 @@ module Signalwire::Relay::Calling
375
391
  speech_obj[:language] = args[:speech_language] if args[:speech_language]
376
392
  speech_obj[:hints] = args[:speech_hints] if args[:speech_hints]
377
393
  speech_obj[:end_silence_timeout] = args[:end_silence_timeout] if args[:end_silence_timeout]
378
- collect[:digits] = digits_obj
394
+ collect[:speech] = speech_obj
379
395
  end
380
396
 
381
397
  collect