40 lines
960 B
Dart
40 lines
960 B
Dart
import 'dart:async';
|
|
import 'dart:convert';
|
|
|
|
import 'package:web_socket_channel/web_socket_channel.dart';
|
|
|
|
class SignallingService {
|
|
WebSocketChannel? _channel;
|
|
final _controller = StreamController<Map<String, dynamic>>.broadcast();
|
|
|
|
Stream<Map<String, dynamic>> get messages => _controller.stream;
|
|
|
|
void connect(String url) {
|
|
_channel = WebSocketChannel.connect(Uri.parse(url));
|
|
|
|
_channel!.stream.listen(
|
|
(data) {
|
|
try {
|
|
final msg = jsonDecode(data as String) as Map<String, dynamic>;
|
|
_controller.add(msg);
|
|
} catch (_) {}
|
|
},
|
|
onError: (err) {
|
|
_controller.addError(err);
|
|
},
|
|
onDone: () {
|
|
_controller.addError(Exception('WebSocket connection closed'));
|
|
},
|
|
);
|
|
}
|
|
|
|
void send(Map<String, dynamic> msg) {
|
|
_channel?.sink.add(jsonEncode(msg));
|
|
}
|
|
|
|
void dispose() {
|
|
_channel?.sink.close();
|
|
|
|
if (!_controller.isClosed) _controller.close();
|
|
}
|
|
}
|