import 'dart:async'; import 'dart:convert'; 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; void connect(String token) { 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(token), onDone: () => _reconnect(token), ); } void _reconnect(String token) { _channel = null; Future.delayed(const Duration(seconds: 5), () => connect(token)); } void sendMessage(Map data) { _channel?.sink.add(jsonEncode(data)); } void disconnect() { _channel?.sink.close(status.goingAway); _channel = null; } }