@urun-sh/core 0.4.0 → 0.4.2

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,44 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.2
4
+
5
+ - **Lockstep release** — version bump to match the `@urun-sh/openai` omp launcher cohort
6
+ (urun-sh/urun-ts#401); peer ranges pinning core move to `^0.4.2`.
7
+
8
+ ## 0.4.1
9
+
10
+
11
+ - **FIX: a re-dial no longer leaves the playout element bound to a DEAD track**
12
+ (urun-infra#2132; the prod qwen-voice "assistant audio drops mid-session and
13
+ never self-heals, reload fixes it" signature). `recvTransport.consume()` /
14
+ `consumeData()` are ASYNC — mediasoup-client renegotiates the recv
15
+ PeerConnection to add the transceiver — so a consume ISSUED on the leg that is
16
+ about to die can still be in flight when a dropped signaling socket re-dials
17
+ and `_cleanupMedia()` replaces the whole leg. That late consumer resolved onto
18
+ a transport the session no longer owns and was registered ANYWAY, LAST: it
19
+ overwrote `_tracksByName`, emitted the final `'track'` event, and leaked into
20
+ the live consumer set. Its track reads `readyState === 'live'` (nothing
21
+ stopped it — its consumer was not in `_consumers` when the cleanup ran), so
22
+ every liveness filter above the seam accepted it: `<Video>` / `<Audio>` swap
23
+ tracks into the ONE persistent `MediaStream` that stays the element's
24
+ `srcObject`, so the healthy, decoding track of the NEW leg was removed and a
25
+ track belonging to a closed PeerConnection put in its place. The rendered
26
+ frame froze while the downlink stayed perfectly healthy (SFU `packetsSent`
27
+ climbing, consumer `framesDecoded` climbing, `pliCount 0`,
28
+ `attachedToMediaElement: false` on every RTCPeerConnection), and the
29
+ components' missed-event poll could never heal it because `getTrackByName()`
30
+ kept answering with the stale track — only a page reload recovered.
31
+
32
+ Both consume paths now carry a LEG FENCE across their await, through
33
+ mediasoup's own identity rather than a timer or a poller: a consumer belongs
34
+ to the transport that created it, so a consumer whose transport is no longer
35
+ this session's recv transport (or is closed, or whose dial generation has been
36
+ superseded, or which landed after an intentional disconnect) is closed through
37
+ mediasoup-client's own per-consumer lifecycle — which stops its track — and is
38
+ never registered. The data twin matters just as much: a superseded
39
+ `consumeData` used to install a DEAD channel as a named stream's data lane,
40
+ silently swallowing every later payload on that name.
41
+
3
42
  ## 0.4.0
4
43
 
5
44
  - **BREAKING: `SessionPhaseName` loses `'ended'` and `'expired'`** (#392, #398 —