protected override bool DoEncode(IByteBufferAllocator bufferAllocator, NATSPacket packet, List <object> output)
        {
            if (base.DoEncode(bufferAllocator, packet, output))
            {
                return(true);
            }

            switch (packet.PacketType)
            {
            case NATSPacketType.STREAM_INBOX:
                EncodeSubscribeMessage(bufferAllocator, (SubscribePacket)packet, output);
                break;

            case NATSPacketType.STREAM_MSG_GET:
                EncodePublishMessage(bufferAllocator, (GetMessagePacket)packet, output);
                break;

            case NATSPacketType.STREAM_CREATE:
                EncodePublishMessage(bufferAllocator, (CreatePacket)packet, output);
                break;

            case NATSPacketType.STREAM_UPDATE:
                EncodePublishMessage(bufferAllocator, (UpdatePacket)packet, output);
                break;

            case NATSPacketType.STREAM_NAMES:
                EncodePublishMessage(bufferAllocator, (NamesPacket)packet, output);
                break;

            case NATSPacketType.STREAM_LIST:
                EncodePublishMessage(bufferAllocator, (ListPacket)packet, output);
                break;

            case NATSPacketType.STREAM_DELETE:
                EncodePublishMessage(bufferAllocator, (DeletePacket)packet, output);
                break;

            case NATSPacketType.STREAM_PURGE:
                EncodePublishMessage(bufferAllocator, (PurgePacket)packet, output);
                break;

            case NATSPacketType.STREAM_SNAPSHOT:
                EncodePublishMessage(bufferAllocator, (SnapshotPacket)packet, output);
                break;

            case NATSPacketType.STREAM_MSG_DELETE:
                EncodePublishMessage(bufferAllocator, (DeleteMessagePacket)packet, output);
                break;

            case NATSPacketType.STREAM_REMOVE_PEERE:
                EncodePublishMessage(bufferAllocator, (RemovePeerPacket)packet, output);
                break;

            case NATSPacketType.STREAM_LEADER_STEPDOWN:
                EncodePublishMessage(bufferAllocator, (LeaderStepDownPacket)packet, output);
                break;

            case NATSPacketType.STREAM_INFO:
                EncodePublishMessage(bufferAllocator, (Packets.InfoPacket)packet, output);
                break;

            case NATSPacketType.CONSUMER_CREATE:
                EncodePublishMessage(bufferAllocator, (ConsumerCreatePacket)packet, output);
                break;

            case NATSPacketType.CONSUMER_INFO:
                EncodePublishMessage(bufferAllocator, (ConsumerInfoPacket)packet, output);
                break;

            case NATSPacketType.CONSUMER_NAMES:
                EncodePublishMessage(bufferAllocator, (ConsumerNamesPacket)packet, output);
                break;

            case NATSPacketType.CONSUMER_LIST:
                EncodePublishMessage(bufferAllocator, (ConsumerListPacket)packet, output);
                break;

            case NATSPacketType.CONSUMER_DELETE:
                EncodePublishMessage(bufferAllocator, (ConsumerDeletePacket)packet, output);
                break;

            default:
                return(false);
            }

            return(true);
        }
        protected override bool DoHighFrequencyEncode(IByteBufferAllocator bufferAllocator, NATSPacket packet, List <object> output)
        {
            if (base.DoHighFrequencyEncode(bufferAllocator, packet, output))
            {
                return(true);
            }

            switch (packet.PacketType)
            {
            case NATSPacketType.HPUB:
                EncodePublishHigherMessage(bufferAllocator, (PublishHigherPacket)packet, output);
                break;

            case NATSPacketType.ACK_ACK:
            case NATSPacketType.ACK_NAK:
            case NATSPacketType.ACK_PROGRESS:
            case NATSPacketType.ACK_NEXT:
            case NATSPacketType.ACK_TERM:
                EncodeAckMessage(bufferAllocator, (AckPacket)packet, output);
                break;

            default:
                return(false);
            }

            return(true);
        }