nexmo 5.8.0 → 5.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/nexmo.rb +1 -1
- data/lib/nexmo/account.rb +36 -1
- data/lib/nexmo/alerts.rb +46 -0
- data/lib/nexmo/applications.rb +118 -0
- data/lib/nexmo/applications_v2.rb +71 -0
- data/lib/nexmo/authentication/abstract.rb +3 -1
- data/lib/nexmo/authentication/basic.rb +3 -1
- data/lib/nexmo/authentication/bearer_token.rb +3 -1
- data/lib/nexmo/authentication/key_secret_params.rb +3 -1
- data/lib/nexmo/authentication/key_secret_query.rb +3 -1
- data/lib/nexmo/call_dtmf.rb +12 -0
- data/lib/nexmo/call_stream.rb +26 -0
- data/lib/nexmo/call_talk.rb +30 -0
- data/lib/nexmo/calls.rb +188 -0
- data/lib/nexmo/client.rb +77 -1
- data/lib/nexmo/conversation_events.rb +47 -0
- data/lib/nexmo/conversation_legs.rb +14 -0
- data/lib/nexmo/conversation_members.rb +74 -0
- data/lib/nexmo/conversation_users.rb +63 -0
- data/lib/nexmo/conversations.rb +110 -0
- data/lib/nexmo/errors.rb +41 -0
- data/lib/nexmo/errors/error.rb +0 -27
- data/lib/nexmo/form_data.rb +3 -1
- data/lib/nexmo/http.rb +3 -1
- data/lib/nexmo/json.rb +3 -1
- data/lib/nexmo/jwt.rb +25 -0
- data/lib/nexmo/keys.rb +3 -1
- data/lib/nexmo/logger.rb +3 -1
- data/lib/nexmo/namespace.rb +4 -2
- data/lib/nexmo/number_insight.rb +102 -0
- data/lib/nexmo/numbers.rb +155 -0
- data/lib/nexmo/params.rb +3 -1
- data/lib/nexmo/redact.rb +20 -0
- data/lib/nexmo/secrets.rb +53 -0
- data/lib/nexmo/signature.rb +24 -13
- data/lib/nexmo/sms.rb +88 -0
- data/lib/nexmo/user_agent.rb +3 -1
- data/lib/nexmo/verify.rb +144 -0
- data/lib/nexmo/version.rb +1 -1
- data/nexmo.gemspec +2 -0
- metadata +31 -3
- data/lib/nexmo/problem.rb +0 -20
data/lib/nexmo/call_dtmf.rb
CHANGED
@@ -6,6 +6,18 @@ module Nexmo
|
|
6
6
|
|
7
7
|
self.request_body = JSON
|
8
8
|
|
9
|
+
# Play DTMF tones into a call.
|
10
|
+
#
|
11
|
+
# @option params [String] :digits
|
12
|
+
# The digits to send.
|
13
|
+
#
|
14
|
+
# @param [String] id
|
15
|
+
# @param [Hash] params
|
16
|
+
#
|
17
|
+
# @return [Entity]
|
18
|
+
#
|
19
|
+
# @see https://developer.nexmo.com/api/voice#startDTMF
|
20
|
+
#
|
9
21
|
def send(id, params)
|
10
22
|
request('/v1/calls/' + id + '/dtmf', params: params, type: Put)
|
11
23
|
end
|
data/lib/nexmo/call_stream.rb
CHANGED
@@ -6,10 +6,36 @@ module Nexmo
|
|
6
6
|
|
7
7
|
self.request_body = JSON
|
8
8
|
|
9
|
+
# Play an audio file into a call.
|
10
|
+
#
|
11
|
+
# @option params [required, Array<String>] :stream_url
|
12
|
+
# URL of the audio file.
|
13
|
+
#
|
14
|
+
# @option params [Integer] :loop
|
15
|
+
# The number of times to play the file, 0 for infinite.
|
16
|
+
#
|
17
|
+
# @option params [String] :level
|
18
|
+
# Set the audio level of the stream in the range -1 >= level <= 1 with a precision of 0.1. The default value is 0.
|
19
|
+
#
|
20
|
+
# @param [String] id
|
21
|
+
# @param [Hash] params
|
22
|
+
#
|
23
|
+
# @return [Entity]
|
24
|
+
#
|
25
|
+
# @see https://developer.nexmo.com/api/voice#startStream
|
26
|
+
#
|
9
27
|
def start(id, params)
|
10
28
|
request('/v1/calls/' + id + '/stream', params: params, type: Put)
|
11
29
|
end
|
12
30
|
|
31
|
+
# Stop playing an audio file into a call.
|
32
|
+
#
|
33
|
+
# @param [String] id
|
34
|
+
#
|
35
|
+
# @return [Entity]
|
36
|
+
#
|
37
|
+
# @see https://developer.nexmo.com/api/voice#stopStream
|
38
|
+
#
|
13
39
|
def stop(id)
|
14
40
|
request('/v1/calls/' + id + '/stream', type: Delete)
|
15
41
|
end
|
data/lib/nexmo/call_talk.rb
CHANGED
@@ -6,10 +6,40 @@ module Nexmo
|
|
6
6
|
|
7
7
|
self.request_body = JSON
|
8
8
|
|
9
|
+
# Play text to speech into a call.
|
10
|
+
#
|
11
|
+
# @option params [required, String] :text
|
12
|
+
# The text to read.
|
13
|
+
#
|
14
|
+
# @option params [String] :voice_name
|
15
|
+
# The voice & language to use.
|
16
|
+
#
|
17
|
+
# @option params [Integer] :loop
|
18
|
+
# The number of times to repeat the text the file, 0 for infinite.
|
19
|
+
#
|
20
|
+
# @option params [String] :level
|
21
|
+
# The volume level that the speech is played.
|
22
|
+
# This can be any value between `-1` to `1` in `0.1` increments, with `0` being the default.
|
23
|
+
#
|
24
|
+
# @param [String] id
|
25
|
+
# @param [Hash] params
|
26
|
+
#
|
27
|
+
# @return [Entity]
|
28
|
+
#
|
29
|
+
# @see https://developer.nexmo.com/api/voice#startTalk
|
30
|
+
#
|
9
31
|
def start(id, params)
|
10
32
|
request('/v1/calls/' + id + '/talk', params: params, type: Put)
|
11
33
|
end
|
12
34
|
|
35
|
+
# Stop text to speech in a call.
|
36
|
+
#
|
37
|
+
# @param [String] id
|
38
|
+
#
|
39
|
+
# @return [Entity]
|
40
|
+
#
|
41
|
+
# @see https://developer.nexmo.com/api/voice#stopTalk
|
42
|
+
#
|
13
43
|
def stop(id)
|
14
44
|
request('/v1/calls/' + id + '/talk', type: Delete)
|
15
45
|
end
|
data/lib/nexmo/calls.rb
CHANGED
@@ -6,54 +6,242 @@ module Nexmo
|
|
6
6
|
|
7
7
|
self.request_body = JSON
|
8
8
|
|
9
|
+
# Create an outbound Call.
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# response = client.calls.create({
|
13
|
+
# to: [{type: 'phone', number: '14843331234'}],
|
14
|
+
# from: {type: 'phone', number: '14843335555'},
|
15
|
+
# answer_url: ['https://example.com/answer']
|
16
|
+
# })
|
17
|
+
#
|
18
|
+
# @option params [required, Array<Hash>] :to
|
19
|
+
# Connect to a Phone (PSTN) number, SIP Endpoint, Websocket, or VBC extension.
|
20
|
+
#
|
21
|
+
# @option params [required, Hash] :from
|
22
|
+
# Connect to a Phone (PSTN) number.
|
23
|
+
#
|
24
|
+
# @option params [Array<String>] :ncco
|
25
|
+
# The Nexmo Call Control Object to use for this call.
|
26
|
+
# Required unless **:answer_url** is provided.
|
27
|
+
#
|
28
|
+
# @option params [Array<String>] :answer_url
|
29
|
+
# The webhook endpoint where you provide the Nexmo Call Control Object that governs this call.
|
30
|
+
# Required unless **:ncco** is provided.
|
31
|
+
#
|
32
|
+
# @option params [String] :answer_method
|
33
|
+
# The HTTP method used to send event information to answer_url.
|
34
|
+
#
|
35
|
+
# @option params [required, Array<String>] :event_url
|
36
|
+
# The webhook endpoint where call progress events are sent to.
|
37
|
+
#
|
38
|
+
# @option params [String] :event_method
|
39
|
+
# The HTTP method used to send event information to event_url.
|
40
|
+
#
|
41
|
+
# @option params [String] :machine_detection
|
42
|
+
# Configure the behavior when Nexmo detects that the call is answered by voicemail.
|
43
|
+
#
|
44
|
+
# @option params [Integer] :length_timer
|
45
|
+
# Set the number of seconds that elapse before Nexmo hangs up after the call state changes to in_progress.
|
46
|
+
#
|
47
|
+
# @option params [Integer] :ringing_timer
|
48
|
+
# Set the number of seconds that elapse before Nexmo hangs up after the call state changes to `ringing`.
|
49
|
+
#
|
50
|
+
# @param [Hash] params
|
51
|
+
#
|
52
|
+
# @return [Entity]
|
53
|
+
#
|
54
|
+
# @see https://developer.nexmo.com/api/voice#createCall
|
55
|
+
#
|
9
56
|
def create(params)
|
10
57
|
request('/v1/calls', params: params, type: Post)
|
11
58
|
end
|
12
59
|
|
60
|
+
# Get details of your calls.
|
61
|
+
#
|
62
|
+
# @example
|
63
|
+
# response = client.calls.list
|
64
|
+
# response._embedded.calls.each do |item|
|
65
|
+
# puts "#{item.uuid} #{item.direction} #{item.status}"
|
66
|
+
# end
|
67
|
+
#
|
68
|
+
# @option params [String] :status
|
69
|
+
# Filter by call status.
|
70
|
+
#
|
71
|
+
# @option params [String] :date_start
|
72
|
+
# Return the records that occurred after this point in time.
|
73
|
+
#
|
74
|
+
# @option params [String] :date_end
|
75
|
+
# Return the records that occurred before this point in time.
|
76
|
+
#
|
77
|
+
# @option params [Integer] :page_size
|
78
|
+
# Return this amount of records in the response.
|
79
|
+
#
|
80
|
+
# @option params [Integer] :record_index
|
81
|
+
# Return calls from this index in the response.
|
82
|
+
#
|
83
|
+
# @option params [String] :order
|
84
|
+
# Either `ascending` or `descending` order.
|
85
|
+
#
|
86
|
+
# @option params [String] :conversation_uuid
|
87
|
+
# Return all the records associated with a specific conversation.
|
88
|
+
#
|
89
|
+
# @param [Hash] params
|
90
|
+
#
|
91
|
+
# @return [Entity]
|
92
|
+
#
|
93
|
+
# @see https://developer.nexmo.com/api/voice#getCalls
|
94
|
+
#
|
13
95
|
def list(params = nil)
|
14
96
|
request('/v1/calls', params: params)
|
15
97
|
end
|
16
98
|
|
99
|
+
# Get detail of a specific call.
|
100
|
+
#
|
101
|
+
# @example
|
102
|
+
# response = client.calls.get(id)
|
103
|
+
#
|
104
|
+
# @param [String] id
|
105
|
+
#
|
106
|
+
# @return [Entity]
|
107
|
+
#
|
108
|
+
# @see https://developer.nexmo.com/api/voice#getCall
|
109
|
+
#
|
17
110
|
def get(id)
|
18
111
|
request('/v1/calls/' + id)
|
19
112
|
end
|
20
113
|
|
114
|
+
# Modify an in progress call.
|
115
|
+
#
|
116
|
+
# @example
|
117
|
+
# response = client.calls.update(id, action: 'hangup')
|
118
|
+
#
|
119
|
+
# @option params [required, String] :action
|
120
|
+
#
|
121
|
+
# @option params [Hash] :destination
|
122
|
+
# Required when **:action** is `transfer`.
|
123
|
+
#
|
124
|
+
# @param [String] id
|
125
|
+
# @param [Hash] params
|
126
|
+
#
|
127
|
+
# @return [Entity]
|
128
|
+
#
|
129
|
+
# @see https://developer.nexmo.com/api/voice#updateCall
|
130
|
+
#
|
21
131
|
def update(id, params)
|
22
132
|
request('/v1/calls/' + id, params: params, type: Put)
|
23
133
|
end
|
24
134
|
|
135
|
+
# Hangup an in progress call.
|
136
|
+
#
|
137
|
+
# @example
|
138
|
+
# response = client.calls.hangup(id)
|
139
|
+
#
|
140
|
+
# @param [String] id
|
141
|
+
#
|
142
|
+
# @return [Entity]
|
143
|
+
#
|
144
|
+
# @see https://developer.nexmo.com/api/voice#updateCall
|
145
|
+
#
|
25
146
|
def hangup(id)
|
26
147
|
update(id, action: 'hangup')
|
27
148
|
end
|
28
149
|
|
150
|
+
# Mute an in progress call.
|
151
|
+
#
|
152
|
+
# @example
|
153
|
+
# response = client.calls.mute(id)
|
154
|
+
#
|
155
|
+
# @param [String] id
|
156
|
+
#
|
157
|
+
# @return [Entity]
|
158
|
+
#
|
159
|
+
# @see https://developer.nexmo.com/api/voice#updateCall
|
160
|
+
#
|
29
161
|
def mute(id)
|
30
162
|
update(id, action: 'mute')
|
31
163
|
end
|
32
164
|
|
165
|
+
# Unmute an in progress call.
|
166
|
+
#
|
167
|
+
# @example
|
168
|
+
# response = client.calls.unmute(id)
|
169
|
+
#
|
170
|
+
# @param [String] id
|
171
|
+
#
|
172
|
+
# @return [Entity]
|
173
|
+
#
|
174
|
+
# @see https://developer.nexmo.com/api/voice#updateCall
|
175
|
+
#
|
33
176
|
def unmute(id)
|
34
177
|
update(id, action: 'unmute')
|
35
178
|
end
|
36
179
|
|
180
|
+
# Earmuff an in progress call.
|
181
|
+
#
|
182
|
+
# @example
|
183
|
+
# response = client.calls.earmuff(id)
|
184
|
+
#
|
185
|
+
# @param [String] id
|
186
|
+
#
|
187
|
+
# @return [Entity]
|
188
|
+
#
|
189
|
+
# @see https://developer.nexmo.com/api/voice#updateCall
|
190
|
+
#
|
37
191
|
def earmuff(id)
|
38
192
|
update(id, action: 'earmuff')
|
39
193
|
end
|
40
194
|
|
195
|
+
# Unearmuff an in progress call.
|
196
|
+
#
|
197
|
+
# @example
|
198
|
+
# response = client.calls.unearmuff(id)
|
199
|
+
#
|
200
|
+
# @param [String] id
|
201
|
+
#
|
202
|
+
# @return [Entity]
|
203
|
+
#
|
204
|
+
# @see https://developer.nexmo.com/api/voice#updateCall
|
205
|
+
#
|
41
206
|
def unearmuff(id)
|
42
207
|
update(id, action: 'unearmuff')
|
43
208
|
end
|
44
209
|
|
210
|
+
# Transfer an in progress call.
|
211
|
+
#
|
212
|
+
# @example
|
213
|
+
# destination = {
|
214
|
+
# type: 'ncco',
|
215
|
+
# url: ['https://example.com/ncco.json']
|
216
|
+
# }
|
217
|
+
#
|
218
|
+
# response = client.calls.transfer(id, destination: destination)
|
219
|
+
#
|
220
|
+
# @param [String] id
|
221
|
+
# @param [Hash] destination
|
222
|
+
#
|
223
|
+
# @return [Entity]
|
224
|
+
#
|
225
|
+
# @see https://developer.nexmo.com/api/voice#updateCall
|
226
|
+
#
|
45
227
|
def transfer(id, destination:)
|
46
228
|
update(id, action: 'transfer', destination: destination)
|
47
229
|
end
|
48
230
|
|
231
|
+
# @return [CallStream]
|
232
|
+
#
|
49
233
|
def stream
|
50
234
|
@stream ||= CallStream.new(@client)
|
51
235
|
end
|
52
236
|
|
237
|
+
# @return [CallTalk]
|
238
|
+
#
|
53
239
|
def talk
|
54
240
|
@talk ||= CallTalk.new(@client)
|
55
241
|
end
|
56
242
|
|
243
|
+
# @return [CallDTMF]
|
244
|
+
#
|
57
245
|
def dtmf
|
58
246
|
@dtmf ||= CallDTMF.new(@client)
|
59
247
|
end
|
data/lib/nexmo/client.rb
CHANGED
@@ -36,24 +36,40 @@ module Nexmo
|
|
36
36
|
@http_options = HTTP::Options.new(hash)
|
37
37
|
end
|
38
38
|
|
39
|
+
# @return [Nexmo::Logger]
|
40
|
+
#
|
39
41
|
def logger
|
40
42
|
@logger
|
41
43
|
end
|
42
44
|
|
45
|
+
# @return [Nexmo::Logger]
|
46
|
+
#
|
43
47
|
def logger=(logger)
|
44
48
|
@logger = Logger.new(logger)
|
45
49
|
end
|
46
50
|
|
51
|
+
# Returns the value of attribute token, or a temporary short lived token.
|
52
|
+
#
|
53
|
+
# @return [String]
|
54
|
+
#
|
47
55
|
def token
|
48
56
|
@token || JWT.generate({application_id: application_id}, private_key)
|
49
57
|
end
|
50
58
|
|
59
|
+
# @deprecated Use {#token=} instead.
|
60
|
+
#
|
51
61
|
def auth_token=(auth_token)
|
52
62
|
Kernel.warn "#{self.class}##{__method__} is deprecated (use #token= instead)"
|
53
63
|
|
54
64
|
@token = auth_token
|
55
65
|
end
|
56
66
|
|
67
|
+
# Returns the value of attribute api_key.
|
68
|
+
#
|
69
|
+
# @return [String]
|
70
|
+
#
|
71
|
+
# @raise [AuthenticationError]
|
72
|
+
#
|
57
73
|
def api_key
|
58
74
|
unless @api_key
|
59
75
|
raise AuthenticationError.new('No API key provided. ' \
|
@@ -64,6 +80,12 @@ module Nexmo
|
|
64
80
|
@api_key
|
65
81
|
end
|
66
82
|
|
83
|
+
# Returns the value of attribute api_secret.
|
84
|
+
#
|
85
|
+
# @return [String]
|
86
|
+
#
|
87
|
+
# @raise [AuthenticationError]
|
88
|
+
#
|
67
89
|
def api_secret
|
68
90
|
unless @api_secret
|
69
91
|
raise AuthenticationError.new('No API secret provided. ' \
|
@@ -74,6 +96,12 @@ module Nexmo
|
|
74
96
|
@api_secret
|
75
97
|
end
|
76
98
|
|
99
|
+
# Returns the value of attribute signature_secret.
|
100
|
+
#
|
101
|
+
# @return [String]
|
102
|
+
#
|
103
|
+
# @raise [AuthenticationError]
|
104
|
+
#
|
77
105
|
def signature_secret
|
78
106
|
unless @signature_secret
|
79
107
|
raise AuthenticationError.new('No signature_secret provided. ' \
|
@@ -85,6 +113,12 @@ module Nexmo
|
|
85
113
|
@signature_secret
|
86
114
|
end
|
87
115
|
|
116
|
+
# Returns the value of attribute application_id.
|
117
|
+
#
|
118
|
+
# @return [String]
|
119
|
+
#
|
120
|
+
# @raise [AuthenticationError]
|
121
|
+
#
|
88
122
|
def application_id
|
89
123
|
unless @application_id
|
90
124
|
raise AuthenticationError.new('No application_id provided. ' \
|
@@ -97,6 +131,12 @@ module Nexmo
|
|
97
131
|
@application_id
|
98
132
|
end
|
99
133
|
|
134
|
+
# Returns the value of attribute private_key.
|
135
|
+
#
|
136
|
+
# @return [String]
|
137
|
+
#
|
138
|
+
# @raise [AuthenticationError]
|
139
|
+
#
|
100
140
|
def private_key
|
101
141
|
unless @private_key
|
102
142
|
raise AuthenticationError.new('No private_key provided. ' \
|
@@ -109,74 +149,110 @@ module Nexmo
|
|
109
149
|
@private_key
|
110
150
|
end
|
111
151
|
|
152
|
+
# @return [Signature]
|
153
|
+
#
|
112
154
|
def signature
|
113
|
-
@signature ||= Signature.new(
|
155
|
+
@signature ||= Signature.new(signature_secret)
|
114
156
|
end
|
115
157
|
|
158
|
+
# @return [Account]
|
159
|
+
#
|
116
160
|
def account
|
117
161
|
@account ||= Account.new(self)
|
118
162
|
end
|
119
163
|
|
164
|
+
# @return [Alerts]
|
165
|
+
#
|
120
166
|
def alerts
|
121
167
|
@alerts ||= Alerts.new(self)
|
122
168
|
end
|
123
169
|
|
170
|
+
# @return [Applications]
|
171
|
+
#
|
124
172
|
def applications
|
125
173
|
@applications ||= Applications.new(self)
|
126
174
|
end
|
127
175
|
|
176
|
+
# @return [ApplicationsV2]
|
177
|
+
#
|
128
178
|
def applications_v2
|
129
179
|
@applications_v2 ||= ApplicationsV2.new(self)
|
130
180
|
end
|
131
181
|
|
182
|
+
# @return [Calls]
|
183
|
+
#
|
132
184
|
def calls
|
133
185
|
@calls ||= Calls.new(self)
|
134
186
|
end
|
135
187
|
|
188
|
+
# @return [Conversations]
|
189
|
+
#
|
136
190
|
def conversations
|
137
191
|
@conversations ||= Conversations.new(self)
|
138
192
|
end
|
139
193
|
|
194
|
+
# @return [Conversions]
|
195
|
+
#
|
140
196
|
def conversions
|
141
197
|
@conversions ||= Conversions.new(self)
|
142
198
|
end
|
143
199
|
|
200
|
+
# @return [Files]
|
201
|
+
#
|
144
202
|
def files
|
145
203
|
@files ||= Files.new(self)
|
146
204
|
end
|
147
205
|
|
206
|
+
# @return [Messages]
|
207
|
+
#
|
148
208
|
def messages
|
149
209
|
@messages ||= Messages.new(self)
|
150
210
|
end
|
151
211
|
|
212
|
+
# @return [NumberInsight]
|
213
|
+
#
|
152
214
|
def number_insight
|
153
215
|
@number_insight ||= NumberInsight.new(self)
|
154
216
|
end
|
155
217
|
|
218
|
+
# @return [Numbers]
|
219
|
+
#
|
156
220
|
def numbers
|
157
221
|
@numbers ||= Numbers.new(self)
|
158
222
|
end
|
159
223
|
|
224
|
+
# @return [PricingTypes]
|
225
|
+
#
|
160
226
|
def pricing
|
161
227
|
@pricing ||= PricingTypes.new(self)
|
162
228
|
end
|
163
229
|
|
230
|
+
# @return [Redact]
|
231
|
+
#
|
164
232
|
def redact
|
165
233
|
@redact ||= Redact.new(self)
|
166
234
|
end
|
167
235
|
|
236
|
+
# @return [Secrets]
|
237
|
+
#
|
168
238
|
def secrets
|
169
239
|
@secrets ||= Secrets.new(self)
|
170
240
|
end
|
171
241
|
|
242
|
+
# @return [SMS]
|
243
|
+
#
|
172
244
|
def sms
|
173
245
|
@sms ||= SMS.new(self)
|
174
246
|
end
|
175
247
|
|
248
|
+
# @return [TFA]
|
249
|
+
#
|
176
250
|
def tfa
|
177
251
|
@tfa ||= TFA.new(self)
|
178
252
|
end
|
179
253
|
|
254
|
+
# @return [Verify]
|
255
|
+
#
|
180
256
|
def verify
|
181
257
|
@verify ||= Verify.new(self)
|
182
258
|
end
|