surge_api 0.2.1 → 0.4.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.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +40 -0
  3. data/README.md +1 -1
  4. data/lib/surge_api/internal/transport/base_client.rb +7 -1
  5. data/lib/surge_api/internal/transport/pooled_net_requester.rb +18 -12
  6. data/lib/surge_api/internal/type/union.rb +12 -0
  7. data/lib/surge_api/internal/util.rb +7 -2
  8. data/lib/surge_api/models/account_archive_params.rb +14 -0
  9. data/lib/surge_api/models/message_retrieve_params.rb +14 -0
  10. data/lib/surge_api/models/unwrap_webhook_event.rb +11 -9
  11. data/lib/surge_api/models.rb +4 -0
  12. data/lib/surge_api/resources/accounts.rb +29 -0
  13. data/lib/surge_api/resources/messages.rb +20 -0
  14. data/lib/surge_api/version.rb +1 -1
  15. data/lib/surge_api.rb +4 -0
  16. data/manifest.yaml +2 -0
  17. data/rbi/surge_api/internal/transport/base_client.rbi +5 -0
  18. data/rbi/surge_api/internal/transport/pooled_net_requester.rbi +6 -2
  19. data/rbi/surge_api/internal/type/base_model.rbi +8 -4
  20. data/rbi/surge_api/models/account_archive_params.rbi +27 -0
  21. data/rbi/surge_api/models/message_retrieve_params.rbi +27 -0
  22. data/rbi/surge_api/models.rbi +4 -0
  23. data/rbi/surge_api/resources/accounts.rbi +23 -0
  24. data/rbi/surge_api/resources/messages.rbi +14 -0
  25. data/sig/surge_api/internal/transport/base_client.rbs +2 -0
  26. data/sig/surge_api/internal/transport/pooled_net_requester.rbs +4 -1
  27. data/sig/surge_api/models/account_archive_params.rbs +15 -0
  28. data/sig/surge_api/models/message_retrieve_params.rbs +15 -0
  29. data/sig/surge_api/models.rbs +4 -0
  30. data/sig/surge_api/resources/accounts.rbs +5 -0
  31. data/sig/surge_api/resources/messages.rbs +5 -0
  32. metadata +22 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cc8267ebb4682d2884a0ed0a4ff0c1ec89a6e76988ee96cbdd794bc9ee745ef2
4
- data.tar.gz: fcefd6289c6dae43967d4eac94bbc87299ab03c52e335f611949a4d6169c7c79
3
+ metadata.gz: da7c01aaa992d5a9324e6a320821c240261535e5c85ef840624e00e82ff3a722
4
+ data.tar.gz: 1219ffe72345fb81de26f7f7be3c6a05d11d790de928bb8e3821c59ca837ad86
5
5
  SHA512:
6
- metadata.gz: 22b712d8f2898bca0a102de847125c57cc1feb4771c23db55de558616b6dba9de87a1915e05e44c23ca619872f9a9d0f70df9c8f522e8f867048fd43a53cb660
7
- data.tar.gz: '025923bb1e6f82ecbe04e30ee9f849369e8ddd76dd73f729dfe046220ffc044633cc7f1d15d286b6d37c2b5d6d641bae27e2cb558499e4c6271133997ba8444f'
6
+ metadata.gz: 44b3bd94a28e639bdae0131f72893b3e0fbbccc4ef11eaef833cd4214d167879bbbdb36ab964ce991c07d8cf844b2a59225c1a2e4afd231ac1045472e6c5f2b0
7
+ data.tar.gz: aeba66370a29d5bc640f998625e6bde7e3a040f9579a24253442d434d9b671fa1f46d42c84afb07913958d696836e89a226ab2a989585ec90fc156150e45bbb2
data/CHANGELOG.md CHANGED
@@ -1,5 +1,45 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.0 (2026-01-10)
4
+
5
+ Full Changelog: [v0.3.0...v0.4.0](https://github.com/surgeapi/ruby-sdk/compare/v0.3.0...v0.4.0)
6
+
7
+ ### Features
8
+
9
+ * **api:** add archive account endpoint ([b56a3ac](https://github.com/surgeapi/ruby-sdk/commit/b56a3ac799df5e73cfea5416bb6af32cdeaac64d))
10
+
11
+
12
+ ### Bug Fixes
13
+
14
+ * issue where json.parse errors when receiving HTTP 204 with nobody ([a54e6ff](https://github.com/surgeapi/ruby-sdk/commit/a54e6ff310c9d5d146161a33971eb0dc541c9774))
15
+
16
+
17
+ ### Chores
18
+
19
+ * **internal:** codegen related update ([6dda266](https://github.com/surgeapi/ruby-sdk/commit/6dda2669de3018139c1ff15a9c23edda513fd899))
20
+ * move `cgi` into dependencies for ruby 4 ([03ce06b](https://github.com/surgeapi/ruby-sdk/commit/03ce06b6a4f4d7f510dee6ece06e89ff93ede89d))
21
+
22
+ ## 0.3.0 (2025-12-17)
23
+
24
+ Full Changelog: [v0.2.1...v0.3.0](https://github.com/surgeapi/ruby-sdk/compare/v0.2.1...v0.3.0)
25
+
26
+ ### Features
27
+
28
+ * **api:** add retrieve message endpoint ([55df346](https://github.com/surgeapi/ruby-sdk/commit/55df346f91c99fece77d130057afc55b021666c7))
29
+
30
+
31
+ ### Bug Fixes
32
+
33
+ * better thread safety via early initializing SSL store during HTTP client creation ([0d14e5e](https://github.com/surgeapi/ruby-sdk/commit/0d14e5e73496e95743359c4c8dbab6da1c384a6e))
34
+ * calling `break` out of streams should be instantaneous ([b43c7e5](https://github.com/surgeapi/ruby-sdk/commit/b43c7e54e9dfaaf31ffa0fe498c53fcc51bbb81c))
35
+
36
+
37
+ ### Chores
38
+
39
+ * bump dependency version and update sorbet types ([e00a588](https://github.com/surgeapi/ruby-sdk/commit/e00a5886df58170099838c7a2b1ba25fe36588d6))
40
+ * explicitly require "base64" gem ([a25ee53](https://github.com/surgeapi/ruby-sdk/commit/a25ee53f821df6c2d177b0e41c864e15e4b8bae9))
41
+ * **internal:** codegen related update ([744a068](https://github.com/surgeapi/ruby-sdk/commit/744a0682fa04890d445106232878d0d5be7d7273))
42
+
3
43
  ## 0.2.1 (2025-10-31)
4
44
 
5
45
  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.4.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
@@ -657,7 +657,8 @@ module SurgeAPI
657
657
  def decode_content(headers, stream:, suppress_error: false)
658
658
  case (content_type = headers["content-type"])
659
659
  in SurgeAPI::Internal::Util::JSON_CONTENT
660
- json = stream.to_a.join
660
+ return nil if (json = stream.to_a.join).empty?
661
+
661
662
  begin
662
663
  JSON.parse(json, symbolize_names: true)
663
664
  rescue JSON::ParserError => e
@@ -667,7 +668,11 @@ module SurgeAPI
667
668
  in SurgeAPI::Internal::Util::JSONL_CONTENT
668
669
  lines = decode_lines(stream)
669
670
  chain_fused(lines) do |y|
670
- lines.each { y << JSON.parse(_1, symbolize_names: true) }
671
+ lines.each do
672
+ next if _1.empty?
673
+
674
+ y << JSON.parse(_1, symbolize_names: true)
675
+ end
671
676
  end
672
677
  in %r{^text/event-stream}
673
678
  lines = decode_lines(stream)
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SurgeAPI
4
+ module Models
5
+ # @see SurgeAPI::Resources::Accounts#archive
6
+ class AccountArchiveParams < 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
@@ -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)]
@@ -41,6 +41,8 @@ module SurgeAPI
41
41
 
42
42
  Account = SurgeAPI::Models::Account
43
43
 
44
+ AccountArchiveParams = SurgeAPI::Models::AccountArchiveParams
45
+
44
46
  AccountCreateParams = SurgeAPI::Models::AccountCreateParams
45
47
 
46
48
  AccountRetrieveStatusParams = SurgeAPI::Models::AccountRetrieveStatusParams
@@ -91,6 +93,8 @@ module SurgeAPI
91
93
 
92
94
  MessageReceivedWebhookEvent = SurgeAPI::Models::MessageReceivedWebhookEvent
93
95
 
96
+ MessageRetrieveParams = SurgeAPI::Models::MessageRetrieveParams
97
+
94
98
  MessageSentWebhookEvent = SurgeAPI::Models::MessageSentWebhookEvent
95
99
 
96
100
  Organization = SurgeAPI::Models::Organization
@@ -67,6 +67,35 @@ module SurgeAPI
67
67
  )
68
68
  end
69
69
 
70
+ # Archives an account and releases all associated resources.
71
+ #
72
+ # **Warning**: This action will:
73
+ #
74
+ # - Release all phone numbers associated with the account
75
+ # - Deactivate all campaigns
76
+ # - Make the account unusable for sending messages
77
+ #
78
+ # This operation is irreversible. If you need to send SMS in the future, you will
79
+ # need to re-register new phone numbers and campaigns.
80
+ #
81
+ # @overload archive(id, request_options: {})
82
+ #
83
+ # @param id [String] The ID of the account to archive.
84
+ #
85
+ # @param request_options [SurgeAPI::RequestOptions, Hash{Symbol=>Object}, nil]
86
+ #
87
+ # @return [SurgeAPI::Models::Account]
88
+ #
89
+ # @see SurgeAPI::Models::AccountArchiveParams
90
+ def archive(id, params = {})
91
+ @client.request(
92
+ method: :delete,
93
+ path: ["accounts/%1$s", id],
94
+ model: SurgeAPI::Account,
95
+ options: params[:request_options]
96
+ )
97
+ end
98
+
70
99
  # Check an account's status and capabilities
71
100
  #
72
101
  # @overload retrieve_status(account_id, capabilities: nil, request_options: {})
@@ -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.4.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"
@@ -53,6 +55,7 @@ require_relative "surge_api/client"
53
55
  require_relative "surge_api/models/campaign_params"
54
56
  require_relative "surge_api/models/message_params"
55
57
  require_relative "surge_api/models/account"
58
+ require_relative "surge_api/models/account_archive_params"
56
59
  require_relative "surge_api/models/account_create_params"
57
60
  require_relative "surge_api/models/account_retrieve_status_params"
58
61
  require_relative "surge_api/models/account_status"
@@ -76,6 +79,7 @@ require_relative "surge_api/models/message_create_params"
76
79
  require_relative "surge_api/models/message_delivered_webhook_event"
77
80
  require_relative "surge_api/models/message_failed_webhook_event"
78
81
  require_relative "surge_api/models/message_received_webhook_event"
82
+ require_relative "surge_api/models/message_retrieve_params"
79
83
  require_relative "surge_api/models/message_sent_webhook_event"
80
84
  require_relative "surge_api/models/organization"
81
85
  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 AccountArchiveParams < 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::AccountArchiveParams, 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
@@ -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
@@ -3,6 +3,8 @@
3
3
  module SurgeAPI
4
4
  Account = SurgeAPI::Models::Account
5
5
 
6
+ AccountArchiveParams = SurgeAPI::Models::AccountArchiveParams
7
+
6
8
  AccountCreateParams = SurgeAPI::Models::AccountCreateParams
7
9
 
8
10
  AccountRetrieveStatusParams = SurgeAPI::Models::AccountRetrieveStatusParams
@@ -54,6 +56,8 @@ module SurgeAPI
54
56
 
55
57
  MessageReceivedWebhookEvent = SurgeAPI::Models::MessageReceivedWebhookEvent
56
58
 
59
+ MessageRetrieveParams = SurgeAPI::Models::MessageRetrieveParams
60
+
57
61
  MessageSentWebhookEvent = SurgeAPI::Models::MessageSentWebhookEvent
58
62
 
59
63
  Organization = SurgeAPI::Models::Organization
@@ -65,6 +65,29 @@ module SurgeAPI
65
65
  )
66
66
  end
67
67
 
68
+ # Archives an account and releases all associated resources.
69
+ #
70
+ # **Warning**: This action will:
71
+ #
72
+ # - Release all phone numbers associated with the account
73
+ # - Deactivate all campaigns
74
+ # - Make the account unusable for sending messages
75
+ #
76
+ # This operation is irreversible. If you need to send SMS in the future, you will
77
+ # need to re-register new phone numbers and campaigns.
78
+ sig do
79
+ params(
80
+ id: String,
81
+ request_options: SurgeAPI::RequestOptions::OrHash
82
+ ).returns(SurgeAPI::Account)
83
+ end
84
+ def archive(
85
+ # The ID of the account to archive.
86
+ id,
87
+ request_options: {}
88
+ )
89
+ end
90
+
68
91
  # Check an account's status and capabilities
69
92
  sig do
70
93
  params(
@@ -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 account_archive_params =
4
+ { } & SurgeAPI::Internal::Type::request_parameters
5
+
6
+ class AccountArchiveParams < 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
@@ -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
@@ -1,6 +1,8 @@
1
1
  module SurgeAPI
2
2
  class Account = SurgeAPI::Models::Account
3
3
 
4
+ class AccountArchiveParams = SurgeAPI::Models::AccountArchiveParams
5
+
4
6
  class AccountCreateParams = SurgeAPI::Models::AccountCreateParams
5
7
 
6
8
  class AccountRetrieveStatusParams = SurgeAPI::Models::AccountRetrieveStatusParams
@@ -51,6 +53,8 @@ module SurgeAPI
51
53
 
52
54
  class MessageReceivedWebhookEvent = SurgeAPI::Models::MessageReceivedWebhookEvent
53
55
 
56
+ class MessageRetrieveParams = SurgeAPI::Models::MessageRetrieveParams
57
+
54
58
  class MessageSentWebhookEvent = SurgeAPI::Models::MessageSentWebhookEvent
55
59
 
56
60
  class Organization = SurgeAPI::Models::Organization
@@ -18,6 +18,11 @@ module SurgeAPI
18
18
  ?request_options: SurgeAPI::request_opts
19
19
  ) -> SurgeAPI::Account
20
20
 
21
+ def archive: (
22
+ String id,
23
+ ?request_options: SurgeAPI::request_opts
24
+ ) -> SurgeAPI::Account
25
+
21
26
  def retrieve_status: (
22
27
  String account_id,
23
28
  ?capabilities: ::Array[SurgeAPI::Models::AccountRetrieveStatusParams::capability],
@@ -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,15 +1,29 @@
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.4.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: 2026-01-11 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: cgi
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: connection_pool
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -56,6 +70,7 @@ files:
56
70
  - lib/surge_api/internal/util.rb
57
71
  - lib/surge_api/models.rb
58
72
  - lib/surge_api/models/account.rb
73
+ - lib/surge_api/models/account_archive_params.rb
59
74
  - lib/surge_api/models/account_create_params.rb
60
75
  - lib/surge_api/models/account_retrieve_status_params.rb
61
76
  - lib/surge_api/models/account_status.rb
@@ -81,6 +96,7 @@ files:
81
96
  - lib/surge_api/models/message_failed_webhook_event.rb
82
97
  - lib/surge_api/models/message_params.rb
83
98
  - lib/surge_api/models/message_received_webhook_event.rb
99
+ - lib/surge_api/models/message_retrieve_params.rb
84
100
  - lib/surge_api/models/message_sent_webhook_event.rb
85
101
  - lib/surge_api/models/organization.rb
86
102
  - lib/surge_api/models/phone_number.rb
@@ -129,6 +145,7 @@ files:
129
145
  - rbi/surge_api/internal/util.rbi
130
146
  - rbi/surge_api/models.rbi
131
147
  - rbi/surge_api/models/account.rbi
148
+ - rbi/surge_api/models/account_archive_params.rbi
132
149
  - rbi/surge_api/models/account_create_params.rbi
133
150
  - rbi/surge_api/models/account_retrieve_status_params.rbi
134
151
  - rbi/surge_api/models/account_status.rbi
@@ -154,6 +171,7 @@ files:
154
171
  - rbi/surge_api/models/message_failed_webhook_event.rbi
155
172
  - rbi/surge_api/models/message_params.rbi
156
173
  - rbi/surge_api/models/message_received_webhook_event.rbi
174
+ - rbi/surge_api/models/message_retrieve_params.rbi
157
175
  - rbi/surge_api/models/message_sent_webhook_event.rbi
158
176
  - rbi/surge_api/models/organization.rbi
159
177
  - rbi/surge_api/models/phone_number.rbi
@@ -201,6 +219,7 @@ files:
201
219
  - sig/surge_api/internal/util.rbs
202
220
  - sig/surge_api/models.rbs
203
221
  - sig/surge_api/models/account.rbs
222
+ - sig/surge_api/models/account_archive_params.rbs
204
223
  - sig/surge_api/models/account_create_params.rbs
205
224
  - sig/surge_api/models/account_retrieve_status_params.rbs
206
225
  - sig/surge_api/models/account_status.rbs
@@ -226,6 +245,7 @@ files:
226
245
  - sig/surge_api/models/message_failed_webhook_event.rbs
227
246
  - sig/surge_api/models/message_params.rbs
228
247
  - sig/surge_api/models/message_received_webhook_event.rbs
248
+ - sig/surge_api/models/message_retrieve_params.rbs
229
249
  - sig/surge_api/models/message_sent_webhook_event.rbs
230
250
  - sig/surge_api/models/organization.rbs
231
251
  - sig/surge_api/models/phone_number.rbs