connect method

  1. @override
Future<void> connect()
override

Implementation

@override
Future<void> connect() async {
  if (_started) throw StateError('Websocket connector has already been used');
  _started = true;
  WebSocketChannel? channel;
  try {
    channel = WebSocketChannel.connect(Uri.parse(address));
    _wsChannel = channel;
    _wsSubscription = channel.stream.listen(
      (element) {
        try {
          final msgs = jsonDecode(element);
          for (final msg in msgs) {
            _serverMessageStream.add(ButtplugServerMessage.fromJson(msg));
          }
        } catch (_) {
          unawaited(disconnect());
        }
      },
      onError: (Object error, StackTrace stackTrace) {
        unawaited(disconnect());
      },
      onDone: () {
        unawaited(disconnect());
      },
    );
    await channel.ready;
    if (!identical(_wsChannel, channel)) {
      throw ButtplugClientException('Connection closed during connect');
    }
  } catch (_) {
    await disconnect();
    rethrow;
  }
}