arriWebsocketRequest<TServerMessage, TClientMessage> function

Future<ArriWebsocketController<TServerMessage, TClientMessage>> arriWebsocketRequest<TServerMessage, TClientMessage>(
  1. String url, {
  2. FutureOr<Map<String, String>> headers()?,
  3. required TServerMessage parser(
    1. String msg
    ),
  4. required String serializer(
    1. TClientMessage msg
    ),
  5. String? clientVersion,
})

Implementation

Future<ArriWebsocketController<TServerMessage, TClientMessage>>
    arriWebsocketRequest<TServerMessage, TClientMessage>(
  String url, {
  FutureOr<Map<String, String>> Function()? headers,
  required TServerMessage Function(String msg) parser,
  required String Function(TClientMessage msg) serializer,
  String? clientVersion,
}) async {
  var finalUrl =
      url.replaceAll("http://", "ws://").replaceAll("https://", "wss://");

  if (headers != null || clientVersion?.isNotEmpty == true) {
    final queryParts = <String>[];
    for (final entry
        in (await headers?.call())?.entries ?? <MapEntry<String, String>>[]) {
      queryParts.add("${entry.key}=${entry.value}");
    }
    if (clientVersion != null) {
      queryParts.add("client-version=$clientVersion");
    }
    finalUrl = "$finalUrl?${queryParts.join("&")}";
  }
  final uri = Uri.parse(finalUrl);
  final channel = WebSocketChannel.connect(uri);
  await channel.ready;
  return ArriWebsocketController<TServerMessage, TClientMessage>(
    channel: channel,
    parser: parser,
    serializer: serializer,
  );
}