func (this *service) subscribe(msg *message.SubscribeMessage, onComplete OnCompleteFunc, onPublish OnPublishFunc) error { if onPublish == nil { return fmt.Errorf("onPublish function is nil. No need to subscribe.") } _, err := this.writeMessage(msg) if err != nil { return fmt.Errorf("(%s) Error sending %s message: %v", this.cid(), msg.Name(), err) } var onc OnCompleteFunc = func(msg, ack message.Message, err error) error { onComplete := onComplete onPublish := onPublish if err != nil { if onComplete != nil { return onComplete(msg, ack, err) } return err } sub, ok := msg.(*message.SubscribeMessage) if !ok { if onComplete != nil { return onComplete(msg, ack, fmt.Errorf("Invalid SubscribeMessage received")) } return nil } suback, ok := ack.(*message.SubackMessage) if !ok { if onComplete != nil { return onComplete(msg, ack, fmt.Errorf("Invalid SubackMessage received")) } return nil } if sub.PacketId() != suback.PacketId() { if onComplete != nil { return onComplete(msg, ack, fmt.Errorf("Sub and Suback packet ID not the same. %d != %d.", sub.PacketId(), suback.PacketId())) } return nil } retcodes := suback.ReturnCodes() topics := sub.Topics() if len(topics) != len(retcodes) { if onComplete != nil { return onComplete(msg, ack, fmt.Errorf("Incorrect number of return codes received. Expecting %d, got %d.", len(topics), len(retcodes))) } return nil } var err2 error = nil for i, t := range topics { c := retcodes[i] if c == message.QosFailure { err2 = fmt.Errorf("Failed to subscribe to '%s'\n%v", string(t), err2) } else { this.sess.AddTopic(string(t), c) _, err := this.topicsMgr.Subscribe(t, c, &onPublish) if err != nil { err2 = fmt.Errorf("Failed to subscribe to '%s' (%v)\n%v", string(t), err, err2) } } } if onComplete != nil { return onComplete(msg, ack, err2) } return err2 } return this.sess.Suback.Wait(msg, onc) }