@@ -164,7 +164,7 @@ class PhoenixSocket {
164
164
String get endpoint => _endpoint;
165
165
166
166
/// The [Uri] containing all the parameters and options for the
167
- /// remote connection to occue .
167
+ /// remote connection to occur .
168
168
Uri get mountPoint => _mountPoint;
169
169
170
170
/// Whether the underlying socket is connected of not.
@@ -210,7 +210,7 @@ class PhoenixSocket {
210
210
// Wait for the WebSocket to be ready before continuing. In case of a
211
211
// failure to connect, the future will complete with an error and will be
212
212
// caught.
213
- await _ws! .ready;
213
+ await _ws! .ready. timeout (_options.timeout) ;
214
214
215
215
_socketState = SocketState .connected;
216
216
@@ -222,9 +222,20 @@ class PhoenixSocket {
222
222
} else {
223
223
throw PhoenixException ();
224
224
}
225
+ } on TimeoutException catch (err, stackTrace) {
226
+ _logger.severe (
227
+ 'Timed out waiting for WebSocket to be ready' , err, stackTrace);
228
+ _closeSink ();
229
+ _ws = null ;
230
+ _socketState = SocketState .closed;
231
+ // Calling this method will trigger a reconnect
232
+ // making _shouldReconnect = false as we are manually calling _delayedReconnect()
233
+ _shouldReconnect = false ;
234
+ _onSocketError (err, stackTrace);
235
+ completer.complete (_delayedReconnect ());
225
236
} catch (err, stackTrace) {
226
237
_logger.severe ('Raised Exception' , err, stackTrace);
227
-
238
+ _closeSink ();
228
239
_ws = null ;
229
240
_socketState = SocketState .closed;
230
241
@@ -271,6 +282,7 @@ class PhoenixSocket {
271
282
272
283
_disposed = true ;
273
284
_ws? .sink.close ();
285
+ _cancelHeartbeat ();
274
286
275
287
for (final sub in _subscriptions) {
276
288
sub.cancel ();
@@ -455,9 +467,19 @@ class PhoenixSocket {
455
467
}
456
468
457
469
try {
458
- await sendMessage (_heartbeatMessage ());
470
+ await sendMessage (_heartbeatMessage ()). timeout (_options.heartbeatTimeout) ;
459
471
_logger.fine ('[phoenix_socket] Heartbeat completed' );
460
472
return true ;
473
+ } on TimeoutException catch (err, stacktrace) {
474
+ _logger.severe (
475
+ '[phoenix_socket] Heartbeat message timed out' ,
476
+ err,
477
+ stacktrace,
478
+ );
479
+ if (_ws != null ) {
480
+ _closeSink (normalClosure, 'heartbeat timeout' );
481
+ }
482
+ return false ;
461
483
} on WebSocketChannelException catch (err, stacktrace) {
462
484
_logger.severe (
463
485
'[phoenix_socket] Heartbeat message failed: WebSocketChannelException' ,
@@ -552,6 +574,7 @@ class PhoenixSocket {
552
574
code: _ws? .closeCode,
553
575
);
554
576
final exc = PhoenixException (socketClosed: ev);
577
+ _closeSink ();
555
578
_ws = null ;
556
579
557
580
if (! _stateStreamController.isClosed) {
0 commit comments