MCPcopy Index your code
hub / github.com/tinode/chat / handleLeaveRequest

Method handleLeaveRequest

server/topic.go:722–861  ·  view source on GitHub ↗

handleLeaveRequest processes a session leave request.

(msg *ClientComMessage, sess *Session)

Source from the content-addressed store, hash-verified

720
721// handleLeaveRequest processes a session leave request.
722func (t *Topic) handleLeaveRequest(msg *ClientComMessage, sess *Session) {
723 // Remove connection from topic; session may continue to function
724 now := types.TimeNow()
725
726 var asUid types.Uid
727 var asChan bool
728 if msg.init {
729 asUid = types.ParseUserId(msg.AsUser)
730 var err error
731 asChan, err = t.verifyChannelAccess(msg.Original)
732 if err != nil {
733 // Group topic cannot be addressed as channel unless channel functionality is enabled.
734 sess.queueOut(ErrNotFoundReply(msg, now))
735 }
736 }
737
738 if t.isInactive() {
739 if !asUid.IsZero() && msg.init {
740 sess.queueOut(ErrLockedReply(msg, now))
741 }
742 return
743 }
744
745 // User wants to leave and unsubscribe.
746 if msg.init && msg.Leave.Unsub {
747 // asUid must not be Zero.
748 if err := t.replyLeaveUnsub(sess, msg, asUid); err != nil {
749 logs.Err.Println("failed to unsub", err, sess.sid)
750 }
751 return
752 }
753
754 // User wants to leave without unsubscribing.
755 if pssd, _ := t.remSession(sess, asUid); pssd != nil {
756 if !sess.isProxy() {
757 sess.delSub(t.name)
758 }
759 if pssd.isChanSub != asChan {
760 // Cannot address non-channel subscription as channel and vice versa.
761 if msg.init {
762 // Group topic cannot be addressed as channel unless channel functionality is enabled.
763 sess.queueOut(ErrNotFoundReply(msg, now))
764 }
765 return
766 }
767
768 var uid types.Uid
769 if sess.isProxy() {
770 // Multiplexing session, multiple UIDs.
771 uid = asUid
772 } else {
773 // Simple session, single UID.
774 uid = pssd.uid
775 }
776
777 var pud perUserData
778 // uid may be zero when a proxy session is trying to terminate (it called unsubAll).
779 if !uid.IsZero() {

Callers 1

unregisterSessionMethod · 0.95

Calls 15

verifyChannelAccessMethod · 0.95
isInactiveMethod · 0.95
IsZeroMethod · 0.95
replyLeaveUnsubMethod · 0.95
remSessionMethod · 0.95
mostRecentSessionMethod · 0.95
fndRemovePublicMethod · 0.95
presSubsOnlineMethod · 0.95
UserIdMethod · 0.95
TimeNowFunction · 0.92
ParseUserIdFunction · 0.92
ErrNotFoundReplyFunction · 0.85

Tested by

no test coverage detected