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? _sub; @override Future 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) { onBytes(Uint8List.fromList(message)); } }, onError: (_) => onChannelClosed(), onDone: onChannelClosed, cancelOnError: true, ); } @override Future _closePlatform() async { await _sub?.cancel(); _sub = null; await _channel?.sink.close(1000); // Normal closure. _channel = null; } }