code: func (c *BaseConn) Receive() (packet.Generic, error) {
  	c.rMutex.Lock()
  	defer c.rMutex.Unlock()
  
  	// read next packet
  	pkt, err := c.stream.Read()
  	if err != nil {
  		// ensure connection gets closed
  		_ = c.carrier.Close()
  
  		return nil, err
  	}
  
  	// reset timeout
  	err = c.resetTimeout()
  	if err != nil {
  		return nil, err
  	}
  
  	return pkt, nil
  }
docs: // Receive will read from the underlying connection and return a fully read
  // packet. It will return an Error if there was an error while decoding or
  // reading from the underlying connection.
  //
  // Note: Only one goroutine can Receive at the same time.