Skip to content

Commit 0126924

Browse files
authored
chore(llc): improved join call time (#1126)
* improved join call time * fix * error handling * changelog * changelog * tweaks
1 parent 1b3dfc6 commit 0126924

File tree

9 files changed

+177
-124
lines changed

9 files changed

+177
-124
lines changed

packages/stream_video/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## Upcoming
2+
3+
### ⚡ Performance
4+
5+
* Improved `call.join()` performance - reduced join time by optimizing WebRTC setup and deferring non-critical operations.
6+
17
## 1.0.2
28

39
🐞 Fixed

packages/stream_video/lib/globals.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import 'package:meta/meta.dart';
22
import 'package:stream_webrtc_flutter/stream_webrtc_flutter.dart' as webrtc;
33

4+
import 'protobuf/video/sfu/models/models.pb.dart';
5+
46
const String streamSdkName = 'stream-flutter';
57
const String streamVideoVersion = '1.0.2';
68
const String openapiModelsVersion = '202.0.0';
@@ -15,3 +17,6 @@ final xStreamClientHeader = '$streamDefaultUserAgent|$clientVersionDetails';
1517
/// Details regarding app name, version, os and device. Is set during initialization of StreamVideo instance.
1618
@internal
1719
String? clientVersionDetails;
20+
21+
@internal
22+
ClientDetails? clientDetails;

packages/stream_video/lib/src/call/call.dart

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,9 +1045,11 @@ class Call {
10451045
// make sure we only track connection timing if we are not calling this method as part of a migration flow
10461046
connectionTimeStopwatch.stop();
10471047
if (!performingMigration) {
1048-
await _sfuStatsReporter?.sendSfuStats(
1049-
reconnectionStrategy: _reconnectStrategy,
1050-
connectionTimeMs: connectionTimeStopwatch.elapsedMilliseconds,
1048+
unawaited(
1049+
_sfuStatsReporter?.sendSfuStats(
1050+
reconnectionStrategy: _reconnectStrategy,
1051+
connectionTimeMs: connectionTimeStopwatch.elapsedMilliseconds,
1052+
),
10511053
);
10521054
}
10531055

@@ -1305,7 +1307,17 @@ class Call {
13051307
capabilities: _sfuClientCapabilities,
13061308
onRtcManagerCreatedCallback: (_) async {
13071309
_logger.v(() => '[startSession] applying connect options');
1308-
await _applyConnectOptions();
1310+
unawaited(
1311+
_applyConnectOptions().catchError((
1312+
dynamic error,
1313+
StackTrace stackTrace,
1314+
) {
1315+
_logger.e(
1316+
() =>
1317+
'[startSession] failed to apply connect options: $error, stackTrace: $stackTrace',
1318+
);
1319+
}),
1320+
);
13091321
},
13101322
isAnonymousUser:
13111323
_streamVideo.state.currentUser.type == UserType.anonymous,
@@ -1331,7 +1343,7 @@ class Call {
13311343
}
13321344

13331345
if (_sfuStatsOptions != null) {
1334-
await _sfuStatsReporter?.sendSfuStats();
1346+
unawaited(_sfuStatsReporter?.sendSfuStats());
13351347
_sfuStatsReporter =
13361348
SfuStatsReporter(
13371349
callSession: session,
@@ -1381,7 +1393,7 @@ class Call {
13811393
anonymousCount: sfuEvent.participantCount.anonymous,
13821394
);
13831395
} else if (sfuEvent is SfuCallEndedEvent) {
1384-
await _sfuStatsReporter?.sendSfuStats();
1396+
unawaited(_sfuStatsReporter?.sendSfuStats());
13851397
_stateManager.sfuCallEnded(sfuEvent);
13861398
}
13871399

@@ -1517,7 +1529,7 @@ class Call {
15171529
return;
15181530
}
15191531

1520-
await _sfuStatsReporter?.sendSfuStats();
1532+
unawaited(_sfuStatsReporter?.sendSfuStats());
15211533

15221534
switch (_reconnectStrategy) {
15231535
case SfuReconnectionStrategy.unspecified:
@@ -1638,9 +1650,11 @@ class Call {
16381650

16391651
if (migrationResult.isSuccess) {
16401652
migrateTimeStopwatch.stop();
1641-
await _sfuStatsReporter?.sendSfuStats(
1642-
connectionTimeMs: migrateTimeStopwatch.elapsedMilliseconds,
1643-
reconnectionStrategy: _reconnectStrategy,
1653+
unawaited(
1654+
_sfuStatsReporter?.sendSfuStats(
1655+
connectionTimeMs: migrateTimeStopwatch.elapsedMilliseconds,
1656+
reconnectionStrategy: _reconnectStrategy,
1657+
),
16441658
);
16451659
}
16461660
}
@@ -2238,8 +2252,17 @@ class Call {
22382252
_logger.v(() => '[performGetOperation] success: $success');
22392253

22402254
final callMetadata = onSuccess(success.data);
2241-
await _applyCallSettingsToConnectOptions(
2242-
callMetadata.settings,
2255+
unawaited(
2256+
_applyCallSettingsToConnectOptions(
2257+
callMetadata.settings,
2258+
).catchError(
2259+
(dynamic error, StackTrace stackTrace) {
2260+
_logger.e(
2261+
() =>
2262+
'[performGetOperation] failed to apply call settings: $error, stackTrace: $stackTrace',
2263+
);
2264+
},
2265+
),
22432266
);
22442267

22452268
return success;

packages/stream_video/lib/src/call/session/call_session.dart

Lines changed: 4 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@ import 'dart:async';
22
import 'dart:convert';
33

44
import 'package:collection/collection.dart';
5-
import 'package:device_info_plus/device_info_plus.dart';
65
import 'package:internet_connection_checker_plus/internet_connection_checker_plus.dart';
76
import 'package:rxdart/rxdart.dart';
87
import 'package:stream_webrtc_flutter/stream_webrtc_flutter.dart' as rtc;
98
import 'package:synchronized/synchronized.dart';
10-
import 'package:system_info2/system_info2.dart';
119

1210
import '../../../globals.dart';
1311
import '../../../protobuf/video/sfu/event/events.pb.dart' as sfu_events;
@@ -124,8 +122,6 @@ class CallSession extends Disposable {
124122
Timer? _peerConnectionCheckTimer;
125123
bool _isLeavingOrClosed = false;
126124

127-
sfu_models.ClientDetails? _clientDetails;
128-
129125
SharedEmitter<SfuEvent> get events => sfuWS.events;
130126

131127
late final _vvBuffer = DebounceBuffer<VisibilityChange, Result<None>>(
@@ -153,87 +149,6 @@ class CallSession extends Disposable {
153149
});
154150
}
155151

156-
Future<void> _ensureClientDetails() async {
157-
if (_clientDetails != null) return;
158-
159-
try {
160-
sfu_models.Device? device;
161-
sfu_models.Browser? browser;
162-
163-
var os = sfu_models.OS(
164-
name: CurrentPlatform.name,
165-
);
166-
167-
if (CurrentPlatform.isAndroid) {
168-
final deviceInfo = await DeviceInfoPlugin().androidInfo;
169-
os = sfu_models.OS(
170-
name: CurrentPlatform.name,
171-
version: deviceInfo.version.release,
172-
architecture: SysInfo.rawKernelArchitecture,
173-
);
174-
device = sfu_models.Device(
175-
name: '${deviceInfo.manufacturer} : ${deviceInfo.model}',
176-
);
177-
} else if (CurrentPlatform.isIos) {
178-
final deviceInfo = await DeviceInfoPlugin().iosInfo;
179-
os = sfu_models.OS(
180-
name: CurrentPlatform.name,
181-
version: deviceInfo.systemVersion,
182-
);
183-
device = sfu_models.Device(
184-
name: deviceInfo.utsname.machine,
185-
);
186-
} else if (CurrentPlatform.isWeb) {
187-
final browserInfo = await DeviceInfoPlugin().webBrowserInfo;
188-
browser = sfu_models.Browser(
189-
name: browserInfo.browserName.name,
190-
version: browserInfo.vendorSub,
191-
);
192-
} else if (CurrentPlatform.isMacOS) {
193-
final deviceInfo = await DeviceInfoPlugin().macOsInfo;
194-
os = sfu_models.OS(
195-
name: CurrentPlatform.name,
196-
version:
197-
'${deviceInfo.majorVersion}.${deviceInfo.minorVersion}.${deviceInfo.patchVersion}',
198-
architecture: deviceInfo.arch,
199-
);
200-
device = sfu_models.Device(
201-
name: deviceInfo.model,
202-
version: deviceInfo.osRelease,
203-
);
204-
} else if (CurrentPlatform.isWindows) {
205-
final deviceInfo = await DeviceInfoPlugin().windowsInfo;
206-
os = sfu_models.OS(
207-
name: CurrentPlatform.name,
208-
version:
209-
'${deviceInfo.majorVersion}.${deviceInfo.minorVersion}.${deviceInfo.buildNumber}',
210-
architecture: deviceInfo.buildLabEx,
211-
);
212-
} else if (CurrentPlatform.isLinux) {
213-
final deviceInfo = await DeviceInfoPlugin().linuxInfo;
214-
os = sfu_models.OS(
215-
name: CurrentPlatform.name,
216-
version: '${deviceInfo.name} ${deviceInfo.version}',
217-
);
218-
}
219-
220-
final versionSplit = streamVideoVersion.split('.');
221-
_clientDetails = sfu_models.ClientDetails(
222-
sdk: sfu_models.Sdk(
223-
type: sfu_models.SdkType.SDK_TYPE_FLUTTER,
224-
major: versionSplit.first,
225-
minor: versionSplit.skip(1).first,
226-
patch: versionSplit.last,
227-
),
228-
os: os,
229-
device: device,
230-
browser: browser,
231-
);
232-
} catch (e) {
233-
_logger.e(() => '[_ensureClientDetails] failed: $e');
234-
}
235-
}
236-
237152
Future<sfu_events.ReconnectDetails> getReconnectDetails(
238153
SfuReconnectionStrategy strategy, {
239154
String? migratingFromSfuId,
@@ -274,8 +189,6 @@ class CallSession extends Disposable {
274189
'isAnonymousUser: $isAnonymousUser',
275190
);
276191

277-
await _ensureClientDetails();
278-
279192
await _eventsSubscription?.cancel();
280193
await _rtcManagerSubject?.close();
281194

@@ -338,7 +251,7 @@ class CallSession extends Disposable {
338251
: clientPublishOptions?.getPreferredSubscriberOptions();
339252

340253
final joinRequest = sfu_events.JoinRequest(
341-
clientDetails: _clientDetails,
254+
clientDetails: clientDetails,
342255
token: config.sfuToken,
343256
sessionId: sessionId,
344257
subscriberSdp: subscriberSdp,
@@ -384,7 +297,7 @@ class CallSession extends Disposable {
384297
rtcManager =
385298
await rtcManagerFactory.makeRtcManager(
386299
sfuClient: sfuClient,
387-
clientDetails: _clientDetails,
300+
clientDetails: clientDetails,
388301
sessionSequence: sessionSeq,
389302
statsOptions: statsOptions,
390303
)
@@ -407,7 +320,7 @@ class CallSession extends Disposable {
407320
sfuClient: sfuClient,
408321
publisherId: localTrackId,
409322
publishOptions: joinResponseEvent.publishOptions,
410-
clientDetails: _clientDetails,
323+
clientDetails: clientDetails,
411324
sessionSequence: sessionSeq,
412325
statsOptions: statsOptions,
413326
callSessionConfig: config,
@@ -511,8 +424,6 @@ class CallSession extends Disposable {
511424
rtc.TransceiverDirection.SendOnly,
512425
);
513426

514-
await _ensureClientDetails();
515-
516427
Result<({SfuCallState callState, Duration fastReconnectDeadline})?>?
517428
result;
518429

@@ -523,7 +434,7 @@ class CallSession extends Disposable {
523434
sfuWS.send(
524435
sfu_events.SfuRequest(
525436
joinRequest: sfu_events.JoinRequest(
526-
clientDetails: _clientDetails,
437+
clientDetails: clientDetails,
527438
token: config.sfuToken,
528439
sessionId: sessionId,
529440
subscriberSdp: subscriberSdp,

0 commit comments

Comments
 (0)