proto-socket/dart/lib/src/base_client.dart
toki 182dcae5bf fix: update Dart close() implementation
- Fix base_client.dart close() method
- Update communicator.dart for close() pattern
- Update protobuf_server.dart and ws_protobuf_server.dart
- Update communicator_test.dart for close() API
- skills: rename implement/SKILL.md to plan/SKILL.md
- tasks: add dart_close_fix task files
2026-04-11 19:53:12 +09:00

50 lines
1 KiB
Dart

import 'package:meta/meta.dart';
import 'communicator.dart';
import 'heartbeat_mixin.dart';
abstract class BaseClient<Self extends BaseClient<Self>> extends Communicator
with HeartbeatMixin {
late final Self _self;
final List<void Function(Self)> _disconnectListeners = [];
@protected
void initSelf(Self self) {
_self = self;
}
void addDisconnectListener(void Function(Self) fn) {
if (!_disconnectListeners.contains(fn)) {
_disconnectListeners.add(fn);
}
}
void removeDisconnectListener(void Function(Self) fn) {
_disconnectListeners.remove(fn);
}
void onDisconnected(dynamic _) {
close();
}
@override
Future<void> close() async {
if (!isAlive) {
return;
}
isAlive = false;
stopHeartbeat();
cancelPendingRequests();
await closeTransport();
final listeners = List<void Function(Self)>.from(_disconnectListeners);
_disconnectListeners.clear();
for (final fn in listeners) {
fn(_self);
}
}
@protected
Future<void> closeTransport();
}