code: func (c *Client) pinger() error {
  	for {
  		// get current window
  		window := c.tracker.Window()
  
  		// check if ping is due
  		if window < 0 {
  			// check if a pong has already been sent
  			if c.tracker.Pending() {
  				return c.die(ErrClientMissingPong, true, false)
  			}
  
  			// send pingreq packet
  			err := c.send(packet.NewPingreq(), true)
  			if err != nil {
  				return c.die(err, false, false)
  			}
  
  			// save ping attempt
  			c.tracker.Ping()
  		} else {
  			// log keep alive delay
  			if c.Logger != nil {
  				c.Logger(fmt.Sprintf("Delay KeepAlive by %s", window.String()))
  			}
  		}
  
  		select {
  		case <-c.tomb.Dying():
  			return tomb.ErrDying
  		case <-time.After(window):
  			continue
  		}
  	}
  }
docs: /* pinger goroutine */
  // manages the sending of ping packets to keep the connection alive