-
Notifications
You must be signed in to change notification settings - Fork 0
/
meta.go
41 lines (35 loc) · 968 Bytes
/
meta.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package rdv
import (
"errors"
"fmt"
"net/netip"
"slices"
)
// Metadata associated with the rdv http handshake between client and server.
type Meta struct {
// Request data
Method, Token string
SelfAddrs []netip.AddrPort
// Response data
ObservedAddr *netip.AddrPort
PeerAddrs []netip.AddrPort
}
func newMeta(method, token string) (*Meta, error) {
if token == "" {
return nil, errors.New("missing rdv token")
}
if !(method == DIAL || method == ACCEPT) {
return nil, fmt.Errorf("unknown rdv method [%v]", method)
}
return &Meta{Method: method, Token: token}, nil
}
// Returns a list of observed and self-reported addrs, de-duplicated
func (m *Meta) selfAndObservedAddrs() []netip.AddrPort {
addrs := make([]netip.AddrPort, 0, len(m.SelfAddrs)+1)
addrs = append(addrs, m.SelfAddrs...)
if m.ObservedAddr != nil {
addrs = append(addrs, *m.ObservedAddr)
}
slices.SortFunc(addrs, netip.AddrPort.Compare)
return slices.Compact(addrs)
}