42 lines
1.1 KiB
Dart
42 lines
1.1 KiB
Dart
import 'dart:async';
|
|
import 'package:web_socket_channel/web_socket_channel.dart';
|
|
|
|
abstract interface class RelayConnection {
|
|
Future<void> connect();
|
|
Future<void> send(String message);
|
|
Stream<String> get messages;
|
|
Future<void> close();
|
|
}
|
|
|
|
final class WebSocketRelayConnection implements RelayConnection {
|
|
final String _url;
|
|
WebSocketChannel? _channel;
|
|
StreamController<String>? _controller;
|
|
|
|
WebSocketRelayConnection(String url) : _url = url;
|
|
|
|
@override
|
|
Future<void> connect() async {
|
|
_channel = WebSocketChannel.connect(Uri.parse(_url));
|
|
await _channel!.ready;
|
|
_controller = StreamController<String>();
|
|
_channel!.stream.cast<String>().listen(
|
|
_controller!.add,
|
|
onError: _controller!.addError,
|
|
onDone: _controller!.close,
|
|
);
|
|
}
|
|
|
|
@override
|
|
Future<void> send(String message) async => _channel!.sink.add(message);
|
|
|
|
@override
|
|
Stream<String> get messages => _controller!.stream;
|
|
|
|
@override
|
|
Future<void> close() async {
|
|
await _channel?.sink.close();
|
|
_channel = null;
|
|
_controller = null;
|
|
}
|
|
}
|