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