code: func (c *Client) processUnsubscribe(pkt *packet.Unsubscribe) error {
  	// acquire subscribe token
  	select {
  	case <-c.subscribeTokens:
  		// continue
  	case <-time.After(c.TokenTimeout):
  		return c.die(ClientError, ErrTokenTimeout)
  	case <-c.tomb.Dying():
  		return tomb.ErrDying
  	}
  
  	// prepare unsuback packet
  	unsuback := packet.NewUnsuback()
  	unsuback.ID = pkt.ID
  
  	// unsubscribe topics
  	err := c.backend.Unsubscribe(c, pkt.Topics, func() {
  		select {
  		case c.ackQueue <- unsuback:
  		case <-c.tomb.Dying():
  		}
  	})
  	if err != nil {
  		return c.die(BackendError, err)
  	}
  
  	return nil
  }
docs: // handle an incoming unsubscribe packet