debugbundle 2.0.0 → 2.0.1

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: 154069d58e3649c8b90ab0b5567749fef0b0ae27756354467d2f54e347c20bdb
4
- data.tar.gz: 10364db06a596a352b0b96cdfda8b54fe6ec228ab2a4682b89740d38ca0f2a09
3
+ metadata.gz: de914935eb26ac5a4a4c7a21e91e13f92fcdef0949c8a19cc9566adf70fa7b5d
4
+ data.tar.gz: ff2d61415de5d618556d00f4918e4d3a29af38ae7be2bddafc088304a7b11e2b
5
5
  SHA512:
6
- metadata.gz: 529aa156d0361a75d06a6b9c1f1dd9950269c1c0c82a97367436a6987a8546c0f9274631c1027e0e5585147b18e34ce5a441eca453891a442e105617370f373f
7
- data.tar.gz: 3d768b54c0ca11c5ed227bbe02ece3ad61a40a77597028366e900c1cc42a4e4777bb93fc837dfc2eeee030e610c0756993fb363f0d2eab5e17457b34b0c66e02
6
+ metadata.gz: 7655a43d83ce82e3d7cd6febebc560a2c6c31dde18df9b3a579897fa236c1094c36bc170aa203f1a412caca0ff86c1d6bf529745e9b69e48d55c88799ba84531
7
+ data.tar.gz: 06b7e321fe0bae17dfe91bd4ffecd4288f84c0151a9909def3d18c02fc1e5f4e262171b7318a2bed337876a0ed7740c9d1d31d0ab518b187a05f72e0db0fcf49
data/README.md CHANGED
@@ -368,3 +368,9 @@ The repository ships a GitHub Actions release workflow at `.github/workflows/rel
368
368
  ## License
369
369
 
370
370
  Apache-2.0. See LICENSE.
371
+
372
+ ## Delivery acknowledgement and retry limits
373
+
374
+ The built-in HTTP transport requires the canonical ingestion acknowledgement (`accepted`, `rejected`, and `errors`). Empty responses, unrelated JSON, malformed counts, or invalid rejection indices retain the full batch with backoff. Valid acknowledgements remove accepted and terminally rejected events and retry only the indexed retryable rejections; an all-rejected batch does not advance `lastEventAt`.
375
+
376
+ File transports and explicitly supplied custom/legacy transports retain their documented bodyless success fallback. A custom transport that returns acknowledgement fields must return the complete canonical shape. Retry hints (delay seconds or HTTP dates) are bounded to five minutes and measured from response receipt, including partial/protocol acknowledgements and retryable server failures. Without a server hint, existing retry timing is preserved. Failures remain contained within the SDK's existing delivery path.
@@ -11,8 +11,8 @@ module DebugBundle
11
11
 
12
12
  module_function
13
13
 
14
- def decide(body, batch_length)
15
- return { kind: :legacy } unless body.is_a?(Hash) && FIELDS.any? { |field| body.key?(field) }
14
+ def decide(body, batch_length, required: false)
15
+ return missing_acknowledgement(required) unless body.is_a?(Hash) && FIELDS.any? { |field| body.key?(field) }
16
16
  return protocol_failure unless FIELDS.all? { |field| body.key?(field) }
17
17
 
18
18
  accepted = body['accepted']
@@ -55,5 +55,9 @@ module DebugBundle
55
55
  def protocol_failure
56
56
  { kind: :protocol_failure }
57
57
  end
58
+
59
+ def missing_acknowledgement(required)
60
+ required ? protocol_failure : { kind: :legacy }
61
+ end
58
62
  end
59
63
  end
@@ -443,10 +443,10 @@ module DebugBundle
443
443
  case result.status_code
444
444
  when 200..299
445
445
  handle_successful_result(result, batch)
446
- when 429
446
+ when 429, 500..599
447
447
  @consecutive_failures += 1
448
- retry_after_seconds = (result.retry_after_seconds || 1).clamp(1, RETRY_AFTER_CAP_SECONDS)
449
- @retry_at = now + retry_after_seconds
448
+ retry_after_seconds = bounded_retry_hint(result.retry_after_seconds)
449
+ @retry_at = now + retry_after_seconds if result.status_code == 429 || !result.retry_after_seconds.nil?
450
450
  false
451
451
  when 400..499
452
452
  remove_buffered_events(batch)
@@ -515,9 +515,15 @@ module DebugBundle
515
515
 
516
516
  private
517
517
 
518
+ def bounded_retry_hint(value)
519
+ return 1 unless value.is_a?(Numeric) && value.real? && value.finite?
520
+
521
+ value.clamp(1, RETRY_AFTER_CAP_SECONDS)
522
+ end
523
+
518
524
  def handle_successful_result(result, batch)
519
- decision = Acknowledgement.decide(result.body, batch.length)
520
- return handle_protocol_failure if decision[:kind] == :protocol_failure
525
+ decision = Acknowledgement.decide(result.body, batch.length, required: @transport.is_a?(Transport::HttpTransport))
526
+ return handle_protocol_failure(result.retry_after_seconds) if decision[:kind] == :protocol_failure
521
527
 
522
528
  if decision[:kind] == :legacy
523
529
  remove_buffered_events(batch)
@@ -532,7 +538,7 @@ module DebugBundle
532
538
 
533
539
  if retryable_events.any?
534
540
  @consecutive_failures += 1
535
- @retry_at = now + 1
541
+ @retry_at = now + bounded_retry_hint(result.retry_after_seconds)
536
542
  @acknowledgement_state = :degraded
537
543
  false
538
544
  else
@@ -543,9 +549,9 @@ module DebugBundle
543
549
  end
544
550
  end
545
551
 
546
- def handle_protocol_failure
552
+ def handle_protocol_failure(retry_hint)
547
553
  @consecutive_failures += 1
548
- @retry_at = now + 1
554
+ @retry_at = now + bounded_retry_hint(retry_hint)
549
555
  @acknowledgement_state = :degraded
550
556
  false
551
557
  end
@@ -4,6 +4,7 @@ require 'json'
4
4
  require 'net/http'
5
5
  require 'securerandom'
6
6
  require 'uri'
7
+ require 'time'
7
8
  require 'fileutils'
8
9
 
9
10
  module DebugBundle
@@ -83,8 +84,11 @@ module DebugBundle
83
84
  def parse_retry_after(value)
84
85
  return nil if value.nil? || value.strip.empty?
85
86
 
86
- seconds = Integer(Float(value))
87
- seconds.clamp(0, RETRY_AFTER_CAP_SECONDS)
87
+ seconds = Float(value, exception: false)
88
+ seconds = Time.httpdate(value) - Time.now if seconds.nil?
89
+ return nil unless seconds.finite?
90
+
91
+ seconds.clamp(0, RETRY_AFTER_CAP_SECONDS).to_i
88
92
  rescue ArgumentError, TypeError
89
93
  nil
90
94
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DebugBundle
4
- VERSION = '2.0.0'
4
+ VERSION = '2.0.1'
5
5
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: debugbundle
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - DebugBundle
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2026-09-25 00:00:00.000000000 Z
10
+ date: 2026-09-26 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: base64