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
+}