67 lines
1.5 KiB
Go
67 lines
1.5 KiB
Go
package resolver
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"time"
|
|
|
|
"github.com/FAU-CDI/wisski-distillery/pkg/timex"
|
|
)
|
|
|
|
// updatePrefixes starts updating prefixes
|
|
func (resolver *Resolver) updatePrefixes(ctx context.Context, progress io.Writer) {
|
|
go func() {
|
|
for t := range timex.TickContext(ctx, resolver.RefreshInterval) {
|
|
fmt.Fprintf(progress, "[%s]: reloading prefixes\n", t.Format(time.Stamp))
|
|
|
|
err := (func() (err error) {
|
|
ctx, cancel := context.WithTimeout(ctx, resolver.RefreshInterval)
|
|
defer cancel()
|
|
|
|
prefixes, err := resolver.AllPrefixes(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
resolver.prefixes.Set(prefixes)
|
|
return nil
|
|
})()
|
|
if err != nil {
|
|
fmt.Fprintf(progress, "error reloading prefixes: %s", err.Error())
|
|
}
|
|
}
|
|
}()
|
|
}
|
|
|
|
// AllPrefixes returns a list of all prefixes from the server.
|
|
// Prefixes may be cached on the server
|
|
func (resolver *Resolver) AllPrefixes(ctx context.Context) (map[string]string, error) {
|
|
instances, err := resolver.Instances.All(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
gPrefixes := make(map[string]string)
|
|
var lastErr error
|
|
for _, instance := range instances {
|
|
if instance.Prefixes().NoPrefix() {
|
|
continue
|
|
}
|
|
url := instance.URL().String()
|
|
|
|
// failed to fetch prefixes for this particular instance
|
|
// => skip it!
|
|
prefixes, err := instance.Prefixes().AllCached(ctx)
|
|
if err != nil {
|
|
lastErr = err
|
|
continue
|
|
}
|
|
|
|
for _, p := range prefixes {
|
|
gPrefixes[p] = url
|
|
}
|
|
}
|
|
|
|
return gPrefixes, lastErr
|
|
}
|