@@ -465,6 +465,9 @@ base class DatabaseImplementation implements CommonDatabase {
465465 @override
466466 Stream <SqliteUpdate > get updates => _updatesHandler ().stream;
467467
468+ @override
469+ Stream <SqliteUpdate > get updatesSync => _updatesHandler ().syncStream;
470+
468471 @override
469472 Stream <void > get rollbacks => _rollbackHandler ().stream;
470473
@@ -589,7 +592,8 @@ final class DatabaseConfigImplementation extends DatabaseConfig {
589592/// commits into rollbacks. This is represented by [_syncCallback] .
590593final class _StreamHandlers <T , SyncCallback > {
591594 final DatabaseImplementation _database;
592- final List <MultiStreamController <T >> _asyncListeners = [];
595+ final List <({MultiStreamController <T > controller, bool sync})>
596+ _asyncListeners = [];
593597 SyncCallback ? _syncCallback;
594598
595599 /// Registers a native callback on the database.
@@ -599,29 +603,33 @@ final class _StreamHandlers<T, SyncCallback> {
599603 final void Function () _unregister;
600604
601605 Stream <T >? _stream;
606+ Stream <T >? _syncStream;
602607
603- Stream <T > get stream => _stream! ;
608+ Stream <T > get stream => _stream ?? = _generateStream (false );
609+ Stream <T > get syncStream => _syncStream ?? = _generateStream (true );
604610
605611 _StreamHandlers ({
606612 required DatabaseImplementation database,
607613 required void Function () register,
608614 required void Function () unregister,
609615 }) : _database = database,
610616 _register = register,
611- _unregister = unregister {
612- _stream = Stream .multi (
617+ _unregister = unregister;
618+
619+ Stream <T > _generateStream (bool dispatchSynchronously) {
620+ return Stream .multi (
613621 (newListener) {
614622 if (_database._isClosed) {
615623 newListener.close ();
616624 return ;
617625 }
618626
619627 void addListener () {
620- _addAsyncListener (newListener);
628+ _addAsyncListener (newListener, dispatchSynchronously );
621629 }
622630
623631 void removeListener () {
624- _removeAsyncListener (newListener);
632+ _removeAsyncListener (newListener, dispatchSynchronously );
625633 }
626634
627635 newListener
@@ -653,17 +661,17 @@ final class _StreamHandlers<T, SyncCallback> {
653661 }
654662 }
655663
656- void _addAsyncListener (MultiStreamController <T > listener) {
664+ void _addAsyncListener (MultiStreamController <T > listener, bool sync ) {
657665 final isFirstListener = ! hasListener;
658- _asyncListeners.add (listener);
666+ _asyncListeners.add ((controller : listener, sync : sync ) );
659667
660668 if (isFirstListener) {
661669 _register ();
662670 }
663671 }
664672
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 ) );
667675
668676 if (! hasListener && ! _database._isClosed) {
669677 _unregister ();
@@ -672,13 +680,17 @@ final class _StreamHandlers<T, SyncCallback> {
672680
673681 void deliverAsyncEvent (T event) {
674682 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+ }
676688 }
677689 }
678690
679691 void close () {
680692 for (final listener in _asyncListeners) {
681- listener.close ();
693+ listener.controller. close ();
682694 }
683695 _syncCallback = null ;
684696 }
0 commit comments