diff --git a/session/common.go b/session/common.go index 1ce578d..bc43332 100644 --- a/session/common.go +++ b/session/common.go @@ -57,8 +57,9 @@ type Provider interface { } type InvalidatedSession struct { - Account primitive.ObjectID - Infinite bool + Account primitive.ObjectID + SessionKeys []string + Infinite bool } type Consumer interface { diff --git a/session/impl_redis.go b/session/impl_redis.go index 077746b..eeeb8b4 100644 --- a/session/impl_redis.go +++ b/session/impl_redis.go @@ -2,6 +2,7 @@ package session import ( "context" + "encoding/json" "errors" "fmt" "slices" @@ -78,12 +79,17 @@ func (p *provider_redis) RevokeAll(account primitive.ObjectID, infinite bool) ([ return nil, err } - for _, sk := range sks { - if infinite { - p.redisClient.Publish(p.ctx, p.deleteChannel, "~"+sk).Result() - } else { - p.redisClient.Publish(p.ctx, p.deleteChannel, sk).Result() + if len(sks) > 0 { + p.redisClient.Del(p.ctx, sks...) + + invsess := InvalidatedSession{ + SessionKeys: sks, + Account: account, + Infinite: infinite, } + data, _ := json.Marshal(invsess) + + p.redisClient.Publish(p.ctx, p.deleteChannel, string(data)).Result() } return sks, nil @@ -172,25 +178,18 @@ func newConsumerWithRedis(ctx context.Context, redisUrl string, ttl time.Duratio switch msg.Channel { case deleteChannel: - infinite := false - var sk string - if msg.Payload[0] == '~' { - sk = msg.Payload[1:] - infinite = true - } else { - sk = msg.Payload - infinite = false + var invsess InvalidatedSession + if err := json.Unmarshal([]byte(msg.Payload), &invsess); err != nil { + logger.Println("redis consumer deleteChannel unmarshal failed :", err) + break } - old := consumer.delete(storagekey(sk)) - if old != nil { - invsess := InvalidatedSession{ - Account: old.Account, - Infinite: infinite, - } - for _, f := range consumer.onSessionInvalidated { - f(invsess) - } + for _, sk := range invsess.SessionKeys { + consumer.delete(storagekey(sk)) + } + + for _, f := range consumer.onSessionInvalidated { + f(invsess) } } }