Release packages - #1423
Release packages#1423knope-bot[bot] wants to merge 1 commit into
Conversation
There was a problem hiding this comment.
Note
This report is out of date. Scroll down for Devin Review's latest report on this PR.
🔍 Devin Review: 1 flag
Not posted on this PR by your GitHub settings — view it in Devin Review. (Configure)
258765c to
5fef4ae
Compare
There was a problem hiding this comment.
Note
This report is out of date. Scroll down for Devin Review's latest report on this PR.
Devin Review found 1 new potential issue.
🐛 1 issue in files not directly in the diff
🐛 Dropped pumps leave threads detached
When a source remains blocked, RunningPump::drop only signals stop and detaches the join handle. The thread and captured resources can remain alive indefinitely.
1 flag not posted on this PR by your GitHub settings — view it in Devin Review. (Configure)
cc8f388 to
3414f91
Compare
3414f91 to
e2de867
Compare
There was a problem hiding this comment.
Note
This report is out of date. Scroll down for Devin Review's latest report on this PR.
Devin Review found 1 new potential issue.
2 flags not posted on this PR by your GitHub settings — view them in Devin Review. (Configure)
| name = "livekit-datatrack" | ||
| description = "Data track core for LiveKit" | ||
| version = "0.1.15" | ||
| version = "0.1.16" |
There was a problem hiding this comment.
🟡 Patch release breaks Rust consumers
A ^0.1.15 dependency can resolve 0.1.16, but both error Failed variants changed from unit to struct variants. Existing Rust consumers then fail to compile after a compatible update.
Learn more
Cargo treats releases within 0.1.x as semver-compatible. The error variants are public through the crate's backend API, and changing a unit variant to a struct variant breaks both construction and pattern matching. A resolver can therefore upgrade existing consumers automatically and hand them source that no longer compiles.
Example: A consumer declaring livekit-datatrack = "0.1.15" and matching EncryptionError::Failed can receive 0.1.16 during a lockfile update. Its unchanged match no longer compiles because the variant now requires { reason }.
Recommended fix: Release livekit-datatrack as 0.2.0 and update the workspace dependency and every generated release reference accordingly. Alternatively, preserve the existing Rust variant shape while introducing a separate UniFFI-facing error type.
Was this helpful? React with 👍 or 👎 to provide feedback.
e2de867 to
c5c23e1
Compare
c5c23e1 to
772a578
Compare
There was a problem hiding this comment.
Devin Review found 1 new potential issue.
🐛 1 issue in files not directly in the diff
🐛 Engine drop leaves signaling alive
Dropping RtcEngine lets engine_task release the engine without closing its session. The detached signal task retains the websocket until the server disconnects.
2 flags not posted on this PR by your GitHub settings — view them in Devin Review. (Configure)
772a578 to
cb06254
Compare
cb06254 to
9dd20ec
Compare
Important
Merging this pull request will create these releases
livekit-datatrack 0.1.16 (2026-09-22)
Features
EncryptionError::FailedandDecryptionError::Failedcarry areasonstring and are no longerflat_error,so a foreign
EncryptionProviderorDecryptionProviderreturning an error no longer aborts the process with"Can't lift flat errors" -- a failed data track decrypt (no E2EE manager, key mismatch, corrupt frame) now
drops the frame and leaves the room connected.
libwebrtc 0.3.49 (2026-09-22)
Fixes
livekit 0.9.2 (2026-09-22)
Fixes
MissedChunk.Fix the RTC engine leaking when a room is dropped without being closed.
The engine's event task held a strong reference to the engine, while the signal that stops
that task lives inside the engine itself, so the two kept each other alive. An engine
dropped without an explicit
close()released nothing: the session, both peer connections,the WebRTC runtime, and the signal client with its open websocket all stayed resident for
the lifetime of the process, and the server kept its half of the session because the socket
was never closed. The task now holds a weak reference and stops on its own once the engine
is gone.
EncryptionError::FailedandDecryptionError::Failedcarry areasonstring and are no longerflat_error,so a foreign
EncryptionProviderorDecryptionProviderreturning an error no longer aborts the process with"Can't lift flat errors" -- a failed data track decrypt (no E2EE manager, key mismatch, corrupt frame) now
drops the frame and leaves the room connected.
Report the reconnect reason to the server when resuming.
Resumes previously sent no reason, so server-side telemetry could not attribute why Rust
clients reconnect — every resume looked like
RR_UNKNOWN. The engine now records what causedthe episode (signal disconnected, publisher failed, subscriber failed) and reports it on each
resume attempt. The v0 signalling path was also missing the
reconnect_reasonquery parameterentirely, so it would not have been reported even if a reason had been supplied.
Fix resume reporting success for a PeerConnection that had not recovered.
A resume decided recovery from
PeerConnectionState, which keeps readingConnectedfor tensof seconds after the far end goes away. A resume could therefore emit
Resumed— and soRoomEvent::ReconnectedwithConnectionState::Connected— for a session whose subscribertransport was dead, leaving applications with no signal that they had stopped receiving media.
A resume now requires each transport to have entered
Connectedsince the resume began, or tohave held it throughout, rather than trusting the state it currently reports.
VideoGrantsgains theagentgrant andClaimsthekindclaim (withAccessToken::with_kind), which the Go, Python and JS SDKs already carry. Anagent worker's token is
VideoGrants { agent: true }and a simulated job'sparticipant token is
kind: "agent"; neither could be minted from Rust before.livekit-uniffiexposes both:TokenOptions.kind,Claims.kind, andagenton its
VideoGrantsrecord.Breaking: the four grants the server infers when absent --
can_publish,can_subscribe,can_publish_data,can_update_own_metadata-- are nowOption<bool>, as in the Go and JS SDKs.Noneleaves the decision to theserver, and the new getters (
can_publish(),can_subscribe(),can_publish_data(),can_update_own_metadata()) read a token the way theserver does,
can_publish_datafalling back tocan_publishincluded. Codethat set these fields writes
Some(..); code that read them uses the getters.The same fields are optional on the
livekit-uniffirecord, andlivekit-apire-exports the crate aslivekit_api::access_token, so bothcarry the change.
Nothing at its default is written into the token any more: unset claims and
grants are omitted, as the server's own
omitemptygrants are. Verificationof existing tokens is unchanged.
Write the
x-google-start-bitratehint once per publisher connection, and exempt screen share from the 1 Mbps cap.libwebrtc reads this fmtp parameter per m-section but applies it to the shared
Call(WebRtcVideoSendChannel::ApplyChangedParams->SetSdpBitrateParameters), whereRtpBitrateConfiguratorholds one config for the whole peer connection. It retainsstart_bitrate_bpsand re-applies it on network route changes (RtpTransportControllerSend::OnNetworkRouteChanged), so a WiFi-to-cellular handover re-seeds the estimator from the original hint with no renegotiation. Rewriting the value on later offers was therefore at best a no-op and at worst a restart of a converged bandwidth estimator; it is now written only on the first offer that carries local video, and only once that offer is accepted locally. A full reconnect builds a new peer connection and seeds the new estimator again. The initial offer sent with the JoinRequest in single PC mode never carries the hint: it is created before any track is published, so no target bitrate exists yet.Screen share is no longer capped at 1 Mbps, matching client-sdk-js and client-sdk-android: unlike camera content, a screen share is published at a high bitrate so text stays legible, and a conservative start costs more than a brief overshoot.
livekit-data-stream 0.1.6 (2026-09-22)
Fixes
MissedChunk.livekit-ffi 0.12.80 (2026-09-22)
Features
Fixes
MissedChunk.Fix the RTC engine leaking when a room is dropped without being closed.
The engine's event task held a strong reference to the engine, while the signal that stops
that task lives inside the engine itself, so the two kept each other alive. An engine
dropped without an explicit
close()released nothing: the session, both peer connections,the WebRTC runtime, and the signal client with its open websocket all stayed resident for
the lifetime of the process, and the server kept its half of the session because the socket
was never closed. The task now holds a weak reference and stops on its own once the engine
is gone.
EncryptionError::FailedandDecryptionError::Failedcarry areasonstring and are no longerflat_error,so a foreign
EncryptionProviderorDecryptionProviderreturning an error no longer aborts the process with"Can't lift flat errors" -- a failed data track decrypt (no E2EE manager, key mismatch, corrupt frame) now
drops the frame and leaves the room connected.
Report the reconnect reason to the server when resuming.
Resumes previously sent no reason, so server-side telemetry could not attribute why Rust
clients reconnect — every resume looked like
RR_UNKNOWN. The engine now records what causedthe episode (signal disconnected, publisher failed, subscriber failed) and reports it on each
resume attempt. The v0 signalling path was also missing the
reconnect_reasonquery parameterentirely, so it would not have been reported even if a reason had been supplied.
Fix resume reporting success for a PeerConnection that had not recovered.
A resume decided recovery from
PeerConnectionState, which keeps readingConnectedfor tensof seconds after the far end goes away. A resume could therefore emit
Resumed— and soRoomEvent::ReconnectedwithConnectionState::Connected— for a session whose subscribertransport was dead, leaving applications with no signal that they had stopped receiving media.
A resume now requires each transport to have entered
Connectedsince the resume began, or tohave held it throughout, rather than trusting the state it currently reports.
VideoGrantsgains theagentgrant andClaimsthekindclaim (withAccessToken::with_kind), which the Go, Python and JS SDKs already carry. Anagent worker's token is
VideoGrants { agent: true }and a simulated job'sparticipant token is
kind: "agent"; neither could be minted from Rust before.livekit-uniffiexposes both:TokenOptions.kind,Claims.kind, andagenton its
VideoGrantsrecord.Breaking: the four grants the server infers when absent --
can_publish,can_subscribe,can_publish_data,can_update_own_metadata-- are nowOption<bool>, as in the Go and JS SDKs.Noneleaves the decision to theserver, and the new getters (
can_publish(),can_subscribe(),can_publish_data(),can_update_own_metadata()) read a token the way theserver does,
can_publish_datafalling back tocan_publishincluded. Codethat set these fields writes
Some(..); code that read them uses the getters.The same fields are optional on the
livekit-uniffirecord, andlivekit-apire-exports the crate aslivekit_api::access_token, so bothcarry the change.
Nothing at its default is written into the token any more: unset claims and
grants are omitted, as the server's own
omitemptygrants are. Verificationof existing tokens is unchanged.
Write the
x-google-start-bitratehint once per publisher connection, and exempt screen share from the 1 Mbps cap.libwebrtc reads this fmtp parameter per m-section but applies it to the shared
Call(WebRtcVideoSendChannel::ApplyChangedParams->SetSdpBitrateParameters), whereRtpBitrateConfiguratorholds one config for the whole peer connection. It retainsstart_bitrate_bpsand re-applies it on network route changes (RtpTransportControllerSend::OnNetworkRouteChanged), so a WiFi-to-cellular handover re-seeds the estimator from the original hint with no renegotiation. Rewriting the value on later offers was therefore at best a no-op and at worst a restart of a converged bandwidth estimator; it is now written only on the first offer that carries local video, and only once that offer is accepted locally. A full reconnect builds a new peer connection and seeds the new estimator again. The initial offer sent with the JoinRequest in single PC mode never carries the hint: it is created before any track is published, so no target bitrate exists yet.Screen share is no longer capped at 1 Mbps, matching client-sdk-js and client-sdk-android: unlike camera content, a screen share is published at a high bitrate so text stays legible, and a conservative start costs more than a brief overshoot.
livekit-capture 0.1.2 (2026-09-22)
Features
Fixes
MissedChunk.Fix the RTC engine leaking when a room is dropped without being closed.
The engine's event task held a strong reference to the engine, while the signal that stops
that task lives inside the engine itself, so the two kept each other alive. An engine
dropped without an explicit
close()released nothing: the session, both peer connections,the WebRTC runtime, and the signal client with its open websocket all stayed resident for
the lifetime of the process, and the server kept its half of the session because the socket
was never closed. The task now holds a weak reference and stops on its own once the engine
is gone.
EncryptionError::FailedandDecryptionError::Failedcarry areasonstring and are no longerflat_error,so a foreign
EncryptionProviderorDecryptionProviderreturning an error no longer aborts the process with"Can't lift flat errors" -- a failed data track decrypt (no E2EE manager, key mismatch, corrupt frame) now
drops the frame and leaves the room connected.
Report the reconnect reason to the server when resuming.
Resumes previously sent no reason, so server-side telemetry could not attribute why Rust
clients reconnect — every resume looked like
RR_UNKNOWN. The engine now records what causedthe episode (signal disconnected, publisher failed, subscriber failed) and reports it on each
resume attempt. The v0 signalling path was also missing the
reconnect_reasonquery parameterentirely, so it would not have been reported even if a reason had been supplied.
Fix resume reporting success for a PeerConnection that had not recovered.
A resume decided recovery from
PeerConnectionState, which keeps readingConnectedfor tensof seconds after the far end goes away. A resume could therefore emit
Resumed— and soRoomEvent::ReconnectedwithConnectionState::Connected— for a session whose subscribertransport was dead, leaving applications with no signal that they had stopped receiving media.
A resume now requires each transport to have entered
Connectedsince the resume began, or tohave held it throughout, rather than trusting the state it currently reports.
Write the
x-google-start-bitratehint once per publisher connection, and exempt screen share from the 1 Mbps cap.libwebrtc reads this fmtp parameter per m-section but applies it to the shared
Call(WebRtcVideoSendChannel::ApplyChangedParams->SetSdpBitrateParameters), whereRtpBitrateConfiguratorholds one config for the whole peer connection. It retainsstart_bitrate_bpsand re-applies it on network route changes (RtpTransportControllerSend::OnNetworkRouteChanged), so a WiFi-to-cellular handover re-seeds the estimator from the original hint with no renegotiation. Rewriting the value on later offers was therefore at best a no-op and at worst a restart of a converged bandwidth estimator; it is now written only on the first offer that carries local video, and only once that offer is accepted locally. A full reconnect builds a new peer connection and seeds the new estimator again. The initial offer sent with the JoinRequest in single PC mode never carries the hint: it is created before any track is published, so no target bitrate exists yet.Screen share is no longer capped at 1 Mbps, matching client-sdk-js and client-sdk-android: unlike camera content, a screen share is published at a high bitrate so text stays legible, and a conservative start costs more than a brief overshoot.
livekit-token 0.2.0 (2026-09-22)
Breaking Changes
VideoGrantsgains theagentgrant andClaimsthekindclaim (withAccessToken::with_kind), which the Go, Python and JS SDKs already carry. Anagent worker's token is
VideoGrants { agent: true }and a simulated job'sparticipant token is
kind: "agent"; neither could be minted from Rust before.livekit-uniffiexposes both:TokenOptions.kind,Claims.kind, andagenton its
VideoGrantsrecord.Breaking: the four grants the server infers when absent --
can_publish,can_subscribe,can_publish_data,can_update_own_metadata-- are nowOption<bool>, as in the Go and JS SDKs.Noneleaves the decision to theserver, and the new getters (
can_publish(),can_subscribe(),can_publish_data(),can_update_own_metadata()) read a token the way theserver does,
can_publish_datafalling back tocan_publishincluded. Codethat set these fields writes
Some(..); code that read them uses the getters.The same fields are optional on the
livekit-uniffirecord, andlivekit-apire-exports the crate aslivekit_api::access_token, so bothcarry the change.
Nothing at its default is written into the token any more: unset claims and
grants are omitted, as the server's own
omitemptygrants are. Verificationof existing tokens is unchanged.
webrtc-sys 0.3.46 (2026-09-22)
Fixes
livekit-uniffi 0.2.0 (2026-09-22)
Breaking Changes
VideoGrantsgains theagentgrant andClaimsthekindclaim (withAccessToken::with_kind), which the Go, Python and JS SDKs already carry. Anagent worker's token is
VideoGrants { agent: true }and a simulated job'sparticipant token is
kind: "agent"; neither could be minted from Rust before.livekit-uniffiexposes both:TokenOptions.kind,Claims.kind, andagenton its
VideoGrantsrecord.Breaking: the four grants the server infers when absent --
can_publish,can_subscribe,can_publish_data,can_update_own_metadata-- are nowOption<bool>, as in the Go and JS SDKs.Noneleaves the decision to theserver, and the new getters (
can_publish(),can_subscribe(),can_publish_data(),can_update_own_metadata()) read a token the way theserver does,
can_publish_datafalling back tocan_publishincluded. Codethat set these fields writes
Some(..); code that read them uses the getters.The same fields are optional on the
livekit-uniffirecord, andlivekit-apire-exports the crate aslivekit_api::access_token, so bothcarry the change.
Nothing at its default is written into the token any more: unset claims and
grants are omitted, as the server's own
omitemptygrants are. Verificationof existing tokens is unchanged.
Features
EncryptionError::FailedandDecryptionError::Failedcarry areasonstring and are no longerflat_error,so a foreign
EncryptionProviderorDecryptionProviderreturning an error no longer aborts the process with"Can't lift flat errors" -- a failed data track decrypt (no E2EE manager, key mismatch, corrupt frame) now
drops the frame and leaves the room connected.
Fixes
MissedChunk.Report the reconnect reason to the server when resuming.
Resumes previously sent no reason, so server-side telemetry could not attribute why Rust
clients reconnect — every resume looked like
RR_UNKNOWN. The engine now records what causedthe episode (signal disconnected, publisher failed, subscriber failed) and reports it on each
resume attempt. The v0 signalling path was also missing the
reconnect_reasonquery parameterentirely, so it would not have been reported even if a reason had been supplied.
livekit-api 0.8.0 (2026-09-22)
Breaking Changes
VideoGrantsgains theagentgrant andClaimsthekindclaim (withAccessToken::with_kind), which the Go, Python and JS SDKs already carry. Anagent worker's token is
VideoGrants { agent: true }and a simulated job'sparticipant token is
kind: "agent"; neither could be minted from Rust before.livekit-uniffiexposes both:TokenOptions.kind,Claims.kind, andagenton its
VideoGrantsrecord.Breaking: the four grants the server infers when absent --
can_publish,can_subscribe,can_publish_data,can_update_own_metadata-- are nowOption<bool>, as in the Go and JS SDKs.Noneleaves the decision to theserver, and the new getters (
can_publish(),can_subscribe(),can_publish_data(),can_update_own_metadata()) read a token the way theserver does,
can_publish_datafalling back tocan_publishincluded. Codethat set these fields writes
Some(..); code that read them uses the getters.The same fields are optional on the
livekit-uniffirecord, andlivekit-apire-exports the crate aslivekit_api::access_token, so bothcarry the change.
Nothing at its default is written into the token any more: unset claims and
grants are omitted, as the server's own
omitemptygrants are. Verificationof existing tokens is unchanged.
Fixes
Report the reconnect reason to the server when resuming.
Resumes previously sent no reason, so server-side telemetry could not attribute why Rust
clients reconnect — every resume looked like
RR_UNKNOWN. The engine now records what causedthe episode (signal disconnected, publisher failed, subscriber failed) and reports it on each
resume attempt. The v0 signalling path was also missing the
reconnect_reasonquery parameterentirely, so it would not have been reported even if a reason had been supplied.
livekit-signaling 0.1.3 (2026-09-22)
Fixes
Report the reconnect reason to the server when resuming.
Resumes previously sent no reason, so server-side telemetry could not attribute why Rust
clients reconnect — every resume looked like
RR_UNKNOWN. The engine now records what causedthe episode (signal disconnected, publisher failed, subscriber failed) and reports it on each
resume attempt. The v0 signalling path was also missing the
reconnect_reasonquery parameterentirely, so it would not have been reported even if a reason had been supplied.
VideoGrantsgains theagentgrant andClaimsthekindclaim (withAccessToken::with_kind), which the Go, Python and JS SDKs already carry. Anagent worker's token is
VideoGrants { agent: true }and a simulated job'sparticipant token is
kind: "agent"; neither could be minted from Rust before.livekit-uniffiexposes both:TokenOptions.kind,Claims.kind, andagenton its
VideoGrantsrecord.Breaking: the four grants the server infers when absent --
can_publish,can_subscribe,can_publish_data,can_update_own_metadata-- are nowOption<bool>, as in the Go and JS SDKs.Noneleaves the decision to theserver, and the new getters (
can_publish(),can_subscribe(),can_publish_data(),can_update_own_metadata()) read a token the way theserver does,
can_publish_datafalling back tocan_publishincluded. Codethat set these fields writes
Some(..); code that read them uses the getters.The same fields are optional on the
livekit-uniffirecord, andlivekit-apire-exports the crate aslivekit_api::access_token, so bothcarry the change.
Nothing at its default is written into the token any more: unset claims and
grants are omitted, as the server's own
omitemptygrants are. Verificationof existing tokens is unchanged.
livekit-rpc 0.1.2 (2026-09-22)
Fixes
MissedChunk.