Files
TelemetryMonitor/lib/transport/websocket_transport_web.dart
2026-04-21 19:38:20 -03:00

47 lines
1.2 KiB
Dart

import 'dart:async';
import 'dart:typed_data';
import 'package:web_socket_channel/html.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
import 'websocket_transport_base.dart';
/// Web WebSocket transport using HtmlWebSocketChannel.
class WebSocketTransport extends WebSocketTransportBase {
WebSocketTransport({
super.initialReconnectDelay,
super.maxReconnectDelay,
super.backoffFactor,
});
WebSocketChannel? _channel;
StreamSubscription<dynamic>? _sub;
@override
Future<void> openPlatform(String url) async {
_channel = HtmlWebSocketChannel.connect(Uri.parse(url));
await _channel!.ready;
_sub = _channel!.stream.listen(
(dynamic message) {
if (message is Uint8List) {
onBytes(message);
} else if (message is ByteBuffer) {
onBytes(message.asUint8List());
} else if (message is List<int>) {
onBytes(Uint8List.fromList(message));
}
},
onError: (_) => onChannelClosed(),
onDone: onChannelClosed,
cancelOnError: true,
);
}
@override
Future<void> closePlatform() async {
await _sub?.cancel();
_sub = null;
await _channel?.sink.close(1000); // Normal closure.
_channel = null;
}
}