package session import ( "sonet/pkg/utils/collect" "sonet/pkg/utils/logger" ) type Store interface { Load(uid string) (channel *Channel, exist bool) Delete(uid string) Store(uid string, channel *Channel) Range(f func(key string, channel *Channel) bool) OnStore() <-chan string // Store 函数调用 OnDelete() <-chan *Channel // Delete 函数调用 } func NewMapStore(concurrentLevel int) Store { return &mapStore{ m: collect.NewConcurrentMap[string, *Channel](concurrentLevel, func(k string) string { return k }), storeCh: make(chan string, 128), deleteCh: make(chan *Channel, 64), } } type mapStore struct { m *collect.ConcurrentMap[string, *Channel] storeCh chan string deleteCh chan *Channel } func (c *mapStore) Load(uid string) (channel *Channel, exist bool) { channel, exist = c.m.Load(uid) return } func (c *mapStore) Delete(uid string) { ch, ok := c.m.LoadAndDelete(uid) if !ok { return } select { case c.deleteCh <- ch: default: logger.Warningf("session store delete channel fulled, %s", uid) } } func (c *mapStore) Store(uid string, channel *Channel) { c.m.Store(uid, channel) c.storeCh <- uid // logger.Warningf("session store store channel fulled, %s", uid) } func (c *mapStore) Range(f func(key string, channel *Channel) bool) { c.m.Range(f) } // OnStore 用户上线 func (c *mapStore) OnStore() <-chan string { return c.storeCh } // OnDelete 用户离线 func (c *mapStore) OnDelete() <-chan *Channel { return c.deleteCh }