proto-socket/dart/lib/src/heartbeat_mixin.dart
toki 9cc1f1d58f sync: update communicator implementation across all languages
- Align protocol documentation (PROTOCOL.md, README.md, VERSIONING.md)
- Go: add nonce test, update communicator
- Kotlin: update Communicator, TcpClient, TcpServer, add TLS test
- Python: update all modules, add certificate test resources
- TypeScript: update communicator, tcp/ws clients and servers, add tests
- Dart: update communicator, heartbeat mixin, and tests
2026-04-26 05:31:56 +09:00

64 lines
1.5 KiB
Dart

import 'package:protobuf/protobuf.dart';
import 'communicator.dart';
import 'packets/message_common.pb.dart';
import 'response_checker.dart';
mixin HeartbeatMixin on Communicator {
late int _heartbeatIntervalTime;
late int _heartbeatWaitTime;
ResponseChecker<Communicator>? _heartbeatChecker;
bool _waitingHeartbeatResponse = false;
Future<void> close();
void initHeartbeat(int intervalSec, int waitSec) {
_heartbeatIntervalTime = intervalSec;
_heartbeatWaitTime = waitSec;
}
void sendHeartBeat() {
if (isAlive) {
_heartbeatChecker?.responded();
_heartbeatChecker =
ResponseChecker.second(this, _heartbeatIntervalTime, (client) {
if (isAlive) {
_waitingHeartbeatResponse = true;
send(HeartBeat());
_heartbeatChecker =
ResponseChecker.second(this, _heartbeatWaitTime, (client) {
if (isAlive) {
close();
}
});
}
});
}
}
void onHeartBeat(HeartBeat data) {
if (_waitingHeartbeatResponse) {
_waitingHeartbeatResponse = false;
} else {
send(HeartBeat());
}
}
@override
Future<void> send<T extends GeneratedMessage>(T data) async {
if (isAlive) {
try {
await queuePacket(PacketBase()
..typeName = data.info_.qualifiedMessageName
..nonce = nextNonce()
..data = data.writeToBuffer());
} catch (e) {
close();
}
}
}
void stopHeartbeat() {
_heartbeatChecker?.responded();
}
}