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