// For PUBLISH message, we should figure out what QoS it is and process accordingly // If QoS == 0, we should just take the next step, no ack required // If QoS == 1, we should send back PUBACK, then take the next step // If QoS == 2, we need to put it in the ack queue, send back PUBREC func (this *service) processPublish(msg *message.PublishMessage) error { switch msg.QoS() { case message.QosExactlyOnce: this.sess.Pub2in.Wait(msg, nil) resp := message.NewPubrecMessage() resp.SetPacketId(msg.PacketId()) _, err := this.writeMessage(resp) return err case message.QosAtLeastOnce: resp := message.NewPubackMessage() resp.SetPacketId(msg.PacketId()) if _, err := this.writeMessage(resp); err != nil { return err } return this.onPublish(msg) case message.QosAtMostOnce: return this.onPublish(msg) } return fmt.Errorf("(%s) invalid message QoS %d.", this.cid(), msg.QoS()) }