func (this *rnode) rinsert(topic []byte, msg *message.PublishMessage) error { // If there's no more topic levels, that means we are at the matching rnode. if len(topic) == 0 { l := msg.Len() // Let's reuse the buffer if there's enough space if l > cap(this.buf) { this.buf = make([]byte, l) } else { this.buf = this.buf[0:l] } if _, err := msg.Encode(this.buf); err != nil { return err } // Reuse the message if possible if this.msg == nil { this.msg = message.NewPublishMessage() } if _, err := this.msg.Decode(this.buf); err != nil { return err } return nil } // Not the last level, so let's find or create the next level snode, and // recursively call it's insert(). // ntl = next topic level ntl, rem, err := nextTopicLevel(topic) if err != nil { return err } level := string(ntl) // Add snode if it doesn't already exist n, ok := this.rnodes[level] if !ok { n = newRNode() this.rnodes[level] = n } return n.rinsert(rem, msg) }
func (this *Session) RetainMessage(msg *message.PublishMessage) error { this.mu.Lock() defer this.mu.Unlock() this.rbuf = make([]byte, msg.Len()) this.Retained = message.NewPublishMessage() if _, err := msg.Encode(this.rbuf); err != nil { return err } if _, err := this.Retained.Decode(this.rbuf); err != nil { return err } return nil }