connect method

Future<void> connect()

Implementation

Future<void> connect() async {
  if (_state is! Disconnected) {
    SdkLogger.i('Already connected or connecting');
    return;
  }
  _shouldReconnect = true;
  _updateState(const Connecting());

  try {
    final protocol = ssl ? 'wss' : 'ws';
    var uri = Uri.parse('$protocol://$host/v1/database/$database/subscribe');

    final headers = <String, dynamic>{};

    if (kIsWeb && _currentToken != null) {
      final wsToken = await _getWebSocketToken();
      if (wsToken != null) {
        uri = uri.replace(queryParameters: {'token': wsToken});
      }
    } else if (_currentToken != null) {
      headers['Authorization'] = 'Bearer $_currentToken';
    }

    _channel = _socketFactory(
      uri,
      ['v1.bsatn.spacetimedb'],
      headers,
      connectTimeout: config.connectTimeout,
    );
    await _channel!.ready;
    _setupMessageListener();
    _setupKeepAlive();
    _updateState(const Connected());
    _reconnectAttempts = 0;
    _updateQuality();
  } catch (e) {
    SdkLogger.e('Connection failed: $e');
    _updateState(const Disconnected());
    _channel = null;

    final errorString = e.toString();
    if (errorString.contains('401') || errorString.contains('Unauthorized')) {
      throw SpacetimeDbAuthException(
        'Authentication failed (401). Token may be invalid or expired.',
      );
    }

    throw SpacetimeDbConnectionException(
      'Connection failed: $e',
      lastKnownState: const Disconnected(),
    );
  }
}