@urun-sh/core 0.2.56 → 0.2.57

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,6 +1,71 @@
1
1
  # Changelog
2
2
 
3
- ## Unreleased
3
+ ## 0.2.57
4
+
5
+ - **FIX: `jitterBufferTarget` range guard (0–4000ms).** The W3C
6
+ `RTCRtpReceiver.jitterBufferTarget` attribute is specified over [0, 4000]ms
7
+ and an out-of-range assignment THROWS a RangeError. The consume path set the
8
+ target with no range check, so an out-of-range configured value threw inside
9
+ `_onConsume` — reached through the un-awaited `_handleMessage`, that throw
10
+ surfaced only as an UNHANDLED REJECTION while the lane was never
11
+ `resumeConsumer`'d: a silent dead media lane over a config typo. Out-of-range
12
+ targets are now refused with the same posture as the existing non-finite
13
+ guard (a default-visible `*-jitter-buffer-invalid` warning naming the value;
14
+ the receiver is left alone; media flows), and the signaling `onmessage`
15
+ dispatch now attaches a rejection handler to `_handleMessage` (same `error`
16
+ surface as its synchronous parse failures — the fire-and-forget shape is
17
+ unchanged).
18
+
19
+ - **Opt-in steady-state session stats** (`sessionStats?: { pollMs? }` on
20
+ `TransportSessionOptions` AND `AppOptions`, threaded through `App()`; new
21
+ `Session.onStats(handler)` — optional on the interface, the `onActivation`
22
+ additive precedent). When enabled, inbound RTP stats are sampled PER MEDIA
23
+ KIND every `pollMs` (default 2000ms) and emitted as a `SessionStatsSample`
24
+ on a NEW `stats` transport event: per-kind `InboundStatsSample`s plus
25
+ **`avSyncMs` = video − audio `estimatedPlayoutTimestamp`** — the first-class
26
+ measurement of the standing audio-behind-video delay class (liveavatar
27
+ measured 2.2–2.7s). Off by default: no sampler runs at all unless asked for.
28
+ Deliberately its OWN timer and event: never the join-probe timer (whose
29
+ contract is settle-then-disarm; the stats timer is stopped at every teardown
30
+ site the probe is) and never the diagnostic channel (each diagnostic is a
31
+ default-visible console line and, with an events reporter wired, an HTTP
32
+ POST per event). `readInboundSample` no longer gates per-field aggregation
33
+ to video-only (audio fields were structurally invisible — null forever), and
34
+ the inbound field set gains `estimatedPlayoutTimestamp`,
35
+ `jitterBufferTargetDelay`, `jitterBufferMinimumDelay`, `concealedSamples`,
36
+ `insertedSamplesForDeceleration`. `avSyncMs` is measured WITHIN ONE STREAM:
37
+ a session can carry several named streams at once, so the sampled lanes are
38
+ grouped by A/V pair key (the parent name of a `{parent}--audio` /
39
+ `{parent}--video` derived-leg pair) and the busiest group carrying BOTH
40
+ kinds is the one measured — differencing two unrelated streams' playout
41
+ instants would be a fabricated offset that reads like a real measurement.
42
+ The chosen pair is named on the sample as `stream` (null for unnamed legacy
43
+ lanes). `estimatedPlayoutTimestamp` aggregates as the LATEST instant across
44
+ a report's `inbound-rtp` entries rather than a sum (it is an NTP-anchored
45
+ instant, not a cumulative counter — summing fabricates a timestamp); the
46
+ other new fields are genuine counters and stay additive. A THROWING `stats`
47
+ subscriber is routed to the transport `error` surface instead of becoming an
48
+ unhandled rejection on every sampling tick, and sampling continues.
49
+
50
+ - **Per-kind playout knob — MECHANISM ONLY** (`videoPlayout?:
51
+ VideoPlayoutOptions`, additive beside `audioPlayout` at every thread point).
52
+ `_capAudioJitterBuffer` is generalized to `_capJitterBuffer(consumer, kind)`
53
+ with per-kind target resolution: audio keeps its 300ms default UNCHANGED;
54
+ video's default is **UNSET** — no hidden number. Video receivers remain
55
+ untouched unless `videoPlayout` is explicitly passed ("video renders on
56
+ arrival" stays the default behavior; formally amending that commitment is a
57
+ queued owner ruling). CAVEAT, verbatim from the review: under a
58
+ single-element muxed playout the browser resolves the effective
59
+ jitter-buffer target as the max() across the element's receivers — a small
60
+ VIDEO target can RAISE the AUDIO leg's standing delay to match. Defaults
61
+ await `avSyncMs` measurement. Cap-before-`resumeConsumer` ordering is
62
+ preserved. Receipts: every capped/unsupported/invalid diagnostic now carries
63
+ `mediaKind` + `transportId`, and the previously-silent no-RTCRtpReceiver
64
+ path (node/werift legs) emits a `debug` receipt. Audio diagnostic kind
65
+ strings (`audio-jitter-buffer-*`) are unchanged — consumers string-match
66
+ them; video uses the new parallel `video-jitter-buffer-*` family.
67
+
68
+ ## 0.2.53
4
69
 
5
70
  - **Audio receiver jitter-buffer cap** (`AudioPlayoutOptions`, new export). A
6
71
  muxed A/V egress reaches the browser as TWO RTP tracks with independent