surge_api 0.2.1 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cc8267ebb4682d2884a0ed0a4ff0c1ec89a6e76988ee96cbdd794bc9ee745ef2
4
- data.tar.gz: fcefd6289c6dae43967d4eac94bbc87299ab03c52e335f611949a4d6169c7c79
3
+ metadata.gz: 3cdf5f24e69c710419d1609ebc934daaafd1be183603d3f364e6a3d4085fa9b9
4
+ data.tar.gz: 65ecd730b0df9e65ab06bd73a272bbff75e7f3b17c5136173ca26d48e92364bb
5
5
  SHA512:
6
- metadata.gz: 22b712d8f2898bca0a102de847125c57cc1feb4771c23db55de558616b6dba9de87a1915e05e44c23ca619872f9a9d0f70df9c8f522e8f867048fd43a53cb660
7
- data.tar.gz: '025923bb1e6f82ecbe04e30ee9f849369e8ddd76dd73f729dfe046220ffc044633cc7f1d15d286b6d37c2b5d6d641bae27e2cb558499e4c6271133997ba8444f'
6
+ metadata.gz: 40416443213907937c15359db9fd573680ec1c0d6038a727304b632125d1331e765d980e4617afe0d80b98db12a1d7405bb3cd84d9b9be2a416ccda6ec9f7857
7
+ data.tar.gz: 20d73f3c32f237a86513ed84416b0ac144ff35f7ccd722bf57e79aa3a4fe44ee2525f91d523f67cd8b1b4819dfe3c3a9fe4b0f2c17cc56b280e2fe9f681d5386
data/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.0 (2025-12-17)
4
+
5
+ Full Changelog: [v0.2.1...v0.3.0](https://github.com/surgeapi/ruby-sdk/compare/v0.2.1...v0.3.0)
6
+
7
+ ### Features
8
+
9
+ * **api:** add retrieve message endpoint ([55df346](https://github.com/surgeapi/ruby-sdk/commit/55df346f91c99fece77d130057afc55b021666c7))
10
+
11
+
12
+ ### Bug Fixes
13
+
14
+ * better thread safety via early initializing SSL store during HTTP client creation ([0d14e5e](https://github.com/surgeapi/ruby-sdk/commit/0d14e5e73496e95743359c4c8dbab6da1c384a6e))
15
+ * calling `break` out of streams should be instantaneous ([b43c7e5](https://github.com/surgeapi/ruby-sdk/commit/b43c7e54e9dfaaf31ffa0fe498c53fcc51bbb81c))
16
+
17
+
18
+ ### Chores
19
+
20
+ * bump dependency version and update sorbet types ([e00a588](https://github.com/surgeapi/ruby-sdk/commit/e00a5886df58170099838c7a2b1ba25fe36588d6))
21
+ * explicitly require "base64" gem ([a25ee53](https://github.com/surgeapi/ruby-sdk/commit/a25ee53f821df6c2d177b0e41c864e15e4b8bae9))
22
+ * **internal:** codegen related update ([744a068](https://github.com/surgeapi/ruby-sdk/commit/744a0682fa04890d445106232878d0d5be7d7273))
23
+
3
24
  ## 0.2.1 (2025-10-31)
4
25
 
5
26
  Full Changelog: [v0.2.0...v0.2.1](https://github.com/surgeapi/ruby-sdk/compare/v0.2.0...v0.2.1)
data/README.md CHANGED
@@ -17,7 +17,7 @@ To use this gem, install via Bundler by adding the following to your application
17
17
  <!-- x-release-please-start-version -->
18
18
 
19
19
  ```ruby
20
- gem "surge_api", "~> 0.2.1"
20
+ gem "surge_api", "~> 0.3.0"
21
21
  ```
22
22
 
23
23
  <!-- x-release-please-end -->
@@ -201,7 +201,8 @@ module SurgeAPI
201
201
  self.class::PLATFORM_HEADERS,
202
202
  {
203
203
  "accept" => "application/json",
204
- "content-type" => "application/json"
204
+ "content-type" => "application/json",
205
+ "user-agent" => user_agent
205
206
  },
206
207
  headers
207
208
  )
@@ -219,6 +220,11 @@ module SurgeAPI
219
220
  # @return [Hash{String=>String}]
220
221
  private def auth_headers = {}
221
222
 
223
+ # @api private
224
+ #
225
+ # @return [String]
226
+ private def user_agent = "#{self.class.name}/Ruby #{SurgeAPI::VERSION}"
227
+
222
228
  # @api private
223
229
  #
224
230
  # @return [String]
@@ -16,10 +16,11 @@ module SurgeAPI
16
16
  class << self
17
17
  # @api private
18
18
  #
19
+ # @param cert_store [OpenSSL::X509::Store]
19
20
  # @param url [URI::Generic]
20
21
  #
21
22
  # @return [Net::HTTP]
22
- def connect(url)
23
+ def connect(cert_store:, url:)
23
24
  port =
24
25
  case [url.port, url.scheme]
25
26
  in [Integer, _]
@@ -33,6 +34,8 @@ module SurgeAPI
33
34
  Net::HTTP.new(url.host, port).tap do
34
35
  _1.use_ssl = %w[https wss].include?(url.scheme)
35
36
  _1.max_retries = 0
37
+
38
+ (_1.cert_store = cert_store) if _1.use_ssl?
36
39
  end
37
40
  end
38
41
 
@@ -102,7 +105,7 @@ module SurgeAPI
102
105
  pool =
103
106
  @mutex.synchronize do
104
107
  @pools[origin] ||= ConnectionPool.new(size: @size) do
105
- self.class.connect(url)
108
+ self.class.connect(cert_store: @cert_store, url: url)
106
109
  end
107
110
  end
108
111
 
@@ -150,17 +153,19 @@ module SurgeAPI
150
153
  end
151
154
 
152
155
  self.class.calibrate_socket_timeout(conn, deadline)
153
- conn.request(req) do |rsp|
154
- y << [req, rsp]
155
- break if finished
156
-
157
- rsp.read_body do |bytes|
158
- y << bytes.force_encoding(Encoding::BINARY)
159
- break if finished
160
-
161
- self.class.calibrate_socket_timeout(conn, deadline)
156
+ ::Kernel.catch(:jump) do
157
+ conn.request(req) do |rsp|
158
+ y << [req, rsp]
159
+ ::Kernel.throw(:jump) if finished
160
+
161
+ rsp.read_body do |bytes|
162
+ y << bytes.force_encoding(Encoding::BINARY)
163
+ ::Kernel.throw(:jump) if finished
164
+
165
+ self.class.calibrate_socket_timeout(conn, deadline)
166
+ end
167
+ eof = true
162
168
  end
163
- eof = true
164
169
  end
165
170
  end
166
171
  ensure
@@ -192,6 +197,7 @@ module SurgeAPI
192
197
  def initialize(size: self.class::DEFAULT_MAX_CONNECTIONS)
193
198
  @mutex = Mutex.new
194
199
  @size = size
200
+ @cert_store = OpenSSL::X509::Store.new.tap(&:set_default_paths)
195
201
  @pools = {}
196
202
  end
197
203
 
@@ -17,6 +17,18 @@ module SurgeAPI
17
17
  # else
18
18
  # puts(unwrap_webhook_event)
19
19
  # end
20
+ #
21
+ # @example
22
+ # case unwrap_webhook_event
23
+ # in {type: :"call.ended", account_id: account_id, data: data, timestamp: timestamp}
24
+ # puts(account_id)
25
+ # in {type: :"campaign.approved", account_id: account_id, data: data, timestamp: timestamp}
26
+ # puts(data)
27
+ # in {type: :"contact.opted_in", account_id: account_id, data: data, timestamp: timestamp}
28
+ # puts(timestamp)
29
+ # else
30
+ # puts(unwrap_webhook_event)
31
+ # end
20
32
  module Union
21
33
  include SurgeAPI::Internal::Type::Converter
22
34
  include SurgeAPI::Internal::Util::SorbetRuntimeSupport
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SurgeAPI
4
+ module Models
5
+ # @see SurgeAPI::Resources::Messages#retrieve
6
+ class MessageRetrieveParams < SurgeAPI::Internal::Type::BaseModel
7
+ extend SurgeAPI::Internal::Type::RequestParameters::Converter
8
+ include SurgeAPI::Internal::Type::RequestParameters
9
+
10
+ # @!method initialize(request_options: {})
11
+ # @param request_options [SurgeAPI::RequestOptions, Hash{Symbol=>Object}]
12
+ end
13
+ end
14
+ end
@@ -5,23 +5,25 @@ module SurgeAPI
5
5
  module UnwrapWebhookEvent
6
6
  extend SurgeAPI::Internal::Type::Union
7
7
 
8
- variant -> { SurgeAPI::CallEndedWebhookEvent }
8
+ discriminator :type
9
9
 
10
- variant -> { SurgeAPI::CampaignApprovedWebhookEvent }
10
+ variant :"call.ended", -> { SurgeAPI::CallEndedWebhookEvent }
11
11
 
12
- variant -> { SurgeAPI::ContactOptedInWebhookEvent }
12
+ variant :"campaign.approved", -> { SurgeAPI::CampaignApprovedWebhookEvent }
13
13
 
14
- variant -> { SurgeAPI::ContactOptedOutWebhookEvent }
14
+ variant :"contact.opted_in", -> { SurgeAPI::ContactOptedInWebhookEvent }
15
15
 
16
- variant -> { SurgeAPI::ConversationCreatedWebhookEvent }
16
+ variant :"contact.opted_out", -> { SurgeAPI::ContactOptedOutWebhookEvent }
17
17
 
18
- variant -> { SurgeAPI::MessageDeliveredWebhookEvent }
18
+ variant :"conversation.created", -> { SurgeAPI::ConversationCreatedWebhookEvent }
19
19
 
20
- variant -> { SurgeAPI::MessageFailedWebhookEvent }
20
+ variant :"message.delivered", -> { SurgeAPI::MessageDeliveredWebhookEvent }
21
21
 
22
- variant -> { SurgeAPI::MessageReceivedWebhookEvent }
22
+ variant :"message.failed", -> { SurgeAPI::MessageFailedWebhookEvent }
23
23
 
24
- variant -> { SurgeAPI::MessageSentWebhookEvent }
24
+ variant :"message.received", -> { SurgeAPI::MessageReceivedWebhookEvent }
25
+
26
+ variant :"message.sent", -> { SurgeAPI::MessageSentWebhookEvent }
25
27
 
26
28
  # @!method self.variants
27
29
  # @return [Array(SurgeAPI::Models::CallEndedWebhookEvent, SurgeAPI::Models::CampaignApprovedWebhookEvent, SurgeAPI::Models::ContactOptedInWebhookEvent, SurgeAPI::Models::ContactOptedOutWebhookEvent, SurgeAPI::Models::ConversationCreatedWebhookEvent, SurgeAPI::Models::MessageDeliveredWebhookEvent, SurgeAPI::Models::MessageFailedWebhookEvent, SurgeAPI::Models::MessageReceivedWebhookEvent, SurgeAPI::Models::MessageSentWebhookEvent)]
@@ -91,6 +91,8 @@ module SurgeAPI
91
91
 
92
92
  MessageReceivedWebhookEvent = SurgeAPI::Models::MessageReceivedWebhookEvent
93
93
 
94
+ MessageRetrieveParams = SurgeAPI::Models::MessageRetrieveParams
95
+
94
96
  MessageSentWebhookEvent = SurgeAPI::Models::MessageSentWebhookEvent
95
97
 
96
98
  Organization = SurgeAPI::Models::Organization
@@ -59,6 +59,26 @@ module SurgeAPI
59
59
  )
60
60
  end
61
61
 
62
+ # Retrieves a Message object.
63
+ #
64
+ # @overload retrieve(id, request_options: {})
65
+ #
66
+ # @param id [String] The ID of the message to retrieve.
67
+ #
68
+ # @param request_options [SurgeAPI::RequestOptions, Hash{Symbol=>Object}, nil]
69
+ #
70
+ # @return [SurgeAPI::Models::Message]
71
+ #
72
+ # @see SurgeAPI::Models::MessageRetrieveParams
73
+ def retrieve(id, params = {})
74
+ @client.request(
75
+ method: :get,
76
+ path: ["messages/%1$s", id],
77
+ model: SurgeAPI::Message,
78
+ options: params[:request_options]
79
+ )
80
+ end
81
+
62
82
  # @api private
63
83
  #
64
84
  # @param client [SurgeAPI::Client]
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SurgeAPI
4
- VERSION = "0.2.1"
4
+ VERSION = "0.3.0"
5
5
  end
data/lib/surge_api.rb CHANGED
@@ -3,12 +3,14 @@
3
3
  # Standard libraries.
4
4
  # rubocop:disable Lint/RedundantRequireStatement
5
5
  require "English"
6
+ require "base64"
6
7
  require "cgi"
7
8
  require "date"
8
9
  require "erb"
9
10
  require "etc"
10
11
  require "json"
11
12
  require "net/http"
13
+ require "openssl"
12
14
  require "pathname"
13
15
  require "rbconfig"
14
16
  require "securerandom"
@@ -76,6 +78,7 @@ require_relative "surge_api/models/message_create_params"
76
78
  require_relative "surge_api/models/message_delivered_webhook_event"
77
79
  require_relative "surge_api/models/message_failed_webhook_event"
78
80
  require_relative "surge_api/models/message_received_webhook_event"
81
+ require_relative "surge_api/models/message_retrieve_params"
79
82
  require_relative "surge_api/models/message_sent_webhook_event"
80
83
  require_relative "surge_api/models/organization"
81
84
  require_relative "surge_api/models/phone_number"
data/manifest.yaml CHANGED
@@ -1,11 +1,13 @@
1
1
  dependencies:
2
2
  - English
3
+ - base64
3
4
  - cgi
4
5
  - date
5
6
  - erb
6
7
  - etc
7
8
  - json
8
9
  - net/http
10
+ - openssl
9
11
  - pathname
10
12
  - rbconfig
11
13
  - securerandom
@@ -176,6 +176,11 @@ module SurgeAPI
176
176
  private def auth_headers
177
177
  end
178
178
 
179
+ # @api private
180
+ sig { returns(String) }
181
+ private def user_agent
182
+ end
183
+
179
184
  # @api private
180
185
  sig { returns(String) }
181
186
  private def generate_idempotency_key
@@ -26,8 +26,12 @@ module SurgeAPI
26
26
 
27
27
  class << self
28
28
  # @api private
29
- sig { params(url: URI::Generic).returns(Net::HTTP) }
30
- def connect(url)
29
+ sig do
30
+ params(cert_store: OpenSSL::X509::Store, url: URI::Generic).returns(
31
+ Net::HTTP
32
+ )
33
+ end
34
+ def connect(cert_store:, url:)
31
35
  end
32
36
 
33
37
  # @api private
@@ -31,7 +31,7 @@ module SurgeAPI
31
31
  #
32
32
  # Assumes superclass fields are totally defined before fields are accessed /
33
33
  # defined on subclasses.
34
- sig { params(child: T.self_type).void }
34
+ sig { params(child: SurgeAPI::Internal::Type::BaseModel).void }
35
35
  def inherited(child)
36
36
  end
37
37
 
@@ -274,9 +274,13 @@ module SurgeAPI
274
274
 
275
275
  # Create a new instance of a model.
276
276
  sig do
277
- params(data: T.any(T::Hash[Symbol, T.anything], T.self_type)).returns(
278
- T.attached_class
279
- )
277
+ params(
278
+ data:
279
+ T.any(
280
+ T::Hash[Symbol, T.anything],
281
+ SurgeAPI::Internal::Type::BaseModel
282
+ )
283
+ ).returns(T.attached_class)
280
284
  end
281
285
  def self.new(data = {})
282
286
  end
@@ -0,0 +1,27 @@
1
+ # typed: strong
2
+
3
+ module SurgeAPI
4
+ module Models
5
+ class MessageRetrieveParams < SurgeAPI::Internal::Type::BaseModel
6
+ extend SurgeAPI::Internal::Type::RequestParameters::Converter
7
+ include SurgeAPI::Internal::Type::RequestParameters
8
+
9
+ OrHash =
10
+ T.type_alias do
11
+ T.any(SurgeAPI::MessageRetrieveParams, SurgeAPI::Internal::AnyHash)
12
+ end
13
+
14
+ sig do
15
+ params(request_options: SurgeAPI::RequestOptions::OrHash).returns(
16
+ T.attached_class
17
+ )
18
+ end
19
+ def self.new(request_options: {})
20
+ end
21
+
22
+ sig { override.returns({ request_options: SurgeAPI::RequestOptions }) }
23
+ def to_hash
24
+ end
25
+ end
26
+ end
27
+ end
@@ -54,6 +54,8 @@ module SurgeAPI
54
54
 
55
55
  MessageReceivedWebhookEvent = SurgeAPI::Models::MessageReceivedWebhookEvent
56
56
 
57
+ MessageRetrieveParams = SurgeAPI::Models::MessageRetrieveParams
58
+
57
59
  MessageSentWebhookEvent = SurgeAPI::Models::MessageSentWebhookEvent
58
60
 
59
61
  Organization = SurgeAPI::Models::Organization
@@ -46,6 +46,20 @@ module SurgeAPI
46
46
  )
47
47
  end
48
48
 
49
+ # Retrieves a Message object.
50
+ sig do
51
+ params(
52
+ id: String,
53
+ request_options: SurgeAPI::RequestOptions::OrHash
54
+ ).returns(SurgeAPI::Message)
55
+ end
56
+ def retrieve(
57
+ # The ID of the message to retrieve.
58
+ id,
59
+ request_options: {}
60
+ )
61
+ end
62
+
49
63
  # @api private
50
64
  sig { params(client: SurgeAPI::Client).returns(T.attached_class) }
51
65
  def self.new(client:)
@@ -87,6 +87,8 @@ module SurgeAPI
87
87
 
88
88
  private def auth_headers: -> ::Hash[String, String]
89
89
 
90
+ private def user_agent: -> String
91
+
90
92
  private def generate_idempotency_key: -> String
91
93
 
92
94
  private def build_request: (
@@ -17,7 +17,10 @@ module SurgeAPI
17
17
 
18
18
  DEFAULT_MAX_CONNECTIONS: Integer
19
19
 
20
- def self.connect: (URI::Generic url) -> top
20
+ def self.connect: (
21
+ cert_store: OpenSSL::X509::Store,
22
+ url: URI::Generic
23
+ ) -> top
21
24
 
22
25
  def self.calibrate_socket_timeout: (top conn, Float deadline) -> void
23
26
 
@@ -0,0 +1,15 @@
1
+ module SurgeAPI
2
+ module Models
3
+ type message_retrieve_params =
4
+ { } & SurgeAPI::Internal::Type::request_parameters
5
+
6
+ class MessageRetrieveParams < SurgeAPI::Internal::Type::BaseModel
7
+ extend SurgeAPI::Internal::Type::RequestParameters::Converter
8
+ include SurgeAPI::Internal::Type::RequestParameters
9
+
10
+ def initialize: (?request_options: SurgeAPI::request_opts) -> void
11
+
12
+ def to_hash: -> { request_options: SurgeAPI::RequestOptions }
13
+ end
14
+ end
15
+ end
@@ -51,6 +51,8 @@ module SurgeAPI
51
51
 
52
52
  class MessageReceivedWebhookEvent = SurgeAPI::Models::MessageReceivedWebhookEvent
53
53
 
54
+ class MessageRetrieveParams = SurgeAPI::Models::MessageRetrieveParams
55
+
54
56
  class MessageSentWebhookEvent = SurgeAPI::Models::MessageSentWebhookEvent
55
57
 
56
58
  class Organization = SurgeAPI::Models::Organization
@@ -7,6 +7,11 @@ module SurgeAPI
7
7
  ?request_options: SurgeAPI::request_opts
8
8
  ) -> SurgeAPI::Message
9
9
 
10
+ def retrieve: (
11
+ String id,
12
+ ?request_options: SurgeAPI::request_opts
13
+ ) -> SurgeAPI::Message
14
+
10
15
  def initialize: (client: SurgeAPI::Client) -> void
11
16
  end
12
17
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: surge_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Surge
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-10-31 00:00:00.000000000 Z
11
+ date: 2025-12-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: connection_pool
@@ -81,6 +81,7 @@ files:
81
81
  - lib/surge_api/models/message_failed_webhook_event.rb
82
82
  - lib/surge_api/models/message_params.rb
83
83
  - lib/surge_api/models/message_received_webhook_event.rb
84
+ - lib/surge_api/models/message_retrieve_params.rb
84
85
  - lib/surge_api/models/message_sent_webhook_event.rb
85
86
  - lib/surge_api/models/organization.rb
86
87
  - lib/surge_api/models/phone_number.rb
@@ -154,6 +155,7 @@ files:
154
155
  - rbi/surge_api/models/message_failed_webhook_event.rbi
155
156
  - rbi/surge_api/models/message_params.rbi
156
157
  - rbi/surge_api/models/message_received_webhook_event.rbi
158
+ - rbi/surge_api/models/message_retrieve_params.rbi
157
159
  - rbi/surge_api/models/message_sent_webhook_event.rbi
158
160
  - rbi/surge_api/models/organization.rbi
159
161
  - rbi/surge_api/models/phone_number.rbi
@@ -226,6 +228,7 @@ files:
226
228
  - sig/surge_api/models/message_failed_webhook_event.rbs
227
229
  - sig/surge_api/models/message_params.rbs
228
230
  - sig/surge_api/models/message_received_webhook_event.rbs
231
+ - sig/surge_api/models/message_retrieve_params.rbs
229
232
  - sig/surge_api/models/message_sent_webhook_event.rbs
230
233
  - sig/surge_api/models/organization.rbs
231
234
  - sig/surge_api/models/phone_number.rbs