📚 VERSION: draft-01 ⛳️ STATE: v1.0.0
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.
- 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
See Y3 Codec SPEC
make test
go get -u github.com/yomorun/y3
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.Encoder
foo.SetSeqID(0x01, true)
// 0x02 -> foo.ID=-11
var id y3.Encoder
id.SetSeqID(0x02, false)
id.SetInt32V(-1)
foo.AddPacket(id)
// 0x83 -> &bar{}
var bar = y3.NewNodePacketEncoder(0x03)
// 0x04 -> bar.Name="C"
var name y3.Encoder
name.SetSeqID(0x04)
name.SetStringV("C")
bar.AddPacket(name)
// -> foo.bar=&bar
foo.AddNodePacket(bar)
// Buid to Packet
packet, _ = foo.Packet()
// Read to buf
buf := &bytes.Buffer{}
io.Copy(buf, packet.Reader())
fmt.Printf("res=%#v", buf) // res=[]byte{0x81, 0x08, 0x02, 0x01, 0x7F, 0x83, 0x03, 0x04, 0x01, 0x43}
}
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)
}
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/
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 }