vonage 7.2.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 +7 -0
- data/LICENSE.txt +190 -0
- data/README.md +191 -0
- data/lib/vonage.rb +29 -0
- data/lib/vonage/abstract_authentication.rb +9 -0
- data/lib/vonage/account.rb +61 -0
- data/lib/vonage/alerts.rb +72 -0
- data/lib/vonage/applications.rb +148 -0
- data/lib/vonage/applications/list_response.rb +11 -0
- data/lib/vonage/authentication_error.rb +6 -0
- data/lib/vonage/basic.rb +13 -0
- data/lib/vonage/bearer_token.rb +14 -0
- data/lib/vonage/client.rb +134 -0
- data/lib/vonage/client_error.rb +6 -0
- data/lib/vonage/config.rb +208 -0
- data/lib/vonage/conversations.rb +210 -0
- data/lib/vonage/conversations/events.rb +73 -0
- data/lib/vonage/conversations/legs.rb +30 -0
- data/lib/vonage/conversations/members.rb +104 -0
- data/lib/vonage/conversations/users.rb +93 -0
- data/lib/vonage/conversions.rb +19 -0
- data/lib/vonage/entity.rb +51 -0
- data/lib/vonage/error.rb +6 -0
- data/lib/vonage/errors.rb +51 -0
- data/lib/vonage/files.rb +26 -0
- data/lib/vonage/form_data.rb +11 -0
- data/lib/vonage/gsm7.rb +13 -0
- data/lib/vonage/http.rb +43 -0
- data/lib/vonage/json.rb +17 -0
- data/lib/vonage/jwt.rb +43 -0
- data/lib/vonage/key_secret_params.rb +20 -0
- data/lib/vonage/keys.rb +51 -0
- data/lib/vonage/logger.rb +60 -0
- data/lib/vonage/messages.rb +25 -0
- data/lib/vonage/namespace.rb +118 -0
- data/lib/vonage/number_insight.rb +140 -0
- data/lib/vonage/numbers.rb +196 -0
- data/lib/vonage/numbers/list_response.rb +11 -0
- data/lib/vonage/numbers/response.rb +8 -0
- data/lib/vonage/params.rb +27 -0
- data/lib/vonage/pricing.rb +30 -0
- data/lib/vonage/pricing_types.rb +18 -0
- data/lib/vonage/redact.rb +37 -0
- data/lib/vonage/response.rb +25 -0
- data/lib/vonage/secrets.rb +85 -0
- data/lib/vonage/secrets/list_response.rb +11 -0
- data/lib/vonage/server_error.rb +6 -0
- data/lib/vonage/signature.rb +53 -0
- data/lib/vonage/sms.rb +121 -0
- data/lib/vonage/tfa.rb +14 -0
- data/lib/vonage/user_agent.rb +16 -0
- data/lib/vonage/verify.rb +253 -0
- data/lib/vonage/version.rb +5 -0
- data/lib/vonage/voice.rb +250 -0
- data/lib/vonage/voice/dtmf.rb +26 -0
- data/lib/vonage/voice/list_response.rb +11 -0
- data/lib/vonage/voice/stream.rb +44 -0
- data/lib/vonage/voice/talk.rb +48 -0
- data/vonage.gemspec +26 -0
- metadata +155 -0
@@ -0,0 +1,118 @@
|
|
1
|
+
# typed: ignore
|
2
|
+
# frozen_string_literal: true
|
3
|
+
require 'net/http'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
module Vonage
|
7
|
+
class Namespace
|
8
|
+
def initialize(config)
|
9
|
+
@config = config
|
10
|
+
|
11
|
+
@host = self.class.host == :api_host ? @config.api_host : @config.rest_host
|
12
|
+
|
13
|
+
@http = Net::HTTP.new(@host, Net::HTTP.https_default_port, p_addr = nil)
|
14
|
+
@http.use_ssl = true
|
15
|
+
|
16
|
+
@config.http.set(@http) unless @config.http.nil?
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.host
|
20
|
+
@host ||= :api_host
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.host=(host)
|
24
|
+
raise ArgumentError unless host == :rest_host
|
25
|
+
|
26
|
+
@host = host
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.authentication
|
30
|
+
@authentication ||= KeySecretParams
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.authentication=(authentication)
|
34
|
+
@authentication = authentication
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.request_body
|
38
|
+
@request_body ||= FormData
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.request_body=(request_body)
|
42
|
+
@request_body = request_body
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.request_headers
|
46
|
+
@request_headers ||= {}
|
47
|
+
end
|
48
|
+
|
49
|
+
protected
|
50
|
+
|
51
|
+
Get = Net::HTTP::Get
|
52
|
+
Put = Net::HTTP::Put
|
53
|
+
Post = Net::HTTP::Post
|
54
|
+
Delete = Net::HTTP::Delete
|
55
|
+
|
56
|
+
def request(path, params: nil, type: Get, response_class: Response, &block)
|
57
|
+
uri = URI('https://' + @host + path)
|
58
|
+
|
59
|
+
params ||= {}
|
60
|
+
|
61
|
+
authentication = self.class.authentication.new(@config)
|
62
|
+
authentication.update(params)
|
63
|
+
|
64
|
+
unless type::REQUEST_HAS_BODY || params.empty?
|
65
|
+
uri.query = Params.encode(params)
|
66
|
+
end
|
67
|
+
|
68
|
+
authentication.update(uri)
|
69
|
+
|
70
|
+
message = type.new(uri)
|
71
|
+
|
72
|
+
message['User-Agent'] = UserAgent.string(@config.app_name, @config.app_version)
|
73
|
+
|
74
|
+
self.class.request_headers.each do |key, value|
|
75
|
+
message[key] = value
|
76
|
+
end
|
77
|
+
|
78
|
+
authentication.update(message)
|
79
|
+
|
80
|
+
self.class.request_body.update(message, params) if type::REQUEST_HAS_BODY
|
81
|
+
|
82
|
+
logger.log_request_info(message)
|
83
|
+
|
84
|
+
response = @http.request(message, &block)
|
85
|
+
|
86
|
+
logger.log_response_info(response, @host)
|
87
|
+
|
88
|
+
return if block
|
89
|
+
|
90
|
+
logger.debug(response.body) if response.body
|
91
|
+
|
92
|
+
parse(response, response_class)
|
93
|
+
end
|
94
|
+
|
95
|
+
def parse(response, response_class)
|
96
|
+
case response
|
97
|
+
when Net::HTTPNoContent
|
98
|
+
response_class.new(nil, response)
|
99
|
+
when Net::HTTPSuccess
|
100
|
+
if response['Content-Type'].split(';').first == 'application/json'
|
101
|
+
entity = ::JSON.parse(response.body, object_class: Vonage::Entity)
|
102
|
+
|
103
|
+
response_class.new(entity, response)
|
104
|
+
else
|
105
|
+
response_class.new(nil, response)
|
106
|
+
end
|
107
|
+
else
|
108
|
+
raise Errors.parse(response)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def logger
|
113
|
+
@config.logger
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
private_constant :Namespace
|
118
|
+
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
# typed: true
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Vonage
|
5
|
+
class NumberInsight < Namespace
|
6
|
+
# Provides basic number insight information about a number.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# response = client.number_insight.basic(number: '447700900000')
|
10
|
+
#
|
11
|
+
# @option params [required, String] :number
|
12
|
+
# A single phone number that you need insight about in national or international format.
|
13
|
+
#
|
14
|
+
# @option params [String] :country
|
15
|
+
# If a number does not have a country code or is uncertain, set the two-character country code.
|
16
|
+
# This code must be in ISO 3166-1 alpha-2 format and in upper case. For example, GB or US.
|
17
|
+
# If you set country and number is already in E.164 format, country must match the country code in number.
|
18
|
+
#
|
19
|
+
# @param [Hash] params
|
20
|
+
#
|
21
|
+
# @return [Response]
|
22
|
+
#
|
23
|
+
# @see https://developer.nexmo.com/api/number-insight#getNumberInsightBasic
|
24
|
+
#
|
25
|
+
def basic(params)
|
26
|
+
response = request('/ni/basic/json', params: params)
|
27
|
+
|
28
|
+
raise Error, response[:status_message] unless response.status.zero?
|
29
|
+
|
30
|
+
response
|
31
|
+
end
|
32
|
+
|
33
|
+
# Provides standard number insight information about a number.
|
34
|
+
#
|
35
|
+
# @example
|
36
|
+
# response = client.number_insight.standard(number: '447700900000')
|
37
|
+
#
|
38
|
+
# @option params [required, String] :number
|
39
|
+
# A single phone number that you need insight about in national or international format.
|
40
|
+
#
|
41
|
+
# @option params [String] :country
|
42
|
+
# If a number does not have a country code or is uncertain, set the two-character country code.
|
43
|
+
# This code must be in ISO 3166-1 alpha-2 format and in upper case. For example, GB or US.
|
44
|
+
# If you set country and number is already in E.164 format, country must match the country code in number.
|
45
|
+
#
|
46
|
+
# @option params [Boolean] :cnam
|
47
|
+
# Indicates if the name of the person who owns the phone number should be looked up and returned in the response.
|
48
|
+
# Set to true to receive phone number owner name in the response.
|
49
|
+
# This features is available for US numbers only and incurs an additional charge.
|
50
|
+
#
|
51
|
+
# @param [Hash] params
|
52
|
+
#
|
53
|
+
# @return [Response]
|
54
|
+
#
|
55
|
+
# @see https://developer.nexmo.com/api/number-insight#getNumberInsightStandard
|
56
|
+
#
|
57
|
+
def standard(params)
|
58
|
+
response = request('/ni/standard/json', params: params)
|
59
|
+
|
60
|
+
raise Error, response[:status_message] unless response.status.zero?
|
61
|
+
|
62
|
+
response
|
63
|
+
end
|
64
|
+
|
65
|
+
# Provides advanced number insight information about a number synchronously.
|
66
|
+
#
|
67
|
+
# @example
|
68
|
+
# response = client.number_insight.advanced(number: '447700900000')
|
69
|
+
#
|
70
|
+
# @option params [required, String] :number
|
71
|
+
# A single phone number that you need insight about in national or international format.
|
72
|
+
#
|
73
|
+
# @option params [String] :country
|
74
|
+
# If a number does not have a country code or is uncertain, set the two-character country code.
|
75
|
+
# This code must be in ISO 3166-1 alpha-2 format and in upper case. For example, GB or US.
|
76
|
+
# If you set country and number is already in E.164 format, country must match the country code in number.
|
77
|
+
#
|
78
|
+
# @option params [Boolean] :cnam
|
79
|
+
# Indicates if the name of the person who owns the phone number should be looked up and returned in the response.
|
80
|
+
# Set to true to receive phone number owner name in the response.
|
81
|
+
# This features is available for US numbers only and incurs an additional charge.
|
82
|
+
#
|
83
|
+
# @option params [String] :ip
|
84
|
+
# The IP address of the user.
|
85
|
+
# If supplied, we will compare this to the country the user's phone is located in and return an error if it does not match.
|
86
|
+
#
|
87
|
+
# @param [Hash] params
|
88
|
+
#
|
89
|
+
# @return [Response]
|
90
|
+
#
|
91
|
+
# @see https://developer.nexmo.com/api/number-insight#getNumberInsightAdvanced
|
92
|
+
#
|
93
|
+
def advanced(params)
|
94
|
+
response = request('/ni/advanced/json', params: params)
|
95
|
+
|
96
|
+
raise Error, response[:status_message] unless response.status.zero?
|
97
|
+
|
98
|
+
response
|
99
|
+
end
|
100
|
+
|
101
|
+
# Provides advanced number insight number information *asynchronously* using the URL specified in the callback parameter.
|
102
|
+
#
|
103
|
+
# @example
|
104
|
+
# response = client.number_insight.advanced_async(number: '447700900000', callback: webhook_url)
|
105
|
+
#
|
106
|
+
# @option params [required, String] :callback
|
107
|
+
# The callback URL.
|
108
|
+
#
|
109
|
+
# @option params [required, String] :number
|
110
|
+
# A single phone number that you need insight about in national or international format.
|
111
|
+
#
|
112
|
+
# @option params [String] :country
|
113
|
+
# If a number does not have a country code or is uncertain, set the two-character country code.
|
114
|
+
# This code must be in ISO 3166-1 alpha-2 format and in upper case. For example, GB or US.
|
115
|
+
# If you set country and number is already in E.164 format, country must match the country code in number.
|
116
|
+
#
|
117
|
+
# @option params [Boolean] :cnam
|
118
|
+
# Indicates if the name of the person who owns the phone number should be looked up and returned in the response.
|
119
|
+
# Set to true to receive phone number owner name in the response.
|
120
|
+
# This features is available for US numbers only and incurs an additional charge.
|
121
|
+
#
|
122
|
+
# @option params [String] :ip
|
123
|
+
# The IP address of the user.
|
124
|
+
# If supplied, we will compare this to the country the user's phone is located in and return an error if it does not match.
|
125
|
+
#
|
126
|
+
# @param [Hash] params
|
127
|
+
#
|
128
|
+
# @return [Response]
|
129
|
+
#
|
130
|
+
# @see https://developer.nexmo.com/api/number-insight#getNumberInsightAsync
|
131
|
+
#
|
132
|
+
def advanced_async(params)
|
133
|
+
response = request('/ni/advanced/async/json', params: params)
|
134
|
+
|
135
|
+
raise Error, response[:status_message] unless response.status.zero?
|
136
|
+
|
137
|
+
response
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
@@ -0,0 +1,196 @@
|
|
1
|
+
# typed: true
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Vonage
|
5
|
+
class Numbers < Namespace
|
6
|
+
include Keys
|
7
|
+
|
8
|
+
self.host = :rest_host
|
9
|
+
|
10
|
+
# Retrieve all the inbound numbers associated with your Vonage account.
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# response = client.numbers.list
|
14
|
+
# response.each do |item|
|
15
|
+
# puts "#{item.msisdn} #{item.country} #{item.type}"
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# @option params [String] :application_id
|
19
|
+
# The application that you want to return the numbers for.
|
20
|
+
#
|
21
|
+
# @option params [Boolean] :has_application
|
22
|
+
# Set this optional field to `true` to restrict your results to numbers associated with an application (any application).
|
23
|
+
# Set to `false` to find all numbers not associated with any application.
|
24
|
+
# Omit the field to avoid filtering on whether or not the number is assigned to an application.
|
25
|
+
#
|
26
|
+
# @option params [String] :country
|
27
|
+
# The two character country code to filter on (in ISO 3166-1 alpha-2 format).
|
28
|
+
#
|
29
|
+
# @option params [String] :pattern
|
30
|
+
# The number pattern you want to search for. Use in conjunction with **:search_pattern**.
|
31
|
+
#
|
32
|
+
# @option params [Integer] :search_pattern
|
33
|
+
# The strategy you want to use for matching:
|
34
|
+
# - `0` - Search for numbers that start with **:pattern**
|
35
|
+
# - `1` - Search for numbers that contain **:pattern**
|
36
|
+
# - `2` - Search for numbers that end with **:pattern**
|
37
|
+
#
|
38
|
+
# @option params [Integer] :size
|
39
|
+
# Page size.
|
40
|
+
#
|
41
|
+
# @option params [Integer] :index
|
42
|
+
# Page index.
|
43
|
+
#
|
44
|
+
# @param [Hash] params
|
45
|
+
#
|
46
|
+
# @return [ListResponse]
|
47
|
+
#
|
48
|
+
# @see https://developer.nexmo.com/api/developer/numbers#getOwnedNumbers
|
49
|
+
#
|
50
|
+
def list(params = nil)
|
51
|
+
request('/account/numbers', params: params, response_class: ListResponse)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Retrieve inbound numbers that are available for the specified country.
|
55
|
+
#
|
56
|
+
# @example
|
57
|
+
# response = client.numbers.search(country: 'GB')
|
58
|
+
# response.each do |item|
|
59
|
+
# puts "#{item.msisdn} #{item.type} #{item.cost}"
|
60
|
+
# end
|
61
|
+
#
|
62
|
+
# @option params [required, String] :country
|
63
|
+
# The two character country code in ISO 3166-1 alpha-2 format.
|
64
|
+
#
|
65
|
+
# @option params [String] :type
|
66
|
+
# Set this parameter to filter the type of number, such as mobile or landline.
|
67
|
+
#
|
68
|
+
# @option params [String] :pattern
|
69
|
+
# The number pattern you want to search for.
|
70
|
+
# Use in conjunction with **:search_pattern**.
|
71
|
+
#
|
72
|
+
# @option params [Integer] :search_pattern
|
73
|
+
# The strategy you want to use for matching:
|
74
|
+
# - `0` - Search for numbers that start with **:pattern**
|
75
|
+
# - `1` - Search for numbers that contain **:pattern**
|
76
|
+
# - `2` - Search for numbers that end with **:pattern**
|
77
|
+
#
|
78
|
+
# @option params [String] :features
|
79
|
+
# Available features are `SMS` and `VOICE`.
|
80
|
+
# To look for numbers that support both, use a comma-separated value: `SMS,VOICE`.
|
81
|
+
#
|
82
|
+
# @option params [Integer] :size
|
83
|
+
# Page size.
|
84
|
+
#
|
85
|
+
# @option params [Integer] :index
|
86
|
+
# Page index.
|
87
|
+
#
|
88
|
+
# @param [Hash] params
|
89
|
+
#
|
90
|
+
# @return [ListResponse]
|
91
|
+
#
|
92
|
+
# @see https://developer.nexmo.com/api/developer/numbers#getAvailableNumbers
|
93
|
+
#
|
94
|
+
def search(params)
|
95
|
+
request('/number/search', params: params, response_class: ListResponse)
|
96
|
+
end
|
97
|
+
|
98
|
+
# Request to purchase a specific inbound number.
|
99
|
+
#
|
100
|
+
# @example
|
101
|
+
# response = client.numbers.buy(country: 'GB', msisdn: '447700900000')
|
102
|
+
#
|
103
|
+
# @option params [required, String] :country
|
104
|
+
# The two character country code in ISO 3166-1 alpha-2 format.
|
105
|
+
#
|
106
|
+
# @option params [required, String] :msisdn
|
107
|
+
# An available inbound virtual number.
|
108
|
+
#
|
109
|
+
# @option params [String] :target_api_key
|
110
|
+
# If you'd like to perform an action on a subaccount, provide the `api_key` of that account here.
|
111
|
+
# If you'd like to perform an action on your own account, you do not need to provide this field.
|
112
|
+
#
|
113
|
+
# @param [Hash] params
|
114
|
+
#
|
115
|
+
# @return [Response]
|
116
|
+
#
|
117
|
+
# @see https://developer.nexmo.com/api/developer/numbers#buyANumber
|
118
|
+
#
|
119
|
+
def buy(params)
|
120
|
+
request('/number/buy', params: params, type: Post, response_class: Response)
|
121
|
+
end
|
122
|
+
|
123
|
+
# Cancel your subscription for a specific inbound number.
|
124
|
+
#
|
125
|
+
# @example
|
126
|
+
# response = client.numbers.cancel(country: 'GB', msisdn: '447700900000')
|
127
|
+
#
|
128
|
+
# @option params [required, String] :country
|
129
|
+
# The two character country code in ISO 3166-1 alpha-2 format.
|
130
|
+
#
|
131
|
+
# @option params [required, String] :msisdn
|
132
|
+
# An available inbound virtual number.
|
133
|
+
#
|
134
|
+
# @option params [String] :target_api_key
|
135
|
+
# If you'd like to perform an action on a subaccount, provide the `api_key` of that account here.
|
136
|
+
# If you'd like to perform an action on your own account, you do not need to provide this field.
|
137
|
+
#
|
138
|
+
# @param [Hash] params
|
139
|
+
#
|
140
|
+
# @return [Response]
|
141
|
+
#
|
142
|
+
# @see https://developer.nexmo.com/api/developer/numbers#cancelANumber
|
143
|
+
#
|
144
|
+
def cancel(params)
|
145
|
+
request('/number/cancel', params: params, type: Post, response_class: Response)
|
146
|
+
end
|
147
|
+
|
148
|
+
# Change the behaviour of a number that you own.
|
149
|
+
#
|
150
|
+
# @example
|
151
|
+
# params = {
|
152
|
+
# country: 'GB',
|
153
|
+
# msisdn: '447700900000',
|
154
|
+
# voice_callback_type: 'app',
|
155
|
+
# voice_callback_value: application_id
|
156
|
+
# }
|
157
|
+
#
|
158
|
+
# response = client.numbers.update(params)
|
159
|
+
#
|
160
|
+
# @option params [required, String] :country
|
161
|
+
# The two character country code in ISO 3166-1 alpha-2 format.
|
162
|
+
#
|
163
|
+
# @option params [required, String] :msisdn
|
164
|
+
# An available inbound virtual number.
|
165
|
+
#
|
166
|
+
# @option params [String] :mo_http_url
|
167
|
+
# An URL-encoded URI to the webhook endpoint that handles inbound messages.
|
168
|
+
# Your webhook endpoint must be active before you make this request.
|
169
|
+
# Vonage makes a `GET` request to the endpoint and checks that it returns a `200 OK` response.
|
170
|
+
# Set this parameter's value to an empty string to remove the webhook.
|
171
|
+
#
|
172
|
+
# @option params [String] :mo_smpp_sys_type
|
173
|
+
# The associated system type for your SMPP client.
|
174
|
+
#
|
175
|
+
# @option params [String] :voice_callback_type
|
176
|
+
# Specify whether inbound voice calls on your number are handled by your Application configuration, or forwarded to a SIP or a telephone number.
|
177
|
+
# Must be used with the **:voice_callback_value** option.
|
178
|
+
#
|
179
|
+
# @option params [String] :voice_callback_value
|
180
|
+
# A SIP URI, telephone number or Application ID.
|
181
|
+
# Must be used with the **:voice_callback_type** option.
|
182
|
+
#
|
183
|
+
# @option params [String] :voice_status_callback
|
184
|
+
# A webhook URI for Vonage to send a request to when a call ends.
|
185
|
+
#
|
186
|
+
# @param [Hash] params
|
187
|
+
#
|
188
|
+
# @return [Response]
|
189
|
+
#
|
190
|
+
# @see https://developer.nexmo.com/api/developer/numbers#updateANumber
|
191
|
+
#
|
192
|
+
def update(params)
|
193
|
+
request('/number/update', params: camelcase(params), type: Post, response_class: Response)
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|