MCPcopy Create free account
hub / github.com/encodeous/nylon / Refresh

Method Refresh

state/endpoint.go:68–117  ·  view source on GitHub ↗
(resolveExpiry time.Duration)

Source from the content-addressed store, hash-verified

66}
67
68func (ep *DynamicEndpoint) Refresh(resolveExpiry time.Duration) (netip.AddrPort, error) {
69 // 1. Try to parse as AddrPort directly
70 if ap, err := netip.ParseAddrPort(ep.Value); err == nil {
71 return ap, nil
72 }
73
74 ep.rw.RLock()
75 // if this endpoint is down, we will refresh every EndpointResolveDelay
76 if time.Since(ep.lastUpdate) < resolveExpiry && ep.lastValue != (netip.AddrPort{}) {
77 ep.rw.RUnlock()
78 return ep.lastValue, nil
79 }
80 ep.rw.RUnlock()
81
82 host, port, err := ep.Parse()
83 if err != nil {
84 return netip.AddrPort{}, err
85 }
86
87 ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
88 defer cancel()
89
90 // 2. Try SRV lookup
91 target, srvPort, err := ResolveSRV(ctx, "nylon", "udp", host)
92 if err == nil {
93 addrs, err := ResolveName(ctx, target)
94 if err == nil && len(addrs) > 0 {
95 ep.rw.Lock()
96 defer ep.rw.Unlock()
97 ep.lastUpdate = time.Now()
98 ep.lastValue = netip.AddrPortFrom(addrs[0], srvPort)
99 return ep.lastValue, nil
100 }
101 }
102
103 // 3. Normal A/AAAA lookup
104 addrs, err := ResolveName(ctx, host)
105 if err != nil {
106 return netip.AddrPort{}, err
107 }
108 if len(addrs) == 0 {
109 return netip.AddrPort{}, fmt.Errorf("no addresses found for %s", host)
110 }
111
112 ep.rw.Lock()
113 defer ep.rw.Unlock()
114 ep.lastUpdate = time.Now()
115 ep.lastValue = netip.AddrPortFrom(addrs[0], port)
116 return ep.lastValue, nil
117}
118
119func (ep *DynamicEndpoint) Get() (netip.AddrPort, error) {
120 if ap, err := netip.ParseAddrPort(ep.Value); err == nil {

Callers 1

InitMethod · 0.80

Calls 3

ParseMethod · 0.95
ResolveSRVFunction · 0.85
ResolveNameFunction · 0.85

Tested by

no test coverage detected