connect method

  1. @override
Future<void> connect(
  1. String url, {
  2. Map<String, String>? headers,
})
override

Connect to the server

Implementation

@override
Future<void> connect(String url, {Map<String, String>? headers}) async {
  _logger.info('WebSocket: Starting connection to $url');
  _logger.info('WebSocket: Current connected state: $connected');

  if (connected) {
    _logger.info('WebSocket: Already connected, skipping connection');
    return;
  }

  final startTime = DateTime.now();

  try {
    _url = url;
    _headers = headers ?? {};
    _logger.info('WebSocket: URL set to $_url');
    _logger.info('WebSocket: Headers: $_headers');

    // Convert HTTP URL to WebSocket URL
    final wsUrl = _convertToWebSocketUrl(url);
    _logger.info('WebSocket: Converted URL: $wsUrl');

    // Create WebSocket connection
    _logger.info('WebSocket: Creating WebSocketChannel...');
    _logger.info('WebSocket: URL: $wsUrl');
    _logger.info('WebSocket: Protocols: $_protocols');
    try {
      _channel = WebSocketChannel.connect(
        Uri.parse(wsUrl),
        // Don't specify protocols - let the server choose
      );
      _logger.info('WebSocket: WebSocketChannel created successfully');
    } catch (e) {
      _logger.severe('WebSocket: Failed to create WebSocketChannel: $e');
      rethrow;
    }

    // Listen for messages
    _logger.info('WebSocket: Setting up message listeners...');
    _channel!.stream.listen(
      _handleMessage,
      onError: _handleError,
      onDone: _handleDisconnect,
    );
    _logger.info('WebSocket: Message listeners configured');

    // Wait for connection to be established
    _logger.info('WebSocket: Waiting for connection to establish...');
    await _waitForConnection();
    _logger.info('WebSocket: Connection established');

    updateConnectionState(true);
    recordConnectTime(DateTime.now().difference(startTime).inMilliseconds);
    _logger.info('WebSocket: Connection state updated to connected');

    // Reset reconnection attempts
    _reconnectAttempts = 0;
    _logger.info('WebSocket: Connection completed successfully');
  } catch (e) {
    _logger.severe('WebSocket: Connection failed: $e');
    emitError(FayeError.network('Failed to connect: $e'));
    rethrow;
  }
}