mirror of
https://github.com/mxpv/podsync.git
synced 2024-05-11 05:55:04 +00:00
63 lines
1.0 KiB
Go
63 lines
1.0 KiB
Go
package feed
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
type KeyProvider interface {
|
|
Get() string
|
|
}
|
|
|
|
func NewKeyProvider(keys []string) (KeyProvider, error) {
|
|
switch len(keys) {
|
|
case 0:
|
|
return nil, errors.New("no keys")
|
|
case 1:
|
|
return NewFixedKey(keys[0])
|
|
default:
|
|
return NewRotatedKeys(keys)
|
|
}
|
|
}
|
|
|
|
type FixedKeyProvider struct {
|
|
key string
|
|
}
|
|
|
|
func NewFixedKey(key string) (KeyProvider, error) {
|
|
if key == "" {
|
|
return nil, errors.New("key can't be empty")
|
|
}
|
|
|
|
return &FixedKeyProvider{key: key}, nil
|
|
}
|
|
|
|
func (p FixedKeyProvider) Get() string {
|
|
return p.key
|
|
}
|
|
|
|
type RotatedKeyProvider struct {
|
|
keys []string
|
|
lock sync.Mutex
|
|
index int
|
|
}
|
|
|
|
func NewRotatedKeys(keys []string) (KeyProvider, error) {
|
|
if len(keys) < 2 {
|
|
return nil, errors.Errorf("at least 2 keys required (got %d)", len(keys))
|
|
}
|
|
|
|
return &RotatedKeyProvider{keys: keys, index: 0}, nil
|
|
}
|
|
|
|
func (p *RotatedKeyProvider) Get() string {
|
|
p.lock.Lock()
|
|
defer p.lock.Unlock()
|
|
|
|
current := p.index % len(p.keys)
|
|
p.index++
|
|
|
|
return p.keys[current]
|
|
}
|