From 6f83f199f8311bf7782da59bc2e07df38073e65a Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Sun, 20 Oct 2024 20:12:12 +0300 Subject: refactor: finished refactoring server-side code --- internal/packet/encoders.go | 29 ++++++----- internal/packet/messages.go | 33 +++++-------- internal/packet/packet.go | 14 +++--- internal/packet/packet_test.go | 108 ----------------------------------------- 4 files changed, 33 insertions(+), 151 deletions(-) delete mode 100644 internal/packet/packet_test.go (limited to 'internal/packet') diff --git a/internal/packet/encoders.go b/internal/packet/encoders.go index e70d0e8..f5841ce 100644 --- a/internal/packet/encoders.go +++ b/internal/packet/encoders.go @@ -1,10 +1,9 @@ package packet import ( - "bytes" "encoding/json" - "io" + "github.com/kyren223/eko/pkg/assert" "github.com/vmihailenco/msgpack/v5" ) @@ -13,7 +12,7 @@ type TypedMessage interface { } type defaultPacketEncoder struct { - io.Reader + data []byte encoding Encoding packetType PacketType } @@ -26,28 +25,28 @@ func (e defaultPacketEncoder) Type() PacketType { return e.packetType } -func NewJsonEncoder(message TypedMessage) (PacketEncoder, error) { +func (e defaultPacketEncoder) Payload() []byte { + return e.data +} + +func NewJsonEncoder(message TypedMessage) PacketEncoder { data, err := json.Marshal(message) - if err != nil { - return nil, err - } + assert.NoError(err, "encoding a message with JSON should never fail") return defaultPacketEncoder{ - Reader: bytes.NewReader(data), + data: data, encoding: EncodingJson, packetType: message.Type(), - }, nil + } } -func NewMsgPackEncoder(message TypedMessage) (PacketEncoder, error) { +func NewMsgPackEncoder(message TypedMessage) PacketEncoder { data, err := msgpack.Marshal(message) - if err != nil { - return nil, err - } + assert.NoError(err, "encoding a message with msg pack should never fail") return defaultPacketEncoder{ - Reader: bytes.NewReader(data), + data: data, encoding: EncodingMsgPack, packetType: message.Type(), - }, nil + } } diff --git a/internal/packet/messages.go b/internal/packet/messages.go index b1a6598..c561079 100644 --- a/internal/packet/messages.go +++ b/internal/packet/messages.go @@ -4,43 +4,34 @@ import ( "github.com/kyren223/eko/internal/data" ) -type EkoMessage struct { - Message string `msgpack:"message"` -} - -func (m *EkoMessage) Type() PacketType { - return TypeEko -} - type ErrorMessage struct { Error string `msgpack:"error"` } -func (m *ErrorMessage) Type() PacketType { - return TypeError +func NewOkMessage() *ErrorMessage { + return &ErrorMessage{} } -type GetMessagesMessage struct { - Since *int64 - UpTo *int64 +func (m *ErrorMessage) Type() PacketType { + return PacketError } -func (m *GetMessagesMessage) Type() PacketType { - return TypeGetMessages +func (m *ErrorMessage) IsOk() bool { + return m.Error == "" } -type SendMessageMessage struct { +type SendMessage struct { Content string } -func (m *SendMessageMessage) Type() PacketType { - return TypeSendMessage +func (m *SendMessage) Type() PacketType { + return PacketSendMessage } -type MessagesMessage struct { +type Messages struct { Messages []data.Message } -func (m *MessagesMessage) Type() PacketType { - return TypeMessages +func (m *Messages) Type() PacketType { + return PacketMessages } diff --git a/internal/packet/packet.go b/internal/packet/packet.go index df3ee73..e9d5d94 100644 --- a/internal/packet/packet.go +++ b/internal/packet/packet.go @@ -60,11 +60,11 @@ func (t PacketType) String() string { case PacketError: return "PacketError" case PacketSendMessage: - return "PacketTypeSendMessage" + return "PacketSendMessage" case PacketMessages: - return "PacketTypeMessages" + return "PacketMessages" default: - return fmt.Sprintf("PacketTypeInvalid(%v)", byte(t)) + return fmt.Sprintf("PacketInvalidType(%v)", byte(t)) } } @@ -110,15 +110,15 @@ type Packet struct { func NewPacket(encoder PacketEncoder) Packet { payload := encoder.Payload() n := len(payload) - assert.Assert(0 <= n && n <= PAYLOAD_MAX_SIZE, "size of payload must be valid") + assert.Assert(0 <= n && n <= PAYLOAD_MAX_SIZE, "size of payload must be valid", "size", n) data := make([]byte, HEADER_SIZE+n) data[VERSION_OFFSET] = VERSION packetType, encoding := byte(encoder.Type()), byte(encoder.Encoding()) - assert.Assert(packetType <= 63, "packet type exceeded allowed size type=%v", packetType) - assert.Assert(encoding <= 3, "encoding exceeded allowed permutations encoding=%v", encoding) + assert.Assert(packetType <= 63, "packet type exceeded allowed size", "type", packetType) + assert.Assert(encoding <= 3, "encoding exceeded allowed size", "encoding", encoding) data[TYPE_OFFSET] = packetType | encoding<<6 binary.BigEndian.PutUint16(data[LENGTH_OFFSET:], uint16(n)) @@ -170,7 +170,7 @@ func (p Packet) DecodePayload(v TypedMessage) error { case EncodingUnused2: return fmt.Errorf("unsupported encoding: %v", p.Encoding().String()) default: - assert.Never("encoding from packet should always be valid encoding=%v", p.Encoding()) + assert.Never("encoding from packet should always be valid", "encoding", p.Encoding()) return nil } } diff --git a/internal/packet/packet_test.go b/internal/packet/packet_test.go deleted file mode 100644 index a523d59..0000000 --- a/internal/packet/packet_test.go +++ /dev/null @@ -1,108 +0,0 @@ -package packet - -import ( - "context" - "io" - "testing" - "time" - - "github.com/vmihailenco/msgpack/v5" -) - -func TestMsgPackEncoding(t *testing.T) { - request := EkoMessage{Message: "test"} - data, err := msgpack.Marshal(&request) - if err != nil { - t.Errorf("encoding error: %v", err) - return - } - var response EkoMessage - err = msgpack.Unmarshal(data, &response) - if err != nil { - t.Errorf("decoding error: %v", err) - return - } - if request.Message != response.Message { - t.Errorf("%v != %v", request.Message, response.Message) - return - } -} - -func TestPacketMsgPackEncoding(t *testing.T) { - request := EkoMessage{Message: "test"} - encoder1, err := NewMsgPackEncoder(&request) - encoder2, _ := NewMsgPackEncoder(&request) - if err != nil { - t.Errorf("encoding error: %v", err) - return - } - encodedBytes := make([]byte, PACKET_MAX_SIZE) - n, _ := encoder2.Read(encodedBytes[HEADER_SIZE:]) - - packet := NewPacket(encoder1) - var response EkoMessage - err = packet.DecodePayload(&response) - if err != nil { - t.Errorf("decoding error: %#v: packet: %v encoder: %v", err, packet.Payload(), encodedBytes[HEADER_SIZE:HEADER_SIZE+n]) - return - } - if request.Message != response.Message { - t.Errorf("%v != %v", request.Message, response.Message) - return - } -} - -type TestIoReader struct { - data []byte - len int -} - -func (r *TestIoReader) Read(data []byte) (int, error) { - if len(r.data) <= r.len { - // log.Println("RETURNING EOF:", len(data), r.len) - return 0, io.EOF - } - n := copy(data, r.data[r.len:]) - r.len += n - // log.Println("RETURNING N:", len(r.data), r.len) - return n, nil -} - -func (r *TestIoReader) start(msg TypedMessage, t *testing.T) { - encoder, err := NewMsgPackEncoder(msg) - if err != nil { - t.Errorf("encoding error: %v", err) - return - } - r.data = NewPacket(encoder).data - // log.Println("LEN:", len(r.data)) -} - -func TestPacketFramer(t *testing.T) { - reader := &TestIoReader{} - - // Long msg to test multiple - msg := EkoMessage{"Testing FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting FramerTesting Framer"} - reader.start(&msg, t) - - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - out, outErr := RunFramer(ctx, reader) - - var message EkoMessage - select { - case packet := <-out: - if err := packet.DecodePayload(&message); err != nil { - t.Errorf("error decoding response: %v", err) - return - } - if msg.Message != message.Message { - t.Errorf("%v != %v", msg.Message, message.Message) - return - } - - case err := <-outErr: - t.Errorf("error receiving packet: %v", err) - return - } -} -- cgit v1.3.1