Web audio graphs and audio contexts the SDK created are now released after room.disconnect() instead of accumulating over mute/unmute cycles, fixing a false AudioSilenceDetected on autoplay-blocked pages. Fixed E2EE H.264/H.265 decryption for encoders emitting 3-byte Annex B start codes, and encrypting h264 frames from the correct offset when an SEI or AUD NALU precedes the slice.
Client SDK JS
npx @buildinternet/releases get livekit-client-sdk-jsDocument Picture-in-Picture detection now requires an element to live in the PiP window's document or a nested frame, so elements positioned inside the PiP bounds are no longer misreported as in PiP and counted visible while scrolled out of view. Clients rejected with a 403 on RTC paths now retry against other LiveKit Cloud regions instead of failing to connect, and a duplicated server answer with the same offerId is ignored rather than applied twice.
Simulcast is now supported for SVC codecs (VP9/AV1), and a fix prevents the mid-track map from being reset when a publisher answers with an empty map. Also added code 1000 to the WebSocketStream onclose handler and forwarded worker logs to the main thread.
Fixed a bug where the subscriber silently buffered remote ICE candidates after a reconnect, leaving it unable to adopt new network paths the server proposed. Also tracks websocket close by attemptId, flushes buffered events on signal reconnection, and errors on datastreams with missing chunks.
The ParticipantDisconnected event now carries the DisconnectReason, and supportsAdaptiveStream correctly returns false in environments lacking ResizeObserver or IntersectionObserver. Also added a roomOptions.dataStream.maxPayloadByteLength option and fixed signal request queueing.
Fixed buffered events not flushing on signal reconnection and a broken publish-path recovery that now reconnects instead of disconnecting on connection state mismatches. Also introduced DevelopmentTokenServer and deprecated SandboxTokenServer.
Data streams v2 support is now available, and events buffered during room resume are now correctly emitted after the room is declared reconnected.
Fixed the reliable data channel dying under concurrent writes by adding two-watermark flow control and a per-kind sender lock. Attached audio elements now stay muted in startAudio() when webAudioMix is enabled, preventing double playback on iOS Safari. Also removes stale data track subscriber handles and handles data track SID reassignment.
The NonSharedUint8Array type polyfill is now exported and included in published type declarations, fixing "Cannot find name" errors under skipLibCheck: false and unblocking downstream packages like @livekit/components-*. Added support for user_data frame metadata trailer type and conformed placeholder sections to canonical fmtp for shared payloads.
Renamed PacketTrailer to FrameMetadata. Fixed a data channel close race condition and enforced the SDP-defined maxMessageSize on data packets sent via publishData. Added restrictOwnAudio experimental param to AudioCaptureOptions and deployment option to TokenSourceFetch.
Fixed an rtpMap event leak that occurred on multiple negotiations without video tracks. Also fixed a timeout clearing issue and ensured initial media sections are sent with v1 signalling for Firefox.
Fixed a memory leak where the devicechange listener registered on navigator.mediaDevices was not removed when a Room was constructed but never connected, preventing the instance from being garbage-collected. Also disabled publisher offer with join in Firefox and ensured client protocol is set in dual peer connection scenarios.
RPC protocol updates now support infinite payload length in requests and responses.
The data tracks depacketizer now supports multiple in-flight packets, improving reliability when receiving out-of-order or concurrent packet streams.
