nexmo 5.8.0 → 5.9.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|