chore codes

Kim committed Oct 20, 2025 at 18:55 UTC b0d1c9e910122b910c7b68c319943fb69528135d
3 files changed +122 -108
relaydns/director.go renamed
-108
@@ -8,118 +8,14 @@ import (
8 "net"
9 "net/http"
10 "sync"
11 - "sync/atomic"
11 "time"
12
14 - "github.com/libp2p/go-libp2p"
13 pubsub "github.com/libp2p/go-libp2p-pubsub"
14 "github.com/libp2p/go-libp2p/core/host"
15 "github.com/libp2p/go-libp2p/core/peer"
18 - "github.com/libp2p/go-libp2p/core/protocol"
16 ma "github.com/multiformats/go-multiaddr"
17 )
18
22 -type Advertise struct {
23 - Peer string `json:"peer"`
24 - Name string `json:"name,omitempty"`
25 - DNS string `json:"dns,omitempty"`
26 - Addrs []string `json:"addrs"`
27 - Ready bool `json:"ready"`
28 - Load float64 `json:"load"`
29 - TS time.Time `json:"ts"`
30 -}
31 -
32 -type HostEntry struct {
33 - Info Advertise
34 - AddrInfo *peer.AddrInfo
35 - LastSeen time.Time
36 -}
37 -
38 -type Picker struct {
39 - mu sync.RWMutex
40 - rr uint64
41 - list []HostEntry
42 - pinTo string
43 - pinTil time.Time
44 -}
45 -
46 -func (p *Picker) update(list []HostEntry) {
47 - p.mu.Lock()
48 - p.list = list
49 - p.mu.Unlock()
50 -}
51 -func (p *Picker) choose() (HostEntry, bool) {
52 - p.mu.RLock()
53 - defer p.mu.RUnlock()
54 - if len(p.list) == 0 {
55 - return HostEntry{}, false
56 - }
57 - if p.pinTo != "" && time.Now().Before(p.pinTil) {
58 - for _, e := range p.list {
59 - if e.Info.Peer == p.pinTo {
60 - return e, true
61 - }
62 - }
63 - }
64 - i := atomic.AddUint64(&p.rr, 1)
65 - return p.list[i%uint64(len(p.list))], true
66 -}
67 -func (p *Picker) pin(peerID string, dur time.Duration) {
68 - p.mu.Lock()
69 - p.pinTo = peerID
70 - p.pinTil = time.Now().Add(dur)
71 - p.mu.Unlock()
72 -}
73 -func (p *Picker) unpin() {
74 - p.mu.Lock()
75 - p.pinTo = ""
76 - p.pinTil = time.Time{}
77 - p.mu.Unlock()
78 -}
79 -
80 -// ---- libp2p host boot ----
81 -
82 -func MakeHost(ctx context.Context, enableRelay bool) (host.Host, error) {
83 - opts := []libp2p.Option{
84 - libp2p.DefaultTransports, // TCP+QUIC
85 - libp2p.EnableNATService(), // AutoNAT helper
86 - libp2p.EnableHolePunching(), // DCUtR
87 - libp2p.DefaultSecurity,
88 - libp2p.DefaultMuxers,
89 - libp2p.EnableAutoRelay(), // ← 추가
90 - }
91 - if enableRelay {
92 - opts = append(opts, libp2p.EnableRelay()) // circuit relay (useful both as client & svc)
93 - }
94 - h, err := libp2p.New(opts...)
95 - if err != nil {
96 - return nil, err
97 - }
98 - return h, nil
99 -}
100 -
101 -func ConnectBootstraps(ctx context.Context, h host.Host, addrs []string) {
102 - for _, s := range addrs {
103 - m, err := ma.NewMultiaddr(s)
104 - if err != nil {
105 - log.Printf("bootstrap bad multiaddr %q: %v", s, err)
106 - continue
107 - }
108 - ai, err := peer.AddrInfoFromP2pAddr(m)
109 - if err != nil {
110 - log.Printf("bootstrap missing /p2p/ in %q: %v", s, err)
111 - continue
112 - }
113 - if err := h.Connect(ctx, *ai); err != nil {
114 - log.Printf("bootstrap connect %s: %v", ai.ID, err)
115 - } else {
116 - log.Printf("connected bootstrap %s", ai.ID)
117 - }
118 - }
119 -}
120 -
121 -// ---- director ----
122 -
19 type Director struct {
20 ctx context.Context
21 h host.Host
@@ -302,7 +198,3 @@ func (d *Director) ServeHTTP(addr string) error {
198 log.Printf("director HTTP API on %s", addr)
199 return http.ListenAndServe(addr, mux)
200 }
305 -
306 -func protocolID(s string) protocol.ID {
307 - return protocol.ID(s)
308 -}
relaydns/host.go new
+50
@@ -0,0 +1,50 @@
1 +package relaydns
2 +
3 +import (
4 + "context"
5 + "log"
6 +
7 + "github.com/libp2p/go-libp2p"
8 + "github.com/libp2p/go-libp2p/core/host"
9 + "github.com/libp2p/go-libp2p/core/peer"
10 + ma "github.com/multiformats/go-multiaddr"
11 +)
12 +
13 +func MakeHost(ctx context.Context, enableRelay bool) (host.Host, error) {
14 + opts := []libp2p.Option{
15 + libp2p.DefaultTransports, // TCP+QUIC
16 + libp2p.EnableNATService(), // AutoNAT helper
17 + libp2p.EnableHolePunching(), // DCUtR
18 + libp2p.DefaultSecurity,
19 + libp2p.DefaultMuxers,
20 + libp2p.EnableAutoRelay(), // ← 추가
21 + }
22 + if enableRelay {
23 + opts = append(opts, libp2p.EnableRelay()) // circuit relay (useful both as client & svc)
24 + }
25 + h, err := libp2p.New(opts...)
26 + if err != nil {
27 + return nil, err
28 + }
29 + return h, nil
30 +}
31 +
32 +func ConnectBootstraps(ctx context.Context, h host.Host, addrs []string) {
33 + for _, s := range addrs {
34 + m, err := ma.NewMultiaddr(s)
35 + if err != nil {
36 + log.Printf("bootstrap bad multiaddr %q: %v", s, err)
37 + continue
38 + }
39 + ai, err := peer.AddrInfoFromP2pAddr(m)
40 + if err != nil {
41 + log.Printf("bootstrap missing /p2p/ in %q: %v", s, err)
42 + continue
43 + }
44 + if err := h.Connect(ctx, *ai); err != nil {
45 + log.Printf("bootstrap connect %s: %v", ai.ID, err)
46 + } else {
47 + log.Printf("connected bootstrap %s", ai.ID)
48 + }
49 + }
50 +}
relaydns/types.go new
+72
@@ -0,0 +1,72 @@
1 +package relaydns
2 +
3 +import (
4 + "sync"
5 + "sync/atomic"
6 + "time"
7 +
8 + "github.com/libp2p/go-libp2p/core/peer"
9 + "github.com/libp2p/go-libp2p/core/protocol"
10 +)
11 +
12 +type Advertise struct {
13 + Peer string `json:"peer"`
14 + Name string `json:"name,omitempty"`
15 + DNS string `json:"dns,omitempty"`
16 + Addrs []string `json:"addrs"`
17 + Ready bool `json:"ready"`
18 + Load float64 `json:"load"`
19 + TS time.Time `json:"ts"`
20 +}
21 +
22 +type HostEntry struct {
23 + Info Advertise
24 + AddrInfo *peer.AddrInfo
25 + LastSeen time.Time
26 +}
27 +
28 +type Picker struct {
29 + mu sync.RWMutex
30 + rr uint64
31 + list []HostEntry
32 + pinTo string
33 + pinTil time.Time
34 +}
35 +
36 +func (p *Picker) update(list []HostEntry) {
37 + p.mu.Lock()
38 + p.list = list
39 + p.mu.Unlock()
40 +}
41 +func (p *Picker) choose() (HostEntry, bool) {
42 + p.mu.RLock()
43 + defer p.mu.RUnlock()
44 + if len(p.list) == 0 {
45 + return HostEntry{}, false
46 + }
47 + if p.pinTo != "" && time.Now().Before(p.pinTil) {
48 + for _, e := range p.list {
49 + if e.Info.Peer == p.pinTo {
50 + return e, true
51 + }
52 + }
53 + }
54 + i := atomic.AddUint64(&p.rr, 1)
55 + return p.list[i%uint64(len(p.list))], true
56 +}
57 +func (p *Picker) pin(peerID string, dur time.Duration) {
58 + p.mu.Lock()
59 + p.pinTo = peerID
60 + p.pinTil = time.Now().Add(dur)
61 + p.mu.Unlock()
62 +}
63 +func (p *Picker) unpin() {
64 + p.mu.Lock()
65 + p.pinTo = ""
66 + p.pinTil = time.Time{}
67 + p.mu.Unlock()
68 +}
69 +
70 +func protocolID(s string) protocol.ID {
71 + return protocol.ID(s)
72 +}