89 lines
2.4 KiB
Plaintext
89 lines
2.4 KiB
Plaintext
// lib/services/api/socket_service.dart
|
||
import 'dart:convert';
|
||
import 'package:flutter_stocky/utils/constants.dart';
|
||
import 'package:get/get.dart';
|
||
import 'package:web_socket_channel/web_socket_channel.dart';
|
||
|
||
class SocketService extends GetxService {
|
||
final String _baseUrl = Constants.BASE_SOCKET_URL;
|
||
WebSocketChannel? _channel;
|
||
bool _connected = false;
|
||
|
||
// Поток для получения сообщений
|
||
StreamController<Map<String, dynamic>> _messageController =
|
||
StreamController.broadcast();
|
||
|
||
Stream<Map<String, dynamic>> get messages => _messageController.stream;
|
||
|
||
@override
|
||
void onInit() {
|
||
connect();
|
||
super.onInit();
|
||
}
|
||
|
||
@override
|
||
void onClose() {
|
||
_disconnect();
|
||
_messageController.close();
|
||
super.onClose();
|
||
}
|
||
|
||
void connect() async {
|
||
if (_connected) return;
|
||
|
||
try {
|
||
_channel = WebSocketChannel.connect(Uri.parse('$_baseUrl/ws'));
|
||
_channel!.stream.listen(
|
||
(message) {
|
||
final data = json.decode(message);
|
||
_messageController.add(data);
|
||
},
|
||
onDone: () {
|
||
_connected = false;
|
||
debugPrint('WebSocket отключен');
|
||
},
|
||
onError: (error) {
|
||
debugPrint('WebSocket ошибка: $error');
|
||
_connected = false;
|
||
// Автоподключение через 3 сек
|
||
Future.delayed(const Duration(seconds: 3), connect);
|
||
},
|
||
);
|
||
|
||
_connected = true;
|
||
debugPrint('WebSocket подключен');
|
||
} catch (e) {
|
||
debugPrint('Ошибка подключения к WebSocket: $e');
|
||
}
|
||
}
|
||
|
||
void _disconnect() {
|
||
_channel?.close();
|
||
_channel = null;
|
||
_connected = false;
|
||
}
|
||
|
||
void sendMessage(Map<String, dynamic> message) {
|
||
if (_connected && _channel != null) {
|
||
_channel?.sink.add(json.encode(message));
|
||
}
|
||
}
|
||
|
||
// Пример: отправить обновление задачи
|
||
void notifyTaskUpdate(String taskId) {
|
||
sendMessage({'type': 'task_updated', 'task_id': taskId});
|
||
}
|
||
|
||
// Пример: подписаться на изменения задач
|
||
void subscribeToTasks() {
|
||
sendMessage({'type': 'subscribe', 'entity': 'tasks'});
|
||
}
|
||
|
||
// Пример: уведомить о создании задачи
|
||
void notifyTaskCreated(Task task) {
|
||
sendMessage({'type': 'task_created', 'data': task.toJson()});
|
||
}
|
||
|
||
bool get isConnected => _connected;
|
||
}
|