code: func persistInbound(s Store, m packets.ControlPacket) {
  	switch m.Details().Qos {
  	case 0:
  		switch m.(type) {
  		case *packets.PubackPacket, *packets.SubackPacket, *packets.UnsubackPacket, *packets.PubcompPacket:
  			// Received a puback. delete matching publish
  			// from obound
  			s.Del(outboundKeyFromMID(m.Details().MessageID))
  		case *packets.PublishPacket, *packets.PubrecPacket, *packets.PingrespPacket, *packets.ConnackPacket:
  		default:
  			ERROR.Println(STR, "Asked to persist an invalid messages type")
  		}
  	case 1:
  		switch m.(type) {
  		case *packets.PublishPacket, *packets.PubrelPacket:
  			// Received a publish. store it in ibound
  			// until puback sent
  			s.Put(inboundKeyFromMID(m.Details().MessageID), m)
  		default:
  			ERROR.Println(STR, "Asked to persist an invalid messages type")
  		}
  	case 2:
  		switch m.(type) {
  		case *packets.PublishPacket:
  			// Received a publish. store it in ibound
  			// until pubrel received
  			s.Put(inboundKeyFromMID(m.Details().MessageID), m)
  		default:
  			ERROR.Println(STR, "Asked to persist an invalid messages type")
  		}
  	}
  }
docs: // govern which incoming messages are persisted