Release 2.12.0 - #1191
Draft
hiroshihorie wants to merge 1 commit into
Draft
Conversation
|
Warning No changeset found If this PR includes user-facing changes, please add a changeset file in Format: |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Minor release. Main theme is iOS audio robustness: the audio session is now resolved from engine state before any policy is pushed (fixes audio engine error -9001 in pre-connect / pre-join / playout-only flows), and microphone permission is requested before capture starts. Also raises the toolchain floor to Flutter 3.38 / Dart 3.10 for native assets, plus a batch of fixes in data channels, data streams, E2EE, token caching, and the Linux task runner.
Changes
Added
AudioSessionExceptionfor iOS audio session failuresChanged
TrackCreateException/AudioSessionExceptioninstead ofAudioProcessingExceptionFixed
BaseKeyProvider.createhonorsdiscardFrameWhenCryptorNotReadyCachingTokenSource.fetchawaits its result so errors surface and the in-flight entry is clearedsendTextdeclares the UTF-8 byte length in the stream header (non-ASCII text streams were rejected)TrackCreateExceptionwhile the app is not in the foregroundTaskRunnerLinux::EnqueueTaskwhen the runner is destroyed before dispatchRelease review
Diff reviewed against
v2.11.0(11 commits).flutter analyze,dart format,import_sorter,check_version, andflutter test(407 tests) all pass locally. Version fields agree across.version,pubspec.yaml,README.md,lib/src/livekit.dart, and both podspecs;.changes/is empty; the 13 changelog bullets match the consumed changesets.flutter_webrtcpin unchanged at 1.6.0.The 111-file commit (#1170) is confirmed behavior-neutral after stripping whitespace and trailing commas, with one intentional rewrite:
room.dartnow uses null-aware map elements (?localParticipant?.sid), verified equivalent. Regenerated*.g.dartkeep the same nullability and null-omission semantics.No blockers. Items worth a look before tagging (none require holding the release):
applicationState == .active(shared_swift/LiveKitPlugin.swifthandleEnsureMicrophoneAccess)..inactivealso covers a visible iPad Split View app and the launch window beforedidBecomeActive, so a first-runwithPreConnectAudiofrominitStatethrowsTrackCreateExceptioninstead of prompting.!= .backgroundwould avoid the false positive. The behavior is documented onwithPreConnectAudio, so this is a judgment call.defaultRecordingConfigurationLocked). This is the intended -9001 fix, but apps that configureAVAudioSessionthemselves and start the engine before Dart syncs (CallKit wake) now get LiveKit's preset unless they opt into manual mode. Worth a louder changelog / migration note.LiveKitPlugin.kthandleStartLocalRecording).prewarmRecordingapplies the processing options first; if that step throws, the options are silently not applied and Dart still sees success. Narrowing the catch to the recorder-prep stage would keepnoProcessing()failures visible.patchchangeset.AudioProcessingExceptionis@experimentaland does not extendLiveKitException, so existingon AudioProcessingException catchsites (the pattern indoc/audio.md) will now miss permission / -9001 failures. Fine for a minor release, but the changelog entry could call this out.withPreConnectAudiocallsstartRecordingoutside itstry, so a permission failure both firesonErrorand propagates the exception to the caller.startCapturere-pushes the audio session policy; with the engine already running this re-applies the same playout config thatdidDisableEnginealready resolved on mute. Redundant but harmless.ReusableCompleter.completeErrordrops the error when nothing is listening yet, so a caller that readsagentReadyFutureonly afterstartRecordingthrows gets a fresh, never-completing future. Pre-existing, but the new preconnect failure paths make it easier to hit.