──────▶ Channel Legend: ━━━━━━▶ Service call ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ PeerServer │ │ PeerServer │ │ PeerServer │ │ PeerServer │ │ ┌───────┐ │ │ ┌───────┐ │ │ ┌───────┐ │ │ ┌───────┐ │ │ │┌─────┐│ │ │ │┌─────┐│ │ │ │┌─────┐│ │ │ │┌─────┐│ │ │ ││ Tcp ││ │ │ ││ Tcp ││ │ │ ││ Tcp ││ │ │ ││ Tcp ││ │ │ │└─────┘│───┼┐ │ │└─────┘│───┼┐ │ │└─────┘│───┼┐ │ │└─────┘│───┼┐ │ │Framed │ ││ │ │Framed │ ││ │ │Framed │ ││ │ │Framed │ ││ │ │Stream │ ││ │ │Stream │ ││ │ │Stream │ ││ │ │Stream │ ││ │ └───────┘ ││ │ └───────┘ ││ │ └───────┘ ││ │ └───────┘ ││ ┏▶│ ┃ ││ ┏▶│ ┃ ││ ┏▶│ ┃ ││ ┏▶│ ┃ ││ ┃ │ ┃ ││ ┃ │ ┃ ││ ┃ │ ┃ ││ ┃ │ ┃ ││ ┃ │ ▼ ││ ┃ │ ▼ ││ ┃ │ ▼ ││ ┃ │ ▼ ││ ┃ │ ┌───────┐ ││ ┃ │ ┌───────┐ ││ ┃ │ ┌───────┐ ││ ┃ │ ┌───────┐ ││ ┃ │ │ Tower │ ││ ┃ │ │ Tower │ ││ ┃ │ │ Tower │ ││ ┃ │ │ Tower │ ││ ┃ │ │Buffer │ ││ ┃ │ │Buffer │ ││ ┃ │ │Buffer │ ││ ┃ │ │Buffer │ ││ ┃ │ └───────┘ ││ ┃ │ └───────┘ ││ ┃ │ └───────┘ ││ ┃ │ └───────┘ ││ ┃ │ ┃ ││ ┃ │ ┃ ││ ┃ │ ┃ ││ ┃ │ ┃ ││ ┃ └─────╋───────┘│ ┃ └─────╋───────┘│ ┃ └─────╋───────┘│ ┃ └─────╋───────┘│ ┃ ┃ └─╋───────╋────────┴─╋───────╋────────┴─╋───────╋────────┴─┐ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ │ ┃ ┗━━━━━━━━━━╋━━━━━━━┻━━━━━━━━━━╋━━━━━━━┻━━━━━━━━━━╋━━━━━━━┻━━━━━━━━━━╋━┓ ┃ ┃ ┃ ┃ │ ┃ ┗━━━━━━━━┓ ┗━━━━━━━━┓ ┗━━━━━━━━┓ ┗━━━━━━━━┓ │ ┃ ┌───────╋──────────────────╋──────────────────╋──────────────────╋───────┐ │ ┃ │ ┃ ┃ ┃ ┃ │ │ ┃ │┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐│ │ ┃ ││ PeerClient │ │ PeerClient │ │ PeerClient │ │ PeerClient ││ │ ┃ │└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘│ │ ┃ │ │ │ ┃ │ PeerSet │ │ ┃ │ req: Request, rsp: Response │ │ ┃ │ routes all outgoing requests, adds peers to handle load │ │ ┃ └─────────────────────────────────────────────────────────┬──────────────┘ │ ┃ ▲ │ │ ┃ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ │ │ ┃ ┃ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━╋━┛ ┃ ▼ │ │ ┃ ┌────────────────────────────────┐ ┌────────────────────────────┐ │ ┃ │ Router │ │ PeerDiscover │ │ ┃ │ req: Request, rsp: Response │ │Discover│ │ ┃ │ routes all incoming requests, │ │ │ │ ┃ │ removes peers to shed load │ │ connects to a remote peer, │ │ ┃ │ │ │ constructs client/server │ │ ┃ │ │ └────────────────────────────┘ │ ┃ │ │ ┃ ▲ │ ┃ └────────────────────────────────┘ ┃ └─────┐ │ ┃ ┃ ┃ │ │ ┃ ┃ ┃ ┌───────────────┐ │ ┃ ┃ ┃ │ PeerListener │ │ ┃ ┃ ┃ │ req: ? │ │ ┃ ┃ ┃ │rsp: PeerClient│ │ ┃ ┃ ┃ └───────────────┘ │ ┃ ┃ ┃ ┌───────────────┐ │ ┃ ┃ ┃ │ PeerConnector │ │ ┃ ┃ ┗━━━━▶│req: SocketAddr│ │ ┃ ┃ │rsp: PeerClient│ │ ┃ ┃ └───────────────┘ │ ┃ ┃ ┃ │ ┃ ┃ ▼ │ ┃ ┃ ┌───────────────┐ │ ┃ ┃ ┌───────────────┐ │ NextAddress │ │ ┗━━━━━━━━━━━━━━━━━━━━━╋━━━━━│ AddrCrawler │─────────▶│ req: () │ │ ┃ └───────────────┘ │rsp: SocketAddr│ │ ┃ └───────────────┘ │ ┃ ▲ │ ┃ │ │ ┃ ┌───────────────┐ ┌───────────────┐ │ ┃ │ AddrService │ │ AddressBook │ │ ┗━━━━▶│ req: GetPeers │◀─────────│ our per-peer │◀─┘ │ rsp: Peers │ │last-seen info │ └───────────────┘ └───────────────┘