Websocket hearbeat

This commit is contained in:
2025-07-29 18:13:26 +08:00
parent d8cd33e79a
commit 97226ae96b

View File

@@ -46,6 +46,10 @@ class WebSocketService {
final StreamController<WebSocketState> _statusStreamController =
StreamController<WebSocketState>.broadcast();
Timer? _reconnectTimer;
Timer? _heartbeatTimer;
DateTime? _heartbeatAt;
Duration? _heartbeatDelay;
Stream<WebSocketPacket> get dataStream => _streamController.stream;
Stream<WebSocketState> get statusStream => _statusStreamController.stream;
@@ -71,6 +75,7 @@ class WebSocketService {
}
await _channel!.ready;
_statusStreamController.sink.add(WebSocketState.connected());
_scheduleHeartbeat();
_channel!.stream.listen(
(data) {
final dataStr =
@@ -80,6 +85,13 @@ class WebSocketService {
log(
"[WebSocket] Received packet: ${packet.type} ${packet.errorMessage}",
);
if (packet.type == 'pong' && _heartbeatAt != null) {
var now = DateTime.now();
_heartbeatDelay = now.difference(_heartbeatAt!);
log(
"[WebSocket] Server respond last heartbeat for ${_heartbeatDelay!.inMilliseconds} ms",
);
}
},
onDone: () {
log('[WebSocket] Connection closed, attempting to reconnect...');
@@ -108,6 +120,19 @@ class WebSocketService {
});
}
void _scheduleHeartbeat() {
_heartbeatTimer?.cancel();
_heartbeatTimer = Timer.periodic(const Duration(seconds: 3), (_) {
_beatTheHeart();
});
}
void _beatTheHeart() {
_heartbeatAt = DateTime.now();
log('[WebSocket] We\'re beating the heart! $_heartbeatAt');
sendMessage(jsonEncode(WebSocketPacket(type: 'ping', data: null)));
}
WebSocketChannel? get ws => _channel;
void sendMessage(String message) {