code: func (c *Client) processPubrel(id packet.ID) error {
  	// get packet from store
  	pkt, err := c.Session.LookupPacket(session.Incoming, id)
  	if err != nil {
  		return c.die(err, true, false)
  	}
  
  	// get packet from store
  	publish, ok := pkt.(*packet.Publish)
  	if !ok {
  		return nil // ignore a wrongly sent Pubrel packet
  	}
  
  	// call callback
  	if c.Callback != nil {
  		err = c.Callback(&publish.Message, nil)
  		if err != nil {
  			return c.die(err, true, true)
  		}
  	}
  
  	// prepare pubcomp packet
  	pubcomp := packet.NewPubcomp()
  	pubcomp.ID = publish.ID
  
  	// acknowledge Publish packet
  	err = c.send(pubcomp, true)
  	if err != nil {
  		return c.die(err, false, false)
  	}
  
  	// remove packet from store
  	err = c.Session.DeletePacket(session.Incoming, id)
  	if err != nil {
  		return c.die(err, true, false)
  	}
  
  	return nil
  }
docs: // handle an incoming Pubrel packet