import 'package:web_socket_channel/web_socket_channel.dart'; import 'package:web_socket_channel/status.dart' as status; class CustomWSChannel{ late WebSocketChannel channel; bool webSocketConnected=false; int reconnectAttempts=0; String serverUrl; late Uri serverUri; int delay; void Function(dynamic) onMessage; void Function(String,dynamic) onErrorShowMessage; CustomWSChannel(this.serverUrl,{this.delay=5,required this.onMessage,required this.onErrorShowMessage}){ serverUri=Uri.parse(serverUrl); connect(); } get sink => channel.sink; get ready =>channel.ready; Future isConnected() async{ try{ await channel.ready; return true; } catch(e){ debugFn("we are not connected"); return false; } } void onDone() async{ debugFn("Reconnecting in $delay seconds, attempt $reconnectAttempts "); webSocketConnected=false; // channel = null; channel.sink.close(status.goingAway); // close old connection await Future.delayed(Duration(seconds: delay)); connect(); } void onError(error){ debugFn("Error while connecting.",e:error); reconnectAttempts += 1; } void connect() async{ try{ channel=WebSocketChannel.connect( serverUri ); channel.stream.listen(onMessage, onDone:onDone, onError:onError); // channel.stream.listen(onMessage, onError:onError); await channel.ready; debugFn("connected"); } catch(e){ debugFn("can't connect to the server",e:e); } } void debugFn(String s,{e=""}){ // print("space"); // print("Custom Message:"+s); // print("Custom Error:"+e.toString()); onErrorShowMessage(s,e); } }