63 lines
1.6 KiB
Go
63 lines
1.6 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
|
|
fetchedTotal string
|
|
pendingTotal string
|
|
permits string
|
|
permitExpiry 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",
|
|
fetchedTotal: prefix + ":fetched-total",
|
|
pendingTotal: prefix + ":pending-total",
|
|
permits: prefix + ":permits",
|
|
permitExpiry: prefix + ":permit-expiry",
|
|
}, nil
|
|
}
|
|
|
|
func (keys upstreamKeys) all() []string {
|
|
return []string{
|
|
keys.generation, keys.epoch, keys.leader, keys.next, keys.inflight,
|
|
keys.fetchedTotal, keys.pendingTotal, keys.permits, keys.permitExpiry,
|
|
}
|
|
}
|
|
|
|
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))
|
|
}
|