From 688668f6d34d4d962247bd5df60c3fca61185927 Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Thu, 24 Oct 2024 16:39:14 +0300 Subject: feat: worked on client --- internal/packet/encoders.go | 17 +++++++++-------- internal/packet/packet.go | 37 +++++++++++++++++++++++++++++++------ 2 files changed, 40 insertions(+), 14 deletions(-) (limited to 'internal/packet') diff --git a/internal/packet/encoders.go b/internal/packet/encoders.go index f5841ce..760c11c 100644 --- a/internal/packet/encoders.go +++ b/internal/packet/encoders.go @@ -3,11 +3,12 @@ package packet import ( "encoding/json" - "github.com/kyren223/eko/pkg/assert" "github.com/vmihailenco/msgpack/v5" + + "github.com/kyren223/eko/pkg/assert" ) -type TypedMessage interface { +type Payload interface { Type() PacketType } @@ -29,24 +30,24 @@ func (e defaultPacketEncoder) Payload() []byte { return e.data } -func NewJsonEncoder(message TypedMessage) PacketEncoder { - data, err := json.Marshal(message) +func NewJsonEncoder(payload Payload) PacketEncoder { + data, err := json.Marshal(payload) assert.NoError(err, "encoding a message with JSON should never fail") return defaultPacketEncoder{ data: data, encoding: EncodingJson, - packetType: message.Type(), + packetType: payload.Type(), } } -func NewMsgPackEncoder(message TypedMessage) PacketEncoder { - data, err := msgpack.Marshal(message) +func NewMsgPackEncoder(payload Payload) PacketEncoder { + data, err := msgpack.Marshal(payload) assert.NoError(err, "encoding a message with msg pack should never fail") return defaultPacketEncoder{ data: data, encoding: EncodingMsgPack, - packetType: message.Type(), + packetType: payload.Type(), } } diff --git a/internal/packet/packet.go b/internal/packet/packet.go index e9d5d94..f38ad14 100644 --- a/internal/packet/packet.go +++ b/internal/packet/packet.go @@ -77,6 +77,15 @@ func (e PacketType) IsSupported() bool { } } +func (e PacketType) IsPush() bool { + switch e { + case PacketError, PacketSendMessage: + return false + default: + return true + } +} + const ( VERSION = byte(1) PACKET_MAX_SIZE = math.MaxUint16 @@ -156,7 +165,7 @@ func (p Packet) Into(writer io.Writer) (int, error) { return writer.Write(p.data) } -func (p Packet) DecodePayload(v TypedMessage) error { +func (p Packet) DecodePayloadInto(v Payload) error { if p.Type() != v.Type() { return fmt.Errorf("type mismatch: want %v got %v", p.Type(), v.Type()) } @@ -175,24 +184,40 @@ func (p Packet) DecodePayload(v TypedMessage) error { } } +func (p Packet) DecodedPayload() (Payload, error) { + var payload Payload + switch p.Type() { + case PacketError: + payload = &ErrorMessage{} + case PacketMessages: + payload = &Messages{} + case PacketSendMessage: + payload = &SendMessage{} + default: + assert.Never("packet type of a packet struct must always be valid") + } + err := p.DecodePayloadInto(payload) + return payload, err +} + var ( PacketUnsupportedVersion error = errors.New("packet error: unsupported version") PacketUnsupportedEncoding error = errors.New("packet error: unsupported encoding") PacketUnsupportedType error = errors.New("packet error: unsupported type") ) -type packetFramer struct { +type PacketFramer struct { buffer []byte Out chan Packet } -func NewFramer(ctx context.Context) packetFramer { - return packetFramer{ +func NewFramer(ctx context.Context) PacketFramer { + return PacketFramer{ Out: make(chan Packet, 10), } } -func (f *packetFramer) Push(ctx context.Context, data []byte) error { +func (f *PacketFramer) Push(ctx context.Context, data []byte) error { f.buffer = append(f.buffer, data...) for { @@ -208,7 +233,7 @@ func (f *packetFramer) Push(ctx context.Context, data []byte) error { } } -func (f *packetFramer) parse() (*Packet, error) { +func (f *PacketFramer) parse() (*Packet, error) { if len(f.buffer) < HEADER_SIZE { return nil, nil } -- cgit v1.3.1