47 lines
1.1 KiB
Dart
47 lines
1.1 KiB
Dart
import 'dart:async';
|
|
import 'package:web_socket_channel/web_socket_channel.dart';
|
|
|
|
class WebSocketService {
|
|
static final WebSocketService _instance = WebSocketService._();
|
|
|
|
factory WebSocketService() => _instance;
|
|
|
|
WebSocketService._();
|
|
|
|
WebSocketChannel? _channel;
|
|
|
|
final _messageController = StreamController<String>.broadcast();
|
|
final _errorController = StreamController<Object>.broadcast();
|
|
|
|
Stream<String> get messages => _messageController.stream;
|
|
|
|
Stream<Object> get errors => _errorController.stream;
|
|
|
|
bool get isConnected => _channel != null;
|
|
|
|
void connect(String url) {
|
|
if (_channel != null) return;
|
|
|
|
_channel = WebSocketChannel.connect(Uri.parse(url));
|
|
|
|
_channel!.stream.listen(
|
|
(message) => _messageController.add(message.toString()),
|
|
onError: (error) => _errorController.add(error),
|
|
onDone: () => _errorController.add('WebSocket closed'),
|
|
);
|
|
}
|
|
|
|
void send(String message) {
|
|
if (_channel == null) {
|
|
_errorController.add('WebSocket not connected');
|
|
return;
|
|
}
|
|
_channel!.sink.add(message);
|
|
}
|
|
|
|
void disconnect() {
|
|
_channel?.sink.close();
|
|
_channel = null;
|
|
}
|
|
}
|