code: func (k *Kite) TellKontrolWithTimeout(method string, timeout time.Duration, args ...interface{}) (result *dnode.Partial, err error) {
  	if err := k.SetupKontrolClient(); err != nil {
  		return nil, err
  	}
  
  	// Wait for readyConnect, or timeout
  	select {
  	case <-time.After(k.Config.Timeout):
  		return nil, &Error{
  			Type: "timeout",
  			Message: fmt.Sprintf(
  				"Timed out registering to kontrol for %s method after %s",
  				method, k.Config.Timeout,
  			),
  		}
  	case <-k.kontrol.readyConnected:
  	}
  
  	return k.kontrol.TellWithTimeout(method, timeout, args...)
  }
docs: // TellKontrolWithTimeout is a lower level function for communicating directly with
  // kontrol. Like GetKites and GetToken, this automatically sets up and connects to
  // kontrol as needed.