Implement negotiation tracking based on offerId - #1927 (@lukasIO)
Ignore data track promise rejections after a subscription readable stream is discarded - #1917 (@1egoman)
chore: improve logging foundation for implicit context retrieval - #1907 (@lukasIO)
Pass optional LocalTrack reference to processors - #1916 (@lukasIO)
Ensure priority isn't set on all simulcast layers when using Firefox on iOS - #1920 (@lukasIO)
Defer onEnterPiP visibility update until after the next microtask and animation frame so Document Picture-in-Picture embedders can append DOM into the PiP window before isElementInPiP runs. - #1868 (@gparant)
Differentiate different 404 responses on validate path - #1901 (@lukasIO)
await screen share audio unpublish before returning setEnabled - #1899 (@lukasIO)
Avoid attaching a new Closing event listener for each waitForBufferStatusLow call - #1896 (@1egoman)
Re-compute encoding params after track replace - #1902 (@lukasIO)
Harden extension id computation and retry publishing on negotiation failure - #1895 (@lukasIO)
fix: ensure udpated tokens get set on the regionUrlProvider - #1900 (@lukasIO)
fix: handle race between LocalTrackSubscribed signal and publishTrack completion - #1872 (@pabloFuente)
Harden RemoteParticipant.dataTracks map to work when a data track subscription is processed before the room connect is complete - #1888 (@1egoman)
Update dependency webrtc-adapter to v9.0.5 - #1858 (@renovate)
Ensure transport manager is reset before attempting legacy fallback path - #1893 (@lukasIO)
Fix data tracks related subscript edge cases when the passed abort signal fires across the subscription lifecycle - #1892 (@1egoman)
Export CheckStatus as enum, not just type - #1855 (@Ludobaka)
fix: improve ordering of resolving waitForBufferStatus calls - #1877 (@lukasIO)
Close streamcontrollers when datatrack gets unpublished - #1879 (@lukasIO)
Moves "connected to Livekit Server" log within RTCEngine.join so it shows up for reconnects as well as connects - #1873 (@1egoman)
Send publisher offer with join request to accelerate connection - #1846 (@cnderrauber)
Enable E2EE key-size configuration via ExternalE2EEKeyProvider options - #1841 (@MariusBernhardt)
Ensure freshly created RTCEngine isn't recreated on join - #1843 (@lukasIO)
Fix shouldReturnCachedValueFromFetch check for cached options - #1837 (@lukasIO)
Add token fetch force option to skip TokenSource cache - #1839 (@lukasIO)
e2ee: ensure current key index isn't unintentionally updated - #1830 (@lukasIO)
Prevent unmute -> mute -> unmute cycle for track restarts that happen during unmute - #1793 (@mfairley)
Use controller.error to signal unexpected errors mid data stream - #1834 (@lukasIO)
Signal leave on failed connection attempts if signalling is connected - #1817 (@lukasIO)
Vendored ts-debounce and added critical timers to debounce function - #1800 (@mfairley)
Ensure cryptor setup respects async queue in worker - #1833 (@lukasIO)
Adds new OutgoingDataTrackManager to manage sending data track payloads - #1810 (@1egoman)
Ensure connection state mismatches aren't triggered for ongoing PC connection attempts - #1807 (@lukasIO)
Fix unnecessary track restarts on unmute when using ideal device constraints - #1794 (@mfairley)
Prevent ongoing renegotiations from declaring the negotiation as timed out - #1813 (@lukasIO)
Add data track packetizer and depacketizer implementations - #1798 (@1egoman)
Add missing type exports required by @livekit/components-core - #1815 (@1egoman)
Add data track packet serialization + deserialization logic - #1792 (@1egoman)
Update docs to clarify other client HKDF support - #1796 (@1egoman)
Add attachedStreamIds as text stream metadata - #1805 (@1egoman)
export type RoomEventCallbacks - #1599 (@shincurry)
Remove experimental tag on some stabilized features - #1777 (@lukasIO)
Fix connection check issues with pinned regions - #1775 (@lukasIO)
Control latency of lossy data channel - #1754 (@cnderrauber)
Add docs comments making it clear TokenSource-prefixed exported types shouldn't be used for TokenSource construction - #1776 (@1egoman)
Fix leaking memory by removing event listener from correct scope - #1768 (@wuhkuh)
Wait for dc buffer status low for all published packets - #1691 (@lukasIO)
Fix message loss during resuming/migration - #1757 (@cnderrauber)
Add connectionCount tracking and stop auto refetching after timeout - #1756 (@lukasIO)
Add explicit error types for future helper - #1753 (@lukasIO)
fix(LocalTrackAudio): prevent overwriting constraint flags - #1744 (@itamayo)
Keep text / byte stream handlers between room disconnects - #1741 (@1egoman)
Ensure unexpected websocket disconnects trigger reconnect flow - #1748 (@lukasIO)
Add exponential backoff strategy in case of connection failures - #1715 (@lukasIO)
Add participant as an optional parameter to EncryptionError events emitted on room level - #1723 (@CSantosM)
fix(e2ee): propagate worker data decryption errors and reject corresponding promises - #1729 (@CSantosM)
Fix potential undefined access while disconnecting - #1734 (@lukasIO)
Add new areTokenSourceFetchOptionsEqual function - #1733 (@1egoman)
Ensure publication isn't attempted after timeout rejected the promise - #1725 (@lukasIO)
Apply server supplied cache control settings for region url provider - #1669 (@lukasIO)
Only export types for TokenSource variants to try to push users to use the TokenSource.foo static constructors instead - #1707 (@1egoman)
Add check to ensure track visibility update only happens when adaptiveStream is enabled - #1712 (@1egoman)
Fix abort race resulting in multiple code paths trying to close the ws connection - #1695 (@lukasIO)
fix the RPC comment and clam the timeout if the provided value is less than 8s - #1694 (@xianshijing-lk)
Fix track mapping when single peer connectionis used - #1696 (@lukasIO)
Ensure leave requests can be sent before join response is received - #1687 (@lukasIO)
Increase RPC total timeout to 15s and connection timeout to 7s for better reliability under network latency. - #1692 (@xianshijing-lk)
Populate participant identity when receiving encrypted e2ee packets - #1679 (@lukasIO)
Export supportsAudioOutputSelection helper - #1676 (@lukasIO)
Fix bug in isResponseExpired token expiry checking logic - #1683 (@1egoman)
Use WebSocketStream for sequential signal processing - #1638 (@lukasIO)
Support for data channel encryption on React-Native - #1678 (@davidliu)
Add preliminary support for data message decryption - #1595 (@lukasIO)
Add video autoplay attributes to PublishVideoCheck - #1648 (@Doomann)
Ensure handleDisconnect is called also when already in Reconnecting state - #1671 (@lukasIO)
Fix TS 5.9 generic Uint8Array declaration when inferred - #1668 (@lukasIO)
Properly clean up event listeners in getNewAudioContext() - #1660 (@indexds)
Avoid uncaught errors related to send/disconnect races - #1674 (@bryfox)
Register online listener in engine's join - #1658 (@lukasIO)
add TokenSource token fetching abstraction - #1645 (@1egoman)
Ensure permission event is only emitted once for local participant - #1643 (@lukasIO)
internal typing fix - add missing async to postAction - #1644 (@1egoman)
Ensure mid is always interpreted as string - #1641 (@lukasIO)
Query audio track with all constraints present - #1624 (@lukasIO)
Ensure RemoteVideoTracks without any attached elements are stopped by adaptiveStream - #1625 (@lukasIO)
Disable av1 for firefox - #1631 (@cnderrauber)
Use SIF payload hashes to ensure integrity - #1629 (@lukasIO)
fix(e2ee): h264 publishing with e2ee enabled - #1632 (@lukasIO)
Check for encrypted track if room unencrypted, and if so, emit an event - #1627 (@1egoman)
feat: add ability to include an AbortSignal when reading from a datastream - #1611 (@1egoman)
Fix error when unwrapConstraint receives an empty deviceId when creating local tracks - #1594 (@mpnri)
feat(e2ee): add h265 as supported codec for encryption - #1618 (@lukasIO)
Handle numerous small data stream errors / state inconsistiencies with throwing explicit errors - #1613 (@1egoman)
lock all APIs that change underlying track with the same lock - #1620 (@lukasIO)
Fix iOS local track recorder mimetype for preconnect buffer - #1609 (@lukasIO)
Add support for react-native preconnect audio - #1598 (@davidliu)
Clear LocalParticipant futures at start of disconnect, not at end - #1604 (@1egoman)
fix: ensure audio output switching is disabled for safari based browsers - #1602 (@lukasIO)
skip errant signal layer leave message when already disconnected - #1601 (@1egoman)
fix: retry processor playback on abort error - #1592 (@lukasIO)
fix: correct handling of signal connect future - #1600 (@lukasIO)
allow manual controls even when adaptiveStream is enabled - #1569 (@davidzhao)
Add support for H265 - #1576 (@cnderrauber)
Ensure feature support checks include iOS checks - #1563 (@lukasIO)
Ensure encryption transforms are set up as soon as sender is created - #1561 (@lukasIO)
Fix transceiver reuse causing destination stream closed errors - #1554 (@lukasIO)
Stop MediaStream tracks at the end of the video check - #1552 (@svajunas-budrys)
disable dyncast for svc encoding - #1556 (@cnderrauber)
Update active device immediately for muted audio tracks - #1526 (@yashjain-99)
Drop outdated sdp answers and forward offer ids - #1547 (@lukasIO)
Improve e2e reliablility of data channel - #1546 (@cnderrauber)
do not expose token with Moved events - #1549 (@davidzhao)
fix: don't try to set audio output on Safari without explicit user interaction - #1527 (@lukasIO)
Fix svc encoding for safari 18.4 - #1519 (@cnderrauber)
feat: add MediaDeviceKind to media device error event - #1525 (@lukasIO)
fix: remove track from transceiver if add request failed - #1524 (@lukasIO)
Support moving participant to another room - #1511 (@cnderrauber)
feature: E2E Allow sharing ratcheted material out-of-band - #1503 (@BillCarsonFr)
Ensure userProvided tracks are not overriden from within the SDK - #1500 (@lukasIO)
Revert "Add option (KeyProviderOptions) to allowKeyExtraction." - #1502 (@toger5)
Convert URL Scheme When Creating WebSocket Object - #1492 (@rktguswjd)
Defer publishing until signal is connected - #1465 (@lukasIO)
Address chrome ideal device handling change by defaulting to exact device matching - #1478 (@lukasIO)
Improve error message for WS errors during connection attempt - #1466 (@lukasIO)
Closable spatial layers for svc encoding - #1458 (@cnderrauber)
Improve connection URL handling and add unit tests - #1468 (@lukasIO)
Pass facingMode to initial getUserMedia call in track restart - #1451 (@lukasIO)
Fix trailing slash handling in WebSocket URL pathname - #1440 (@Tanney-102)
Ensure only suspended audio context gets resumed - #1452 (@lukasIO)
Automatically attempt to resume suspended audio contexts on click - #1431 (@lukasIO)
Fix ignored constraints in LocalTrack.restart - #1435 (@rktguswjd)
log ice candidates as debug rather than trace - #1437 (@haydenbr)
fix: handle server url with params correctly - #1366 (@jiyeyuran)
fix: properly remove text stream controllers on stream close - #1422 (@lukasIO)
Reject publishing with insufficient permissions present - #1418 (@lukasIO)
Improve utf8 text split and add unit test - #1414 (@lukasIO)
Fix applying default processors from captureDefaults - #1416 (@lukasIO)
Disable simulcast for screenshare backup codec - #1409 (@cnderrauber)
added new connection tests - #1402 (@davidzhao)
Add backupCodecPolicy to TrackPublishDefaults - #1399 (@cnderrauber)
The default policy of backup codec is codec regression for maxium compatibility, which means the publisher stops sending primary codec and all subscribers will receive backup codec even primary codec is supported.
It changes the default behavior multi-codec simulcast in the previous version, will not break the functionality of the previous version but only cause potential extra bandwidth usage. The user can set the policy to multi-codec simulcast to keep the previous behavior.
Move RPC registration to room level and deprecate localParticipant level registration - #1396 (@lukasIO)
Populate name property of LiveKit errors and add reasonName for enums - #1385 (@lukasIO)
Replace internal instanceof checks with typeguards - #1378 (@lukasIO)
Remove track from pending publishing on device errors - #1380 (@lukasIO)
Allow audio processing for react native without AudioContext - #1395 (@davidliu)
use a error code 14 for data publish errors - #1374 (@davidzhao)
Only emit TrackSubscriptionEvent once on room - #1392 (@lukasIO)
Redact access_token parameter in debug logs - #1394 (@hughns)
Don't hang on audio context trying to resume - #1379 (@lukasIO)
expose inbound-rtp.id as streamId - #1367 (@s-hamdananwar)
Emit ActiveDeviceChanged event also for audio-output - #1372 (@lukasIO)
Ensure maxFps applies for very low framerates - #1362 (@lukasIO)
Emit MediaDeviceError only when acquiring tracks fails - #1365 (@lukasIO)
Support swapping out the E2EEManager for react-native - #1345 (@davidliu)
fix: prevent monitoring leak when stopOnUnpublish is false - #1348 (@davidzhao)
Prevent undefined access to engine in connection reconciler - #1349 (@lukasIO)
Fix sdp connection address mismatch - #1342 (@cnderrauber)
Set participant attributes as soon as possible, making them available in all related events - #1344 (@holzgeist)
ReconnectContext and ReconnectPolicy, for use in custom reconnection implementations. - #1328 (@wuhkuh)