mirror of
https://github.com/shtorm-7/sing-box-extended.git
synced 2026-08-07 22:35:16 +03:00
133 lines
2.4 KiB
Go
133 lines
2.4 KiB
Go
package livekit
|
|
|
|
import "fmt"
|
|
|
|
const (
|
|
wireVarint = 0
|
|
wireFixed64 = 1
|
|
wireBytes = 2
|
|
wireFixed32 = 5
|
|
)
|
|
|
|
type pbWriter struct{ buf []byte }
|
|
|
|
func (w *pbWriter) varint(v uint64) {
|
|
for v >= 0x80 {
|
|
w.buf = append(w.buf, byte(v)|0x80)
|
|
v >>= 7
|
|
}
|
|
w.buf = append(w.buf, byte(v))
|
|
}
|
|
|
|
func (w *pbWriter) tag(field, wire uint64) { w.varint(field<<3 | wire) }
|
|
|
|
func (w *pbWriter) string(field uint64, s string) {
|
|
w.tag(field, wireBytes)
|
|
w.varint(uint64(len(s)))
|
|
w.buf = append(w.buf, s...)
|
|
}
|
|
|
|
func (w *pbWriter) bytes(field uint64, b []byte) {
|
|
w.tag(field, wireBytes)
|
|
w.varint(uint64(len(b)))
|
|
w.buf = append(w.buf, b...)
|
|
}
|
|
|
|
func (w *pbWriter) message(field uint64, b []byte) { w.bytes(field, b) }
|
|
|
|
func (w *pbWriter) int32(field uint64, v int32) {
|
|
w.tag(field, wireVarint)
|
|
w.varint(uint64(uint32(v)))
|
|
}
|
|
|
|
func (w *pbWriter) int64(field uint64, v int64) {
|
|
w.tag(field, wireVarint)
|
|
w.varint(uint64(v))
|
|
}
|
|
|
|
func (w *pbWriter) uint32(field uint64, v uint32) {
|
|
w.tag(field, wireVarint)
|
|
w.varint(uint64(v))
|
|
}
|
|
|
|
func (w *pbWriter) bool(field uint64, v bool) {
|
|
w.tag(field, wireVarint)
|
|
if v {
|
|
w.varint(1)
|
|
} else {
|
|
w.varint(0)
|
|
}
|
|
}
|
|
|
|
type pbReader struct {
|
|
buf []byte
|
|
pos int
|
|
}
|
|
|
|
func (r *pbReader) eof() bool { return r.pos >= len(r.buf) }
|
|
|
|
func (r *pbReader) varint() (uint64, error) {
|
|
var v uint64
|
|
var shift uint
|
|
for {
|
|
if r.pos >= len(r.buf) {
|
|
return 0, fmt.Errorf("varint: unexpected eof")
|
|
}
|
|
b := r.buf[r.pos]
|
|
r.pos++
|
|
v |= uint64(b&0x7f) << shift
|
|
if b < 0x80 {
|
|
return v, nil
|
|
}
|
|
shift += 7
|
|
if shift >= 64 {
|
|
return 0, fmt.Errorf("varint: overflow")
|
|
}
|
|
}
|
|
}
|
|
|
|
func (r *pbReader) tag() (field, wire uint64, err error) {
|
|
t, err := r.varint()
|
|
if err != nil {
|
|
return 0, 0, err
|
|
}
|
|
return t >> 3, t & 7, nil
|
|
}
|
|
|
|
func (r *pbReader) bytes() ([]byte, error) {
|
|
n, err := r.varint()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if r.pos+int(n) > len(r.buf) {
|
|
return nil, fmt.Errorf("bytes: short read")
|
|
}
|
|
out := r.buf[r.pos : r.pos+int(n)]
|
|
r.pos += int(n)
|
|
return out, nil
|
|
}
|
|
|
|
func (r *pbReader) skipWire(wire uint64) error {
|
|
switch wire {
|
|
case wireVarint:
|
|
_, err := r.varint()
|
|
return err
|
|
case wireFixed64:
|
|
if r.pos+8 > len(r.buf) {
|
|
return fmt.Errorf("skip: short fixed64")
|
|
}
|
|
r.pos += 8
|
|
return nil
|
|
case wireBytes:
|
|
_, err := r.bytes()
|
|
return err
|
|
case wireFixed32:
|
|
if r.pos+4 > len(r.buf) {
|
|
return fmt.Errorf("skip: short fixed32")
|
|
}
|
|
r.pos += 4
|
|
return nil
|
|
}
|
|
return fmt.Errorf("unknown wire type %d", wire)
|
|
}
|