code: func (p *Peer) Run(handler func(ctx context.Context, msg interface{}) error) error {
  	for {
  		if err := p.handleIncoming(handler); err != nil {
  			if err != io.EOF {
  				metrics.GetOrRegisterCounter("peer.handleincoming.error", nil).Inc(1)
  				log.Error("peer.handleIncoming", "err", err)
  			}
  
  			return err
  		}
  	}
  }
docs: // Run starts the forever loop that handles incoming messages
  // called within the p2p.Protocol#Run function
  // the handler argument is a function which is called for each message received
  // from the remote peer, a returned error causes the loop to exit
  // resulting in disconnection