main
go 43 lines 1.07 KB
Raw
1 package types
2
3 import (
4 "encoding/binary"
5 "errors"
6 )
7
8 // errDatagramTooSmall is returned when a datagram payload is too short to
9 // contain a valid flow ID varint.
10 var errDatagramTooSmall = errors.New("datagram too small to decode")
11
12 // DatagramFrame carries one relayed datagram.
13 // Wire encoding uses only FlowID and Payload with layout:
14 // [flowID varint][payload bytes]
15 type DatagramFrame struct {
16 FlowID uint32
17 Payload []byte
18 Address string
19 RelayURL string
20 UDPAddr string
21 }
22
23 // EncodeDatagram serialises a flow-framed datagram for transmission.
24 func EncodeDatagram(flowID uint32, payload []byte) []byte {
25 var buf [binary.MaxVarintLen32]byte
26 n := binary.PutUvarint(buf[:], uint64(flowID))
27 out := make([]byte, n+len(payload))
28 copy(out, buf[:n])
29 copy(out[n:], payload)
30 return out
31 }
32
33 // DecodeDatagram deserialises a flow-framed datagram.
34 func DecodeDatagram(data []byte) (DatagramFrame, error) {
35 flowID, n := binary.Uvarint(data)
36 if n <= 0 {
37 return DatagramFrame{}, errDatagramTooSmall
38 }
39 return DatagramFrame{
40 FlowID: uint32(flowID),
41 Payload: data[n:],
42 }, nil
43 }