multiaddrToBytes function

Uint8List multiaddrToBytes(
  1. FullAddress address
)

Helper to encode FullAddress to binary multiaddr

Implementation

Uint8List multiaddrToBytes(FullAddress address) {
  final buffer = <int>[];
  if (address.address.contains('.')) {
    // IPv4
    buffer.add(4); // ip4
    buffer.addAll(address.address.split('.').map(int.parse));
  } else if (address.address.contains(':') || address.address == '::1') {
    // IPv6
    buffer.add(41); // ip6

    // Handle special cases like ::1
    String expanded = address.address;
    if (expanded == '::1') {
      expanded = '0000:0000:0000:0000:0000:0000:0000:0001';
    } else if (expanded.contains('::')) {
      // Simple expansion for ::
      final parts = expanded.split('::');
      final left = parts[0].isEmpty ? <String>[] : parts[0].split(':');
      final right = parts[1].isEmpty ? <String>[] : parts[1].split(':');
      final missing = 8 - (left.length + right.length);
      final mid = List.filled(missing, '0000');
      expanded = (left + mid + right).join(':');
    }

    final groups = expanded.split(':');
    for (final group in groups) {
      final val = int.parse(group.isEmpty ? '0' : group, radix: 16);
      buffer.add((val >> 8) & 0xFF);
      buffer.add(val & 0xFF);
    }
  } else {
    return Uint8List(0); // Unsupported
  }

  // Assuming TCP (6) by default for FullAddress as we don't have protocol field
  buffer.add(6); // tcp
  buffer.add((address.port >> 8) & 0xFF);
  buffer.add(address.port & 0xFF);

  return Uint8List.fromList(buffer);
}