createClient function

Creates a disposable GraphQL over WebSocket client.

@category Client

Implementation

TransportWsClient createClient(TransportWsClientOptions options) {
  // websocket status emitter, subscriptions are handled differently
  final emitter = (() {
    final Map<String, _EventMessageListener> _listenersMessage = {};
    void Function() onMessage(String id, _EventMessageListener listener) {
      _listenersMessage[id] = listener;
      return () {
        _listenersMessage.remove(id);
      };
    }

    void emitMessage(TransportWsMessage message) {
      _listenersMessage[message.id]?.call(message);
    }

    final Map<TransportWsEventType, List<TransportWsEventHandler>> listeners =
        Map.fromIterables(
      TransportWsEventType.values,
      TransportWsEventType.values.map((e) => []),
    );
    listeners[TransportWsEventType.message]!
        .add(TransportWsEventHandler<void>(message: emitMessage));

    final on = options.eventHandlers;
    if (on != null) {
      for (final handler in on) {
        for (final type in handler.eventTypesHandled()) {
          listeners[type]!.add(handler);
        }
      }
    }

    return _Emitter(
      onMessage: onMessage,
      listeners: listeners,
      log: options.log,
    );
  })();

  final state = _ConnectionState(
    emitter: emitter,
    options: options,
  );
  return _Client(state: state);
}