connect method

Future<bool> connect({
  1. Duration timeout = const Duration(seconds: 5),
})

Implementation

Future<bool> connect({Duration timeout = const Duration(seconds: 5)}) async {
  try {
    final completer = Completer<bool>();
    final address = await _resolveHost();
    _socket = await Socket.connect(address, _port, timeout: timeout);
    _eventController.add(TcpConnected());
    _socket!.listen(
      (List<int> event) {
        final raw = utf8.decode(event);
        final packets = raw.split(splitRegExp).where((m) => m.isNotEmpty).map((m) => m.trim()).toList();

        for (final packet in packets) {
          try {
            final parsed = Packet.fromPacket(packet);
            if (parsed is AuPacket) {
              _log.info('AuPacket deprecated, skipping');
              continue;
            }
            if (parsed is AsPacket) {
              LayrzProtocolSocket.isActive = true;
              if (!completer.isCompleted) completer.complete(true);
            }
            _eventController.add(MessageReceived(message: parsed));
          } catch (e) {
            _log.severe('Error parsing packet: "$packet" - $e');
            disconnect();
          }
        }
      },
      onError: (err) async {
        _log.fine('onError: $err');
        await disconnect();
      },
      onDone: () async {
        _log.fine('onDone');
        await disconnect();
      },
    );

    _socket!.writeln(PaPacket(ident: ident, password: password).toPacket());

    return await completer.future.timeout(
      timeout,
      onTimeout: () {
        if (!completer.isCompleted) completer.complete(false);
        return false;
      },
    );
  } catch (e) {
    _log.severe('Error connecting to the server: $e');
    _eventController.add(TcpDisconnected());
    LayrzProtocolSocket.isActive = false;
    return false;
  }
}