nexmo 7.0.0 → 7.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/nexmo.rb +1 -1
- data/lib/nexmo/applications.rb +24 -4
- data/lib/nexmo/client.rb +40 -19
- data/lib/nexmo/config.rb +42 -9
- data/lib/nexmo/conversations.rb +24 -1
- data/lib/nexmo/conversations/events.rb +1 -1
- data/lib/nexmo/conversations/legs.rb +1 -1
- data/lib/nexmo/conversations/members.rb +1 -1
- data/lib/nexmo/conversations/users.rb +1 -1
- data/lib/nexmo/conversions.rb +4 -1
- data/lib/nexmo/entity.rb +2 -2
- data/lib/nexmo/errors.rb +6 -1
- data/lib/nexmo/files.rb +7 -3
- data/lib/nexmo/http.rb +12 -4
- data/lib/nexmo/json.rb +4 -1
- data/lib/nexmo/jwt.rb +5 -2
- data/lib/nexmo/key_secret_params.rb +9 -3
- data/lib/nexmo/keys.rb +7 -2
- data/lib/nexmo/logger.rb +14 -5
- data/lib/nexmo/messages.rb +6 -1
- data/lib/nexmo/number_insight.rb +1 -1
- data/lib/nexmo/numbers.rb +1 -1
- data/lib/nexmo/pricing.rb +1 -1
- data/lib/nexmo/pricing_types.rb +1 -1
- data/lib/nexmo/redact.rb +1 -1
- data/lib/nexmo/response.rb +1 -1
- data/lib/nexmo/secrets.rb +1 -1
- data/lib/nexmo/signature.rb +1 -1
- data/lib/nexmo/sms.rb +1 -1
- data/lib/nexmo/tfa.rb +1 -1
- data/lib/nexmo/verify.rb +66 -3
- data/lib/nexmo/version.rb +1 -1
- data/lib/nexmo/voice.rb +1 -1
- data/lib/nexmo/voice/dtmf.rb +1 -1
- data/lib/nexmo/voice/stream.rb +1 -1
- data/lib/nexmo/voice/talk.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 041a5d88df4780900cec2813647b6cfb45c71031374a824905cc2839cb9e46dd
|
4
|
+
data.tar.gz: c5fb8b4dc6f75c19a55ff1005364eff154b326bb0bbff82cc7874127a37da1e0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c923d6ca80704f3e6fd68f8311ff2e7d737a75d6892ba24866a8d2e82e6db566ad8c8cb84335302830ec71fe1a1e6e1466ab890fd1746e5d25a4b6c0f4de789
|
7
|
+
data.tar.gz: af9df8e503ea622f9221f9c8c8bf6414e03d6c806b4648829093ff80155f0e05bb32c678795d1e750f2edc4b0c0c11681a318bed9eb0b6edcec1c8fbb5f7e70c
|
data/lib/nexmo.rb
CHANGED
data/lib/nexmo/applications.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
module Nexmo
|
5
5
|
class Applications < Namespace
|
6
|
+
extend T::Sig
|
6
7
|
self.authentication = Basic
|
7
8
|
|
8
9
|
self.request_body = JSON
|
@@ -14,9 +15,20 @@ module Nexmo
|
|
14
15
|
# @example
|
15
16
|
# params = {
|
16
17
|
# name: 'Example App',
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
18
|
+
# capabilities: {
|
19
|
+
# 'messages': {
|
20
|
+
# 'webhooks': {
|
21
|
+
# 'inbound_url': {
|
22
|
+
# 'address': 'https://example.com/webhooks/inbound',
|
23
|
+
# 'http_method': 'POST'
|
24
|
+
# },
|
25
|
+
# 'status_url': {
|
26
|
+
# 'address': 'https://example.com/webhooks/status',
|
27
|
+
# 'http_method': 'POST'
|
28
|
+
# }
|
29
|
+
# }
|
30
|
+
# }
|
31
|
+
# }
|
20
32
|
# }
|
21
33
|
#
|
22
34
|
# response = client.applications.create(params)
|
@@ -38,6 +50,7 @@ module Nexmo
|
|
38
50
|
#
|
39
51
|
# @see https://developer.nexmo.com/api/application.v2#createApplication
|
40
52
|
#
|
53
|
+
sig { params(params: T::Hash[Symbol, T.untyped]).returns(Nexmo::Response) }
|
41
54
|
def create(params)
|
42
55
|
request('/v2/applications', params: params, type: Post)
|
43
56
|
end
|
@@ -62,6 +75,7 @@ module Nexmo
|
|
62
75
|
#
|
63
76
|
# @see https://developer.nexmo.com/api/application.v2#listApplication
|
64
77
|
#
|
78
|
+
sig { params(params: T.nilable(T::Hash[Symbol, Integer])).returns(Nexmo::Response) }
|
65
79
|
def list(params = nil)
|
66
80
|
request('/v2/applications', params: params, response_class: ListResponse)
|
67
81
|
end
|
@@ -77,6 +91,7 @@ module Nexmo
|
|
77
91
|
#
|
78
92
|
# @see https://developer.nexmo.com/api/application.v2#getApplication
|
79
93
|
#
|
94
|
+
sig { params(id: String).returns(Nexmo::Response) }
|
80
95
|
def get(id)
|
81
96
|
request('/v2/applications/' + id)
|
82
97
|
end
|
@@ -104,6 +119,10 @@ module Nexmo
|
|
104
119
|
#
|
105
120
|
# @see https://developer.nexmo.com/api/application.v2#updateApplication
|
106
121
|
#
|
122
|
+
sig { params(
|
123
|
+
id: String,
|
124
|
+
params: T::Hash[Symbol, T.untyped]
|
125
|
+
).returns(Nexmo::Response) }
|
107
126
|
def update(id, params)
|
108
127
|
request('/v2/applications/' + id, params: params, type: Put)
|
109
128
|
end
|
@@ -121,6 +140,7 @@ module Nexmo
|
|
121
140
|
#
|
122
141
|
# @see https://developer.nexmo.com/api/application.v2#deleteApplication
|
123
142
|
#
|
143
|
+
sig { params(id: String).returns(Nexmo::Response) }
|
124
144
|
def delete(id)
|
125
145
|
request('/v2/applications/' + id, type: Delete)
|
126
146
|
end
|
data/lib/nexmo/client.rb
CHANGED
@@ -1,113 +1,134 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
2
|
|
3
3
|
module Nexmo
|
4
4
|
class Client
|
5
|
+
extend T::Sig
|
6
|
+
|
7
|
+
sig { returns(Nexmo::Config) }
|
5
8
|
attr_reader :config
|
6
9
|
|
10
|
+
sig { params(options: T.nilable(T::Hash[Symbol, T.untyped])).void }
|
7
11
|
def initialize(options = nil)
|
8
|
-
@config = Nexmo.config.merge(options)
|
12
|
+
@config = T.let(Nexmo.config.merge(options), Nexmo::Config)
|
9
13
|
end
|
10
14
|
|
11
15
|
# @return [Signature]
|
12
16
|
#
|
17
|
+
sig { returns(T.nilable(Nexmo::Signature)) }
|
13
18
|
def signature
|
14
|
-
@signature ||= Signature.new(config)
|
19
|
+
@signature ||= T.let(Signature.new(config), T.nilable(Nexmo::Signature))
|
15
20
|
end
|
16
21
|
|
17
22
|
# @return [Account]
|
18
23
|
#
|
24
|
+
sig { returns(T.nilable(Nexmo::Account)) }
|
19
25
|
def account
|
20
|
-
@account ||= Account.new(config)
|
26
|
+
@account ||= T.let(Account.new(config), T.nilable(Nexmo::Account))
|
21
27
|
end
|
22
28
|
|
23
29
|
# @return [Alerts]
|
24
30
|
#
|
31
|
+
sig { returns(T.nilable(Nexmo::Alerts)) }
|
25
32
|
def alerts
|
26
|
-
@alerts ||= Alerts.new(config)
|
33
|
+
@alerts ||= T.let(Alerts.new(config), T.nilable(Nexmo::Alerts))
|
27
34
|
end
|
28
35
|
|
29
36
|
# @return [Applications]
|
30
37
|
#
|
38
|
+
sig { returns(T.nilable(Nexmo::Applications)) }
|
31
39
|
def applications
|
32
|
-
@applications ||= Applications.new(config)
|
40
|
+
@applications ||= T.let(Applications.new(config), T.nilable(Nexmo::Applications))
|
33
41
|
end
|
34
42
|
|
35
43
|
# @return [Conversations]
|
36
44
|
#
|
45
|
+
sig { returns(T.nilable(Nexmo::Conversations)) }
|
37
46
|
def conversations
|
38
|
-
@conversations ||= Conversations.new(config)
|
47
|
+
@conversations ||= T.let(Conversations.new(config), T.nilable(Nexmo::Conversations))
|
39
48
|
end
|
40
49
|
|
41
50
|
# @return [Conversions]
|
42
51
|
#
|
52
|
+
sig { returns(T.nilable(Nexmo::Conversions)) }
|
43
53
|
def conversions
|
44
|
-
@conversions ||= Conversions.new(config)
|
54
|
+
@conversions ||= T.let(Conversions.new(config), T.nilable(Nexmo::Conversions))
|
45
55
|
end
|
46
56
|
|
47
57
|
# @return [Files]
|
48
58
|
#
|
59
|
+
sig { returns(T.nilable(Nexmo::Files)) }
|
49
60
|
def files
|
50
|
-
@files ||= Files.new(config)
|
61
|
+
@files ||= T.let(Files.new(config), T.nilable(Nexmo::Files))
|
51
62
|
end
|
52
63
|
|
53
64
|
# @return [Messages]
|
54
65
|
#
|
66
|
+
sig { returns(T.nilable(Nexmo::Messages)) }
|
55
67
|
def messages
|
56
|
-
@messages ||= Messages.new(config)
|
68
|
+
@messages ||= T.let(Messages.new(config), T.nilable(Nexmo::Messages))
|
57
69
|
end
|
58
70
|
|
59
71
|
# @return [NumberInsight]
|
60
72
|
#
|
73
|
+
sig { returns(T.nilable(Nexmo::NumberInsight)) }
|
61
74
|
def number_insight
|
62
|
-
@number_insight ||= NumberInsight.new(config)
|
75
|
+
@number_insight ||= T.let(NumberInsight.new(config), T.nilable(Nexmo::NumberInsight))
|
63
76
|
end
|
64
77
|
|
65
78
|
# @return [Numbers]
|
66
79
|
#
|
80
|
+
sig { returns(T.nilable(Nexmo::Numbers)) }
|
67
81
|
def numbers
|
68
|
-
@numbers ||= Numbers.new(config)
|
82
|
+
@numbers ||= T.let(Numbers.new(config), T.nilable(Nexmo::Numbers))
|
69
83
|
end
|
70
84
|
|
71
85
|
# @return [PricingTypes]
|
72
86
|
#
|
87
|
+
sig { returns(T.nilable(Nexmo::PricingTypes)) }
|
73
88
|
def pricing
|
74
|
-
@pricing ||= PricingTypes.new(config)
|
89
|
+
@pricing ||= T.let(PricingTypes.new(config), T.nilable(Nexmo::PricingTypes))
|
75
90
|
end
|
76
91
|
|
77
92
|
# @return [Redact]
|
78
93
|
#
|
94
|
+
sig { returns(T.nilable(Nexmo::Redact)) }
|
79
95
|
def redact
|
80
|
-
@redact ||= Redact.new(config)
|
96
|
+
@redact ||= T.let(Redact.new(config), T.nilable(Nexmo::Redact))
|
81
97
|
end
|
82
98
|
|
83
99
|
# @return [Secrets]
|
84
100
|
#
|
101
|
+
sig { returns(T.nilable(Nexmo::Secrets)) }
|
85
102
|
def secrets
|
86
|
-
@secrets ||= Secrets.new(config)
|
103
|
+
@secrets ||= T.let(Secrets.new(config), T.nilable(Nexmo::Secrets))
|
87
104
|
end
|
88
105
|
|
89
106
|
# @return [SMS]
|
90
107
|
#
|
108
|
+
sig { returns(T.nilable(Nexmo::SMS)) }
|
91
109
|
def sms
|
92
|
-
@sms ||= SMS.new(config)
|
110
|
+
@sms ||= T.let(SMS.new(config), T.nilable(Nexmo::SMS))
|
93
111
|
end
|
94
112
|
|
95
113
|
# @return [TFA]
|
96
114
|
#
|
115
|
+
sig { returns(T.nilable(Nexmo::TFA)) }
|
97
116
|
def tfa
|
98
|
-
@tfa ||= TFA.new(config)
|
117
|
+
@tfa ||= T.let(TFA.new(config), T.nilable(Nexmo::TFA))
|
99
118
|
end
|
100
119
|
|
101
120
|
# @return [Verify]
|
102
121
|
#
|
122
|
+
sig { returns(T.nilable(Nexmo::Verify)) }
|
103
123
|
def verify
|
104
|
-
@verify ||= Verify.new(config)
|
124
|
+
@verify ||= T.let(Verify.new(config), T.nilable(Nexmo::Verify))
|
105
125
|
end
|
106
126
|
|
107
127
|
# @return [Voice]
|
108
128
|
#
|
129
|
+
sig { returns(T.nilable(Nexmo::Voice)) }
|
109
130
|
def voice
|
110
|
-
@voice ||= Voice.new(config)
|
131
|
+
@voice ||= T.let(Voice.new(config), T.nilable(Nexmo::Voice))
|
111
132
|
end
|
112
133
|
end
|
113
134
|
end
|
data/lib/nexmo/config.rb
CHANGED
@@ -1,26 +1,30 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: true
|
2
2
|
# frozen_string_literal: true
|
3
3
|
require 'logger'
|
4
4
|
|
5
5
|
module Nexmo
|
6
6
|
class Config
|
7
|
+
extend T::Sig
|
8
|
+
|
9
|
+
sig { void }
|
7
10
|
def initialize
|
8
11
|
self.api_host = 'api.nexmo.com'
|
9
|
-
self.api_key = ENV['NEXMO_API_KEY']
|
10
|
-
self.api_secret = ENV['NEXMO_API_SECRET']
|
12
|
+
self.api_key = T.let(ENV['NEXMO_API_KEY'], T.nilable(String))
|
13
|
+
self.api_secret = T.let(ENV['NEXMO_API_SECRET'], T.nilable(String))
|
11
14
|
self.application_id = ENV['NEXMO_APPLICATION_ID']
|
12
|
-
self.logger = (defined?(Rails.logger) && Rails.
|
13
|
-
self.private_key = ENV['NEXMO_PRIVATE_KEY_PATH'] ? File.read(ENV['NEXMO_PRIVATE_KEY_PATH']) : ENV['NEXMO_PRIVATE_KEY']
|
15
|
+
self.logger = (defined?(Rails.logger) && Rails.log) || Nexmo::Logger.new(nil)
|
16
|
+
self.private_key = ENV['NEXMO_PRIVATE_KEY_PATH'] ? File.read(T.must(ENV['NEXMO_PRIVATE_KEY_PATH'])) : ENV['NEXMO_PRIVATE_KEY']
|
14
17
|
self.rest_host = 'rest.nexmo.com'
|
15
18
|
self.signature_secret = ENV['NEXMO_SIGNATURE_SECRET']
|
16
19
|
self.signature_method = ENV['NEXMO_SIGNATURE_METHOD'] || 'md5hash'
|
17
|
-
self.token = nil
|
20
|
+
self.token = T.let(nil, T.nilable(String))
|
18
21
|
end
|
19
22
|
|
20
23
|
# Merges the config with the given options hash.
|
21
24
|
#
|
22
25
|
# @return [Nexmo::Config]
|
23
26
|
#
|
27
|
+
sig { params(options: T.nilable(T::Hash[Symbol, T.untyped])).returns(Nexmo::Config) }
|
24
28
|
def merge(options)
|
25
29
|
return self if options.nil? || options.empty?
|
26
30
|
|
@@ -29,6 +33,7 @@ module Nexmo
|
|
29
33
|
end
|
30
34
|
end
|
31
35
|
|
36
|
+
sig { returns(String) }
|
32
37
|
attr_accessor :api_host
|
33
38
|
|
34
39
|
# Returns the value of attribute api_key.
|
@@ -37,7 +42,9 @@ module Nexmo
|
|
37
42
|
#
|
38
43
|
# @raise [AuthenticationError]
|
39
44
|
#
|
45
|
+
sig { returns(T.nilable(String)) }
|
40
46
|
def api_key
|
47
|
+
@api_key = T.let(@api_key, T.nilable(String))
|
41
48
|
unless @api_key
|
42
49
|
raise AuthenticationError.new('No API key provided. ' \
|
43
50
|
'See https://developer.nexmo.com/concepts/guides/authentication for details, ' \
|
@@ -47,6 +54,7 @@ module Nexmo
|
|
47
54
|
@api_key
|
48
55
|
end
|
49
56
|
|
57
|
+
sig { params(api_key: T.nilable(String)).returns(T.nilable(String)) }
|
50
58
|
attr_writer :api_key
|
51
59
|
|
52
60
|
# Returns the value of attribute api_secret.
|
@@ -55,7 +63,9 @@ module Nexmo
|
|
55
63
|
#
|
56
64
|
# @raise [AuthenticationError]
|
57
65
|
#
|
66
|
+
sig { returns(T.nilable(String)) }
|
58
67
|
def api_secret
|
68
|
+
@api_secret = T.let(@api_secret, T.nilable(String))
|
59
69
|
unless @api_secret
|
60
70
|
raise AuthenticationError.new('No API secret provided. ' \
|
61
71
|
'See https://developer.nexmo.com/concepts/guides/authentication for details, ' \
|
@@ -65,6 +75,7 @@ module Nexmo
|
|
65
75
|
@api_secret
|
66
76
|
end
|
67
77
|
|
78
|
+
sig { params(api_secret: T.nilable(String)).returns(T.nilable(String)) }
|
68
79
|
attr_writer :api_secret
|
69
80
|
|
70
81
|
# Returns the value of attribute application_id.
|
@@ -73,7 +84,9 @@ module Nexmo
|
|
73
84
|
#
|
74
85
|
# @raise [AuthenticationError]
|
75
86
|
#
|
87
|
+
sig { returns(T.nilable(String)) }
|
76
88
|
def application_id
|
89
|
+
@application_id = T.let(@application_id, T.nilable(String))
|
77
90
|
unless @application_id
|
78
91
|
raise AuthenticationError.new('No application_id provided. ' \
|
79
92
|
'Either provide an application_id, or set an auth token. ' \
|
@@ -85,32 +98,40 @@ module Nexmo
|
|
85
98
|
@application_id
|
86
99
|
end
|
87
100
|
|
101
|
+
sig { params(application_id: T.nilable(String)).returns(T.nilable(String)) }
|
88
102
|
attr_writer :application_id
|
89
103
|
|
104
|
+
sig { returns(T.nilable(String)) }
|
90
105
|
attr_accessor :app_name
|
91
106
|
|
107
|
+
sig { returns(T.nilable(String)) }
|
92
108
|
attr_accessor :app_version
|
93
109
|
|
94
110
|
# Returns the value of attribute http.
|
95
111
|
#
|
96
112
|
# @return [Nexmo::HTTP::Options]
|
97
113
|
#
|
114
|
+
sig { returns(T.nilable(Nexmo::HTTP::Options)) }
|
98
115
|
attr_reader :http
|
99
116
|
|
117
|
+
sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.nilable(Nexmo::HTTP::Options)) }
|
100
118
|
def http=(hash)
|
101
|
-
@http = HTTP::Options
|
119
|
+
@http = T.let(nil, T.nilable(Nexmo::HTTP::Options))
|
120
|
+
@http = Nexmo::HTTP::Options.new(hash)
|
102
121
|
end
|
103
122
|
|
104
123
|
# Returns the value of attribute logger.
|
105
124
|
#
|
106
125
|
# @return [Nexmo::Logger]
|
107
126
|
#
|
127
|
+
sig { returns(T.nilable(Nexmo::Logger)) }
|
108
128
|
attr_reader :logger
|
109
129
|
|
110
130
|
# @return [Nexmo::Logger]
|
111
131
|
#
|
132
|
+
sig { params(logger: T.nilable(T.any(::Logger, Nexmo::Logger))).returns(T.nilable(Nexmo::Logger)) }
|
112
133
|
def logger=(logger)
|
113
|
-
@logger = Logger.new(logger)
|
134
|
+
@logger = T.let(Logger.new(logger), T.nilable(Nexmo::Logger))
|
114
135
|
end
|
115
136
|
|
116
137
|
# Returns the value of attribute private_key.
|
@@ -119,7 +140,9 @@ module Nexmo
|
|
119
140
|
#
|
120
141
|
# @raise [AuthenticationError]
|
121
142
|
#
|
143
|
+
sig { returns(T.nilable(String)) }
|
122
144
|
def private_key
|
145
|
+
@private_key = T.let(@private_key, T.nilable(String))
|
123
146
|
unless @private_key
|
124
147
|
raise AuthenticationError.new('No private_key provided. ' \
|
125
148
|
'Either provide a private_key, or set an auth token. ' \
|
@@ -131,8 +154,10 @@ module Nexmo
|
|
131
154
|
@private_key
|
132
155
|
end
|
133
156
|
|
157
|
+
sig { params(private_key: T.nilable(String)).returns(T.nilable(String)) }
|
134
158
|
attr_writer :private_key
|
135
159
|
|
160
|
+
sig { returns(String) }
|
136
161
|
attr_accessor :rest_host
|
137
162
|
|
138
163
|
# Returns the value of attribute signature_secret.
|
@@ -141,7 +166,9 @@ module Nexmo
|
|
141
166
|
#
|
142
167
|
# @raise [AuthenticationError]
|
143
168
|
#
|
169
|
+
sig { returns(T.nilable(String)) }
|
144
170
|
def signature_secret
|
171
|
+
@signature_secret = T.let(@signature_secret, T.nilable(String))
|
145
172
|
unless @signature_secret
|
146
173
|
raise AuthenticationError.new('No signature_secret provided. ' \
|
147
174
|
'You can find your signature secret in the Nexmo dashboard. ' \
|
@@ -152,22 +179,28 @@ module Nexmo
|
|
152
179
|
@signature_secret
|
153
180
|
end
|
154
181
|
|
182
|
+
sig { params(signature_secret: T.nilable(String)).returns(T.nilable(String)) }
|
155
183
|
attr_writer :signature_secret
|
156
184
|
|
185
|
+
sig { returns(String) }
|
157
186
|
attr_accessor :signature_method
|
158
187
|
|
159
188
|
# Returns the value of attribute token, or a temporary short lived token.
|
160
189
|
#
|
161
190
|
# @return [String]
|
162
191
|
#
|
192
|
+
sig { returns(T.nilable(String)) }
|
163
193
|
def token
|
164
|
-
@token
|
194
|
+
@token = T.let(nil, T.nilable(String))
|
195
|
+
@token || JWT.generate({application_id: application_id}, T.must(private_key))
|
165
196
|
end
|
166
197
|
|
198
|
+
sig { params(token: T.nilable(String)).returns(T.nilable(String)) }
|
167
199
|
attr_writer :token
|
168
200
|
|
169
201
|
protected
|
170
202
|
|
203
|
+
sig { params(name: Symbol, value: T.nilable(T.untyped)).void }
|
171
204
|
def write_attribute(name, value)
|
172
205
|
public_send(:"#{name}=", value)
|
173
206
|
end
|
data/lib/nexmo/conversations.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
module Nexmo
|
5
5
|
class Conversations < Namespace
|
6
|
+
extend T::Sig
|
7
|
+
|
6
8
|
self.authentication = BearerToken
|
7
9
|
|
8
10
|
self.request_body = JSON
|
@@ -33,6 +35,7 @@ module Nexmo
|
|
33
35
|
#
|
34
36
|
# @see https://developer.nexmo.com/api/conversation#createConversation
|
35
37
|
#
|
38
|
+
sig { params(params: T::Hash[Symbol, T.untyped]).returns(Nexmo::Response) }
|
36
39
|
def create(params)
|
37
40
|
request('/beta/conversations', params: params, type: Post)
|
38
41
|
end
|
@@ -63,6 +66,7 @@ module Nexmo
|
|
63
66
|
#
|
64
67
|
# @see https://developer.nexmo.com/api/conversation#replaceConversation
|
65
68
|
#
|
69
|
+
sig { params(params: T.nilable(T::Hash[Symbol, T.untyped])).returns(Nexmo::Response) }
|
66
70
|
def list(params = nil)
|
67
71
|
request('/beta/conversations', params: params)
|
68
72
|
end
|
@@ -78,6 +82,7 @@ module Nexmo
|
|
78
82
|
#
|
79
83
|
# @see https://developer.nexmo.com/api/conversation#retrieveConversation
|
80
84
|
#
|
85
|
+
sig { params(id: String).returns(Nexmo::Response) }
|
81
86
|
def get(id)
|
82
87
|
request('/beta/conversations/' + id)
|
83
88
|
end
|
@@ -110,6 +115,10 @@ module Nexmo
|
|
110
115
|
#
|
111
116
|
# @see https://developer.nexmo.com/api/conversation#replaceConversation
|
112
117
|
#
|
118
|
+
sig { params(
|
119
|
+
id: String,
|
120
|
+
params: T::Hash[Symbol, T.untyped]
|
121
|
+
).returns(Nexmo::Response) }
|
113
122
|
def update(id, params)
|
114
123
|
request('/beta/conversations/' + id, params: params, type: Put)
|
115
124
|
end
|
@@ -125,6 +134,7 @@ module Nexmo
|
|
125
134
|
#
|
126
135
|
# @see https://developer.nexmo.com/api/conversation#deleteConversation
|
127
136
|
#
|
137
|
+
sig { params(id: String).returns(Nexmo::Response) }
|
128
138
|
def delete(id)
|
129
139
|
request('/beta/conversations/' + id, type: Delete)
|
130
140
|
end
|
@@ -156,31 +166,44 @@ module Nexmo
|
|
156
166
|
#
|
157
167
|
# @see https://developer.nexmo.com/api/conversation#recordConversation
|
158
168
|
#
|
169
|
+
sig { params(
|
170
|
+
id: String,
|
171
|
+
params: T::Hash[Symbol, T.untyped]
|
172
|
+
).returns(Nexmo::Response) }
|
159
173
|
def record(id, params)
|
160
174
|
request('/v1/conversations/' + id + '/record', params: params, type: Put)
|
161
175
|
end
|
162
176
|
|
163
177
|
# @return [Events]
|
164
178
|
#
|
179
|
+
sig { returns(T.nilable(Nexmo::Conversations::Events)) }
|
165
180
|
def events
|
181
|
+
@events = T.let(@events, T.nilable(Nexmo::Conversations::Events))
|
182
|
+
@config = T.let(@config, T.nilable(Nexmo::Config))
|
166
183
|
@events ||= Events.new(@config)
|
167
184
|
end
|
168
185
|
|
169
186
|
# @return [Legs]
|
170
187
|
#
|
188
|
+
sig { returns(T.nilable(Nexmo::Conversations::Legs)) }
|
171
189
|
def legs
|
190
|
+
@legs = T.let(@legs, T.nilable(Nexmo::Conversations::Legs))
|
172
191
|
@legs ||= Legs.new(@config)
|
173
192
|
end
|
174
193
|
|
175
194
|
# @return [Members]
|
176
195
|
#
|
196
|
+
sig { returns(T.nilable(Nexmo::Conversations::Members)) }
|
177
197
|
def members
|
198
|
+
@members = T.let(@members, T.nilable(Nexmo::Conversations::Members))
|
178
199
|
@members ||= Members.new(@config)
|
179
200
|
end
|
180
201
|
|
181
202
|
# @return [Users]
|
182
203
|
#
|
204
|
+
sig { returns(T.nilable(Nexmo::Conversations::Users)) }
|
183
205
|
def users
|
206
|
+
@users = T.let(@users, T.nilable(Nexmo::Conversations::Users))
|
184
207
|
@users ||= Users.new(@config)
|
185
208
|
end
|
186
209
|
end
|
data/lib/nexmo/conversions.rb
CHANGED
@@ -1,14 +1,17 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
module Nexmo
|
5
5
|
class Conversions < Namespace
|
6
|
+
extend T::Sig
|
6
7
|
include Keys
|
7
8
|
|
9
|
+
sig { params(params: T::Hash[Symbol, T.untyped]).returns(Nexmo::Response) }
|
8
10
|
def track_sms(params)
|
9
11
|
request('/conversions/sms', params: hyphenate(params), type: Post)
|
10
12
|
end
|
11
13
|
|
14
|
+
sig { params(params: T::Hash[Symbol, T.untyped]).returns(Nexmo::Response) }
|
12
15
|
def track_voice(params)
|
13
16
|
request('/conversions/voice', params: hyphenate(params), type: Post)
|
14
17
|
end
|
data/lib/nexmo/entity.rb
CHANGED
data/lib/nexmo/errors.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
require 'json'
|
4
4
|
|
5
5
|
module Nexmo
|
6
6
|
module Errors
|
7
|
+
extend T::Sig
|
8
|
+
|
9
|
+
sig {params(response: T.any(Net::HTTPUnauthorized, Net::HTTPClientError, Net::HTTPServerError, T.untyped)).returns(Nexmo::Error)}
|
7
10
|
def self.parse(response)
|
8
11
|
exception_class = case response
|
9
12
|
when Net::HTTPUnauthorized
|
@@ -33,10 +36,12 @@ module Nexmo
|
|
33
36
|
exception_class.new(message)
|
34
37
|
end
|
35
38
|
|
39
|
+
sig { params(hash: T::Hash[String, T.untyped]).returns(T::Boolean) }
|
36
40
|
def self.problem_details?(hash)
|
37
41
|
hash.key?('title') && hash.key?('detail') && hash.key?('type')
|
38
42
|
end
|
39
43
|
|
44
|
+
sig { params(hash: T::Hash[String, T.untyped]).returns(String) }
|
40
45
|
def self.problem_details_message(hash)
|
41
46
|
"#{hash['title']}. #{hash['detail']} See #{hash['type']} for more info, or email support@nexmo.com if you have any questions."
|
42
47
|
end
|
data/lib/nexmo/files.rb
CHANGED
@@ -1,16 +1,20 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
module Nexmo
|
5
5
|
class Files < Namespace
|
6
|
+
extend T::Sig
|
7
|
+
|
6
8
|
self.authentication = BearerToken
|
7
9
|
|
10
|
+
sig { params(id: String).returns(T.nilable(Nexmo::Response)) }
|
8
11
|
def get(id)
|
9
|
-
request('/v1/files/' + id.split('/').last)
|
12
|
+
request('/v1/files/' + T.must(id.split('/').last))
|
10
13
|
end
|
11
14
|
|
15
|
+
sig { params(id: String, filename: String).returns(T.nilable(Nexmo::Response)) }
|
12
16
|
def save(id, filename)
|
13
|
-
request('/v1/files/' + id.split('/').last) do |response|
|
17
|
+
request('/v1/files/' + T.must(id.split('/').last)) do |response|
|
14
18
|
File.open(filename, 'wb') do |file|
|
15
19
|
response.read_body do |chunk|
|
16
20
|
file.write(chunk)
|
data/lib/nexmo/http.rb
CHANGED
@@ -1,12 +1,18 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
require 'net/http'
|
4
4
|
|
5
5
|
module Nexmo
|
6
6
|
module HTTP
|
7
7
|
class Options
|
8
|
+
extend T::Sig
|
9
|
+
|
10
|
+
sig { params(hash: T::Hash[Symbol, T.untyped]).void }
|
8
11
|
def initialize(hash)
|
9
|
-
|
12
|
+
raise ArgumentError, 'hash parameter cannot be empty or nil' if hash == {} || hash.nil?
|
13
|
+
|
14
|
+
@hash = T.let(@hash, T::Hash[Symbol, T.untyped]) if defined? @hash
|
15
|
+
@hash = hash
|
10
16
|
|
11
17
|
@hash.each_key do |name|
|
12
18
|
next if defined_options.key?(name)
|
@@ -15,6 +21,7 @@ module Nexmo
|
|
15
21
|
end
|
16
22
|
end
|
17
23
|
|
24
|
+
sig { params(http: Net::HTTP).returns(T::Hash[Symbol, T.untyped]) }
|
18
25
|
def set(http)
|
19
26
|
@hash.each do |name, value|
|
20
27
|
http.public_send(defined_options.fetch(name), value)
|
@@ -23,13 +30,14 @@ module Nexmo
|
|
23
30
|
|
24
31
|
private
|
25
32
|
|
33
|
+
sig { returns(T::Hash[Symbol, T.untyped]) }
|
26
34
|
def defined_options
|
35
|
+
@defined_options = T.let(@defined_options, T.nilable(T::Hash[Symbol, T.untyped]))
|
36
|
+
|
27
37
|
@defined_options ||= Net::HTTP.instance_methods.grep(/\w=\z/).each_with_object({}) do |name, hash|
|
28
38
|
hash[name.to_s.chomp('=').to_sym] = name
|
29
39
|
end
|
30
40
|
end
|
31
41
|
end
|
32
42
|
end
|
33
|
-
|
34
|
-
private_constant :HTTP
|
35
43
|
end
|
data/lib/nexmo/json.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
require 'json'
|
4
4
|
|
5
5
|
module Nexmo
|
6
6
|
module JSON
|
7
|
+
extend T::Sig
|
8
|
+
|
9
|
+
sig { params(http_request: T.any(Net::HTTP::Put, Net::HTTP::Post), params: T::Hash[Symbol, T.untyped]).void }
|
7
10
|
def self.update(http_request, params)
|
8
11
|
http_request['Content-Type'] = 'application/json'
|
9
12
|
http_request.body = ::JSON.generate(params)
|
data/lib/nexmo/jwt.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
require 'securerandom'
|
4
4
|
require 'openssl'
|
@@ -6,6 +6,8 @@ require 'jwt'
|
|
6
6
|
|
7
7
|
module Nexmo
|
8
8
|
module JWT
|
9
|
+
extend T::Sig
|
10
|
+
|
9
11
|
# Generate an encoded JSON Web Token.
|
10
12
|
#
|
11
13
|
# By default the Nexmo Ruby SDK generates a short lived JWT per request.
|
@@ -31,9 +33,10 @@ module Nexmo
|
|
31
33
|
#
|
32
34
|
# @return [String]
|
33
35
|
#
|
36
|
+
sig { params(payload: T::Hash[T.any(Symbol, String), T.any(String, Integer)], private_key: T.any(OpenSSL::PKey::RSA, String)).returns(String) }
|
34
37
|
def self.generate(payload, private_key)
|
35
38
|
payload[:iat] = iat = Time.now.to_i unless payload.key?(:iat) || payload.key?('iat')
|
36
|
-
payload[:exp] = iat + 60 unless payload.key?(:exp) || payload.key?('exp')
|
39
|
+
payload[:exp] = T.must(iat) + 60 unless payload.key?(:exp) || payload.key?('exp')
|
37
40
|
payload[:jti] = SecureRandom.uuid unless payload.key?(:jti) || payload.key?('jti')
|
38
41
|
|
39
42
|
private_key = OpenSSL::PKey::RSA.new(private_key) unless private_key.respond_to?(:sign)
|
@@ -1,12 +1,18 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
2
|
|
3
3
|
module Nexmo
|
4
4
|
class KeySecretParams < AbstractAuthentication
|
5
|
+
extend T::Sig
|
6
|
+
|
7
|
+
sig { params(
|
8
|
+
object: T.any(T::Hash[T.untyped, T.untyped], URI::HTTPS, Net::HTTP::Post, Net::HTTP::Get)
|
9
|
+
).void }
|
5
10
|
def update(object)
|
6
11
|
return unless object.is_a?(Hash)
|
7
12
|
|
8
|
-
|
9
|
-
object[:
|
13
|
+
@config = T.let(@config, T.nilable(Nexmo::Config))
|
14
|
+
object[:api_key] = T.must(@config).api_key
|
15
|
+
object[:api_secret] = T.must(@config).api_secret
|
10
16
|
end
|
11
17
|
end
|
12
18
|
|
data/lib/nexmo/keys.rb
CHANGED
@@ -1,17 +1,21 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
module Nexmo
|
5
5
|
module Keys
|
6
|
+
extend T::Sig
|
7
|
+
|
8
|
+
sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T::Hash[String, T.untyped]) }
|
6
9
|
def hyphenate(hash)
|
7
10
|
hash.transform_keys { |k| k.to_s.tr('_', '-') }
|
8
11
|
end
|
9
12
|
|
13
|
+
sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T::Hash[String, T.untyped]) }
|
10
14
|
def camelcase(hash)
|
11
15
|
hash.transform_keys { |k| k.to_s.gsub(/_(\w)/) { $1.upcase } }
|
12
16
|
end
|
13
17
|
|
14
|
-
ATTRIBUTE_KEYS = Hash.new { |h, k| h[k] = k.split(PATTERN).join('_').downcase.to_sym }
|
18
|
+
ATTRIBUTE_KEYS = T.let(Hash.new { |h, k| h[k] = k.split(PATTERN).join('_').downcase.to_sym }, T::Hash[T.untyped, T.untyped])
|
15
19
|
|
16
20
|
PATTERN = /[\-_]|(?<=\w)(?=[A-Z])/
|
17
21
|
|
@@ -19,6 +23,7 @@ module Nexmo
|
|
19
23
|
|
20
24
|
private_constant :PATTERN
|
21
25
|
|
26
|
+
sig { params(k: T.any(Symbol, String)).returns(Symbol) }
|
22
27
|
def attribute_key(k)
|
23
28
|
return k if k.is_a?(Symbol)
|
24
29
|
|
data/lib/nexmo/logger.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: false
|
2
2
|
# frozen_string_literal: true
|
3
3
|
require 'logger'
|
4
4
|
require 'forwardable'
|
5
5
|
|
6
6
|
module Nexmo
|
7
7
|
class Logger
|
8
|
+
extend T::Sig
|
9
|
+
|
10
|
+
sig { params(logger: T.nilable(T.any(::Logger, Nexmo::Logger))).void }
|
8
11
|
def initialize(logger)
|
9
12
|
@logger = logger || ::Logger.new(nil)
|
10
13
|
end
|
@@ -15,8 +18,11 @@ module Nexmo
|
|
15
18
|
def_delegator :@logger, name, name
|
16
19
|
end
|
17
20
|
|
21
|
+
sig { params(request: T.any(Net::HTTP::Post, Net::HTTP::Get, Net::HTTP::Delete, Net::HTTP::Put)).void }
|
18
22
|
def log_request_info(request)
|
19
|
-
@logger.
|
23
|
+
@logger = T.let(@logger, T.nilable(T.any(::Logger, Nexmo::Logger)))
|
24
|
+
|
25
|
+
T.must(@logger).info do
|
20
26
|
format('Nexmo API request', {
|
21
27
|
method: request.method,
|
22
28
|
path: request.uri.path
|
@@ -24,8 +30,12 @@ module Nexmo
|
|
24
30
|
end
|
25
31
|
end
|
26
32
|
|
33
|
+
sig { params(
|
34
|
+
response: T.any(Net::HTTPOK, Net::HTTPNoContent, Net::HTTPBadRequest, Net::HTTPInternalServerError, Net::HTTPResponse),
|
35
|
+
host: String
|
36
|
+
).void }
|
27
37
|
def log_response_info(response, host)
|
28
|
-
@logger.info do
|
38
|
+
T.must(@logger).info do
|
29
39
|
format('Nexmo API response', {
|
30
40
|
host: host,
|
31
41
|
status: response.code,
|
@@ -38,6 +48,7 @@ module Nexmo
|
|
38
48
|
|
39
49
|
private
|
40
50
|
|
51
|
+
sig { params(message: String, hash: T::Hash[Symbol, T.untyped]).returns(String) }
|
41
52
|
def format(message, hash)
|
42
53
|
return message if hash.nil?
|
43
54
|
|
@@ -46,6 +57,4 @@ module Nexmo
|
|
46
57
|
fields.join(' ')
|
47
58
|
end
|
48
59
|
end
|
49
|
-
|
50
|
-
private_constant :Logger
|
51
60
|
end
|
data/lib/nexmo/messages.rb
CHANGED
@@ -1,18 +1,23 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
module Nexmo
|
5
5
|
class Messages < Namespace
|
6
|
+
extend T::Sig
|
7
|
+
|
6
8
|
self.host = :rest_host
|
7
9
|
|
10
|
+
sig { params(id: String).returns(Nexmo::Response) }
|
8
11
|
def get(id)
|
9
12
|
request('/search/message', params: {id: id})
|
10
13
|
end
|
11
14
|
|
15
|
+
sig { params(params: T::Hash[Symbol, T.untyped]).returns(Nexmo::Response) }
|
12
16
|
def search(params)
|
13
17
|
request('/search/messages', params: params)
|
14
18
|
end
|
15
19
|
|
20
|
+
sig { params(params: T::Hash[Symbol, T.untyped]).returns(Nexmo::Response) }
|
16
21
|
def rejections(params)
|
17
22
|
request('/search/rejections', params: params)
|
18
23
|
end
|
data/lib/nexmo/number_insight.rb
CHANGED
data/lib/nexmo/numbers.rb
CHANGED
data/lib/nexmo/pricing.rb
CHANGED
data/lib/nexmo/pricing_types.rb
CHANGED
data/lib/nexmo/redact.rb
CHANGED
data/lib/nexmo/response.rb
CHANGED
data/lib/nexmo/secrets.rb
CHANGED
data/lib/nexmo/signature.rb
CHANGED
data/lib/nexmo/sms.rb
CHANGED
data/lib/nexmo/tfa.rb
CHANGED
data/lib/nexmo/verify.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
module Nexmo
|
5
5
|
class Verify < Namespace
|
6
|
+
extend T::Sig
|
6
7
|
alias_method :http_request, :request
|
7
8
|
|
8
9
|
private :http_request
|
@@ -59,8 +60,9 @@ module Nexmo
|
|
59
60
|
#
|
60
61
|
# @see https://developer.nexmo.com/api/verify#verifyRequest
|
61
62
|
#
|
62
|
-
|
63
|
-
|
63
|
+
sig { params(params: T.untyped, uri: T.untyped).returns(T.untyped) }
|
64
|
+
def request(params, uri = '/verify/json')
|
65
|
+
response = http_request(uri, params: params, type: Post)
|
64
66
|
|
65
67
|
raise Error, response[:error_text] if error?(response)
|
66
68
|
|
@@ -91,6 +93,7 @@ module Nexmo
|
|
91
93
|
#
|
92
94
|
# @see https://developer.nexmo.com/api/verify#verifyCheck
|
93
95
|
#
|
96
|
+
sig { params(params: T::Hash[Symbol, T.untyped]).returns(Nexmo::Response) }
|
94
97
|
def check(params)
|
95
98
|
response = http_request('/verify/check/json', params: params, type: Post)
|
96
99
|
|
@@ -117,6 +120,7 @@ module Nexmo
|
|
117
120
|
#
|
118
121
|
# @see https://developer.nexmo.com/api/verify#verifySearch
|
119
122
|
#
|
123
|
+
sig { params(params: T::Hash[Symbol, T.untyped]).returns(T.any(T::Hash[Symbol, T.untyped], Nexmo::Response)) }
|
120
124
|
def search(params)
|
121
125
|
response = http_request('/verify/search/json', params: params)
|
122
126
|
|
@@ -143,6 +147,7 @@ module Nexmo
|
|
143
147
|
#
|
144
148
|
# @see https://developer.nexmo.com/api/verify#verifyControl
|
145
149
|
#
|
150
|
+
sig { params(params: T::Hash[Symbol, T.untyped]).returns(T.untyped) }
|
146
151
|
def control(params)
|
147
152
|
response = http_request('/verify/control/json', params: params, type: Post)
|
148
153
|
|
@@ -162,6 +167,7 @@ module Nexmo
|
|
162
167
|
#
|
163
168
|
# @see https://developer.nexmo.com/api/verify#verifyControl
|
164
169
|
#
|
170
|
+
sig { params(id: String).returns(Nexmo::Response) }
|
165
171
|
def cancel(id)
|
166
172
|
control(request_id: id, cmd: 'cancel')
|
167
173
|
end
|
@@ -177,12 +183,69 @@ module Nexmo
|
|
177
183
|
#
|
178
184
|
# @see https://developer.nexmo.com/api/verify#verifyControl
|
179
185
|
#
|
186
|
+
sig { params(id: String).returns(Nexmo::Response) }
|
180
187
|
def trigger_next_event(id)
|
181
188
|
control(request_id: id, cmd: 'trigger_next_event')
|
182
189
|
end
|
183
190
|
|
191
|
+
# Send a PSD2-compliant payment token to a user for payment authorization
|
192
|
+
#
|
193
|
+
# @example
|
194
|
+
# response = client.verify.psd2(number: '447700900000', payee: 'Acme Inc', amount: 48.00)
|
195
|
+
#
|
196
|
+
# @option params [required, String] :number
|
197
|
+
# The mobile or landline phone number to verify.
|
198
|
+
# Unless you are setting **:country** explicitly, this number must be in E.164 format.
|
199
|
+
#
|
200
|
+
# @option params [String] :country
|
201
|
+
# If you do not provide **:number** in international format or you are not sure if **:number** is correctly formatted, specify the two-character country code in **:country**.
|
202
|
+
# Verify will then format the number for you.
|
203
|
+
#
|
204
|
+
# @option params [required, String] :payee
|
205
|
+
# An alphanumeric string to indicate to the user the name of the recipient that they are confirming a payment to.
|
206
|
+
#
|
207
|
+
# @option params [required, Float] :amount
|
208
|
+
# The decimal amount of the payment to be confirmed, in Euros
|
209
|
+
#
|
210
|
+
# @option params [Integer] :code_length
|
211
|
+
# The length of the verification code.
|
212
|
+
#
|
213
|
+
# @option params [String] :lg
|
214
|
+
# By default, the SMS or text-to-speech (TTS) message is generated in the locale that matches the **:number**.
|
215
|
+
# For example, the text message or TTS message for a `33*` number is sent in French.
|
216
|
+
# Use this parameter to explicitly control the language, accent and gender used for the Verify request.
|
217
|
+
#
|
218
|
+
# @option params [Integer] :pin_expiry
|
219
|
+
# How log the generated verification code is valid for, in seconds.
|
220
|
+
# When you specify both **:pin_expiry** and **:next_event_wait** then **:pin_expiry** must be an integer multiple of **:next_event_wait** otherwise **:pin_expiry** is defaulted to equal **:next_event_wait**.
|
221
|
+
# See [changing the event timings](https://developer.nexmo.com/verify/guides/changing-default-timings).
|
222
|
+
#
|
223
|
+
# @option params [Integer] :next_event_wait
|
224
|
+
# Specifies the wait time in seconds between attempts to deliver the verification code.
|
225
|
+
#
|
226
|
+
# @option params [Integer] :workflow_id
|
227
|
+
# Selects the predefined sequence of SMS and TTS (Text To Speech) actions to use in order to convey the PIN to your user.
|
228
|
+
# For example, an id of 1 identifies the workflow SMS - TTS - TTS.
|
229
|
+
# For a list of all workflows and their associated ids, please visit the [developer portal](https://developer.nexmo.com/verify/guides/workflows-and-events).
|
230
|
+
#
|
231
|
+
# @param [Hash] params
|
232
|
+
#
|
233
|
+
# @return [Response]
|
234
|
+
#
|
235
|
+
# @see https://developer.nexmo.com/api/verify#verifyRequestWithPSD2
|
236
|
+
#
|
237
|
+
sig { params(params: T.untyped, uri: T.untyped).returns(T.any(Nexmo::Error, Nexmo::Response)) }
|
238
|
+
def psd2(params, uri = '/verify/psd2/json')
|
239
|
+
response = http_request(uri, params: params, type: Post)
|
240
|
+
|
241
|
+
raise Error, response[:error_text] if error?(response)
|
242
|
+
|
243
|
+
response
|
244
|
+
end
|
245
|
+
|
184
246
|
private
|
185
247
|
|
248
|
+
sig { params(response: T.untyped).returns(T::Boolean) }
|
186
249
|
def error?(response)
|
187
250
|
response.respond_to?(:error_text)
|
188
251
|
end
|
data/lib/nexmo/version.rb
CHANGED
data/lib/nexmo/voice.rb
CHANGED
data/lib/nexmo/voice/dtmf.rb
CHANGED
data/lib/nexmo/voice/stream.rb
CHANGED
data/lib/nexmo/voice/talk.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nexmo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.
|
4
|
+
version: 7.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nexmo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jwt
|