endSession method

Future<void> endSession({
  1. String reason = 'session ended',
})

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);
}