Skip to content

Commit 094b956

Browse files
authored
Minor fixes 1 (#1041)
A collection of minor/simple fixes.
1 parent 8dfaf67 commit 094b956

12 files changed

Lines changed: 49 additions & 46 deletions
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
patch type="fixed" "Fix waitForBufferStatusLow busy-wait after engine close"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
patch type="fixed" "Fix connected server address using wrong peer connection"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
patch type="fixed" "Fix deferred track listener leak across reconnects"

.changes/fix-log-interpolation

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
patch type="fixed" "Fix string interpolation in forceRelay log messages"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
patch type="fixed" "Fix premature publication dispose during unpublish"

.changes/fix-reconnect-counter

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
patch type="fixed" "Fix reconnect counter null assertion on first reconnect attempt"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
patch type="fixed" "Fix region failover condition allowing null provider dereference"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
patch type="fixed" "Fix sendSyncState using async void and swallowing sync-state preparation errors"

lib/src/core/engine.dart

Lines changed: 38 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -121,20 +121,19 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
121121

122122
late EventsListener<SignalEvent> _signalListener = signalClient.createListener(synchronized: true);
123123

124-
int? reconnectAttempts;
125-
126-
Timer? reconnectTimeout;
127-
DateTime? reconnectStart;
124+
int _reconnectAttempts = 0;
125+
Timer? _reconnectTimeout;
126+
DateTime? _reconnectStart;
128127

129128
bool _isClosed = false;
130129

131130
bool get isClosed => _isClosed;
132131

133-
bool get isPendingReconnect => reconnectStart != null && reconnectTimeout != null;
132+
bool get isPendingReconnect => _reconnectStart != null && _reconnectTimeout != null;
134133

135134
final int _reconnectCount = defaultRetryDelaysInMs.length;
136135

137-
bool attemptingReconnect = false;
136+
bool _attemptingReconnect = false;
138137

139138
RegionUrlProvider? _regionUrlProvider;
140139

@@ -179,17 +178,17 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
179178
return null;
180179
}
181180

182-
void clearReconnectTimeout() {
183-
if (reconnectTimeout != null) {
184-
reconnectTimeout?.cancel();
185-
reconnectTimeout = null;
181+
void _clearReconnectTimeout() {
182+
if (_reconnectTimeout != null) {
183+
_reconnectTimeout?.cancel();
184+
_reconnectTimeout = null;
186185
}
187186
}
188187

189-
void clearPendingReconnect() {
190-
clearReconnectTimeout();
191-
reconnectAttempts = 0;
192-
reconnectStart = null;
188+
void _clearPendingReconnect() {
189+
_clearReconnectTimeout();
190+
_reconnectAttempts = 0;
191+
_reconnectStart = null;
193192
}
194193

195194
Engine({
@@ -290,15 +289,15 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
290289
await signalClient.cleanUp();
291290

292291
fullReconnectOnNext = false;
293-
attemptingReconnect = false;
292+
_attemptingReconnect = false;
294293

295294
// Reset reliability state
296295
_reliableDataSequence = 1;
297296
_reliableMessageBuffer.clear();
298297
_reliableReceivedState.clear();
299298
_isReconnecting = false;
300299

301-
clearPendingReconnect();
300+
_clearPendingReconnect();
302301
}
303302

304303
@internal
@@ -357,7 +356,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
357356

358357
events.once<EngineClosingEvent>((e) => onClosing());
359358

360-
while (!_dcBufferStatus[kind]!) {
359+
while (!completer.isCompleted && !_dcBufferStatus[kind]!) {
361360
await Future.delayed(const Duration(milliseconds: 10));
362361
}
363362
if (completer.isCompleted) {
@@ -725,7 +724,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
725724
signalClient.connectionState == ConnectionState.connecting) {
726725
final track = event.track;
727726
final receiver = event.receiver;
728-
events.on<EngineConnectedEvent>((event) async {
727+
events.once<EngineConnectedEvent>((event) async {
729728
Timer(const Duration(milliseconds: 10), () {
730729
events.emit(EngineTrackAddedEvent(
731730
track: track,
@@ -829,7 +828,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
829828

830829
Future<void> _handleGettingConnectedServerAddress(rtc.RTCPeerConnection pc) async {
831830
try {
832-
final remoteAddress = await getConnectedAddress(publisher!.pc);
831+
final remoteAddress = await getConnectedAddress(pc);
833832
logger.fine('Connected address: $remoteAddress');
834833
if (_connectedServerAddress == null || _connectedServerAddress != remoteAddress) {
835834
_connectedServerAddress = remoteAddress;
@@ -999,11 +998,11 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
999998

1000999
_isReconnecting = true;
10011000

1002-
if (reconnectAttempts == 0) {
1003-
reconnectStart = DateTime.timestamp();
1001+
if (_reconnectAttempts == 0) {
1002+
_reconnectStart = DateTime.timestamp();
10041003
}
10051004

1006-
if (reconnectAttempts! >= _reconnectCount) {
1005+
if (_reconnectAttempts >= _reconnectCount) {
10071006
logger.fine('reconnectAttempts exceeded, disconnecting...');
10081007
_isClosed = true;
10091008
await cleanUp();
@@ -1014,26 +1013,26 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
10141013
return;
10151014
}
10161015

1017-
var delay = defaultRetryDelaysInMs[reconnectAttempts!];
1016+
var delay = defaultRetryDelaysInMs[_reconnectAttempts];
10181017
// Add random jitter to prevent thundering herd on reconnect
1019-
if (reconnectAttempts! > 1) {
1018+
if (_reconnectAttempts > 1) {
10201019
delay += math.Random().nextInt(1000);
10211020
}
10221021

10231022
events.emit(EngineAttemptReconnectEvent(
1024-
attempt: reconnectAttempts! + 1,
1023+
attempt: _reconnectAttempts + 1,
10251024
maxAttempts: _reconnectCount,
10261025
nextRetryDelaysInMs: delay,
10271026
));
10281027

1029-
clearReconnectTimeout();
1028+
_clearReconnectTimeout();
10301029
if (token != null && _regionUrlProvider != null) {
10311030
// token may have been refreshed, we do not want to recreate the regionUrlProvider
10321031
// since the current engine may have inherited a regional url
10331032
_regionUrlProvider!.updateToken(token!);
10341033
}
1035-
logger.fine('WebSocket reconnecting in $delay ms, retry times $reconnectAttempts');
1036-
reconnectTimeout = Timer(Duration(milliseconds: delay), () async {
1034+
logger.fine('WebSocket reconnecting in $delay ms, retry times $_reconnectAttempts');
1035+
_reconnectTimeout = Timer(Duration(milliseconds: delay), () async {
10371036
await attemptReconnect(
10381037
reason,
10391038
reconnectReason: reconnectReason,
@@ -1051,7 +1050,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
10511050
}
10521051

10531052
// guard for attempting reconnection multiple times while one attempt is still not finished
1054-
if (attemptingReconnect) {
1053+
if (_attemptingReconnect) {
10551054
return;
10561055
}
10571056

@@ -1065,7 +1064,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
10651064
}
10661065

10671066
try {
1068-
attemptingReconnect = true;
1067+
_attemptingReconnect = true;
10691068

10701069
if (await signalClient.networkIsAvailable() == false) {
10711070
logger.fine('no internet connection, waiting...');
@@ -1086,11 +1085,11 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
10861085
reconnectReason: reconnectReason,
10871086
);
10881087
}
1089-
clearPendingReconnect();
1090-
attemptingReconnect = false;
1088+
_clearPendingReconnect();
1089+
_attemptingReconnect = false;
10911090
_isReconnecting = false;
10921091
} catch (e) {
1093-
reconnectAttempts = reconnectAttempts! + 1;
1092+
_reconnectAttempts = _reconnectAttempts + 1;
10941093
bool recoverable = true;
10951094
if (e is WebSocketException || e is MediaConnectException) {
10961095
// cannot resume connection, need to do full reconnect
@@ -1111,7 +1110,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
11111110
await cleanUp();
11121111
}
11131112
} finally {
1114-
attemptingReconnect = false;
1113+
_attemptingReconnect = false;
11151114
}
11161115
}
11171116

@@ -1230,7 +1229,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
12301229
}
12311230

12321231
@internal
1233-
void sendSyncState({
1232+
Future<void> sendSyncState({
12341233
required lk_rtc.UpdateSubscription subscription,
12351234
required Iterable<lk_rtc.TrackPublishedResponse>? publishTracks,
12361235
required List<String> trackSidsDisabled,
@@ -1281,7 +1280,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
12811280
logger.fine('onConnected subscriberPrimary: ${_subscriberPrimary}, '
12821281
'serverVersion: ${event.response.serverVersion}, '
12831282
'iceServers: ${event.response.iceServers}, '
1284-
'forceRelay: $event.response.clientConfiguration.forceRelay');
1283+
'forceRelay: ${event.response.clientConfiguration.forceRelay}');
12851284

12861285
final rtcConfiguration = await _buildRtcConfiguration(
12871286
serverResponseForceRelay: event.response.clientConfiguration.forceRelay,
@@ -1313,7 +1312,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
13131312

13141313
logger.fine('Handle ReconnectResponse: '
13151314
'iceServers: ${event.response.iceServers}, '
1316-
'forceRelay: $event.response.clientConfiguration.forceRelay, '
1315+
'forceRelay: ${event.response.clientConfiguration.forceRelay}, '
13171316
'lastMessageSeq: ${event.response.lastMessageSeq}');
13181317

13191318
final rtcConfiguration = await _buildRtcConfiguration(
@@ -1336,7 +1335,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
13361335
})
13371336
..on<SignalConnectedEvent>((event) async {
13381337
logger.fine('Signal connected');
1339-
reconnectAttempts = 0;
1338+
_reconnectAttempts = 0;
13401339
events.emit(const EngineConnectedEvent());
13411340
})
13421341
..on<SignalConnectingEvent>((event) async {
@@ -1456,7 +1455,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
14561455
logger.fine('disconnect: Cancel the reconnection processing!');
14571456
await signalClient.cleanUp();
14581457
await _signalListener.cancelAll();
1459-
clearPendingReconnect();
1458+
_clearPendingReconnect();
14601459
}
14611460
await cleanUp();
14621461
events.emit(EngineDisconnectedEvent(reason: reason));

lib/src/core/room.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -302,8 +302,8 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
302302
);
303303
} catch (e) {
304304
logger.warning('could not connect to $url $e');
305-
if (_regionUrlProvider != null && e is WebSocketException ||
306-
(e is ConnectException && e.reason != ConnectionErrorReason.NotAllowed)) {
305+
if (_regionUrlProvider != null &&
306+
(e is WebSocketException || (e is ConnectException && e.reason != ConnectionErrorReason.NotAllowed))) {
307307
String? nextUrl;
308308
try {
309309
nextUrl = await _regionUrlProvider!.getNextBestRegionUrl();
@@ -971,7 +971,7 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
971971
}
972972
}
973973

974-
engine.sendSyncState(
974+
await engine.sendSyncState(
975975
subscription: lk_rtc.UpdateSubscription(
976976
participantTracks: [],
977977
trackSids: trackSids,

0 commit comments

Comments
 (0)