@urun-sh/core 0.2.44 → 0.2.46

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,37 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.44
4
+
5
+ - **A flat inbound RTP counter no longer tears down a healthy media transport.** The
6
+ media-liveness watchdog treated any inbound-bytes counter that stayed flat past
7
+ `stallTimeoutMs` (default 6s) as media death and answered it with a full
8
+ teardown + re-dial. A cumulative receive counter cannot tell a dead path from a
9
+ SENDER WITH NOTHING TO SEND — both look identical at the receiver — so every
10
+ on-demand app blacked itself out: zimage emits a handful of H.264 frames per
11
+ generation and then legitimately goes quiet, so each idle gap destroyed the
12
+ transport, the SFU scored the teardown as consumer-abandoned and ended the
13
+ session, the runtime tore down its encoder, and the next dial had no keyframe to
14
+ decode. Self-sustaining reconnect loop; same class as the 3724x reconnect storm.
15
+ The ICE agent already answers "is this path alive?" natively — consent freshness
16
+ (RFC 7675) re-probes the selected pair every ~5s independently of media, and
17
+ `transport.connectionState` IS that verdict. The stall window now only
18
+ CORROBORATES a transport the ICE agent has already given up on. While ICE says
19
+ `connected`, a quiet stream emits a new `media-idle` (`level: 'info'`) diagnostic
20
+ and the transport, its consumers and the last decoded frame are left alone.
21
+ Genuine media death keeps both authoritative library-native detectors —
22
+ `connectionstatechange` → `restartIce()` in place, and a higher control-doc
23
+ incarnation → renegotiate — neither of which needs the counter. Detection stays
24
+ level-triggered, so a path that dies AFTER a long idle gap is still recovered.
25
+ Locked by the `no-teardown-on-idle-inbound-counter` ast-grep guard.
26
+ - **The idle gap no longer leaks into the DECODE rule.** `_checkDecodeLiveness` is only
27
+ reachable while inbound bytes are ADVANCING, so nothing refreshed `_lastDecodeAdvanceAt`
28
+ across a quiet stretch. On the first resume tick the new generation's RTP can land before
29
+ the decoder has assembled a frame from it — bytes advance, `framesDecoded` has not ticked
30
+ yet — and the decode rule then measured the WHOLE idle gap and declared a `decode-wall`,
31
+ firing exactly the `_renegotiate()` teardown the fix above removes. The `media-idle` branch
32
+ now re-arms the decode clock too: a decoder with nothing to decode is not a stalled decoder.
33
+ A genuine decode wall after a resume is still caught.
34
+
3
35
  ## 0.2.24
4
36
 
5
37
  - Docs-only release: README accuracy pass against the 0.2.23+ surface (the READMEs ship in