Skip to content
/ y3 Public

Golang implementation of Y3 Codec, a fast than real-time TLV based binary codec with low CPU usage

License

Notifications You must be signed in to change notification settings

yomorun/y3

Folders and files

NameName
Last commit message
Last commit date

Latest commit

5a8e69d · Feb 27, 2022

History

11 Commits
Aug 19, 2021
Feb 27, 2022
Aug 29, 2021
Aug 19, 2021
Aug 10, 2021
Aug 10, 2021
Aug 20, 2021
Aug 19, 2021
Aug 20, 2021
Aug 20, 2021
Aug 20, 2021
Aug 10, 2021
Aug 10, 2021
Aug 20, 2021
Aug 20, 2021
Aug 19, 2021
Aug 20, 2021
Feb 27, 2022
Aug 30, 2021
Aug 20, 2021
Aug 20, 2021
Aug 20, 2021
Aug 20, 2021
Aug 29, 2021
Aug 29, 2021
Aug 29, 2021
Aug 29, 2021
Aug 19, 2021
Aug 19, 2021

Repository files navigation

📚 VERSION: draft-01 ⛳️ STATE: v1.0.0

Y3

FOSSA Status

Y3 is the golang implementation of Y3 Codec, which describe a fast and low CPU binding data encoder/decoder focus on edge computing and streaming processing.

Advantage

  • Super fast encode/decode for streaming data
  • Low CPU consumption when decoding large data
  • Random access
  • Tuned for QUIC protocol
  • Designed for global communication at high frequency

Y3 Codec Specification

See Y3 Codec SPEC

Test

make test

Use

go get -u github.com/yomorun/y3

Examples

Encode examples

package main

import (
	"fmt"
	y3 "github.com/yomorun/y3"
)

func main() {
	// if we want to repesent `var obj = &foo{ID: -1, bar: &bar{Name: "C"}}`
	// in Y3-Codec:

	// 0x81 -> node
	var foo = y3.NewNodePacketEncoder(0x01)

	// 0x02 -> foo.ID=-11
	var yp1 = y3.NewPrimitivePacketEncoder(0x02)
	yp1.SetInt32Value(-1)
	foo.AddPrimitivePacket(yp1)

	// 0x83 -> &bar{}
	var bar = y3.NewNodePacketEncoder(0x03)

	// 0x04 -> bar.Name="C"
	var yp2 = y3.NewPrimitivePacketEncoder(0x04)
	yp2.SetStringValue("C")
	bar.AddPrimitivePacket(yp2)

	// -> foo.bar=&bar
	foo.AddNodePacket(bar)

	fmt.Printf("res=%#v", foo.Encode()) // res=[]byte{0x81, 0x08, 0x02, 0x01, 0x7F, 0x83, 0x03, 0x04, 0x01, 0x43}
}

Decode examples 1: decode a primitive packet

package main

import (
	"fmt"
	y3 "github.com/yomorun/y3"
)

func main() {
	fmt.Println(">> Parsing [0x0A, 0x01, 0x7F], which like Key-Value format = 0x0A: 127")
	buf := []byte{0x0A, 0x01, 0x7F}
	res, _, err := y3.DecodePrimitivePacket(buf)
	v1, err := res.ToUInt32()
	if err != nil {
		panic(err)
	}

	fmt.Printf("Tag Key=[%#X], Value=%v\n", res.SeqID(), v1)
}

Decode examples 2: decode a node packet

package main

import (
	"fmt"
	y3 "github.com/yomorun/y3"
)

func main() {
	fmt.Println(">> Parsing [0x84, 0x06, 0x0A, 0x01, 0x7F, 0x0B, 0x01, 0x43] EQUALS JSON= 0x84: { 0x0A: -1, 0x0B: 'C' }")
	buf := []byte{0x84, 0x06, 0x0A, 0x01, 0x7F, 0x0B, 0x01, 0x43}
	res, _, err := y3.DecodeNodePacket(buf)
	v1 := res.PrimitivePackets[0]

	p1, err := v1.ToInt32()
	if err != nil {
		panic(err)
	}
	fmt.Printf("Tag Key=[%#X.%#X], Value=%v\n", res.SeqID(), v1.SeqID(), p1)

	v2 := res.PrimitivePackets[1]

	p2, err := v2.ToUTF8String()
	if err != nil {
		panic(err)
	}

	fmt.Printf("Tag Key=[%#X.%#X], Value=%v\n", res.SeqID(), v2.SeqID(), p2)
}

More examples in /examples/

Types

Y3 implements the YoMo Codec protocol and supports the following Golang data types:

int32
uint32
int64
uint64
float32
float64
bool
string
bytes
buf := []byte("yomo")
p := NewPrimitivePacketEncoder(0x02)
p.SetBytesValue(buf)
res := p.Encode()
// res -> { 0x02, 0x04, 0x79, 0x6F, 0x6D, 0x6F }

Contributors

License

FOSSA Status