code: func (c *Client) run() {
  	err := c.readLoop()
  	if err != nil {
  		c.LocalKite.Log.Debug("readloop err: %s", err)
  	}
  
  	// falls here when connection disconnects
  	c.callOnDisconnectHandlers()
  
  	// let others know that the client has disconnected
  	c.disconnectMu.Lock()
  	if c.disconnect != nil {
  		close(c.disconnect)
  		c.disconnect = nil
  	}
  	c.disconnectMu.Unlock()
  
  	if c.reconnect() {
  		// we override it so it doesn't get selected next time. Because we are
  		// redialing, so after redial if a new method is called, the disconnect
  		// channel is being read and the local "disconnect" message will be the
  		// final response. This shouldn't be happen for redials.
  		c.disconnectMu.Lock()
  		c.disconnect = make(chan struct{}, 1)
  		c.disconnectMu.Unlock()
  		go c.dialForever(nil)
  	}
  }
docs: // run consumes incoming dnode messages. Reconnects if necessary.