close method

void close({
  1. bool force = false,
})

Permanently closes this MCP client and rejects subsequent network work.

A caller-owned HTTP transport is left open so a replacement MCP client can reuse it.

Implementation

void close({bool force = false}) {
  _closed = true;
  _clearSessionState();
  _httpRequestStateToken = Object();
  final pendingHttpOperations = _pendingHttpOperations.toList(
    growable: false,
  );
  _pendingHttpOperations.clear();
  final pendingHttpRequests = _pendingHttpRequests.toList(growable: false);
  _pendingHttpRequests.clear();
  final pendingOAuthHttpOperations = _pendingOAuthHttpOperations.toList(
    growable: false,
  );
  _pendingOAuthHttpOperations.clear();
  final pendingHttpResponseBodies = _pendingHttpResponseBodies.toList(
    growable: false,
  );
  _pendingHttpResponseBodies.clear();
  final closeError = StateError(
    'MCP client closed while an HTTP request was pending',
  );
  final oauthCloseError = StateError(
    'MCP client closed while an OAuth HTTP request was pending',
  );
  final closeStackTrace = StackTrace.current;
  for (final pendingOperation in pendingHttpOperations) {
    pendingOperation.reject(closeError, closeStackTrace);
  }
  for (final pendingOperation in pendingOAuthHttpOperations) {
    pendingOperation.abort(oauthCloseError);
  }
  for (final responseBody in pendingHttpResponseBodies) {
    responseBody.abort(closeError);
  }
  for (final request in pendingHttpRequests) {
    request.abort(closeError);
  }

  _subscriptionStateToken = Object();
  final pendingSubscriptionHttpClients = _pendingSubscriptionHttpClients
      .toList(growable: false);
  _pendingSubscriptionHttpClients.clear();
  for (final httpClient in pendingSubscriptionHttpClients) {
    httpClient.close(force: true);
  }
  for (final subscription in _subscriptions.toList(growable: false)) {
    unawaited(subscription.close());
  }
  if (_ownsHttpClient) {
    _httpClient.close(force: force);
  }
}