initialize static method

Future<UFSocket> initialize()

Implementation

static Future<UFSocket> initialize() async {
  _instance ??= UFSocket._();

  if (_polling?.isConnected == true) {
    return _instance!;
  }

  _polling?.dispose();
  _polling = null;
  _socket?.dispose();
  _socket = null;

  final token = await UFUtils.preferences.readAuthToken();
  final target = _socketTarget();

  debugPrint('Connecting socket...');
  debugPrint('Socket URL: ${target.origin}');
  debugPrint('Socket namespace: ${target.namespace}');
  debugPrint('Socket transport: polling');
  debugPrint('Socket path: /socket.io/');
  debugPrint('Socket authentication configured: ${token.isNotEmpty}');

  if (!_loggingAttached) {
    interceptors.add(SocketLoggingInterceptor());
    _loggingAttached = true;
  }

  final polling = _PollingClient(
    origin: target.origin,
    namespace: target.namespace,
    token: token,
    onEvent: _instance!._dispatchEvent,
    onError: _instance!._onTransportError,
    onConnect: () {
      debugPrint('🟢 Socket connected successfully.');
    },
    onDisconnect: (reason) {
      debugPrint('🔴 Socket disconnected: $reason');
      interceptors.onError('disconnect', reason);
    },
  );
  _polling = polling;

  try {
    await polling.connect().timeout(const Duration(seconds: 20));
  } catch (error) {
    debugPrint('🔴 Socket connection error: $error');
    interceptors.onError('connect_error', error);
    polling.dispose();
    if (identical(_polling, polling)) {
      _polling = null;
    }
    rethrow;
  }

  return _instance!;
}