code: func (c *Client) acker() error {
  	for {
  		select {
  		case pkt := <-c.ackQueue:
  			// send packet
  			err := c.send(pkt, true)
  			if err != nil {
  				return c.die(TransportError, err)
  			}
  
  			// remove publish from session if pubcomp
  			if pubcomp, ok := pkt.(*packet.Pubcomp); ok {
  				err = c.session.DeletePacket(session.Incoming, pubcomp.ID)
  				if err != nil {
  					return c.die(SessionError, err)
  				}
  			}
  
  			// put back tokens based on type
  			switch pkt.(type) {
  			case *packet.Suback, *packet.Unsuback:
  				select {
  				case c.subscribeTokens <- struct{}{}:
  				default:
  					// continue if full for some reason
  				}
  			case *packet.Puback, *packet.Pubcomp:
  				select {
  				case c.publishTokens <- struct{}{}:
  				default:
  					// continue if full for some reason
  				}
  			}
  		case <-c.tomb.Dying():
  			return tomb.ErrDying
  		}
  	}
  }
docs: // packet acker