@@ -76,6 +76,9 @@ class SupabaseStreamBuilder extends Stream<SupabaseStreamEvent> {
7676 /// Count of record to be returned
7777 int ? _limit;
7878
79+ /// Flag if the stream has at least one time been subscribed to realtime
80+ bool _gotSubscribed = false ;
81+
7982 SupabaseStreamBuilder ({
8083 required PostgrestQueryBuilder queryBuilder,
8184 required String realtimeTopic,
@@ -209,14 +212,15 @@ class SupabaseStreamBuilder extends Stream<SupabaseStreamEvent> {
209212 .subscribe ((status, [error]) {
210213 switch (status) {
211214 case RealtimeSubscribeStatus .subscribed:
212- // Get first data when realtime is subscribed and reload all data
213- // from postgrest if e.g. got a channel error and is resubscribed
214- _getPostgrestData ();
215+ // Reload all data after a reconnect from postgrest
216+ // First data from postgrest gets loaded before the realtime connect
217+ if (_gotSubscribed) {
218+ _getPostgrestData ();
219+ }
220+ _gotSubscribed = true ;
215221 break ;
216222 case RealtimeSubscribeStatus .closed:
217- if (! (_streamController? .isClosed ?? true )) {
218- _streamController? .close ();
219- }
223+ _streamController? .close ();
220224 break ;
221225 case RealtimeSubscribeStatus .timedOut:
222226 _addException (RealtimeSubscribeException (status, error));
@@ -226,6 +230,7 @@ class SupabaseStreamBuilder extends Stream<SupabaseStreamEvent> {
226230 break ;
227231 }
228232 });
233+ _getPostgrestData ();
229234 }
230235
231236 Future <void > _getPostgrestData () async {
@@ -271,6 +276,10 @@ class SupabaseStreamBuilder extends Stream<SupabaseStreamEvent> {
271276 _addStream ();
272277 } catch (error, stackTrace) {
273278 _addException (error, stackTrace);
279+ // In case the postgrest call fails, there is no need to keep the
280+ // realtime connection open
281+ _channel? .unsubscribe ();
282+ _streamController? .close ();
274283 }
275284 }
276285
0 commit comments