public fun decode()

in aws-runtime/protocols/aws-event-stream/common/src/aws/sdk/kotlin/runtime/protocol/eventstream/Message.kt [49:87]


        public fun decode(buffer: Buffer): Message {
            val totalLen = buffer.readUInt()
            check(totalLen <= MAX_MESSAGE_SIZE.toUInt()) { "Invalid Message size: $totalLen" }

            // read into new ByteArray so we can validate the CRC
            val messageBytes = ByteArray(totalLen.toInt() - MESSAGE_CRC_BYTE_LEN)
            val messageBuffer = SdkByteBuffer.of(messageBytes)
            // add back in the totalLen so we can read the prelude
            messageBuffer.writeUInt(totalLen)
            buffer.readFully(messageBuffer)

            val prelude = Prelude.decode(messageBuffer)

            val remaining = prelude.totalLen - PRELUDE_BYTE_LEN_WITH_CRC - MESSAGE_CRC_BYTE_LEN
            check(messageBuffer.readRemaining >= remaining.toULong()) { "Invalid buffer, not enough remaining; have: ${messageBuffer.readRemaining}; expected $remaining" }

            val message = MessageBuilder()

            // read headers
            var headerBytesConsumed = 0UL
            while (headerBytesConsumed < prelude.headersLength.toULong()) {
                val start = messageBuffer.readPosition
                val header = Header.decode(messageBuffer)
                headerBytesConsumed += messageBuffer.readPosition - start
                message.addHeader(header)
            }
            check(headerBytesConsumed == prelude.headersLength.toULong()) { "Invalid Message: expected ${prelude.headersLength} header bytes; consumed $headerBytesConsumed" }

            val payload = ByteArray(prelude.payloadLen)
            messageBuffer.readFully(payload)
            message.payload = payload

            val expectedCrc = buffer.readUInt()
            val computedCrc = messageBytes.crc32()
            check(computedCrc == expectedCrc) {
                "Message checksum mismatch; expected=0x${expectedCrc.toString(16)}; calculated=0x${computedCrc.toString(16)}"
            }
            return message.build()
        }