From bebea5a7e137ca982853f33be99c1fd9371db204 Mon Sep 17 00:00:00 2001 From: Derrick Hammer Date: Thu, 4 Jan 2024 08:21:19 -0500 Subject: [PATCH] feat: add serialize package --- serialize/seralizer.go | 50 ++++++++++++++++++++++++++++++++++++++++++ serialize/serialize.go | 32 +++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 serialize/seralizer.go create mode 100644 serialize/serialize.go diff --git a/serialize/seralizer.go b/serialize/seralizer.go new file mode 100644 index 0000000..042efce --- /dev/null +++ b/serialize/seralizer.go @@ -0,0 +1,50 @@ +package serialize + +import ( + "errors" + "git.lumeweb.com/LumeWeb/libs5-go/types" + "github.com/vmihailenco/msgpack/v5" +) + +/* + func NewSerializer(kind types.MetadataType) *Packer { + p := NewPacker() + _ = p.PackUint8(types.MetadataMagicByte) + _ = p.PackUint8(uint8(types.MetadataTypeDirectory)) + return p + } +*/ +func InitMarshaller(kind types.MetadataType, enc *msgpack.Encoder) error { + err := enc.EncodeUint8(types.MetadataMagicByte) + if err != nil { + return err + } + err = enc.EncodeUint8(uint8(kind)) + if err != nil { + return err + } + + return nil +} + +func InitUnmarshaller(kind types.MetadataType, enc *msgpack.Decoder) error { + val, err := enc.DecodeUint8() + if err != nil { + return err + } + + if val != types.MetadataMagicByte { + return errors.New("Invalid magic byte") + } + + val, err = enc.DecodeUint8() + if err != nil { + return err + } + + if val != uint8(kind) { + return errors.New("Invalid metadata type") + } + + return nil +} diff --git a/serialize/serialize.go b/serialize/serialize.go new file mode 100644 index 0000000..f0d5ab2 --- /dev/null +++ b/serialize/serialize.go @@ -0,0 +1,32 @@ +package serialize + +import ( + "encoding/base64" + "github.com/multiformats/go-multibase" +) + +func UnmarshalBase64UrlJSON(data []byte) ([]byte, error) { + strData := string(data) + if len(strData) >= 2 && strData[0] == '"' && strData[len(strData)-1] == '"' { + strData = strData[1 : len(strData)-1] + } + + if strData == "null" { + return nil, nil + } + + if strData[0] == 'u' { + _, decoded, err := multibase.Decode(strData) + if err != nil { + return nil, err + } + return decoded, nil + } + + decodedData, err := base64.RawURLEncoding.DecodeString(strData) + if err != nil { + return nil, err + } + + return decodedData, nil +}