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)) }