canDial method
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;
}