fix: reset pubsub state when unsubscribing from all channels

This commit is contained in:
Vladimir Mihailenco 2022-10-14 15:15:06 +03:00
parent 6a8cf3e9d8
commit 331e40dc6c
1 changed files with 30 additions and 6 deletions

View File

@ -238,9 +238,17 @@ func (c *PubSub) Unsubscribe(ctx context.Context, channels ...string) error {
c.mu.Lock() c.mu.Lock()
defer c.mu.Unlock() defer c.mu.Unlock()
if len(channels) > 0 {
for _, channel := range channels { for _, channel := range channels {
delete(c.channels, channel) delete(c.channels, channel)
} }
} else {
// Unsubscribe from all channels.
for channel := range c.channels {
delete(c.channels, channel)
}
}
err := c.subscribe(ctx, "unsubscribe", channels...) err := c.subscribe(ctx, "unsubscribe", channels...)
return err return err
} }
@ -251,9 +259,17 @@ func (c *PubSub) PUnsubscribe(ctx context.Context, patterns ...string) error {
c.mu.Lock() c.mu.Lock()
defer c.mu.Unlock() defer c.mu.Unlock()
if len(patterns) > 0 {
for _, pattern := range patterns { for _, pattern := range patterns {
delete(c.patterns, pattern) delete(c.patterns, pattern)
} }
} else {
// Unsubscribe from all patterns.
for pattern := range c.patterns {
delete(c.patterns, pattern)
}
}
err := c.subscribe(ctx, "punsubscribe", patterns...) err := c.subscribe(ctx, "punsubscribe", patterns...)
return err return err
} }
@ -264,9 +280,17 @@ func (c *PubSub) SUnsubscribe(ctx context.Context, channels ...string) error {
c.mu.Lock() c.mu.Lock()
defer c.mu.Unlock() defer c.mu.Unlock()
if len(channels) > 0 {
for _, channel := range channels { for _, channel := range channels {
delete(c.schannels, channel) delete(c.schannels, channel)
} }
} else {
// Unsubscribe from all channels.
for channel := range c.schannels {
delete(c.schannels, channel)
}
}
err := c.subscribe(ctx, "sunsubscribe", channels...) err := c.subscribe(ctx, "sunsubscribe", channels...)
return err return err
} }