import 'dart:async'; import 'dart:convert'; import 'package:chepuhagram/domain/services/api_service.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; import 'package:web_socket_channel/status.dart' as status; import 'package:chepuhagram/core/constants.dart'; class SocketService { WebSocketChannel? _channel; final StreamController> _messageController = StreamController>.broadcast(); // Поток, который будут слушать провайдеры Stream> get messages => _messageController.stream; Future connect(ApiService apiService) async { final token = await apiService.getAccessToken(); if (_channel != null) return; // Уже подключены // В FastAPI эндпоинт обычно ожидает токен в URL или подзаголовке final uri = Uri.parse("ws://${AppConstants.baseUrl}/ws?token=$token"); _channel = WebSocketChannel.connect(uri); _channel!.stream.listen( (data) { final decoded = jsonDecode(data); _messageController.add(decoded); }, onError: (error) => _reconnect(apiService), onDone: () => _reconnect(apiService), ); } Future _reconnect(ApiService apiService) async { _channel = null; Future.delayed(const Duration(seconds: 5), () => connect(apiService)); } void sendMessage(Map data) { _channel?.sink.add(jsonEncode(data)); } void disconnect() { _channel?.sink.close(status.goingAway); _channel = null; } }