libs5-go/protocol/base/incoming_message.go

129 lines
2.8 KiB
Go
Raw Normal View History

package base
2024-01-06 11:33:46 +00:00
import (
"fmt"
2024-01-07 08:19:04 +00:00
"git.lumeweb.com/LumeWeb/libs5-go/interfaces"
2024-01-06 11:33:46 +00:00
"git.lumeweb.com/LumeWeb/libs5-go/net"
"github.com/vmihailenco/msgpack/v5"
"io"
2024-01-06 11:33:46 +00:00
"net/url"
)
2024-01-08 06:16:20 +00:00
//go:generate mockgen -source=incoming_message.go -destination=../../mocks/base/incoming_message.go -package=base
var _ msgpack.CustomDecoder = (*IncomingMessageImpl)(nil)
var _ IncomingMessage = (*IncomingMessageImpl)(nil)
2024-01-07 12:57:24 +00:00
var _ IncomingMessageTyped = (*IncomingMessageImpl)(nil)
2024-01-06 11:33:46 +00:00
type IncomingMessageHandler func(node interfaces.Node, peer *net.Peer, u *url.URL, verifyId bool) error
2024-01-06 11:33:46 +00:00
type IncomingMessageImpl struct {
kind int
data msgpack.RawMessage
original []byte
known bool
self IncomingMessage
incoming IncomingMessage
}
func (i *IncomingMessageImpl) Self() IncomingMessage {
return i.self
}
func (i *IncomingMessageImpl) SetSelf(self IncomingMessage) {
i.self = self
}
func (i *IncomingMessageImpl) DecodeMessage(dec *msgpack.Decoder) error {
panic("child class should implement this method")
}
func (i *IncomingMessageImpl) Known() bool {
return i.known
}
func (i *IncomingMessageImpl) SetKnown(known bool) {
i.known = known
}
func (i *IncomingMessageImpl) SetOriginal(original []byte) {
i.original = original
}
func (i *IncomingMessageImpl) Original() []byte {
return i.original
2024-01-06 11:33:46 +00:00
}
func (i *IncomingMessageImpl) SetIncomingMessage(msg IncomingMessage) {
i.incoming = msg
i.known = true
}
func (i *IncomingMessageImpl) IncomingMessage() IncomingMessage {
return i.incoming
2024-01-06 11:33:46 +00:00
}
func (i *IncomingMessageImpl) Kind() int {
2024-01-06 11:33:46 +00:00
return i.kind
}
func (i *IncomingMessageImpl) ToMessage() (message []byte, err error) {
return msgpack.Marshal(i)
}
func (i *IncomingMessageImpl) HandleMessage(node interfaces.Node, peer net.Peer, verifyId bool) error {
2024-01-06 11:33:46 +00:00
panic("child class should implement this method")
}
func (i *IncomingMessageImpl) Data() msgpack.RawMessage {
return i.data
}
type IncomingMessageTypedImpl struct {
IncomingMessageImpl
}
func NewIncomingMessageUnknown() *IncomingMessageImpl {
return &IncomingMessageImpl{
known: false,
}
}
func NewIncomingMessageKnown(kind int, data msgpack.RawMessage) *IncomingMessageImpl {
2024-01-06 11:33:46 +00:00
return &IncomingMessageImpl{
kind: kind,
data: data,
known: true,
}
}
func NewIncomingMessageTyped(kind int, data msgpack.RawMessage) *IncomingMessageTypedImpl {
2024-01-06 11:33:46 +00:00
known := NewIncomingMessageKnown(kind, data)
return &IncomingMessageTypedImpl{*known}
}
func (i *IncomingMessageImpl) DecodeMsgpack(dec *msgpack.Decoder) error {
if i.known {
if msgTyped, ok := interface{}(i.Self()).(IncomingMessageTyped); ok {
2024-01-06 11:33:46 +00:00
return msgTyped.DecodeMessage(dec)
}
return fmt.Errorf("type assertion to IncomingMessageTyped failed")
}
kind, err := dec.DecodeInt()
if err != nil {
return err
}
i.kind = kind
2024-01-06 11:33:46 +00:00
raw, err := io.ReadAll(dec.Buffered())
2024-01-06 11:33:46 +00:00
if err != nil {
return err
}
i.data = raw
return nil
}