@@ -465,6 +465,9 @@ base class DatabaseImplementation implements CommonDatabase {
465
465
@override
466
466
Stream <SqliteUpdate > get updates => _updatesHandler ().stream;
467
467
468
+ @override
469
+ Stream <SqliteUpdate > get updatesSync => _updatesHandler ().syncStream;
470
+
468
471
@override
469
472
Stream <void > get rollbacks => _rollbackHandler ().stream;
470
473
@@ -589,7 +592,8 @@ final class DatabaseConfigImplementation extends DatabaseConfig {
589
592
/// commits into rollbacks. This is represented by [_syncCallback] .
590
593
final class _StreamHandlers <T , SyncCallback > {
591
594
final DatabaseImplementation _database;
592
- final List <MultiStreamController <T >> _asyncListeners = [];
595
+ final List <({MultiStreamController <T > controller, bool sync})>
596
+ _asyncListeners = [];
593
597
SyncCallback ? _syncCallback;
594
598
595
599
/// Registers a native callback on the database.
@@ -599,29 +603,33 @@ final class _StreamHandlers<T, SyncCallback> {
599
603
final void Function () _unregister;
600
604
601
605
Stream <T >? _stream;
606
+ Stream <T >? _syncStream;
602
607
603
- Stream <T > get stream => _stream! ;
608
+ Stream <T > get stream => _stream ?? = _generateStream (false );
609
+ Stream <T > get syncStream => _syncStream ?? = _generateStream (true );
604
610
605
611
_StreamHandlers ({
606
612
required DatabaseImplementation database,
607
613
required void Function () register,
608
614
required void Function () unregister,
609
615
}) : _database = database,
610
616
_register = register,
611
- _unregister = unregister {
612
- _stream = Stream .multi (
617
+ _unregister = unregister;
618
+
619
+ Stream <T > _generateStream (bool dispatchSynchronously) {
620
+ return Stream .multi (
613
621
(newListener) {
614
622
if (_database._isClosed) {
615
623
newListener.close ();
616
624
return ;
617
625
}
618
626
619
627
void addListener () {
620
- _addAsyncListener (newListener);
628
+ _addAsyncListener (newListener, dispatchSynchronously );
621
629
}
622
630
623
631
void removeListener () {
624
- _removeAsyncListener (newListener);
632
+ _removeAsyncListener (newListener, dispatchSynchronously );
625
633
}
626
634
627
635
newListener
@@ -653,17 +661,17 @@ final class _StreamHandlers<T, SyncCallback> {
653
661
}
654
662
}
655
663
656
- void _addAsyncListener (MultiStreamController <T > listener) {
664
+ void _addAsyncListener (MultiStreamController <T > listener, bool sync ) {
657
665
final isFirstListener = ! hasListener;
658
- _asyncListeners.add (listener);
666
+ _asyncListeners.add ((controller : listener, sync : sync ) );
659
667
660
668
if (isFirstListener) {
661
669
_register ();
662
670
}
663
671
}
664
672
665
- void _removeAsyncListener (MultiStreamController <T > listener) {
666
- _asyncListeners.remove (listener);
673
+ void _removeAsyncListener (MultiStreamController <T > listener, bool sync ) {
674
+ _asyncListeners.remove ((controller : listener, sync : sync ) );
667
675
668
676
if (! hasListener && ! _database._isClosed) {
669
677
_unregister ();
@@ -672,13 +680,17 @@ final class _StreamHandlers<T, SyncCallback> {
672
680
673
681
void deliverAsyncEvent (T event) {
674
682
for (final listener in _asyncListeners) {
675
- listener.add (event);
683
+ if (listener.sync ) {
684
+ listener.controller.addSync (event);
685
+ } else {
686
+ listener.controller.add (event);
687
+ }
676
688
}
677
689
}
678
690
679
691
void close () {
680
692
for (final listener in _asyncListeners) {
681
- listener.close ();
693
+ listener.controller. close ();
682
694
}
683
695
_syncCallback = null ;
684
696
}
0 commit comments