package loader import ( "context" "time" ) // backgroundLoop периодически проверяет доступность соединения и наличие новых версий на сервере func (l *loader) backgroundLoop(ctx context.Context, stop <-chan struct{}) { checkConnTimer := time.NewTimer(checkConnectionTimeout) checkVersionTimer := time.NewTimer(checkVersionTimeout) defer func() { checkConnTimer.Stop() checkVersionTimer.Stop() }() for { select { case <-ctx.Done(): l.client.Shutdown() return case <-stop: return case <-checkConnTimer.C: isGood := l.connector.CheckConnection() l.client.OnConnection(isGood) checkConnTimer.Reset(checkConnectionTimeout) case <-checkVersionTimer.C: if err := l.checkAndDownloadPluginVersion(); err != nil { l.onConnectionError(err) // TODO: separate error types for: onConnectionError / onStorageError / onServiceError } checkVersionTimer.Reset(checkVersionTimeout) } } }