canDial method

  1. @override
bool canDial(
  1. MultiAddr addr
)

Implementation

@override
bool canDial(MultiAddr addr) {
  final addrComponents = addr.components;
  if (addrComponents.length < 2) return false;

  int p2pRelayIdx = -1;
  for (int i = 0; i < addrComponents.length; i++) {
    if (addrComponents[i].$1.code == Protocols.p2p.code) {
      p2pRelayIdx = i;
      break;
    }
  }
  if (p2pRelayIdx == -1) return false; // Must have a /p2p/relayId

  int circuitIdx = -1;
  for (int i = p2pRelayIdx + 1; i < addrComponents.length; i++) {
    if (addrComponents[i].$1.code == Protocols.circuit.code) {
      circuitIdx = i;
      break;
    }
  }
  if (circuitIdx == -1) return false; // Must have /p2p-circuit after relayId

  // Case 1: /.../p2p/relayId/.../p2p-circuit (connect to relay itself)
  if (circuitIdx == addrComponents.length - 1) return true;

  // Case 2: /.../p2p/relayId/.../p2p-circuit/p2p/destId
  if (circuitIdx < addrComponents.length - 1 && addrComponents[circuitIdx + 1].$1.code == Protocols.p2p.code) return true;

  return false;
}