diff --git a/subscriber_list.go b/subscriber_list.go index 115114cb..516b0d38 100644 --- a/subscriber_list.go +++ b/subscriber_list.go @@ -1,7 +1,7 @@ package mercure import ( - "encoding/base64" + "encoding/ascii85" "sort" "strings" @@ -17,15 +17,10 @@ func NewSubscriberList(size int) *SubscriberList { skipfilter: skipfilter.New(func(s interface{}, filter interface{}) bool { var private bool - encodedTopics := strings.Split(filter.(string), ":") + encodedTopics := strings.Split(filter.(string), "~") topics := make([]string, len(encodedTopics)) for i, encodedTopic := range encodedTopics { - decoded, err := base64.StdEncoding.DecodeString(encodedTopic) - if err != nil { - return false - } - - p := strings.SplitN(string(decoded), "_", 2) + p := strings.SplitN(encodedTopic, ">", 2) if len(p) < 2 { return false } @@ -33,7 +28,16 @@ func NewSubscriberList(size int) *SubscriberList { if p[0] == "p" { private = true } - topics[i] = p[1] + + decodedTopic := make([]byte, len(p[1])) + ndst, _, err := ascii85.Decode(decodedTopic, []byte(p[1]), true) + if err != nil { + return false + } + + str := string(decodedTopic[:ndst]) + + topics[i] = str } return s.(*Subscriber).MatchTopics(topics, private) @@ -44,16 +48,20 @@ func NewSubscriberList(size int) *SubscriberList { func (sc *SubscriberList) MatchAny(u *Update) (res []*Subscriber) { encodedTopics := make([]string, len(u.Topics)) for i, t := range u.Topics { + encodedTopic := make([]byte, ascii85.MaxEncodedLen(len(t))) + nb := ascii85.Encode(encodedTopic, []byte(t)) + encodedTopic = encodedTopic[:nb] + if u.Private { - encodedTopics[i] = base64.StdEncoding.EncodeToString([]byte("p_" + t)) + encodedTopics[i] = "p>" + string(encodedTopic) } else { - encodedTopics[i] = base64.StdEncoding.EncodeToString([]byte("_" + t)) + encodedTopics[i] = ">" + string(encodedTopic) } } sort.Strings(encodedTopics) - for _, m := range sc.skipfilter.MatchAny(strings.Join(encodedTopics, ":")) { + for _, m := range sc.skipfilter.MatchAny(strings.Join(encodedTopics, "~")) { res = append(res, m.(*Subscriber)) }