code: func (m *Memberlist) readUserMsg(bufConn io.Reader, dec *codec.Decoder) error {
  	// Read the user message header
  	var header userMsgHeader
  	if err := dec.Decode(&header); err != nil {
  		return err
  	}
  
  	// Read the user message into a buffer
  	var userBuf []byte
  	if header.UserMsgLen > 0 {
  		userBuf = make([]byte, header.UserMsgLen)
  		bytes, err := io.ReadAtLeast(bufConn, userBuf, header.UserMsgLen)
  		if err == nil && bytes != header.UserMsgLen {
  			err = fmt.Errorf(
  				"Failed to read full user message (%d / %d)",
  				bytes, header.UserMsgLen)
  		}
  		if err != nil {
  			return err
  		}
  
  		d := m.config.Delegate
  		if d != nil {
  			d.NotifyMsg(userBuf)
  		}
  	}
  
  	return nil
  }
docs: // readUserMsg is used to decode a userMsg from a stream.