// Handles the receiving + wrapping of messages, per conn. // Consider using reflect.Select with one goroutine instead of n. func (s *Swarm) fanInSingle(c conn.Conn) { // cleanup all data associated with this child Connection. defer func() { // remove it from the map. s.connsLock.Lock() delete(s.conns, c.RemotePeer().Key()) s.connsLock.Unlock() s.Children().Done() c.Children().Done() // child of Conn as well. }() i := 0 for { select { case <-s.Closing(): // Swarm closing return case <-c.Closing(): // Conn closing return case data, ok := <-c.In(): if !ok { log.Infof("%s in channel closed", c) return // channel closed. } i++ log.Debugf("%s received message from %s (%d)", s.local, c.RemotePeer(), i) s.Incoming <- msg.New(c.RemotePeer(), data) } } }