vonage 7.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|