send method

  1. @override
void send(
  1. dynamic message
)
override

Send a message through the transport

Implementation

@override
void send(dynamic message) async {
  if (_isClosed) {
    _logger.debug('Attempted to send on closed transport');
    return;
  }

  if (_messageEndpoint == null) {
    throw McpError(
      'Cannot send message: SSE connection not fully established',
    );
  }

  try {
    final jsonMessage = jsonEncode(message);
    _logger.debug('Sending message: $jsonMessage');

    final url = Uri.parse(_messageEndpoint!);
    final client = HttpClient();
    final request = await client.postUrl(url);

    // Set headers
    request.headers.contentType = ContentType.json;
    if (headers != null) {
      headers!.forEach((name, value) {
        request.headers.add(name, value);
      });
    }

    // Send the request
    request.write(jsonMessage);
    final response = await request.close();

    // Check for successful delivery (200 OK or 202 Accepted)
    if (response.statusCode == 200 || response.statusCode == 202) {
      final responseBody = await response.transform(utf8.decoder).join();
      _logger.debug(
        'Message delivery confirmation (${response.statusCode}): $responseBody',
      );
      // Don't forward this to message controller, actual response comes via SSE
    } else {
      final responseBody = await response.transform(utf8.decoder).join();
      _logger.debug('Error response: $responseBody');
      throw McpError('Error sending message: ${response.statusCode}');
    }

    // Close the HTTP client
    client.close();
    _logger.debug('Message sent successfully');
  } catch (e) {
    _logger.debug('Error sending message: $e');
    rethrow;
  }
}