import 'package:meta/meta.dart'; import 'communicator.dart'; import 'heartbeat_mixin.dart'; abstract class BaseClient> extends Communicator with HeartbeatMixin { late final Self _self; final List _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 close() async { if (!isAlive) { return; } isAlive = false; stopHeartbeat(); cancelPendingRequests(); await closeTransport(); final listeners = List.from(_disconnectListeners); _disconnectListeners.clear(); for (final fn in listeners) { fn(_self); } } @protected Future closeTransport(); }