close method

  1. @override
void close()
override

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