presence

package
v0.3.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 5, 2026 License: Apache-2.0 Imports: 3 Imported by: 0

Documentation

Overview

Package presence 提供在线状态(在场追踪)原语:维护"谁在哪个流(stream)里" 的双向索引,支持 O(1) 按流查询成员、按会话查询所在流,以及 join/leave 事件总线。

适用场景:IM 频道成员、游戏房间在场、在线状态广播、匹配器候选池等。

双索引 presence 树:

  • presencesByStream: 按 流 → 查成员(广播用)
  • presencesBySession: 按 会话 → 查所在流(下线清理用)

一次 Track/Untrack 同步更新两棵索引,双向查询均 O(1)。

零值不可用,用 New 构造。Tracker 并发安全。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Event

type Event struct {
	Stream Stream
	Joins  []*Presence
	Leaves []*Presence
}

Event 是 join/leave 事件,由事件总线扇出给监听者。

type ID

type ID struct {
	SessionID string
	Stream    Stream
	Node      string
}

ID 唯一标识一个在场条目:会话 + 所在流 + 所在节点。 Node 为空表示本节点;非空表示该会话驻留在 Node 节点(跨节点路由用)。

type Listener

type Listener func(stream Stream, joins, leaves []*Presence)

Listener 监听某个流的 join/leave 事件。在事件总线 goroutine 中调用。

type Meta

type Meta struct {
	UserID   string
	Username string
	Hidden   bool // 隐藏在场:不出现在成员列表,但仍被追踪(如观战)
}

Meta 是在场的元数据。

type Presence

type Presence struct {
	ID   ID
	Meta Meta
}

Presence 是一个完整的在场条目。

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

func New(listener Listener, eventQueueSize int) *Tracker

New 创建 Tracker。listener 可为 nil(不订阅事件)。 eventQueueSize 决定事件总线 channel 容量,满时 Track/Untrack 不阻塞(丢弃事件并计数)。

func (*Tracker) Count

func (t *Tracker) Count() int

Count 返回当前总在场数。

func (*Tracker) CountByStream

func (t *Tracker) CountByStream(stream Stream) int

CountByStream 返回某流的在场数。

func (*Tracker) GetLocal

func (t *Tracker) GetLocal(sessionID string, stream Stream) (*Presence, bool)

GetLocal 返回单个条目(若存在)。

func (*Tracker) ListBySession

func (t *Tracker) ListBySession(sessionID string) []*Presence

ListBySession 返回某会话所在的全部流。

func (*Tracker) ListByStream

func (t *Tracker) ListByStream(stream Stream, includeHidden bool) []*Presence

ListByStream 返回某流的全部在场成员。includeHidden 控制是否含隐藏条目。

func (*Tracker) Start

func (t *Tracker) Start(ctx context.Context)

Start 启动事件分发(若构造时给了 listener 则已在运行)。幂等。

func (*Tracker) Stop

func (t *Tracker) Stop()

Stop 停止事件分发。幂等。停止后 Track/Untrack 仍可用(索引维护),只是不再回调。

func (*Tracker) StreamExists

func (t *Tracker) StreamExists(stream Stream) bool

StreamExists 返回某流是否有任何在场。

func (*Tracker) Track

func (t *Tracker) Track(sessionID string, stream Stream, meta Meta) (bool, bool)

Track 登记一个会话在某流的在场。已存在则幂等返回 (true, false)。 返回 (added, newlyTracked):added=是否在流内(含已存在),newlyTracked=本次是否新增。

func (*Tracker) Untrack

func (t *Tracker) Untrack(sessionID string, stream Stream, userID string) bool

Untrack 移除一个会话在某流的在场。返回是否曾存在。

func (*Tracker) UntrackAll

func (t *Tracker) UntrackAll(sessionID string) []*Presence

UntrackAll 移除一个会话的所有在场(下线清理)。返回被移除的条目。

func (*Tracker) Wait

func (t *Tracker) Wait()

Wait 阻塞直到事件分发 goroutine 退出。

Directories

Path Synopsis
Package status 把用户的在线状态变化(上线/下线/进出流)推送给关注他的人。
Package status 把用户的在线状态变化(上线/下线/进出流)推送给关注他的人。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL