findPeerReceiver function

void findPeerReceiver(
  1. StreamController<AddrInfo> peerController,
  2. Stream<AddrInfo> evtStream,
  3. List<AddrInfo> rcvPeers
)

Receives peers from a dispatcher and forwards them to a result channel

Implementation

void findPeerReceiver(
    StreamController<AddrInfo> peerController,
    Stream<AddrInfo> evtStream,
    List<AddrInfo> rcvPeers) async {
  try {
    await for (final ai in evtStream) {
      rcvPeers.add(ai);

      var sentAll = true;
      var i = 0;
      while (i < rcvPeers.length) {
        if (peerController.isClosed) {
          return;
        }

        try {
          peerController.add(rcvPeers[i]);
          i++;
        } catch (e) {
          rcvPeers = rcvPeers.sublist(i);
          sentAll = false;
          break;
        }
      }

      if (sentAll) {
        rcvPeers = [];
      }
    }
  } finally {
    for (final p in rcvPeers) {
      if (peerController.isClosed) {
        return;
      }
      peerController.add(p);
    }
    await peerController.close();
  }
}