mirror of
https://github.com/shtorm-7/sing-box-extended.git
synced 2026-08-08 19:45:18 +03:00
Add call protocol, Rmux. Update AmneziaWG. Fixes and improvements
This commit is contained in:
132
transport/call/livekit/wire.go
Normal file
132
transport/call/livekit/wire.go
Normal file
@@ -0,0 +1,132 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user