fix: Fix sync once hanging forever when opened again too quickly after closing (#98)

This commit is contained in:
Marcelo Mendonça Soares 2026-07-09 01:15:19 -03:00 • committed by GitHub
commit d3b9a66efd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -75,7 +75,12 @@ class CrdtSyncClient {
mode: CrdtSyncPeerMode.follower,
)
.listen(
outboundChanges.addIfNotClosed,
(event) {
outboundChanges.addIfNotClosed(event);
if (once && event is CrdtSyncClose) {
unawaited(outboundChanges.closeOrSkip());
}
},
onDone: doneCompleter.completeOrSkip,
onError: doneCompleter.completeErrorOrSkip,
cancelOnError: true,
@ -117,8 +122,15 @@ extension on StreamController<CrdtSyncStreamEvent> {
}
Future<void> closeOrSkip() async {
if (isClosed) return;
await close();
if (!isClosed) {
unawaited(close());
}
// The done event is only delivered once the stream has a listener. If the
// method stream never listened (e.g. opening it failed), awaiting [done]
// would hang forever.
if (hasListener) {
await done;
}
}
}