From 31930f871bfc3b31d2c4492c8197c2c5c2454624 Mon Sep 17 00:00:00 2001 From: "sashakoshka@tebibyte.media" Date: Sun, 19 Jan 2025 15:54:13 -0500 Subject: [PATCH] Break out encodeMessageB, decodeMessageB --- metadaptb.go | 46 +++++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/metadaptb.go b/metadaptb.go index 86e10ce..2f33b8e 100644 --- a/metadaptb.go +++ b/metadaptb.go @@ -48,28 +48,11 @@ func (trans transB) ID() int64 { } func (trans transB) Send(method uint16, data []byte) error { - buffer := make([]byte, 4 + len(data)) - tape.EncodeI16(buffer[:2], method) - length, ok := tape.U16CastSafe(len(data)) - if !ok { return ErrPayloadTooLarge } - tape.EncodeI16(data[2:4], length) - copy(buffer[4:], data) - _, err := trans.underlying.Write(buffer) - return err + return encodeMessageB(trans.underlying, method, data) } func (trans transB) Receive() (uint16, []byte, error) { - headerBuffer := [4]byte { } - _, err := io.ReadFull(trans.underlying, headerBuffer[:]) - if err != nil { return 0, nil, err } - method, err := tape.DecodeI16[uint16](headerBuffer[:2]) - if err != nil { return 0, nil, err } - length, err := tape.DecodeI16[uint16](headerBuffer[2:4]) - if err != nil { return 0, nil, err } - payloadBuffer := make([]byte, int(length)) - _, err = io.ReadFull(trans.underlying, payloadBuffer) - if err != nil { return 0, nil, err } - return method, payloadBuffer, nil + return decodeMessageB(trans.underlying) } // MultiConn represens a multiplexed stream-oriented transport for use in [B]. @@ -91,3 +74,28 @@ type Stream interface { // ID returns the stream ID ID() int64 } + +func encodeMessageB(writer io.Writer, method uint16, data []byte) error { + buffer := make([]byte, 4 + len(data)) + tape.EncodeI16(buffer[:2], method) + length, ok := tape.U16CastSafe(len(data)) + if !ok { return ErrPayloadTooLarge } + tape.EncodeI16(data[2:4], length) + copy(buffer[4:], data) + _, err := writer.Write(buffer) + return err +} + +func decodeMessageB(reader io.Reader) (uint16, []byte, error) { + headerBuffer := [4]byte { } + _, err := io.ReadFull(reader, headerBuffer[:]) + if err != nil { return 0, nil, err } + method, err := tape.DecodeI16[uint16](headerBuffer[:2]) + if err != nil { return 0, nil, err } + length, err := tape.DecodeI16[uint16](headerBuffer[2:4]) + if err != nil { return 0, nil, err } + payloadBuffer := make([]byte, int(length)) + _, err = io.ReadFull(reader, payloadBuffer) + if err != nil { return 0, nil, err } + return method, payloadBuffer, nil +}