connect method
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;
}
}