Skip to content

Stream errors after system sleep (Desktop) #579

@maxfornacon

Description

@maxfornacon

Describe the bug
I'm experiencing an issue on Flutter desktop especially on MacOS (other platforms not properly tested yet). When the OS goes into sleep mode and awakens after a longer period of time streams seem to not be reconnecting properly.

I'm getting a couple of error messages:

First a couple of these:

[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: 
#0      SupabaseStreamBuilder._addException (package:supabase/src/supabase_stream_builder.dart:442:67)
#1      SupabaseStreamBuilder._getStreamData.<anonymous closure> (package:supabase/src/supabase_stream_builder.dart:348:9)
#2      RealtimeChannel.subscribe.<anonymous closure> (package:realtime_client/src/realtime_channel.dart:202:39)
#3      RealtimeChannel.onError.<anonymous closure> (package:realtime_client/src/realtime_channel.dart:331:36)
#4      RealtimeChannel.trigger (package:realtime_client/src/realtime_channel.dart:569:22)
#5      RealtimeClient._triggerChanError (package:realtime_client/src/realtime_client.dart:408:15)
#6      RealtimeClient._onConnClose (package:realtime_client/src/realtime_client.dart:389:7)
#7      RealtimeClient.connect.<anonymous closure> (package:realtime_client/src/realtime_client.dart:147:11)
#8      _RootZone.runGuarded (dart:async/zone.dart:1581:10)
#9      _BufferingStreamSubscription._sendDone.sendDone (dart:async/stream_impl.dart:392:13)
#10     _BufferingStreamSubscription._sendDone (dart:async/stream_impl.dart:402:7)
#11     _BufferingStreamSubscription._close (dart:async/stream_impl.dart:291:7)
#12     _ForwardingStream._handleDone (dart:async/stream_pipe.dart:99:10)
#13     _ForwardingStreamSubscription._handleDone (dart:async/stream_pipe.dart:161:13)
#14     _RootZone.runGuarded (dart:async/zone.dart:1581:10)
#15     _BufferingStreamSubscription._sendDone.sendDone (dart:async/stream_impl.dart:392:13)
#16     _BufferingStreamSubscription._sendDone (dart:async/stream_impl.dart:402:7)
#17     _BufferingStreamSubscription._close (dart:async/stream_impl.dart:291:7)
#18     _SyncStreamControllerDispatch._sendDone (dart:async/stream_controller.dart:782:19)
#19     _StreamController._closeUnchecked (dart:async/stream_controller.dart:637:7)
#20     _StreamController.close (dart:async/stream_controller.dart:630:5)
#21     _RootZone.run (dart:async/zone.dart:1654:54)
#22     _FutureListener.handleWhenComplete (dart:async/future_impl.dart:190:18)
#23     Future._propagateToListeners.handleWhenCompleteCallback (dart:async/future_impl.dart:737:39)
#24     Future._propagateToListeners (dart:async/future_impl.dart:793:11)
#25     Future._completeWithValue (dart:async/future_impl.dart:567:5)
#26     Future._asyncCompleteWithValue.<anonymous closure> (dart:async/future_impl.dart:640:7)
#27     _microtaskLoop (dart:async/schedule_microtask.dart:40:21)
#28     _startMicrotaskLoop (dart:async/schedule_microtask.dart:49:5)

Then there is this one:

[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Exception: "{:error, [message: \"Invalid token\", claim: \"exp\", claim_val: 1690999365]}"
#0      SupabaseStreamBuilder._addException (package:supabase/src/supabase_stream_builder.dart:442:67)
#1      SupabaseStreamBuilder._getStreamData.<anonymous closure> (package:supabase/src/supabase_stream_builder.dart:348:9)
#2      RealtimeChannel.subscribe.<anonymous closure> (package:realtime_client/src/realtime_channel.dart:277:19)
#3      Push._matchReceive.<anonymous closure> (package:realtime_client/src/push.dart:136:17)
#4      Iterable.forEach (dart:core/iterable.dart:325:35)
#5      Push._matchReceive (package:realtime_client/src/push.dart:135:48)
#6      Push.startTimeout.<anonymous closure> (package:realtime_client/src/push.dart:99:7)
#7      RealtimeChannel.trigger (package:realtime_client/src/realtime_channel.dart:569:22)
#8      new RealtimeChannel.<anonymous closure> (package:realtime_client/src/realtime_channel.dart:171:7)
#9      RealtimeChannel.trigger (package:realtime_client/src/realtime_channel.dart:569:22)
#10     RealtimeClient.onConnMessage.<anonymous closure>.<anonymous closure> (package:realtime_client/src/realtime_client.dart:310:41)
#11     Iterable.forEach (dart:core/iterable.dart:325:35)
#12     RealtimeClient.onConnMessage.<anonymous closure> (package:realtime_client/src/realtime_client.dart:310:12)
#13     new RealtimeClient.<anonymous closure> (package:realtime_client/src/realtime_client.dart:110:21)
#14     RealtimeClient.onConnMessage (package:realtime_client/src/realtime_client.dart:293:11)
#15     RealtimeClient.connect.<anonymous closure> (package:realtime_client/src/realtime_client.dart:140:22)
#16     _RootZone.runUnaryGuarded (dart:async/zone.dart:1593:10)
#17     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:339:11)
#18     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)
#19     _ForwardingStreamSubscription._add (dart:async/stream_pipe.dart:123:11)
#20     _HandleErrorStream._handleData (dart:async/stream_pipe.dart:253:10)
#21     _ForwardingStreamSubscription._handleData (dart:async/stream_pipe.dart:153:13)
#22     _RootZone.runUnaryGuarded (dart:async/zone.dart:1593:10)
#23     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:339:11)
#24     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)
#25     _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:774:19)
#26     _StreamController._add (dart:async/stream_controller.dart:648:7)
#27     _RootZone.runUnaryGuarded (dart:async/zone.dart:1593:10)
#28     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:339:11)
#29     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)
#30     _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:774:19)
#31     _StreamController._add (dart:async/stream_controller.dart:648:7)
#32     _StreamController.add (dart:async/stream_controller.dart:596:5)
#33     new _WebSocketImpl._fromSocket.<anonymous closure> (dart:_http/websocket_impl.dart:1144:21)
#34     _RootZone.runUnaryGuarded (dart:async/zone.dart:1593:10)
#35     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:339:11)
#36     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)
#37     _SinkTransformerStreamSubscription._add (dart:async/stream_transformers.dart:63:11)
#38     _EventSinkWrapper.add (dart:async/stream_transformers.dart:13:11)
#39     _WebSocketProtocolTransformer._messageFrameEnd (dart:_http/websocket_impl.dart:332:23)
#40     _WebSocketProtocolTransformer.add (dart:_http/websocket_impl.dart:226:46)
#41     _SinkTransformerStreamSubscription._handleData (dart:async/stream_transformers.dart:111:24)
#42     _RootZone.runUnaryGuarded (dart:async/zone.dart:1593:10)
#43     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:339:11)
#44     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)
#45     _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:774:19)
#46     _StreamController._add (dart:async/stream_controller.dart:648:7)
#47     _StreamController.add (dart:async/stream_controller.dart:596:5)
#48     _Socket._onData (dart:io-patch/socket_patch.dart:2355:41)
#49     _RootZone.runUnaryGuarded (dart:async/zone.dart:1593:10)
#50     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:339:11)
#51     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)
#52     _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:774:19)
#53     _StreamController._add (dart:async/stream_controller.dart:648:7)
#54     _StreamController.add (dart:async/stream_controller.dart:596:5)
#55     _RawSecureSocket._sendReadEvent (dart:io/secure_socket.dart:1111:19)
#56     Timer._createTimer.<anonymous closure> (dart:async-patch/timer_patch.dart:18:15)
#57     _Timer._runTimers (dart:isolate-patch/timer_impl.dart:398:19)
#58     _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:429:5)
#59     _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:192:26)

When I trigger a request to Supabase the token gets refreshed, which is good. All requests to Supabase seem to work fine, but streams don't.

[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Bad state: Cannot add event after closing
#0      _StreamController.add (dart:async/stream_controller.dart:595:24)
#1      _CompleterSink.add (package:web_socket_channel/src/sink_completer.dart:90:27)
#2      RealtimeClient.push.callback.<anonymous closure> (package:realtime_client/src/realtime_client.dart:267:55)
#3      new RealtimeClient.<anonymous closure> (package:realtime_client/src/realtime_client.dart:107:21)
#4      RealtimeClient.push.callback (package:realtime_client/src/realtime_client.dart:267:13)
#5      RealtimeClient.push (package:realtime_client/src/realtime_client.dart:284:9)
#6      Push.send (package:realtime_client/src/push.dart:61:36)
#7      Push.resend (package:realtime_client/src/push.dart:52:5)
#8      RealtimeChannel.rejoin (package:realtime_client/src/realtime_channel.dart:510:14)
#9      RealtimeChannel.rejoinUntilConnected (package:realtime_client/src/realtime_channel.dart:181:7)
#10     new RealtimeChannel.<anonymous closure> (package:realtime_client/src/realtime_channel.dart:134:26)
#11     RetryTimer.scheduleTimeout.<anonymous closure> (package:realtime_client/src/retry_timer.dart:46:15)
#12     Timer._createTimer.<anonymous closure> (dart:async-patch/timer_patch.dart:18:15)
#13     _Timer._runTimers (dart:isolate-patch/timer_impl.dart:398:19)
#14     _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:429:5)
#15     _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:192:26)

To Reproduce
Steps to reproduce the behavior:

  1. Start Flutter desktop application
  2. get MacOS into sleep mode (e.g. by closing the MacBook)
  3. wake up after a while

Expected behavior
I would expect the streams to reconnect and load all data that's changed while the system was suspended.

Version (please complete the following information):
On macOS

│   ├── supabase_flutter...
├── supabase_flutter 1.10.11
│   ├── supabase 1.9.9
│   │   ├── functions_client 1.3.2
│   │   ├── gotrue 1.11.2
│   │   ├── postgrest 1.4.0
│   │   ├── realtime_client 1.1.3
│   │   ├── storage_client 1.5.1

I experienced an issue with all requests failing after system sleep due to invalid JWT, but this seems to be solved with the newest package version. Therefore my remaining problem could be related.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingrealtimeThis issue or pull request is related to realtime

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions