52 lines
1.2 KiB
Go
52 lines
1.2 KiB
Go
package redisprovider
|
|
|
|
import (
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
"strconv"
|
|
"strings"
|
|
|
|
controllerProvider "proxy-pool/internal/controller/provider"
|
|
)
|
|
|
|
type keyBuilder struct {
|
|
namespace string
|
|
}
|
|
|
|
type upstreamKeys struct {
|
|
generation string
|
|
epoch string
|
|
leader string
|
|
next string
|
|
inflight string
|
|
}
|
|
|
|
func (builder keyBuilder) forUpstream(upstreamID string) (upstreamKeys, error) {
|
|
if strings.TrimSpace(upstreamID) != upstreamID || upstreamID == "" {
|
|
return upstreamKeys{}, controllerProvider.ErrInvalidCoordination
|
|
}
|
|
digest := digestParts(upstreamID)
|
|
prefix := "pp:" + builder.namespace + ":{provider:" + digest + "}"
|
|
return upstreamKeys{
|
|
generation: prefix + ":generation",
|
|
epoch: prefix + ":epoch",
|
|
leader: prefix + ":leader",
|
|
next: prefix + ":next-request",
|
|
inflight: prefix + ":inflight",
|
|
}, nil
|
|
}
|
|
|
|
func (keys upstreamKeys) all() []string {
|
|
return []string{keys.generation, keys.epoch, keys.leader, keys.next, keys.inflight}
|
|
}
|
|
|
|
func digestParts(values ...string) string {
|
|
digest := sha256.New()
|
|
for _, value := range values {
|
|
_, _ = digest.Write([]byte(strconv.Itoa(len(value))))
|
|
_, _ = digest.Write([]byte{':'})
|
|
_, _ = digest.Write([]byte(value))
|
|
}
|
|
return hex.EncodeToString(digest.Sum(nil))
|
|
}
|