From 9aaf7cf7a312d53a3d86ee0b95cc097ee8a6252a Mon Sep 17 00:00:00 2001 From: liurunzhi Date: Fri, 26 May 2023 19:58:57 +0800 Subject: [PATCH] fix: bind after session close --- session/session.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/session/session.go b/session/session.go index 55f66718..737daec7 100644 --- a/session/session.go +++ b/session/session.go @@ -382,6 +382,10 @@ func (s *sessionImpl) Bind(ctx context.Context, uid string) error { return constants.ErrSessionAlreadyBound } + if _, ok := s.pool.sessionsByID.Load(s.ID()); !ok { + return constants.ErrConnectionClosed + } + s.uid = uid for _, cb := range s.pool.sessionBindCallbacks { err := cb(ctx, s) @@ -412,6 +416,19 @@ func (s *sessionImpl) Bind(ctx context.Context, uid string) error { return err } } + + // double check + if _, ok := s.pool.sessionsByID.Load(s.ID()); !ok { + for _, sub := range s.GetSubscriptions() { + err := sub.Unsubscribe() + log := logger.Log + if err != nil { + log = log.WithError(err) + } + log.Debug("unsubscribe to user's %s message channel, because it close the network", s.UID()) + } + return constants.ErrConnectionClosed + } return nil } @@ -434,6 +451,11 @@ func (s *sessionImpl) OnClose(c func()) error { if !s.IsFrontend { return constants.ErrOnCloseBackend } + + if _, ok := s.pool.sessionsByID.Load(s.ID()); !ok { + return constants.ErrConnectionClosed + } + s.OnCloseCallbacks = append(s.OnCloseCallbacks, c) return nil }