diff options
| author | Kyren223 <ulmliad223@gmail.com> | 2024-10-24 16:39:14 +0300 |
|---|---|---|
| committer | Kyren223 <ulmliad223@gmail.com> | 2024-10-24 16:39:14 +0300 |
| commit | 688668f6d34d4d962247bd5df60c3fca61185927 (patch) | |
| tree | 459a29a76bb3a8cd77cdeccf35d7c1689374d09d /internal/packet/packet.go | |
| parent | 6f83f199f8311bf7782da59bc2e07df38073e65a (diff) | |
feat: worked on client
Diffstat (limited to 'internal/packet/packet.go')
| -rw-r--r-- | internal/packet/packet.go | 37 |
1 files changed, 31 insertions, 6 deletions
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 } |
