Skip to content

Commit 3b7404f

Browse files
committed
feat(group): add session walk method and close all sessions when group is closed
1 parent 60c4c29 commit 3b7404f

File tree

1 file changed

+29
-6
lines changed

1 file changed

+29
-6
lines changed

group.go

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@ const (
1414
groupStatusClosed = 1
1515
)
1616

17-
// SessionFilter 表示用于在组播时会话的过滤器, 过滤器返回 true 的会话将收到消息
18-
type SessionFilter func(*session.Session) bool
17+
// SessionFilterFunc 表示用于在组播时会话的过滤器, 过滤器返回 true 的会话将收到消息
18+
type SessionFilterFunc func(*session.Session) bool
19+
20+
// SessionWalkFunc 表示用于在遍历会话的函数, 返回 true 时继续遍历, 返回 false 时停止遍历
21+
type SessionWalkFunc func(*session.Session) bool
1922

2023
// Group 表示一组会话,用于管理多个会话
2124
type Group struct {
@@ -130,7 +133,7 @@ func (g *Group) Member(uid int64) (*session.Session, error) {
130133
}
131134

132135
// FindMember 查找满足指定条件的会话
133-
func (g *Group) FindMember(filter func(ses *session.Session) bool) (*session.Session, error) {
136+
func (g *Group) FindMember(filter SessionFilterFunc) (*session.Session, error) {
134137
g.mu.RLock()
135138
defer g.mu.RUnlock()
136139

@@ -144,7 +147,7 @@ func (g *Group) FindMember(filter func(ses *session.Session) bool) (*session.Ses
144147
}
145148

146149
// Multicast 将消息发送给满足过滤条件的会话
147-
func (g *Group) Multicast(route string, v any, filter SessionFilter) error {
150+
func (g *Group) Multicast(route string, v any, filter SessionFilterFunc) error {
148151
if g.isClosed() {
149152
return ErrClosedGroup
150153
}
@@ -200,13 +203,33 @@ func (g *Group) Broadcast(route string, v any) error {
200203
return err
201204
}
202205

203-
// Close 关闭组,释放所有资源
206+
// Walk 遍历会话, fn 返回 true 继续遍历, 返回 false 时停止遍历
207+
func (g *Group) Walk(fn SessionWalkFunc) {
208+
g.mu.RLock()
209+
defer g.mu.RUnlock()
210+
211+
for _, s := range g.sessions {
212+
if !fn(s) {
213+
return
214+
}
215+
}
216+
}
217+
218+
// Close 关闭并清空组内所有会话
204219
func (g *Group) Close() error {
205220
if !g.status.CompareAndSwap(groupStatusWorking, groupStatusClosed) {
206221
return ErrCloseClosedGroup
207222
}
208223

209-
// release all reference
224+
g.mu.Lock()
225+
defer g.mu.Unlock()
226+
227+
// 关闭所有会话
228+
for _, s := range g.sessions {
229+
s.Close()
230+
}
231+
232+
// 清空
210233
g.sessions = make(map[int64]*session.Session)
211234
return nil
212235
}

0 commit comments

Comments
 (0)