getConnectedWebSocket method
Returns a new WebSocketChannel, ready to be listened on.
This should be overriden by child classes, NOT connect.
Implementation
@override
Future<WebSocketChannel> getConnectedWebSocket() {
  var url = websocketUri;
  if (authToken?.isNotEmpty == true) {
    url = url.replace(
      queryParameters: Map<String, String?>.from(url.queryParameters)
        ..['token'] = authToken,
    );
  }
  var socket = WebSocket(url.toString());
  var completer = Completer<WebSocketChannel>();
  socket
    ..onOpen.listen((_) {
      if (!completer.isCompleted) {
        return completer.complete(HtmlWebSocketChannel(socket));
      }
    })
    ..onError.listen((Event e) {
      if (!completer.isCompleted) {
        return completer.completeError(
          e.isA<ErrorEvent>() ? (e as ErrorEvent).message : e,
        );
      }
    });
  return completer.future;
}