WIP ws messages, TODO backend receiving frontend messages

This commit is contained in:
2025-02-19 09:28:13 -07:00
parent b37862a321
commit d2e378b4a3
12 changed files with 104 additions and 153 deletions
+24 -7
View File
@@ -5,6 +5,7 @@ import 'package:frontend/providers/game_messages.dart';
import 'package:frontend/providers/web_socket.dart';
import 'package:go_router/go_router.dart';
import 'package:logging/logging.dart';
import 'package:shared_models/room.dart';
final logger = Logger('GameRoomHome');
@@ -30,17 +31,33 @@ class _GameRoomHomeState extends ConsumerState<GameRoomHome> {
if (jwt == null || jwt.roomUuid != widget.roomUuid) {
logger.fine('Tried to open room, but not authenticated / wrong room');
// return home
context.go('/');
WidgetsBinding.instance.addPostFrameCallback((_) => context.go('/'));
}
final connection = ref.watch(webSocketNotifierProvider).valueOrNull;
ref.listen(
gameMessageNotifierProvider,
(previous, next) {
print('Got message: $next');
},
);
if (jwt != null) {
ref.listen(
gameMessageNotifierProvider,
(previous, next) {
final message = next.valueOrNull;
if (message is GameRoomMessage) {
switch (message) {
case PingMessage():
final ping = PingMessage.now(
jwt.roomUuid,
dest: PingDestination.server,
userUuid: jwt.uuid,
);
ref.read(webSocketNotifierProvider.notifier).sendMessage(ping);
case PlayerVoteMessage():
// TODO: Handle this case.
throw UnimplementedError();
}
}
},
);
}
// enstablish ws connection at /room/roomCode/ws and save to gameMessageProvider
return Scaffold(
body: Column(
-16
View File
@@ -120,22 +120,6 @@ class _JoinRoomHomeState extends ConsumerState<JoinRoomHome> {
code: _codeController.text,
),
);
// )
// .whenData(
// (response) {
// if (response != null && response.uuid != null) {
// logger.fine('Navigating to room ${response.uuid}');
// // context.go('room/${response.uuid}');
// } else {
// ScaffoldMessenger.of(context).showSnackBar(
// SnackBar(
// content: Text('Unexpected error occurred.'),
// backgroundColor: Colors.red,
// ),
// );
// }
// },
// );
} finally {
setState(() => _isLoading = false);
}
@@ -19,15 +19,15 @@ Future<JoinRoomResponse?> joinRoom(Ref ref, {required String username, required
data: JoinRoomRequest(username: username, roomCode: code).toJson(),
);
if (response.statusCode == 200 && response.data != null) {
final joinResponse = JoinRoomResponse.fromJson(response.data!);
final joinResponse = JoinRoomResponse.fromJson(response.data!);
if (joinResponse.success) {
if (joinResponse.token != null) {
logger.fine('Setting token: ${joinResponse.token!.substring(10)}');
await ref.read(jwtNotifierProvider.notifier).setJwt(joinResponse.token!);
}
return joinResponse;
} else {
logger.warning('Could not join room');
logger.warning('Could not join room: ${joinResponse.toJson()}');
}
} catch (e) {
logger.severe('Failed to join room', e, StackTrace.current);
+2 -1
View File
@@ -57,7 +57,7 @@ JWTBody? jwtBody(Ref ref) {
final payload = JwtDecoder.tryDecode(jwtString);
if (payload == null) {
logger.fine('Failed to decode JWT, removing key.');
ref.read(jwtNotifierProvider.notifier).eraseJwt();
Future.delayed(const Duration(), () => ref.read(jwtNotifierProvider.notifier).eraseJwt());
return null;
}
try {
@@ -66,6 +66,7 @@ JWTBody? jwtBody(Ref ref) {
} catch (e) {
logger.shout(
'Failed to parse JWT payload to JWTBody, something is wrong.\nPayload: $payload', e, StackTrace.current);
Future.delayed(const Duration(), () => ref.read(jwtNotifierProvider.notifier).eraseJwt());
return null;
}
}
+1
View File
@@ -15,6 +15,7 @@ Dio dio(Ref ref) {
baseUrl: 'http://localhost:8080',
connectTimeout: const Duration(seconds: 5),
receiveTimeout: const Duration(seconds: 3),
validateStatus: (status) => true,
));
final jwt = ref.watch(jwtNotifierProvider).valueOrNull;
+1 -1
View File
@@ -30,7 +30,7 @@ class GameMessageNotifier extends _$GameMessageNotifier {
return null;
}
} catch (e) {
_logger.severe('Error parsing message: `${message.runtimeType}` $message', e, StackTrace.current);
_logger.severe('Error parsing message: Type `${message.runtimeType}` $message', e, StackTrace.current);
return null;
}
});
+14 -11
View File
@@ -1,9 +1,11 @@
import 'dart:convert';
import 'dart:io';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:frontend/providers/auth.dart';
import 'package:logging/logging.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:shared_models/room.dart';
part 'web_socket.g.dart';
@@ -41,18 +43,19 @@ class WebSocketNotifier extends _$WebSocketNotifier {
_logger.warning('Error occurred creating web socket: $e');
}
}
}
// @riverpod
// class WebSocketStreamNotifier extends _$WebSocketStreamNotifier {
// @override
// Stream<dynamic> build() {
// final connection = ref.watch(webSocketNotifierProvider).valueOrNull;
// if (connection == null) return Stream.empty();
// _logger.finest('Created broadcast stream from ws connection');
// return connection.asBroadcastStream();
// }
// }
void sendMessage(GameRoomMessage message) {
final msgStr = jsonEncode(message.toJson());
final socket = state.valueOrNull;
if (socket == null) {
// TODO add queue
_logger.info('Socket unavailable... adding to queue');
throw UnimplementedError('No queue available');
}
_logger.finest('Sending message $message on websocket');
socket.add(msgStr);
}
}
@riverpod
Raw<Stream<dynamic>> webSocketStream(Ref ref) {