Skip to content

Commit 28b0006

Browse files
authored
Merge pull request #10 from superlistapp/fix/dev-11757-stateerror-bad-state-cannot-reconnect-a-disposed-socket
[part of DEV-11757] Makes failed heartbeat not attempt to reconnect after ConnectionManager is closed or disposed
2 parents 97cfb6f + d87e620 commit 28b0006

File tree

3 files changed

+35
-3
lines changed

3 files changed

+35
-3
lines changed

.github/workflows/test.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,4 @@ jobs:
4545
dart analyze test/
4646
4747
- name: Run tests
48-
run: dart run test
48+
run: dart run test --concurrency=1

lib/src/socket.dart

+3-2
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,9 @@ class PhoenixSocket {
448448
return false;
449449
} catch (error, stackTrace) {
450450
_logger.warning('Heartbeat message failed', error, stackTrace);
451-
_reconnect(heartbeatTimedOut, reason: 'Heartbeat timed out');
451+
if (!_disposed && _connectionManager != null) {
452+
_reconnect(heartbeatTimedOut, reason: 'Heartbeat timed out');
453+
}
452454
return false;
453455
}
454456
}
@@ -569,7 +571,6 @@ class PhoenixSocket {
569571
if (_isOpen) {
570572
_triggerChannelExceptions(PhoenixException(socketError: errorEvent));
571573
}
572-
// _connectionManager?.reconnect(internalServerError, reason: 'Error on socket: ${errorEvent.error}');
573574
}
574575

575576
void _onSocketClosed(PhoenixSocketCloseEvent closeEvent) {

test/socket_integration_test.dart

+31
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,20 @@ import 'dart:async';
33
import 'package:phoenix_socket/phoenix_socket.dart';
44
import 'package:test/test.dart';
55

6+
import 'helpers/proxy.dart';
7+
68
void main() {
79
const addr = 'ws://localhost:4001/socket/websocket';
810

911
group('PhoenixSocket', () {
12+
setUp(() async {
13+
await prepareProxy();
14+
});
15+
16+
tearDown(() async {
17+
await destroyProxy();
18+
});
19+
1020
test('can connect to a running Phoenix server', () async {
1121
final socket = PhoenixSocket(addr);
1222

@@ -121,5 +131,26 @@ void main() {
121131

122132
expect(errCount, 3);
123133
});
134+
135+
test('heartbeat failure does not reconnect after disposal', () async {
136+
final socket = PhoenixSocket(
137+
addr,
138+
socketOptions: PhoenixSocketOptions(
139+
heartbeat: Duration(milliseconds: 1),
140+
),
141+
);
142+
143+
await socket.connect();
144+
145+
await socket.openStream.first;
146+
147+
// Prevent next heartbeat from getting a reply.
148+
await haltProxy();
149+
150+
socket.dispose();
151+
152+
await Future.delayed(Duration(milliseconds: 1));
153+
// The test will fail with unhandled exception if reconnection attempt is made
154+
});
124155
});
125156
}

0 commit comments

Comments
 (0)