endSession method
Ends the session: disconnects every peer and refuses new ones.
Idempotent. All coordination state is dropped, so a peer that reconnects after openSession starts clean rather than inheriting a half-torn-down membership. Credentials minted for the ended epoch stay invalid even after the session is reopened, because epoch only ever moves forward.
Implementation
Future<void> endSession({String reason = 'session ended'}) async {
if (_status == HubSessionStatus.closed) return;
_status = HubSessionStatus.closed;
_ttlTimer?.cancel();
_ttlTimer = null;
logger.info('Session "$_session" (epoch $_epoch) ending: $reason');
final sockets = <Future<void>>[];
for (final pending in _pending.values.toList(growable: false)) {
pending.deadline.cancel();
sockets.add(pending.socket.close(HubCloseCode.sessionClosed, reason));
}
for (final connection in _connections.values.toList(growable: false)) {
sockets.add(connection.socket.close(HubCloseCode.sessionClosed, reason));
}
_pending.clear();
_connections.clear();
_routing.clear();
_registry.clear();
_slotByEndpoint.clear();
_endpointBySlot.clear();
_revoked.clear();
await Future.wait(sockets);
}