From 323fd7f8bec3ad4c44ba0efb31ecc1fa7bf8f9c5 Mon Sep 17 00:00:00 2001 From: Brazol Date: Thu, 11 Dec 2025 09:32:04 +0100 Subject: [PATCH 1/6] improved join call time --- packages/stream_video/lib/globals.dart | 5 + packages/stream_video/lib/src/call/call.dart | 30 +++-- .../lib/src/call/session/call_session.dart | 103 ++---------------- .../stream_video/lib/src/stream_video.dart | 88 ++++++++++++--- .../lib/src/webrtc/rtc_manager.dart | 26 ++++- 5 files changed, 127 insertions(+), 125 deletions(-) diff --git a/packages/stream_video/lib/globals.dart b/packages/stream_video/lib/globals.dart index a9184da4b..2938a8b4a 100644 --- a/packages/stream_video/lib/globals.dart +++ b/packages/stream_video/lib/globals.dart @@ -1,6 +1,8 @@ import 'package:meta/meta.dart'; import 'package:stream_webrtc_flutter/stream_webrtc_flutter.dart' as webrtc; +import 'protobuf/video/sfu/models/models.pb.dart'; + const String streamSdkName = 'stream-flutter'; const String streamVideoVersion = '1.0.2'; const String openapiModelsVersion = '202.0.0'; @@ -15,3 +17,6 @@ final xStreamClientHeader = '$streamDefaultUserAgent|$clientVersionDetails'; /// Details regarding app name, version, os and device. Is set during initialization of StreamVideo instance. @internal String? clientVersionDetails; + +@internal +ClientDetails? clientDetails; diff --git a/packages/stream_video/lib/src/call/call.dart b/packages/stream_video/lib/src/call/call.dart index 89f7602c6..6ba284b38 100644 --- a/packages/stream_video/lib/src/call/call.dart +++ b/packages/stream_video/lib/src/call/call.dart @@ -1045,9 +1045,11 @@ class Call { // make sure we only track connection timing if we are not calling this method as part of a migration flow connectionTimeStopwatch.stop(); if (!performingMigration) { - await _sfuStatsReporter?.sendSfuStats( - reconnectionStrategy: _reconnectStrategy, - connectionTimeMs: connectionTimeStopwatch.elapsedMilliseconds, + unawaited( + _sfuStatsReporter?.sendSfuStats( + reconnectionStrategy: _reconnectStrategy, + connectionTimeMs: connectionTimeStopwatch.elapsedMilliseconds, + ), ); } @@ -1305,7 +1307,7 @@ class Call { capabilities: _sfuClientCapabilities, onRtcManagerCreatedCallback: (_) async { _logger.v(() => '[startSession] applying connect options'); - await _applyConnectOptions(); + unawaited(_applyConnectOptions()); }, isAnonymousUser: _streamVideo.state.currentUser.type == UserType.anonymous, @@ -1331,7 +1333,7 @@ class Call { } if (_sfuStatsOptions != null) { - await _sfuStatsReporter?.sendSfuStats(); + unawaited(_sfuStatsReporter?.sendSfuStats()); _sfuStatsReporter = SfuStatsReporter( callSession: session, @@ -1381,7 +1383,7 @@ class Call { anonymousCount: sfuEvent.participantCount.anonymous, ); } else if (sfuEvent is SfuCallEndedEvent) { - await _sfuStatsReporter?.sendSfuStats(); + unawaited(_sfuStatsReporter?.sendSfuStats()); _stateManager.sfuCallEnded(sfuEvent); } @@ -1517,7 +1519,7 @@ class Call { return; } - await _sfuStatsReporter?.sendSfuStats(); + unawaited(_sfuStatsReporter?.sendSfuStats()); switch (_reconnectStrategy) { case SfuReconnectionStrategy.unspecified: @@ -1638,9 +1640,11 @@ class Call { if (migrationResult.isSuccess) { migrateTimeStopwatch.stop(); - await _sfuStatsReporter?.sendSfuStats( - connectionTimeMs: migrateTimeStopwatch.elapsedMilliseconds, - reconnectionStrategy: _reconnectStrategy, + unawaited( + _sfuStatsReporter?.sendSfuStats( + connectionTimeMs: migrateTimeStopwatch.elapsedMilliseconds, + reconnectionStrategy: _reconnectStrategy, + ), ); } } @@ -2238,8 +2242,10 @@ class Call { _logger.v(() => '[performGetOperation] success: $success'); final callMetadata = onSuccess(success.data); - await _applyCallSettingsToConnectOptions( - callMetadata.settings, + unawaited( + _applyCallSettingsToConnectOptions( + callMetadata.settings, + ), ); return success; diff --git a/packages/stream_video/lib/src/call/session/call_session.dart b/packages/stream_video/lib/src/call/session/call_session.dart index c614204cc..48ecdcf15 100644 --- a/packages/stream_video/lib/src/call/session/call_session.dart +++ b/packages/stream_video/lib/src/call/session/call_session.dart @@ -2,12 +2,10 @@ import 'dart:async'; import 'dart:convert'; import 'package:collection/collection.dart'; -import 'package:device_info_plus/device_info_plus.dart'; import 'package:internet_connection_checker_plus/internet_connection_checker_plus.dart'; import 'package:rxdart/rxdart.dart'; import 'package:stream_webrtc_flutter/stream_webrtc_flutter.dart' as rtc; import 'package:synchronized/synchronized.dart'; -import 'package:system_info2/system_info2.dart'; import '../../../globals.dart'; import '../../../protobuf/video/sfu/event/events.pb.dart' as sfu_events; @@ -124,8 +122,6 @@ class CallSession extends Disposable { Timer? _peerConnectionCheckTimer; bool _isLeavingOrClosed = false; - sfu_models.ClientDetails? _clientDetails; - SharedEmitter get events => sfuWS.events; late final _vvBuffer = DebounceBuffer>( @@ -153,87 +149,6 @@ class CallSession extends Disposable { }); } - Future _ensureClientDetails() async { - if (_clientDetails != null) return; - - try { - sfu_models.Device? device; - sfu_models.Browser? browser; - - var os = sfu_models.OS( - name: CurrentPlatform.name, - ); - - if (CurrentPlatform.isAndroid) { - final deviceInfo = await DeviceInfoPlugin().androidInfo; - os = sfu_models.OS( - name: CurrentPlatform.name, - version: deviceInfo.version.release, - architecture: SysInfo.rawKernelArchitecture, - ); - device = sfu_models.Device( - name: '${deviceInfo.manufacturer} : ${deviceInfo.model}', - ); - } else if (CurrentPlatform.isIos) { - final deviceInfo = await DeviceInfoPlugin().iosInfo; - os = sfu_models.OS( - name: CurrentPlatform.name, - version: deviceInfo.systemVersion, - ); - device = sfu_models.Device( - name: deviceInfo.utsname.machine, - ); - } else if (CurrentPlatform.isWeb) { - final browserInfo = await DeviceInfoPlugin().webBrowserInfo; - browser = sfu_models.Browser( - name: browserInfo.browserName.name, - version: browserInfo.vendorSub, - ); - } else if (CurrentPlatform.isMacOS) { - final deviceInfo = await DeviceInfoPlugin().macOsInfo; - os = sfu_models.OS( - name: CurrentPlatform.name, - version: - '${deviceInfo.majorVersion}.${deviceInfo.minorVersion}.${deviceInfo.patchVersion}', - architecture: deviceInfo.arch, - ); - device = sfu_models.Device( - name: deviceInfo.model, - version: deviceInfo.osRelease, - ); - } else if (CurrentPlatform.isWindows) { - final deviceInfo = await DeviceInfoPlugin().windowsInfo; - os = sfu_models.OS( - name: CurrentPlatform.name, - version: - '${deviceInfo.majorVersion}.${deviceInfo.minorVersion}.${deviceInfo.buildNumber}', - architecture: deviceInfo.buildLabEx, - ); - } else if (CurrentPlatform.isLinux) { - final deviceInfo = await DeviceInfoPlugin().linuxInfo; - os = sfu_models.OS( - name: CurrentPlatform.name, - version: '${deviceInfo.name} ${deviceInfo.version}', - ); - } - - final versionSplit = streamVideoVersion.split('.'); - _clientDetails = sfu_models.ClientDetails( - sdk: sfu_models.Sdk( - type: sfu_models.SdkType.SDK_TYPE_FLUTTER, - major: versionSplit.first, - minor: versionSplit.skip(1).first, - patch: versionSplit.last, - ), - os: os, - device: device, - browser: browser, - ); - } catch (e) { - _logger.e(() => '[_ensureClientDetails] failed: $e'); - } - } - Future getReconnectDetails( SfuReconnectionStrategy strategy, { String? migratingFromSfuId, @@ -274,8 +189,6 @@ class CallSession extends Disposable { 'isAnonymousUser: $isAnonymousUser', ); - await _ensureClientDetails(); - await _eventsSubscription?.cancel(); await _rtcManagerSubject?.close(); @@ -338,7 +251,7 @@ class CallSession extends Disposable { : clientPublishOptions?.getPreferredSubscriberOptions(); final joinRequest = sfu_events.JoinRequest( - clientDetails: _clientDetails, + clientDetails: clientDetails, token: config.sfuToken, sessionId: sessionId, subscriberSdp: subscriberSdp, @@ -384,7 +297,7 @@ class CallSession extends Disposable { rtcManager = await rtcManagerFactory.makeRtcManager( sfuClient: sfuClient, - clientDetails: _clientDetails, + clientDetails: clientDetails, sessionSequence: sessionSeq, statsOptions: statsOptions, ) @@ -407,7 +320,7 @@ class CallSession extends Disposable { sfuClient: sfuClient, publisherId: localTrackId, publishOptions: joinResponseEvent.publishOptions, - clientDetails: _clientDetails, + clientDetails: clientDetails, sessionSequence: sessionSeq, statsOptions: statsOptions, callSessionConfig: config, @@ -428,8 +341,10 @@ class CallSession extends Disposable { if (CurrentPlatform.isAndroid && _streamVideo.options.androidAudioConfiguration != null) { try { - await rtc.Helper.setAndroidAudioConfiguration( - _streamVideo.options.androidAudioConfiguration!, + unawaited( + rtc.Helper.setAndroidAudioConfiguration( + _streamVideo.options.androidAudioConfiguration!, + ), ); } catch (e) { _logger.w( @@ -511,8 +426,6 @@ class CallSession extends Disposable { rtc.TransceiverDirection.SendOnly, ); - await _ensureClientDetails(); - Result<({SfuCallState callState, Duration fastReconnectDeadline})?>? result; @@ -523,7 +436,7 @@ class CallSession extends Disposable { sfuWS.send( sfu_events.SfuRequest( joinRequest: sfu_events.JoinRequest( - clientDetails: _clientDetails, + clientDetails: clientDetails, token: config.sfuToken, sessionId: sessionId, subscriberSdp: subscriberSdp, diff --git a/packages/stream_video/lib/src/stream_video.dart b/packages/stream_video/lib/src/stream_video.dart index bfefb2543..c0f22a979 100644 --- a/packages/stream_video/lib/src/stream_video.dart +++ b/packages/stream_video/lib/src/stream_video.dart @@ -8,8 +8,10 @@ import 'package:meta/meta.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:rxdart/rxdart.dart'; import 'package:stream_webrtc_flutter/stream_webrtc_flutter.dart' as rtc; +import 'package:system_info2/system_info2.dart'; import 'package:uuid/uuid.dart'; +import '../../../protobuf/video/sfu/models/models.pb.dart' as sfu_models; import '../globals.dart'; import '../open_api/video/coordinator/api.dart' hide User; import 'audio_processing/audio_processor.dart'; @@ -61,6 +63,7 @@ import 'utils/none.dart'; import 'utils/result.dart'; import 'utils/standard.dart'; import 'utils/subscriptions.dart'; +import 'webrtc/rtc_manager.dart'; import 'webrtc/sdp/policy/sdp_policy.dart'; const _tag = 'SV:Client'; @@ -227,7 +230,8 @@ class StreamVideo extends Disposable { ); _setupLogger(options.logPriority, options.logHandlerFunction); - unawaited(_setClientVersionDetails()); + unawaited(_setClientDetails()); + unawaited(RtcManager.cacheGenericSdp()); if (options.autoConnect) { unawaited( @@ -1259,42 +1263,94 @@ void _setupLogger(Priority logPriority, LogHandlerFunction logHandlerFunction) { } } -Future _setClientVersionDetails() async { +Future _setClientDetails() async { try { final packageInfo = await PackageInfo.fromPlatform(); final appName = packageInfo.appName; final appVersion = packageInfo.version; - var osVersion = ''; - var deviceModel = ''; + sfu_models.Device? device; + sfu_models.Browser? browser; + + var os = sfu_models.OS( + name: CurrentPlatform.name, + ); if (CurrentPlatform.isAndroid) { final deviceInfo = await DeviceInfoPlugin().androidInfo; - osVersion = deviceInfo.version.release; - deviceModel = '${deviceInfo.manufacturer} ${deviceInfo.model}'; + os = sfu_models.OS( + name: CurrentPlatform.name, + version: deviceInfo.version.release, + architecture: SysInfo.rawKernelArchitecture, + ); + device = sfu_models.Device( + name: '${deviceInfo.manufacturer} : ${deviceInfo.model}', + ); } else if (CurrentPlatform.isIos) { final deviceInfo = await DeviceInfoPlugin().iosInfo; - osVersion = deviceInfo.systemVersion; - deviceModel = deviceInfo.utsname.machine; + os = sfu_models.OS( + name: CurrentPlatform.name, + version: deviceInfo.systemVersion, + ); + device = sfu_models.Device( + name: deviceInfo.utsname.machine, + ); } else if (CurrentPlatform.isMacOS) { final deviceInfo = await DeviceInfoPlugin().macOsInfo; - osVersion = - '${deviceInfo.majorVersion}.${deviceInfo.minorVersion}.${deviceInfo.patchVersion}'; - deviceModel = deviceInfo.model; + os = sfu_models.OS( + name: CurrentPlatform.name, + version: + '${deviceInfo.majorVersion}.${deviceInfo.minorVersion}.${deviceInfo.patchVersion}', + architecture: deviceInfo.arch, + ); + device = sfu_models.Device( + name: deviceInfo.model, + version: deviceInfo.osRelease, + ); } else if (CurrentPlatform.isWindows) { final deviceInfo = await DeviceInfoPlugin().windowsInfo; - osVersion = - '${deviceInfo.majorVersion}.${deviceInfo.minorVersion}.${deviceInfo.buildNumber}'; + os = sfu_models.OS( + name: CurrentPlatform.name, + version: + '${deviceInfo.majorVersion}.${deviceInfo.minorVersion}.${deviceInfo.buildNumber}', + architecture: deviceInfo.buildLabEx, + ); } else if (CurrentPlatform.isLinux) { final deviceInfo = await DeviceInfoPlugin().linuxInfo; - osVersion = '${deviceInfo.name} ${deviceInfo.version}'; + os = sfu_models.OS( + name: CurrentPlatform.name, + version: '${deviceInfo.name} ${deviceInfo.version}', + ); + } else if (CurrentPlatform.isWeb) { + final browserInfo = await DeviceInfoPlugin().webBrowserInfo; + browser = sfu_models.Browser( + name: browserInfo.browserName.name, + version: browserInfo.vendorSub, + ); } + final versionSplit = streamVideoVersion.split('.'); + clientDetails = sfu_models.ClientDetails( + sdk: sfu_models.Sdk( + type: sfu_models.SdkType.SDK_TYPE_FLUTTER, + major: versionSplit.first, + minor: versionSplit.skip(1).first, + patch: versionSplit.last, + ), + os: os, + device: device, + browser: browser, + ); + + final deviceName = (device?.name != null && device!.name.isNotEmpty) + ? device.name + : null; + return clientVersionDetails ??= - 'app=$appName|app_version=$appVersion|os=${CurrentPlatform.name} $osVersion${deviceModel.isNotEmpty ? '|device_model=$deviceModel' : ''}'; + 'app=$appName|app_version=$appVersion|os=${CurrentPlatform.name} ${os.version}${deviceName != null ? '|device_model=$deviceName' : ''}'; } catch (e) { - streamLog.e(_tag, () => '[_setupComposeVersion] failed: $e'); + streamLog.e(_tag, () => '[_setClientDetails] failed: $e'); return null; } } diff --git a/packages/stream_video/lib/src/webrtc/rtc_manager.dart b/packages/stream_video/lib/src/webrtc/rtc_manager.dart index 5851b935c..b60b08fbf 100644 --- a/packages/stream_video/lib/src/webrtc/rtc_manager.dart +++ b/packages/stream_video/lib/src/webrtc/rtc_manager.dart @@ -109,10 +109,25 @@ class RtcManager extends Disposable { StreamSubscription? _screenSharingStartedSubscription; - /// Returns a generic sdp. + static final Map _cachedGenericSdp = {}; + + static Future cacheGenericSdp() async { + await Future.wait([ + getGenericSdp(rtc.TransceiverDirection.RecvOnly), + getGenericSdp(rtc.TransceiverDirection.SendOnly), + ]); + } + + /// Returns a generic sdp. Results are cached since device capabilities + /// don't change between calls. static Future getGenericSdp( rtc.TransceiverDirection direction, ) async { + // Check cache first + if (_cachedGenericSdp.containsKey(direction)) { + return _cachedGenericSdp[direction]!; + } + final tempPC = await rtc.createPeerConnection({}); await tempPC.addTransceiver( @@ -129,7 +144,14 @@ class RtcManager extends Disposable { final sdp = offer.sdp; await tempPC.dispose(); - return sdp!; + + if (sdp == null) { + taggedLogger(tag: _tag).e(() => '[getGenericSdp] sdp is null'); + return ''; + } + + _cachedGenericSdp[direction] = sdp; + return sdp; } Future onSubscriberOffer(String offerSdp) async { From 48af9552ed1edaf2ea3ee4cd8e35f04f1615571d Mon Sep 17 00:00:00 2001 From: Brazol Date: Thu, 11 Dec 2025 13:32:00 +0100 Subject: [PATCH 2/6] fix --- .../stream_video/lib/src/call/session/call_session.dart | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/stream_video/lib/src/call/session/call_session.dart b/packages/stream_video/lib/src/call/session/call_session.dart index 48ecdcf15..7be219c98 100644 --- a/packages/stream_video/lib/src/call/session/call_session.dart +++ b/packages/stream_video/lib/src/call/session/call_session.dart @@ -341,10 +341,8 @@ class CallSession extends Disposable { if (CurrentPlatform.isAndroid && _streamVideo.options.androidAudioConfiguration != null) { try { - unawaited( - rtc.Helper.setAndroidAudioConfiguration( - _streamVideo.options.androidAudioConfiguration!, - ), + await rtc.Helper.setAndroidAudioConfiguration( + _streamVideo.options.androidAudioConfiguration!, ); } catch (e) { _logger.w( From 3a3d32e9097e88b96adf6d48ff2261f562709676 Mon Sep 17 00:00:00 2001 From: Brazol Date: Thu, 11 Dec 2025 13:34:07 +0100 Subject: [PATCH 3/6] error handling --- packages/stream_video/lib/src/call/call.dart | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/stream_video/lib/src/call/call.dart b/packages/stream_video/lib/src/call/call.dart index 6ba284b38..23e89113d 100644 --- a/packages/stream_video/lib/src/call/call.dart +++ b/packages/stream_video/lib/src/call/call.dart @@ -1307,7 +1307,17 @@ class Call { capabilities: _sfuClientCapabilities, onRtcManagerCreatedCallback: (_) async { _logger.v(() => '[startSession] applying connect options'); - unawaited(_applyConnectOptions()); + unawaited( + _applyConnectOptions().catchError(( + dynamic error, + StackTrace stackTrace, + ) { + _logger.e( + () => + '[startSession] failed to apply connect options: $error, stackTrace: $stackTrace', + ); + }), + ); }, isAnonymousUser: _streamVideo.state.currentUser.type == UserType.anonymous, From cefdcdd62d88890214c48697e1041f6e43410da6 Mon Sep 17 00:00:00 2001 From: Brazol Date: Thu, 11 Dec 2025 15:31:59 +0100 Subject: [PATCH 4/6] changelog --- packages/stream_video/CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/stream_video/CHANGELOG.md b/packages/stream_video/CHANGELOG.md index 5f001f242..92631acfb 100644 --- a/packages/stream_video/CHANGELOG.md +++ b/packages/stream_video/CHANGELOG.md @@ -1,3 +1,9 @@ +## Upcoming + +### ⚡ Performance + +* Improved `call.join()` performance - reduced join time by optimizing WebRTC setup and deferring non-critical operations. Subsequent joins are significantly faster. + ## 1.0.2 🐞 Fixed From 73ecd57b1b589cb788bbd5f84c0b417907c0f1d6 Mon Sep 17 00:00:00 2001 From: Brazol Date: Thu, 11 Dec 2025 18:18:09 +0100 Subject: [PATCH 5/6] changelog --- packages/stream_video/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/stream_video/CHANGELOG.md b/packages/stream_video/CHANGELOG.md index 92631acfb..d44308d7e 100644 --- a/packages/stream_video/CHANGELOG.md +++ b/packages/stream_video/CHANGELOG.md @@ -2,7 +2,7 @@ ### ⚡ Performance -* Improved `call.join()` performance - reduced join time by optimizing WebRTC setup and deferring non-critical operations. Subsequent joins are significantly faster. +* Improved `call.join()` performance - reduced join time by optimizing WebRTC setup and deferring non-critical operations. ## 1.0.2 From de2353141aafdb04b69e56a24ae287dd0a9904f5 Mon Sep 17 00:00:00 2001 From: Brazol Date: Thu, 11 Dec 2025 18:50:36 +0100 Subject: [PATCH 6/6] tweaks --- packages/stream_video/lib/src/call/call.dart | 7 ++++ .../stream_video/lib/src/stream_video.dart | 33 ++++++++++++++++--- ...call_allow_multiple_active_calls_test.dart | 2 ++ .../src/call/call_apply_settings_test.dart | 1 + .../test/src/core/client_state_test.dart | 2 ++ 5 files changed, 41 insertions(+), 4 deletions(-) diff --git a/packages/stream_video/lib/src/call/call.dart b/packages/stream_video/lib/src/call/call.dart index 23e89113d..91f84b961 100644 --- a/packages/stream_video/lib/src/call/call.dart +++ b/packages/stream_video/lib/src/call/call.dart @@ -2255,6 +2255,13 @@ class Call { unawaited( _applyCallSettingsToConnectOptions( callMetadata.settings, + ).catchError( + (dynamic error, StackTrace stackTrace) { + _logger.e( + () => + '[performGetOperation] failed to apply call settings: $error, stackTrace: $stackTrace', + ); + }, ), ); diff --git a/packages/stream_video/lib/src/stream_video.dart b/packages/stream_video/lib/src/stream_video.dart index c0f22a979..64c85b7c7 100644 --- a/packages/stream_video/lib/src/stream_video.dart +++ b/packages/stream_video/lib/src/stream_video.dart @@ -128,6 +128,7 @@ class StreamVideo extends Disposable { TokenLoader? tokenLoader, OnTokenUpdated? onTokenUpdated, PNManagerProvider? pushNotificationManagerProvider, + bool precacheGenericSdps = true, }) { final instance = StreamVideo._( apiKey, @@ -137,6 +138,7 @@ class StreamVideo extends Disposable { tokenLoader: tokenLoader, onTokenUpdated: onTokenUpdated, pushNotificationManagerProvider: pushNotificationManagerProvider, + precacheGenericSdps: precacheGenericSdps, ); return instance; } @@ -149,6 +151,7 @@ class StreamVideo extends Disposable { TokenLoader? tokenLoader, OnTokenUpdated? onTokenUpdated, PNManagerProvider? pushNotificationManagerProvider, + bool precacheGenericSdps = true, }) : _options = options, _state = MutableClientState(user, options) { _networkMonitor = @@ -230,14 +233,36 @@ class StreamVideo extends Disposable { ); _setupLogger(options.logPriority, options.logHandlerFunction); - unawaited(_setClientDetails()); - unawaited(RtcManager.cacheGenericSdp()); + + unawaited( + _setClientDetails().onError((dynamic error, StackTrace stackTrace) { + _logger.e( + () => + '[StreamVideo] failed to set client details: $error with stackTrace: $stackTrace', + ); + + return null; + }), + ); + + if (precacheGenericSdps) { + unawaited(RtcManager.cacheGenericSdp()); + } if (options.autoConnect) { unawaited( connect( includeUserDetails: options.includeUserDetailsForAutoConnect, - ), + ).onError((dynamic error, StackTrace stackTrace) { + _logger.e( + () => + '[StreamVideo] failed to auto connect: $error with stackTrace: $stackTrace', + ); + + return Result.error( + 'Failed to auto connect: $error', + ); + }), ); } } @@ -1326,7 +1351,7 @@ Future _setClientDetails() async { final browserInfo = await DeviceInfoPlugin().webBrowserInfo; browser = sfu_models.Browser( name: browserInfo.browserName.name, - version: browserInfo.vendorSub, + version: browserInfo.appVersion, ); } diff --git a/packages/stream_video/test/src/call/call_allow_multiple_active_calls_test.dart b/packages/stream_video/test/src/call/call_allow_multiple_active_calls_test.dart index 48214151c..57bf04a6e 100644 --- a/packages/stream_video/test/src/call/call_allow_multiple_active_calls_test.dart +++ b/packages/stream_video/test/src/call/call_allow_multiple_active_calls_test.dart @@ -78,6 +78,7 @@ void main() { allowMultipleActiveCalls: false, autoConnect: false, ), + precacheGenericSdps: false, ); call1 = streamVideo.makeCall( @@ -205,6 +206,7 @@ void main() { allowMultipleActiveCalls: true, autoConnect: false, ), + precacheGenericSdps: false, ); call1 = streamVideo.makeCall( diff --git a/packages/stream_video/test/src/call/call_apply_settings_test.dart b/packages/stream_video/test/src/call/call_apply_settings_test.dart index cae064730..bfb0b8900 100644 --- a/packages/stream_video/test/src/call/call_apply_settings_test.dart +++ b/packages/stream_video/test/src/call/call_apply_settings_test.dart @@ -56,6 +56,7 @@ void main() { options: const StreamVideoOptions( autoConnect: false, ), + precacheGenericSdps: false, ); }); diff --git a/packages/stream_video/test/src/core/client_state_test.dart b/packages/stream_video/test/src/core/client_state_test.dart index 794bf5ef5..1d7dbcea2 100644 --- a/packages/stream_video/test/src/core/client_state_test.dart +++ b/packages/stream_video/test/src/core/client_state_test.dart @@ -63,6 +63,7 @@ void main() { allowMultipleActiveCalls: false, autoConnect: false, ), + precacheGenericSdps: false, ); }); @@ -183,6 +184,7 @@ void main() { allowMultipleActiveCalls: true, autoConnect: false, ), + precacheGenericSdps: false, ); });