vonage 7.18.0 → 8.0.0.beta
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +10 -271
- data/lib/vonage/applications.rb +4 -12
- data/lib/vonage/client.rb +4 -32
- data/lib/vonage/client_error.rb +1 -1
- data/lib/vonage/config.rb +3 -7
- data/lib/vonage/errors.rb +20 -37
- data/lib/vonage/gsm7.rb +1 -1
- data/lib/vonage/jwt.rb +0 -17
- data/lib/vonage/keys.rb +7 -1
- data/lib/vonage/logger.rb +3 -5
- data/lib/vonage/messaging/channels/viber.rb +1 -8
- data/lib/vonage/messaging/channels/whats_app.rb +1 -3
- data/lib/vonage/messaging.rb +0 -11
- data/lib/vonage/namespace.rb +58 -128
- data/lib/vonage/numbers.rb +6 -29
- data/lib/vonage/server_error.rb +1 -1
- data/lib/vonage/signature.rb +5 -5
- data/lib/vonage/sms.rb +20 -20
- data/lib/vonage/version.rb +1 -1
- data/lib/vonage/video/archives.rb +187 -0
- data/lib/vonage/video/list_response.rb +11 -0
- data/lib/vonage/video/moderation.rb +73 -0
- data/lib/vonage/video/signals.rb +55 -0
- data/lib/vonage/video/streams.rb +76 -0
- data/lib/vonage/video.rb +91 -0
- data/lib/vonage/voice/actions/connect.rb +3 -27
- data/lib/vonage/voice/actions/pay.rb +107 -0
- data/lib/vonage/voice/actions/talk.rb +2 -11
- data/lib/vonage/voice/talk.rb +1 -11
- data/lib/vonage/voice.rb +0 -22
- data/lib/vonage.rb +0 -1
- data/vonage.gemspec +1 -2
- metadata +14 -59
- data/lib/vonage/api_error.rb +0 -33
- data/lib/vonage/meetings/applications.rb +0 -25
- data/lib/vonage/meetings/dial_in_numbers/list_response.rb +0 -11
- data/lib/vonage/meetings/dial_in_numbers.rb +0 -23
- data/lib/vonage/meetings/recordings.rb +0 -36
- data/lib/vonage/meetings/rooms/list_response.rb +0 -11
- data/lib/vonage/meetings/rooms.rb +0 -155
- data/lib/vonage/meetings/sessions/list_response.rb +0 -11
- data/lib/vonage/meetings/sessions.rb +0 -28
- data/lib/vonage/meetings/themes/list_response.rb +0 -11
- data/lib/vonage/meetings/themes.rb +0 -218
- data/lib/vonage/meetings.rb +0 -38
- data/lib/vonage/proactive_connect/events/list_response.rb +0 -11
- data/lib/vonage/proactive_connect/events.rb +0 -68
- data/lib/vonage/proactive_connect/item.rb +0 -104
- data/lib/vonage/proactive_connect/items/file_response.rb +0 -32
- data/lib/vonage/proactive_connect/items/list_response.rb +0 -11
- data/lib/vonage/proactive_connect/items.rb +0 -107
- data/lib/vonage/proactive_connect/list.rb +0 -168
- data/lib/vonage/proactive_connect/lists/list_response.rb +0 -11
- data/lib/vonage/proactive_connect/lists.rb +0 -35
- data/lib/vonage/proactive_connect.rb +0 -33
- data/lib/vonage/subaccounts/balance_transfers/list_response.rb +0 -11
- data/lib/vonage/subaccounts/credit_transfers/list_response.rb +0 -11
- data/lib/vonage/subaccounts/list_response.rb +0 -15
- data/lib/vonage/subaccounts.rb +0 -203
- data/lib/vonage/users/list_response.rb +0 -11
- data/lib/vonage/users.rb +0 -156
- data/lib/vonage/verify2/channels/email.rb +0 -38
- data/lib/vonage/verify2/channels/silent_auth.rb +0 -32
- data/lib/vonage/verify2/channels/sms.rb +0 -39
- data/lib/vonage/verify2/channels/voice.rb +0 -32
- data/lib/vonage/verify2/channels/whats_app.rb +0 -38
- data/lib/vonage/verify2/channels/whats_app_interactive.rb +0 -32
- data/lib/vonage/verify2/start_verification_options.rb +0 -62
- data/lib/vonage/verify2/workflow.rb +0 -39
- data/lib/vonage/verify2/workflow_builder.rb +0 -25
- data/lib/vonage/verify2.rb +0 -93
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e003a6ed3211d3eace84884bf3fb03d21b81f097b13aba079f1906daf95380ff
|
4
|
+
data.tar.gz: 956c6921b50df45aaf2f1901b08ccd3cb164c2553b23d8e45570f63dcdf6f960
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1500879cd4a974009f6510cf12ea15b4ce60a9163f916b8a5e07fe785323c24c6909134163b21e29afc9c251550fd36a9e348c2ff7eac3b18b45f0e4ef7e1be1
|
7
|
+
data.tar.gz: fe368d23b897a7f1b2b9ba473c993a351ffb1233ef80304c16ec69ed28692c93e422c7a453f8d0da14b6e038424c215026a945d7ccee9b4a26412e3ecbe5435f
|
data/README.md
CHANGED
@@ -12,14 +12,11 @@ need a Vonage account. Sign up [for free at vonage.com][signup].
|
|
12
12
|
* [Installation](#installation)
|
13
13
|
* [Usage](#usage)
|
14
14
|
* [Logging](#logging)
|
15
|
-
* [Exceptions](#exceptions)
|
16
15
|
* [Overriding the default hosts](#overriding-the-default-hosts)
|
17
16
|
* [JWT authentication](#jwt-authentication)
|
18
17
|
* [Webhook signatures](#webhook-signatures)
|
19
18
|
* [Pagination](#pagination)
|
20
19
|
* [NCCO Builder](#ncco-builder)
|
21
|
-
* [Messages API](#messages-api)
|
22
|
-
* [Verify API v2](#verify-api-v2)
|
23
20
|
* [Documentation](#documentation)
|
24
21
|
* [Frequently Asked Questions](#frequently-asked-questions)
|
25
22
|
* [Supported APIs](#supported-apis)
|
@@ -83,46 +80,6 @@ By default the library sets the logger to `Rails.logger` if it is defined.
|
|
83
80
|
|
84
81
|
To disable logging set the logger to `nil`.
|
85
82
|
|
86
|
-
## Exceptions
|
87
|
-
|
88
|
-
Where exceptions result from an error response from the Vonage API (HTTP responses that aren't ion the range `2xx` or `3xx`), the `Net::HTTPResponse` object will be available as a property of the `Exception` object via a `http_response` getter method (where there is no `Net::HTTPResponse` object associated with the exception, the value of `http_response` will be `nil`).
|
89
|
-
|
90
|
-
You can rescue the the exception to access the `http_response`, as well as use other getters provided for specific parts of the response. For example:
|
91
|
-
|
92
|
-
```ruby
|
93
|
-
begin
|
94
|
-
verification_request = client.verify2.start_verification(
|
95
|
-
brand: 'Acme',
|
96
|
-
workflow: [{channel: 'sms', to: '44700000000'}]
|
97
|
-
)
|
98
|
-
rescue Vonage::APIError => error
|
99
|
-
if error.http_response
|
100
|
-
error.http_response # => #<Net::HTTPUnauthorized 401 Unauthorized readbody=true>
|
101
|
-
error.http_response_code # => "401"
|
102
|
-
error.http_response_headers # => {"date"=>["Sun, 24 Sep 2023 11:08:47 GMT"], ...rest of headers}
|
103
|
-
error.http_response_body # => {"title"=>"Unauthorized", ...rest of body}
|
104
|
-
end
|
105
|
-
end
|
106
|
-
```
|
107
|
-
|
108
|
-
For certain legacy API products, such as the [SMS API](https://developer.vonage.com/en/messaging/sms/overview), [Verify v1 API](https://developer.vonage.com/en/verify/verify-v1/overview) and [Number Insight v1 API](https://developer.vonage.com/en/number-insight/overview), a `200` response is received even in situations where there is an API-related error. For exceptions raised in these situation, rather than a `Net::HTTPResponse` object, a `Vonage::Response` object will be made available as a property of the exception via a `response` getter method. The properties on this object will depend on the response data provided by the API endpoint. For example:
|
109
|
-
|
110
|
-
```ruby
|
111
|
-
begin
|
112
|
-
sms = client.sms.send(
|
113
|
-
from: 'Vonage',
|
114
|
-
to: '44700000000',
|
115
|
-
text: 'Hello World!'
|
116
|
-
)
|
117
|
-
rescue Vonage::Error => error
|
118
|
-
if error.is_a? Vonage::ServiceError
|
119
|
-
error.response # => #<Vonage::Response:0x0000555b2e49d4f8>
|
120
|
-
error.response.messages.first.status # => "4"
|
121
|
-
error.response.messages.first.error_text # => "Bad Credentials"
|
122
|
-
error.response.http_response # => #<Net::HTTPOK 200 OK readbody=true>
|
123
|
-
end
|
124
|
-
end
|
125
|
-
```
|
126
83
|
|
127
84
|
## Overriding the default hosts
|
128
85
|
|
@@ -168,7 +125,7 @@ claims = {
|
|
168
125
|
token = Vonage::JWT.generate(claims)
|
169
126
|
|
170
127
|
client = Vonage::Client.new(token: token)
|
171
|
-
|
128
|
+
````
|
172
129
|
|
173
130
|
Documentation for the Vonage Ruby JWT generator gem can be found at
|
174
131
|
[https://www.rubydoc.info/github/nexmo/nexmo-jwt-ruby](https://www.rubydoc.info/github/nexmo/nexmo-jwt-ruby).
|
@@ -176,115 +133,23 @@ The documentation outlines all the possible parameters you can use to customize
|
|
176
133
|
|
177
134
|
## Webhook signatures
|
178
135
|
|
179
|
-
|
180
|
-
|
181
|
-
### Signature in Request Body
|
182
|
-
|
183
|
-
The [SMS API](https://developer.vonage.com/en/messaging/sms/overview) signs the webhook request using a hash digest. This is assigned to a `sig` parameter in the request body.
|
184
|
-
|
185
|
-
You can verify the webhook request using the `Vonage::SMS#verify_webhook_sig` method. As well as the **request params** from the received webhook, the method also needs access to the signature secret associated with the Vonage account (available from the [Vonage Dashboard](https://dashboard.nexmo.com/settings)), and the signature method used for signing (e.g. `sha512`), again this is based on thes setting in the Dashboard.
|
186
|
-
|
187
|
-
There are a few different ways of providing these values to the method:
|
188
|
-
|
189
|
-
1. Pass all values to the method invocation.
|
190
|
-
|
191
|
-
```ruby
|
192
|
-
client = Vonage::Client.new
|
193
|
-
|
194
|
-
client.sms.verify_webhook_sig(
|
195
|
-
webhook_params: params,
|
196
|
-
signature_secret: 'secret',
|
197
|
-
signature_method: 'sha512'
|
198
|
-
) # => returns true if the signature is valid, false otherwise
|
199
|
-
```
|
200
|
-
|
201
|
-
2. Set `signature_secret` and `signature_method` at `Client` instantiation.
|
202
|
-
|
203
|
-
```ruby
|
204
|
-
client = Vonage::Client.new(
|
205
|
-
signature_secret: 'secret',
|
206
|
-
signature_method: 'sha512'
|
207
|
-
)
|
208
|
-
|
209
|
-
client.sms.verify_webhook_sig(webhook_params: params) # => returns true if the signature is valid, false otherwise
|
210
|
-
```
|
211
|
-
|
212
|
-
3. Set `signature_secret` and `signature_method` on the `Config` object.
|
136
|
+
To check webhook signatures you'll also need to specify the `signature_secret` option. For example:
|
213
137
|
|
214
138
|
```ruby
|
215
139
|
client = Vonage::Client.new
|
216
140
|
client.config.signature_secret = 'secret'
|
217
141
|
client.config.signature_method = 'sha512'
|
218
142
|
|
219
|
-
client.
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
```ruby
|
225
|
-
client = Vonage::Client.new
|
226
|
-
|
227
|
-
client.sms.verify_webhook_sig(webhook_params: params) # => returns true if the signature is valid, false otherwise
|
228
|
-
```
|
229
|
-
|
230
|
-
**Note:** Webhook signing for the SMS API is not switched on by default. You'll need to contact support@vonage.com to enable message signing on your account.
|
231
|
-
|
232
|
-
### Signed JWT in Header
|
233
|
-
|
234
|
-
The [Voice API](https://developer.vonage.com/en/voice/voice-api/overview) and [Messages API](https://developer.vonage.com/en/messages/overview) both include an `Authorization` header in their webhook requests. The value of this header includes a JSON Web Token (JWT) signed using the Signature Secret associated with your Vonage account.
|
235
|
-
|
236
|
-
The `Vonage::Voice` and `Vonage::Messaging` classes both define a `verify_webhook_token` method which can be used to verify the JWT received in the webhook `Authorization` header.
|
237
|
-
|
238
|
-
To verify the JWT, you'll first need to extract it from the `Authorization` header. The header value will look something like the following:
|
239
|
-
|
240
|
-
```ruby
|
241
|
-
"Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE1OTUyN" # remainder of token omitted for brevity
|
242
|
-
```
|
243
|
-
|
244
|
-
Note: we are only interested in the token itself, which comes *after* the word `Bearer` and the space.
|
245
|
-
|
246
|
-
Once you have extrated the token, you can pass it to the `verify_webhook_token` method in order to verify it.
|
247
|
-
|
248
|
-
The method also needs access to the the method also needs access to the signature secret associated with the Vonage account (available from the [Vonage Dashboard](https://dashboard.nexmo.com/settings)). There are a few different ways of providing this value to the method:
|
249
|
-
|
250
|
-
1. Pass all values to the method invocation.
|
251
|
-
|
252
|
-
```ruby
|
253
|
-
client = Vonage::Client.new
|
254
|
-
|
255
|
-
client.voice.verify_webhook_token(
|
256
|
-
token: extracted_token,
|
257
|
-
signature_secret: 'secret'
|
258
|
-
) # => returns true if the token is valid, false otherwise
|
259
|
-
```
|
260
|
-
|
261
|
-
2. Set `signature_secret` at `Client` instantiation.
|
262
|
-
|
263
|
-
```ruby
|
264
|
-
client = Vonage::Client.new(
|
265
|
-
signature_secret: 'secret'
|
266
|
-
)
|
267
|
-
|
268
|
-
client.voice.verify_webhook_token(token: extracted_token) # => returns true if the token is valid, false otherwise
|
269
|
-
```
|
270
|
-
|
271
|
-
3. Set `signature_secret` on the `Config` object.
|
272
|
-
|
273
|
-
```ruby
|
274
|
-
client = Vonage::Client.new
|
275
|
-
client.config.signature_secret = 'secret'
|
276
|
-
client.config.signature_method = 'sha512'
|
277
|
-
|
278
|
-
client.voice.verify_webhook_token(token: extracted_token) # => returns true if the token is valid, false otherwise
|
143
|
+
if client.signature.check(request.GET)
|
144
|
+
# valid signature
|
145
|
+
else
|
146
|
+
# invalid signature
|
147
|
+
end
|
279
148
|
```
|
280
149
|
|
281
|
-
|
150
|
+
Alternatively you can set the `VONAGE_SIGNATURE_SECRET` environment variable.
|
282
151
|
|
283
|
-
|
284
|
-
client = Vonage::Client.new
|
285
|
-
|
286
|
-
client.voice.verify_webhook_token(token: extracted_token) # => returns true if the token is valid, false otherwise
|
287
|
-
```
|
152
|
+
Note: you'll need to contact support@nexmo.com to enable message signing on your account.
|
288
153
|
|
289
154
|
## Pagination
|
290
155
|
|
@@ -355,136 +220,11 @@ Once the message data is created, you can then send the message.
|
|
355
220
|
response = client.messaging.send(to: "447700900000", from: "447700900001", **message)
|
356
221
|
```
|
357
222
|
|
358
|
-
## Verify API v2
|
359
|
-
|
360
|
-
The [Vonage Verify API v2](https://developer.vonage.com/en/verify/verify-v2/overview) allows you to manage 2FA verification workflows over a number of different channels such as SMS, WhatsApp, WhatsApp Interactive, Voice, Email, and Silent Authentication, either individually or in combination with each other. See the Vonage Developer Documentation for a [complete API reference](https://developer.vonage.com/en/api/verify.v2) listing all the channels, verification options, and callback types.
|
361
|
-
|
362
|
-
The Ruby SDK provides two methods for interacting with the Verify v2 API:
|
363
|
-
|
364
|
-
- `Verify2#start_verification`: starts a new verification request. Here you can specify options for the request and the workflow to be used.
|
365
|
-
- `Verify2#check_code`: for channels where the end-user is sent a one-time code, this method is used to verify the code against the `request_id` of the verification request created by the `start_verification` method.
|
366
|
-
|
367
|
-
### Creating a Verify2 Object
|
368
|
-
|
369
|
-
```ruby
|
370
|
-
verify = client.verify2
|
371
|
-
```
|
372
|
-
|
373
|
-
### Making a verification request
|
374
|
-
|
375
|
-
For simple requests, you may prefer to manually set the value for `workflow` (an array of one or more hashes containing the settings for a particular channel) and any optional params.
|
376
|
-
|
377
|
-
Example with the required `:brand` and `:workflow` arguments:
|
378
|
-
|
379
|
-
```ruby
|
380
|
-
verification_request = verify.start_verification(
|
381
|
-
brand: 'Acme',
|
382
|
-
workflow: [{channel: 'sms', to: '447000000000'}]
|
383
|
-
)
|
384
|
-
```
|
385
|
-
|
386
|
-
Example with the required `:brand` and `:workflow` arguments, and an optional `code_length`:
|
387
|
-
|
388
|
-
```ruby
|
389
|
-
verification_request = verify.start_verification(
|
390
|
-
brand: 'Acme',
|
391
|
-
workflow: [{channel: 'sms', to: '447000000000'}],
|
392
|
-
code_length: 6
|
393
|
-
)
|
394
|
-
```
|
395
|
-
|
396
|
-
For more complex requests (e.g. with mutliple workflow channels or addtional options), or to take advantage of built-in input validation, you can use the `StartVerificationOptions` object and the `Workflow` and various channel objects or the `WorkflowBuilder`:
|
397
|
-
|
398
|
-
#### Create options using StartVerificationOptions object
|
399
|
-
|
400
|
-
```ruby
|
401
|
-
opts = verify.start_verification_options(
|
402
|
-
locale: 'fr-fr',
|
403
|
-
code_length: 6,
|
404
|
-
client_ref: 'abc-123'
|
405
|
-
).to_h
|
406
|
-
|
407
|
-
verification_request = verify.start_verification(
|
408
|
-
brand: 'Acme',
|
409
|
-
workflow: [{channel: 'email', to: 'alice.example.com'}],
|
410
|
-
**opts
|
411
|
-
)
|
412
|
-
```
|
413
|
-
|
414
|
-
#### Create workflow using Workflow and Channel objects
|
415
|
-
|
416
|
-
```ruby
|
417
|
-
# Instantiate a Workflow object
|
418
|
-
workflow = verify.workflow
|
419
|
-
|
420
|
-
# Add channels to the workflow
|
421
|
-
workflow << workflow.sms(to: '447000000000')
|
422
|
-
workflow << workflow.email(to: 'alice.example.com')
|
423
|
-
|
424
|
-
# Channel data is encpsulated in channel objects stored in the Workflow list array
|
425
|
-
workflow.list
|
426
|
-
# => [ #<Vonage::Verify2::Channels::SMS:0x0000561474a74778 @channel="sms", @to="447000000000">,
|
427
|
-
#<Vonage::Verify2::Channels::Email:0x0000561474c51a28 @channel="email", @to="alice.example.com">]
|
428
|
-
|
429
|
-
# To use the list as the value for `:workflow` in a `start_verification` request call,
|
430
|
-
# the objects must be hashified
|
431
|
-
workflow_list = workflow.hashified_list
|
432
|
-
# => [{:channel=>"sms", :to=>"447000000000"}, {:channel=>"email", :to=>"alice.example.com"}]
|
433
|
-
|
434
|
-
verification_request = verify.start_verification(brand: 'Acme', workflow: workflow_list)
|
435
|
-
```
|
436
|
-
|
437
|
-
#### Create a workflow using the WorkflowBuilder
|
438
|
-
|
439
|
-
```ruby
|
440
|
-
workflow = verify.workflow_builder.build do |builder|
|
441
|
-
builder.add_voice(to: '447000000001')
|
442
|
-
builder.add_whatsapp(to: '447000000000')
|
443
|
-
end
|
444
|
-
|
445
|
-
workflow_list = workflow.hashified_list
|
446
|
-
# => [{:channel=>"voice", :to=>"447000000001"}, {:channel=>"whatsapp", :to=>"447000000000"}]
|
447
|
-
|
448
|
-
verification_request = verify.start_verification(brand: 'Acme', workflow: workflow_list)
|
449
|
-
```
|
450
|
-
|
451
|
-
### Cancelling a request
|
452
|
-
|
453
|
-
You can cancel in in-progress verification request
|
454
|
-
|
455
|
-
```ruby
|
456
|
-
# Get the `request_id` from the Vonage#Response object returned by the `start_verification` method call
|
457
|
-
request_id = verification_request.request_id
|
458
|
-
|
459
|
-
verify.cancel_verification_request(request_id: request_id)
|
460
|
-
```
|
461
|
-
|
462
|
-
### Checking a code
|
463
|
-
|
464
|
-
```ruby
|
465
|
-
# Get the `request_id` from the Vonage#Response object returned by the `start_verification` method call
|
466
|
-
request_id = verification_request.request_id
|
467
|
-
|
468
|
-
# Get the one-time code via user input
|
469
|
-
# e.g. from params in a route handler or controller action for a form input
|
470
|
-
code = params[:code]
|
471
|
-
|
472
|
-
begin
|
473
|
-
code_check = verify.check_code(request_id: request_id, code: code)
|
474
|
-
rescue => error
|
475
|
-
# an invalid code will raise an exception of type Vonage::ClientError
|
476
|
-
end
|
477
|
-
|
478
|
-
if code_check.http_response.code == '200'
|
479
|
-
# code is valid
|
480
|
-
end
|
481
|
-
```
|
482
|
-
|
483
223
|
## Documentation
|
484
224
|
|
485
225
|
Vonage Ruby documentation: https://www.rubydoc.info/github/Vonage/vonage-ruby-sdk
|
486
226
|
|
487
|
-
Vonage Ruby code examples: https://github.com/
|
227
|
+
Vonage Ruby code examples: https://github.com/Nexmo/nexmo-ruby-code-snippets
|
488
228
|
|
489
229
|
Vonage APIs API reference: https://developer.nexmo.com/api
|
490
230
|
|
@@ -512,7 +252,6 @@ The following is a list of Vonage APIs and whether the Ruby SDK provides support
|
|
512
252
|
| Reports API | Beta |❌|
|
513
253
|
| SMS API | General Availability |✅|
|
514
254
|
| Verify API | General Availability |✅|
|
515
|
-
| Verify API v2 | General Availability |✅|
|
516
255
|
| Voice API | General Availability |✅|
|
517
256
|
|
518
257
|
## License
|
data/lib/vonage/applications.rb
CHANGED
@@ -33,8 +33,6 @@ module Vonage
|
|
33
33
|
#
|
34
34
|
# response = client.applications.create(params)
|
35
35
|
#
|
36
|
-
# @param [Hash] params
|
37
|
-
#
|
38
36
|
# @option params [required, String] :name
|
39
37
|
# Application name.
|
40
38
|
#
|
@@ -46,9 +44,7 @@ module Vonage
|
|
46
44
|
# This contains the configuration for each product.
|
47
45
|
# This replaces the application `type` from version 1 of the Application API.
|
48
46
|
#
|
49
|
-
# @
|
50
|
-
# - **:improve_ai** (Boolean) If set to `true``, Vonage may store and use your content and data for the improvement
|
51
|
-
# of Vonage's AI based services and technologies.
|
47
|
+
# @param [Hash] params
|
52
48
|
#
|
53
49
|
# @return [Response]
|
54
50
|
#
|
@@ -77,7 +73,7 @@ module Vonage
|
|
77
73
|
# Set this to `false` to not auto-advance through all the pages in the record
|
78
74
|
# and collect all the data. The default is `true`.
|
79
75
|
# @param [Hash] params
|
80
|
-
#
|
76
|
+
#
|
81
77
|
# @return [ListResponse]
|
82
78
|
#
|
83
79
|
# @see https://developer.nexmo.com/api/application.v2#listApplication
|
@@ -113,9 +109,6 @@ module Vonage
|
|
113
109
|
# @example
|
114
110
|
# response = client.applications.update(id, answer_method: 'POST')
|
115
111
|
#
|
116
|
-
# @param [String] id
|
117
|
-
# @param [Hash] params
|
118
|
-
#
|
119
112
|
# @option params [required, String] :name
|
120
113
|
# Application name.
|
121
114
|
#
|
@@ -127,9 +120,8 @@ module Vonage
|
|
127
120
|
# This contains the configuration for each product.
|
128
121
|
# This replaces the application `type` from version 1 of the Application API.
|
129
122
|
#
|
130
|
-
# @
|
131
|
-
#
|
132
|
-
# of Vonage's AI based services and technologies.
|
123
|
+
# @param [String] id
|
124
|
+
# @param [Hash] params
|
133
125
|
#
|
134
126
|
# @return [Response]
|
135
127
|
#
|
data/lib/vonage/client.rb
CHANGED
@@ -61,13 +61,6 @@ module Vonage
|
|
61
61
|
@files ||= T.let(Files.new(config), T.nilable(Vonage::Files))
|
62
62
|
end
|
63
63
|
|
64
|
-
# @return [Meetings]
|
65
|
-
#
|
66
|
-
sig { returns(T.nilable(Vonage::Meetings)) }
|
67
|
-
def meetings
|
68
|
-
@meetings ||= T.let(Meetings.new(config), T.nilable(Vonage::Meetings))
|
69
|
-
end
|
70
|
-
|
71
64
|
# @return [Messages]
|
72
65
|
#
|
73
66
|
sig { returns(T.nilable(Vonage::Messages)) }
|
@@ -103,13 +96,6 @@ module Vonage
|
|
103
96
|
@pricing ||= T.let(PricingTypes.new(config), T.nilable(Vonage::PricingTypes))
|
104
97
|
end
|
105
98
|
|
106
|
-
# @return [ProactiveConnect]
|
107
|
-
#
|
108
|
-
sig { returns(T.nilable(Vonage::ProactiveConnect)) }
|
109
|
-
def proactive_connect
|
110
|
-
@proactive_connect ||= T.let(ProactiveConnect.new(config), T.nilable(Vonage::ProactiveConnect))
|
111
|
-
end
|
112
|
-
|
113
99
|
# @return [Redact]
|
114
100
|
#
|
115
101
|
sig { returns(T.nilable(Vonage::Redact)) }
|
@@ -131,13 +117,6 @@ module Vonage
|
|
131
117
|
@sms ||= T.let(SMS.new(config), T.nilable(Vonage::SMS))
|
132
118
|
end
|
133
119
|
|
134
|
-
# @return [Subaccounts]
|
135
|
-
#
|
136
|
-
sig { returns(T.nilable(Vonage::Subaccounts)) }
|
137
|
-
def subaccounts
|
138
|
-
@subaccounts ||= T.let(Subaccounts.new(config), T.nilable(Vonage::Subaccounts))
|
139
|
-
end
|
140
|
-
|
141
120
|
# @return [TFA]
|
142
121
|
#
|
143
122
|
sig { returns(T.nilable(Vonage::TFA)) }
|
@@ -145,13 +124,6 @@ module Vonage
|
|
145
124
|
@tfa ||= T.let(TFA.new(config), T.nilable(Vonage::TFA))
|
146
125
|
end
|
147
126
|
|
148
|
-
# @return [Users]
|
149
|
-
#
|
150
|
-
sig { returns(T.nilable(Vonage::Users)) }
|
151
|
-
def users
|
152
|
-
@users ||= T.let(Users.new(config), T.nilable(Vonage::Users))
|
153
|
-
end
|
154
|
-
|
155
127
|
# @return [Verify]
|
156
128
|
#
|
157
129
|
sig { returns(T.nilable(Vonage::Verify)) }
|
@@ -159,11 +131,11 @@ module Vonage
|
|
159
131
|
@verify ||= T.let(Verify.new(config), T.nilable(Vonage::Verify))
|
160
132
|
end
|
161
133
|
|
162
|
-
# @return [
|
134
|
+
# @return [Video]
|
163
135
|
#
|
164
|
-
sig { returns(T.nilable(Vonage::
|
165
|
-
def
|
166
|
-
@
|
136
|
+
sig { returns(T.nilable(Vonage::Video)) }
|
137
|
+
def video
|
138
|
+
@video ||= T.let(Video.new(config), T.nilable(Vonage::Video))
|
167
139
|
end
|
168
140
|
|
169
141
|
# @return [Voice]
|
data/lib/vonage/client_error.rb
CHANGED
data/lib/vonage/config.rb
CHANGED
@@ -18,7 +18,7 @@ module Vonage
|
|
18
18
|
self.signature_secret = ENV['VONAGE_SIGNATURE_SECRET']
|
19
19
|
self.signature_method = ENV['VONAGE_SIGNATURE_METHOD'] || 'md5hash'
|
20
20
|
self.token = T.let(nil, T.nilable(String))
|
21
|
-
self.
|
21
|
+
self.video_host = 'video.api.vonage.com'
|
22
22
|
end
|
23
23
|
|
24
24
|
# Merges the config with the given options hash.
|
@@ -130,11 +130,7 @@ module Vonage
|
|
130
130
|
|
131
131
|
# @return [Vonage::Logger]
|
132
132
|
#
|
133
|
-
sig { params(logger: T.nilable(
|
134
|
-
defined?(ActiveSupport::BroadcastLogger) ?
|
135
|
-
T.any(::Logger, Vonage::Logger, ActiveSupport::BroadcastLogger)
|
136
|
-
: T.any(::Logger, Vonage::Logger)
|
137
|
-
)).returns(T.nilable(Vonage::Logger)) }
|
133
|
+
sig { params(logger: T.nilable(T.any(::Logger, Vonage::Logger))).returns(T.nilable(Vonage::Logger)) }
|
138
134
|
def logger=(logger)
|
139
135
|
@logger = T.let(Logger.new(logger), T.nilable(Vonage::Logger))
|
140
136
|
end
|
@@ -204,7 +200,7 @@ module Vonage
|
|
204
200
|
attr_writer :token
|
205
201
|
|
206
202
|
sig { returns(String) }
|
207
|
-
attr_accessor :
|
203
|
+
attr_accessor :video_host
|
208
204
|
|
209
205
|
protected
|
210
206
|
|
data/lib/vonage/errors.rb
CHANGED
@@ -1,25 +1,14 @@
|
|
1
1
|
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
|
-
require
|
3
|
+
require 'json'
|
4
4
|
|
5
5
|
module Vonage
|
6
6
|
module Errors
|
7
7
|
extend T::Sig
|
8
8
|
|
9
|
-
sig
|
10
|
-
params(
|
11
|
-
response:
|
12
|
-
T.any(
|
13
|
-
Net::HTTPUnauthorized,
|
14
|
-
Net::HTTPClientError,
|
15
|
-
Net::HTTPServerError,
|
16
|
-
T.untyped
|
17
|
-
)
|
18
|
-
).returns(Vonage::Error)
|
19
|
-
end
|
9
|
+
sig {params(response: T.any(Net::HTTPUnauthorized, Net::HTTPClientError, Net::HTTPServerError, T.untyped)).returns(Vonage::Error)}
|
20
10
|
def self.parse(response)
|
21
|
-
exception_class =
|
22
|
-
case response
|
11
|
+
exception_class = case response
|
23
12
|
when Net::HTTPUnauthorized
|
24
13
|
AuthenticationError
|
25
14
|
when Net::HTTPClientError
|
@@ -27,40 +16,34 @@ module Vonage
|
|
27
16
|
when Net::HTTPServerError
|
28
17
|
ServerError
|
29
18
|
else
|
30
|
-
|
19
|
+
Error
|
31
20
|
end
|
32
21
|
|
33
|
-
message = response.content_type
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
hash
|
43
|
-
|
44
|
-
|
45
|
-
elsif hash.key?("description")
|
46
|
-
hash["description"]
|
47
|
-
elsif hash.key?("message")
|
48
|
-
hash["message"]
|
49
|
-
elsif problem_details?(hash)
|
50
|
-
problem_details_message(hash)
|
51
|
-
else
|
52
|
-
""
|
22
|
+
message = if response.content_type == 'application/json'
|
23
|
+
hash = ::JSON.parse(response.body)
|
24
|
+
|
25
|
+
if hash.key?('error_title')
|
26
|
+
hash['error_title']
|
27
|
+
elsif hash.key?('error-code-label')
|
28
|
+
hash['error-code-label']
|
29
|
+
elsif hash.key?('description')
|
30
|
+
hash['description']
|
31
|
+
elsif problem_details?(hash)
|
32
|
+
problem_details_message(hash)
|
33
|
+
end
|
53
34
|
end
|
35
|
+
|
36
|
+
exception_class.new(message)
|
54
37
|
end
|
55
38
|
|
56
39
|
sig { params(hash: T::Hash[String, T.untyped]).returns(T::Boolean) }
|
57
40
|
def self.problem_details?(hash)
|
58
|
-
hash.key?(
|
41
|
+
hash.key?('title') && hash.key?('detail') && hash.key?('type')
|
59
42
|
end
|
60
43
|
|
61
44
|
sig { params(hash: T::Hash[String, T.untyped]).returns(String) }
|
62
45
|
def self.problem_details_message(hash)
|
63
|
-
"#{hash[
|
46
|
+
"#{hash['title']}. #{hash['detail']} See #{hash['type']} for more info, or email support@nexmo.com if you have any questions."
|
64
47
|
end
|
65
48
|
end
|
66
49
|
|
data/lib/vonage/gsm7.rb
CHANGED
@@ -4,7 +4,7 @@ module Vonage
|
|
4
4
|
module GSM7
|
5
5
|
extend T::Sig
|
6
6
|
|
7
|
-
CHARACTERS = "\n\f\r !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_abcdefghijklmnopqrstuvwxyz{|}~
|
7
|
+
CHARACTERS = "\n\f\r !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_abcdefghijklmnopqrstuvwxyz{|}~ ¡£¤¥§¿ÄÅÆÉÑÖØÜßàäåæçèéìñòöøùüΓΔΘΛΞΠΣΦΨΩ€"
|
8
8
|
|
9
9
|
REGEXP = /\A[#{Regexp.escape(CHARACTERS)}]*\z/
|
10
10
|
|
data/lib/vonage/jwt.rb
CHANGED
@@ -39,22 +39,5 @@ module Vonage
|
|
39
39
|
payload[:private_key] = private_key if private_key && !payload[:private_key]
|
40
40
|
@token = Vonage::JWTBuilder.new(payload).jwt.generate
|
41
41
|
end
|
42
|
-
|
43
|
-
# Validate a JSON Web Token from a Vonage Webhook.
|
44
|
-
#
|
45
|
-
# Certain Vonage APIs include a JWT signed with a user's account signature secret in
|
46
|
-
# the Authorization header of Webhook requests. This method can be used to verify that those requests originate
|
47
|
-
# from the Vonage API.
|
48
|
-
#
|
49
|
-
# @param [String, required] :token The JWT from the Webhook's Authorization header
|
50
|
-
# @param [String, required] :signature_secret The account signature secret
|
51
|
-
#
|
52
|
-
# @return [Boolean] true, if the JWT is verified, false otherwise
|
53
|
-
#
|
54
|
-
# @see https://developer.vonage.com/en/getting-started/concepts/webhooks#decoding-signed-webhooks
|
55
|
-
#
|
56
|
-
def self.verify_hs256_signature(token:, signature_secret:)
|
57
|
-
verify_signature(token, signature_secret, 'HS256')
|
58
|
-
end
|
59
42
|
end
|
60
43
|
end
|
data/lib/vonage/keys.rb
CHANGED
@@ -21,7 +21,13 @@ module Vonage
|
|
21
21
|
'voice_callback_value',
|
22
22
|
'voice_status_callback',
|
23
23
|
'messages_callback_value',
|
24
|
-
'messages_callback_type'
|
24
|
+
'messages_callback_type',
|
25
|
+
'add_stream',
|
26
|
+
'has_audio',
|
27
|
+
'has_video',
|
28
|
+
'remove_stream',
|
29
|
+
'screenshare_type',
|
30
|
+
'archive_mode'
|
25
31
|
]
|
26
32
|
hash.transform_keys do |k|
|
27
33
|
if exceptions.include?(k.to_s)
|
data/lib/vonage/logger.rb
CHANGED
@@ -7,11 +7,7 @@ module Vonage
|
|
7
7
|
class Logger
|
8
8
|
extend T::Sig
|
9
9
|
|
10
|
-
sig { params(logger: T.nilable(
|
11
|
-
defined?(ActiveSupport::BroadcastLogger) ?
|
12
|
-
T.any(::Logger, Vonage::Logger, ActiveSupport::BroadcastLogger)
|
13
|
-
: T.any(::Logger, Vonage::Logger)
|
14
|
-
)).void }
|
10
|
+
sig { params(logger: T.nilable(T.any(::Logger, Vonage::Logger))).void }
|
15
11
|
def initialize(logger)
|
16
12
|
@logger = logger || ::Logger.new(nil)
|
17
13
|
end
|
@@ -24,6 +20,8 @@ module Vonage
|
|
24
20
|
|
25
21
|
sig { params(request: T.any(Net::HTTP::Post, Net::HTTP::Get, Net::HTTP::Delete, Net::HTTP::Put, Net::HTTP::Patch)).void }
|
26
22
|
def log_request_info(request)
|
23
|
+
@logger = T.let(@logger, T.nilable(T.any(::Logger, Vonage::Logger)))
|
24
|
+
|
27
25
|
T.must(@logger).info do
|
28
26
|
format('Vonage API request', {
|
29
27
|
method: request.method,
|