handleLeaveRequest processes a session leave request.
(msg *ClientComMessage, sess *Session)
| 720 | |
| 721 | // handleLeaveRequest processes a session leave request. |
| 722 | func (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() { |
no test coverage detected