Documentation
¶
Overview ¶
Package presence 提供在线状态(在场追踪)原语:维护"谁在哪个流(stream)里" 的双向索引,支持 O(1) 按流查询成员、按会话查询所在流,以及 join/leave 事件总线。
适用场景:IM 频道成员、游戏房间在场、在线状态广播、匹配器候选池等。
双索引 presence 树:
- presencesByStream: 按 流 → 查成员(广播用)
- presencesBySession: 按 会话 → 查所在流(下线清理用)
一次 Track/Untrack 同步更新两棵索引,双向查询均 O(1)。
零值不可用,用 New 构造。Tracker 并发安全。
Index ¶
- type Event
- type ID
- type Listener
- type Meta
- type Presence
- type Stream
- type Tracker
- func (t *Tracker) Count() int
- func (t *Tracker) CountByStream(stream Stream) int
- func (t *Tracker) GetLocal(sessionID string, stream Stream) (*Presence, bool)
- func (t *Tracker) ListBySession(sessionID string) []*Presence
- func (t *Tracker) ListByStream(stream Stream, includeHidden bool) []*Presence
- func (t *Tracker) Start(ctx context.Context)
- func (t *Tracker) Stop()
- func (t *Tracker) StreamExists(stream Stream) bool
- func (t *Tracker) Track(sessionID string, stream Stream, meta Meta) (bool, bool)
- func (t *Tracker) Untrack(sessionID string, stream Stream, userID string) bool
- func (t *Tracker) UntrackAll(sessionID string) []*Presence
- func (t *Tracker) Wait()
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Stream ¶
type Stream struct {
Mode uint8 // 业务自定义模式(如 1=频道 2=房间 3=派对)
Subject string // 主体标识(如房间 ID)
Label string // 子分类(如节点名或分区)
}
Stream 标识一个逻辑频道/房间/频道,由业务自定义 Mode + Subject + Label。 同 Stream 值指向同一组成员。使用值类型以便做 map key。
type Tracker ¶
type Tracker struct {
// contains filtered or unexported fields
}
Tracker 维护在线状态的双索引与事件总线。
func New ¶
New 创建 Tracker。listener 可为 nil(不订阅事件)。 eventQueueSize 决定事件总线 channel 容量,满时 Track/Untrack 不阻塞(丢弃事件并计数)。
func (*Tracker) CountByStream ¶
CountByStream 返回某流的在场数。
func (*Tracker) ListBySession ¶
ListBySession 返回某会话所在的全部流。
func (*Tracker) ListByStream ¶
ListByStream 返回某流的全部在场成员。includeHidden 控制是否含隐藏条目。
func (*Tracker) StreamExists ¶
StreamExists 返回某流是否有任何在场。
func (*Tracker) Track ¶
Track 登记一个会话在某流的在场。已存在则幂等返回 (true, false)。 返回 (added, newlyTracked):added=是否在流内(含已存在),newlyTracked=本次是否新增。
func (*Tracker) UntrackAll ¶
UntrackAll 移除一个会话的所有在场(下线清理)。返回被移除的条目。