Ships the external_audio_source.patch fix: after an unpublish and renegotiation, a NativeAudioSource send stream could be registered with AudioState and never removed, so the capture thread called into a freed stream once the PeerConnection closed. Also prevents raw_key/derived_key from leaking via LS_INFO, verifies server-injected frame payloads before skipping decryption, fails AddTransceiver with INVALID_STATE on a closed PeerConnection, and ships missing ObjC headers in the mac framework.
Rust SDKs
npx @buildinternet/releases get livekit-rust-sdksThe four server-inferred VideoGrants fields (can_publish, can_subscribe, can_publish_data, can_update_own_metadata) are now Option<bool>, with new getters that read a token the way the server does; unset claims and grants are omitted rather than written at their defaults. In-flight incoming data streams now error with AbnormalEnd when the room closes instead of returning truncated content as complete, and Room::close reliably emits Disconnected and can no longer be reversed to Connected by a background reconnect.
The four server-inferred grants (can_publish, can_subscribe, can_publish_data, can_update_own_metadata) are now Option<bool>, with new getters that resolve them the way the server does, and unset claims and grants are no longer written into tokens. VideoGrants gains the agent grant and Claims the kind claim, so agent worker and simulated job participant tokens can now be minted from Rust.
The four server-inferred grants (can_publish, can_subscribe, can_publish_data, can_update_own_metadata) are now Option, with getters reading tokens the way the server does, and unset claims and grants are omitted from minted tokens. Also fixed Room::close race that kept closed rooms reporting Connected, incoming data streams now error with AbnormalEnd on room close instead of returning truncated content, and VideoGrants gains the agent grant with Claims gaining kind via AccessToken::with_kind.
VideoGrants gains an agent grant and Claims a kind claim with AccessToken::with_kind, matching the Go, Python, and JS SDKs, and the four server-inferred grants are now Option with no defaults written into the token. In-flight incoming data streams now error with AbnormalEnd when the room closes instead of returning truncated content from read_all().
Added PeerConnection::set_bitrate to set the send bitrate limits of a peer connection. Pre-encoded video now stays decodable when WebRTC drops frames, by disabling the frame dropper and holding delta frames until the next keyframe arrives.
Room::close now leaves the room Disconnected and emits RoomEvent::Disconnected before returning, and Disconnected is final, so a reconnecting room can no longer return to Connected. Also fixes in-flight incoming data streams returning truncated content as complete, adds PeerConnection::set_bitrate, adds GStreamer pipeline encoded-video capture source, and extends thread action permissions for minted public API tokens.
The livekit.agent package — including AgentSessionEvent, SessionRequest, EOT inference messages, agent thread messages, and the agent-db service — is now carried by livekit-protocol, and dependent crates follow its version bump.
In-flight incoming data streams now error with AbnormalEnd when the room closes. Previously stream readers ended cleanly, so read_all() returned truncated content as if it were complete. The livekit-protocol bump carries the livekit.agent package, agent threads messages, and the agent-db service.
VideoGrants gains the agent grant and Claims the kind claim with AccessToken::with_kind, matching the Go, Python, and JS SDKs, with livekit-uniffi exposing TokenOptions.kind, Claims.kind, and agent on its VideoGrants record. The four server-inferred grants can_publish, can_subscribe, can_publish_data, and can_update_own_metadata are now Option<bool> so None leaves the decision to the server, and unset claims and grants are omitted from the token.
VideoGrants gains an agent grant and Claims a kind claim, and the four server-inferred grants (can_publish, can_subscribe, can_publish_data, can_update_own_metadata) are now Option so unset claims are omitted from minted tokens, with new getters reading tokens the way the server does. Also fixes public API tokens only carrying all instead of every thread action, and adds ThreadClient and DatabaseClient services.
PeerConnection::set_bitrate sets the send bitrate limits of a peer connection. Pre-encoded video stays decodable when WebRTC drops frames: the passthrough encoder disables WebRTC's frame dropper and, after a preceding frame is dropped, holds delta frames and requests a keyframe until the next one arrives.
livekit-protocol now carries the livekit.agent package, including AgentSessionEvent, SessionRequest, the EOT inference messages, the agent threads messages, and the agent-db service; the crates that depend on it follow its bump.
livekit-protocol now carries the livekit.agent package, including AgentSessionEvent, SessionRequest, the EOT inference messages, the agent threads messages, and the agent-db service; dependent crates follow its version bump.
In-flight incoming data streams now error with AbnormalEnd when the room closes; previously stream readers ended cleanly, so read_all() returned truncated content as if it were complete. livekit-protocol now carries the livekit.agent package (AgentSessionEvent, SessionRequest, EOT inference messages), agent threads messages, and the agent-db service, and dependent crates follow its bump.
SignalStream::close now aborts the parked reader and bounds the writer's Close flush, fixing a hang where a half-open socket left Room::close blocked indefinitely because the resume never dialled. Also scaled the x-google-start-bitrate camera cap by connection setup time, enlarged data track event buffers to prevent deadlock on room disconnect, and fixed VAAPI display and track release leaks.
Fixed VAAPI display management across capability probes and encoder lifecycles so driver resources and threads are released without invalidating active encoders.
Enlarged local and remote data track event buffers so a burst of track lifecycle events can no longer fill the channel and deadlock room disconnect.
SignalStream::close now aborts a reader parked in recv() on a half-open socket and bounds the writer's Close flush, so the resume dials and Room::close no longer hangs. Also enlarged data track event buffers to prevent a burst of lifecycle events from filling the channel and deadlocking room disconnect, scaled the x-google-start-bitrate hint by connection setup time, and tightened VAAPI display and local track cleanup.
SignalStream::close now aborts a parked reader and bounds the writer's Close flush, so a half-open socket no longer leaves Room::close hanging or blocks the resume from dialling. RoomClient::send_data also returns a Send future by dropping its RNG before awaiting.
