code: func (k *Kite) RegisterForever(kiteURL *url.URL) error {
  	errs := make(chan error, 1)
  	go func() {
  		for u := range k.kontrol.registerChan {
  			_, err := k.Register(u)
  			if err == nil {
  				k.kontrol.Lock()
  				k.kontrol.lastRegisteredURL = u
  				k.kontrol.Unlock()
  				k.signalReady()
  				continue
  			}
  
  			select {
  			case errs <- err:
  			default:
  			}
  
  			k.Log.Error("Cannot register to Kontrol: %s Will retry after %d seconds",
  				err, kontrolRetryDuration/time.Second)
  
  			time.AfterFunc(kontrolRetryDuration, func() {
  				select {
  				case k.kontrol.registerChan <- u:
  				default:
  				}
  			})
  		}
  	}()
  
  	// don't block if there the given url is nil
  	if kiteURL == nil {
  		return nil
  	}
  
  	// initiate a registiration if a url is given
  	k.kontrol.registerChan <- kiteURL
  
  	select {
  	case <-k.KontrolReadyNotify():
  		return nil
  	case err := <-errs:
  		return err
  	}
  }
docs: // RegisterForever is equivalent to Register(), but it tries to re-register if
  // there is a disconnection. The returned error is for the first register
  // attempt. It returns nil if ReadNotify() is ready and it's registered
  // successful.