fix: Fix sync once hanging forever when opened again too quickly after closing (#98)
This commit is contained in:
parent
d89118a43a
commit
d3b9a66efd
1 changed files with 79 additions and 3 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue