package client import ( "time" gerr "galaxy/error" ) var ( checkConnectionInterval = 5 * time.Second checkVersionInterval = time.Hour ) func (e *client) startBackground() { if e.fullConnector == nil && e.updater == nil { return } go e.backgroundLoop() } func (e *client) stopBackground() { e.backgroundOnce.Do(func() { close(e.backgroundStop) }) } func (e *client) backgroundLoop() { checkConnTimer := time.NewTimer(checkConnectionInterval) checkVersionTimer := time.NewTimer(checkVersionInterval) defer func() { checkConnTimer.Stop() checkVersionTimer.Stop() }() for { select { case <-e.backgroundStop: return case <-checkConnTimer.C: if e.fullConnector != nil { e.OnConnection(e.fullConnector.CheckConnection()) } checkConnTimer.Reset(checkConnectionInterval) case <-checkVersionTimer.C: if e.updater != nil { if err := e.updater.CheckAndPrepareLatest(); err != nil { e.handlerError(err) } } checkVersionTimer.Reset(checkVersionInterval) } } } func (e *client) handlerError(err error) { if err == nil { return } switch { case gerr.IsConnection(err): e.OnConnectionError(err) case gerr.IsStorage(err): e.OnStorageError(err) default: e.OnServiceError(err) } }