88 lines
2.3 KiB
Dart
88 lines
2.3 KiB
Dart
import 'dart:async';
|
|
import 'package:quiz_app/core/endpoint/api_endpoint.dart';
|
|
import 'package:socket_io_client/socket_io_client.dart' as io;
|
|
|
|
class SocketService {
|
|
late io.Socket socket;
|
|
|
|
final _roomMessageController = StreamController<Map<String, dynamic>>.broadcast();
|
|
final _chatMessageController = StreamController<Map<String, dynamic>>.broadcast();
|
|
final _errorController = StreamController<String>.broadcast();
|
|
|
|
Stream<Map<String, dynamic>> get roomMessages => _roomMessageController.stream;
|
|
Stream<Map<String, dynamic>> get chatMessages => _chatMessageController.stream;
|
|
Stream<String> get errors => _errorController.stream;
|
|
|
|
void initSocketConnection() {
|
|
socket = io.io(
|
|
APIEndpoint.baseUrl,
|
|
io.OptionBuilder()
|
|
.setTransports(['websocket']) // WebSocket mode
|
|
.disableAutoConnect()
|
|
.build(),
|
|
);
|
|
|
|
socket.connect();
|
|
|
|
socket.onConnect((_) {
|
|
print('Connected: ${socket.id}');
|
|
});
|
|
|
|
socket.onDisconnect((_) {
|
|
print('Disconnected');
|
|
});
|
|
|
|
socket.on('connection_response', (data) {
|
|
print('Connection response: $data');
|
|
});
|
|
|
|
socket.on('room_message', (data) {
|
|
print('Room Message: $data');
|
|
_roomMessageController.add(Map<String, dynamic>.from(data));
|
|
});
|
|
|
|
socket.on('receive_message', (data) {
|
|
print('Message from ${data['from']}: ${data['message']}');
|
|
_chatMessageController.add(Map<String, dynamic>.from(data));
|
|
});
|
|
|
|
socket.on('error', (data) {
|
|
print('Socket error: $data');
|
|
_errorController.add(data.toString());
|
|
});
|
|
}
|
|
|
|
void joinRoom({required String sessionCode, required String userId}) {
|
|
socket.emit('join_room', {
|
|
'session_code': sessionCode,
|
|
'user_id': userId,
|
|
});
|
|
}
|
|
|
|
void leaveRoom({required String sessionId, String username = "anonymous"}) {
|
|
socket.emit('leave_room', {
|
|
'session_id': sessionId,
|
|
'username': username,
|
|
});
|
|
}
|
|
|
|
void sendMessage({
|
|
required String sessionId,
|
|
required String message,
|
|
String username = "anonymous",
|
|
}) {
|
|
socket.emit('send_message', {
|
|
'session_id': sessionId,
|
|
'message': message,
|
|
'username': username,
|
|
});
|
|
}
|
|
|
|
void dispose() {
|
|
socket.dispose();
|
|
_roomMessageController.close();
|
|
_chatMessageController.close();
|
|
_errorController.close();
|
|
}
|
|
}
|