close method
Close the transport
Implementation
@override
void close() async {
if (_isClosed) return;
_isClosed = true;
_logger.info('Closing StreamableHTTP server transport');
// Cancel cleanup timer
_cleanupTimer?.cancel();
// Close all SSE streams
for (final stream in _sseStreams.values) {
await stream.controller.close();
}
_sseStreams.clear();
// Close all GET streams
for (final stream in _getStreams.values) {
await stream.controller.close();
}
_getStreams.clear();
// Close pending requests and message routers
for (final pendingRequest in _pendingRequests.values) {
try {
pendingRequest.request.response.statusCode = HttpStatus.serviceUnavailable;
await pendingRequest.request.response.close();
} catch (e) {
_logger.debug('Error closing pending request: $e');
}
}
_pendingRequests.clear();
// Complete any pending completers with error
for (final completer in _pendingCompleters.values) {
if (!completer.isCompleted) {
completer.completeError('Server shutting down');
}
}
_pendingCompleters.clear();
// Close message routers
for (final router in _messageRouters.values) {
await router.close();
}
_messageRouters.clear();
// Close server
await _server?.close(force: true);
// Close message controller
if (!_messageController.isClosed) {
await _messageController.close();
}
if (!_closeCompleter.isCompleted) {
_closeCompleter.complete();
}
}