swarm/lib/src/relay_connection.dart

43 lines
1.1 KiB
Dart
Raw Normal View History

2026-06-07 16:45:43 +03:00
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;
}
}