connect method
Connect to the server
Implementation
@override
Future<void> connect(String url, {Map<String, String>? headers}) async {
_logger.info('HTTP: Starting connection to $url');
_logger.info('HTTP: Current connected state: $connected');
if (connected) {
_logger.info('HTTP: Already connected, skipping connection');
return;
}
final startTime = DateTime.now();
try {
_url = url;
_headers = headers ?? {};
_logger.info('HTTP: URL set to $_url');
_logger.info('HTTP: Headers: $_headers');
// Set default headers
_headers!.putIfAbsent('Content-Type', () => Constants.contentTypeJson);
_headers!.putIfAbsent('Accept', () => Constants.contentTypeJson);
_headers!.putIfAbsent('User-Agent', () => Constants.userAgent);
_logger.info('HTTP: Default headers set');
// Test connection with a handshake
final handshake = {
'channel': '/meta/handshake',
'version': '1.0',
'supportedConnectionTypes': ['long-polling'],
};
_logger.info('HTTP: Sending handshake: $handshake');
final response = await _sendRequest(handshake);
_logger.info('HTTP: Handshake response: $response');
final responseMessage = extractBayeuxMessage(response);
if (responseMessage['successful'] == true) {
updateConnectionState(true);
recordConnectTime(DateTime.now().difference(startTime).inMilliseconds);
_logger.info('HTTP: Connection established successfully');
// Start polling if using long-polling
if (_connectionType == 'long-polling') {
_logger.info('HTTP: Starting long-polling');
_startPolling();
}
} else {
_logger.severe('HTTP: Handshake failed: ${responseMessage['error']}');
throw FayeError.fromBayeux(responseMessage['error'] ?? {});
}
} catch (e) {
_logger.severe('HTTP: Connection failed: $e');
emitError(FayeError.network('Failed to connect: $e'));
rethrow;
}
}