connect method

  1. @override
SocketConnection connect(
  1. String url,
  2. SocketTransportHandlers handlers
)
override

Implementation

@override
SocketConnection connect(String url, SocketTransportHandlers handlers) {
  final channel = _channelFactory(
    requireSecureEndpoint(url, const {'wss'}),
    headers: _headers,
  );

  unawaited(channel.ready.then(
    (_) => handlers.onOpen(),
    onError: (Object error) => handlers.onError(error),
  ));

  channel.stream.listen(
    (Object? data) {
      final String message;
      if (data is String) {
        if (data.length > _maxIncomingFrameBytes ||
            utf8.encode(data).length > _maxIncomingFrameBytes) {
          handlers.onError(
              StateError('incoming realtime frame exceeded the size limit'));
          unawaited(channel.sink.close(4009, 'frame too large'));
          return;
        }
        message = data;
      } else if (data is List<int>) {
        if (data.length > _maxIncomingFrameBytes) {
          handlers.onError(
              StateError('incoming realtime frame exceeded the size limit'));
          unawaited(channel.sink.close(4009, 'frame too large'));
          return;
        }
        message = utf8.decode(data);
      } else {
        handlers.onError(
            StateError('incoming realtime frame has an unsupported type'));
        return;
      }
      handlers.onMessage(message);
    },
    onError: (Object error) => handlers.onError(error),
    onDone: () {
      final closeCode = channel.closeCode ?? 1006;
      final closeReason = channel.closeReason ?? '';
      handlers.onClose(TransportCloseEvent(
        code: closeCode,
        reason: closeReason,
        wasClean: closeCode == 1000,
      ));
    },
    cancelOnError: false,
  );

  return _WebSocketConnectionAdapter(channel);
}