- 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
50 lines
1 KiB
Dart
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();
|
|
}
|