@@ -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 表示一组会话,用于管理多个会话
2124type 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 关闭并清空组内所有会话
204219func (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