Stabilize frontend login. Make chat messages multiline.

This commit is contained in:
Shivering Ocelot committed 2025-05-31 13:33:42 -05:00
1 parent 5bbdfe8747
commit 3f37f727af
6 files changed
+71 -31

No files matched your search

+25 -7
View File
@@ -24,7 +24,7 @@ class Backend {
// Authentication
static ({String username, String password})? _credentials;
static Completer? _loginCompleter;
static Completer<bool>? _loginCompleter;
static Completer? _credentialsCompleter;
static void setup(String url) {
@@ -49,8 +49,11 @@ class Backend {
}
}
static Future<void> auth(String username, String password) {
_socket!.send(json.encode({'username': username, 'password': password}));
static Future<bool> auth(String username, String password) {
if (_credentials != null) {
print("Cannot authenticate twice");
return Future.value(false);
}
_credentials = (username: username, password: password);
if (_credentialsCompleter != null) {
_credentialsCompleter!.complete(_credentials);
@@ -62,11 +65,13 @@ class Backend {
static void connect() {
_socket = WebSocket(_url! + "/ws");
_socket!.onOpen.listen((event) {
_socket!.onOpen.listen((event) async {
print('Connected to the WebSocket server');
Backend.invalidateCache(chat: true);
print('Logging in...');
// secure the listener for the response before sending credentials
var responseFuture = nextIncomingMessage();
if (_credentials != null) {
_socket!.send(json.encode({'username': _credentials!.username, 'password': _credentials!.password}));
} else {
@@ -75,7 +80,14 @@ class Backend {
_socket!.send(json.encode({'username': credentials.username, 'password': credentials.password}));
});
}
_loginCompleter?.complete();
var response = await responseFuture;
if (response['error'] == null) {
_loginCompleter?.complete(true);
} else {
_loginCompleter?.complete(false);
_socket!.close(); // Retry
}
_loginCompleter = null;
});
_socket!.onError.listen((event) {
print('Error: $event');
@@ -92,11 +104,10 @@ class Backend {
static void disconnect() {
_socket?.close();
_loginCompleter = null;
}
static void _reconnect() {
Future.delayed(Duration(seconds: 5), () {
Future.delayed(Duration(seconds: 1), () {
connect();
});
}
@@ -140,10 +151,17 @@ class Backend {
print("No active listeners for chatId $chatId");
}
} else {
if (jsonData['error'] != null) {
print("Error: ${jsonData['error']}");
}
_packetStreamController.add(jsonData);
}
}
static Future<Map<String, dynamic>> nextIncomingMessage() {
return _packetStreamController.stream.first;
}
static Stream<Map<String, dynamic>> chatMessages(int chatId) {
if (!_chatControllers.containsKey(chatId) || _chatControllers[chatId]!.isClosed) {
_chatControllers[chatId] = StreamController<Map<String, dynamic>>.broadcast();