remove exposureRelay

Kim committed Mar 17, 2026 at 12:30 UTC 36e19f2b28e98c62b50f9ef70254ef24fab8d17a
1 file changed +37 -39
sdk/expose.go
+37 -39
@@ -21,7 +21,7 @@ import (
21 // traffic from all of them through one net.Listener.
22 type Exposure struct {
23 listener net.Listener
24 - relays []exposureRelay
24 + listeners []*Listener
25 done chan struct{}
26
27 closeOnce sync.Once
@@ -39,12 +39,12 @@ func Expose(ctx context.Context, relayUrls []string, name string, metadata types
39 if len(relayURLs) == 0 {
40 return nil, nil
41 }
42 - relays := make([]exposureRelay, 0, len(relayURLs))
42 + listeners := make([]*Listener, 0, len(relayURLs))
43 cleanup := func() error {
44 var closeErr error
45 - for _, relay := range relays {
46 - if relay.listener != nil {
47 - closeErr = errors.Join(closeErr, relay.listener.Close())
45 + for _, listener := range listeners {
46 + if listener != nil {
47 + closeErr = errors.Join(closeErr, listener.Close())
48 }
49 }
50 return closeErr
@@ -59,32 +59,29 @@ func Expose(ctx context.Context, relayUrls []string, name string, metadata types
59 return nil, errors.Join(fmt.Errorf("listen %q: %w", relayURL, err), cleanup())
60 }
61
62 - relays = append(relays, exposureRelay{
63 - relayURL: relayURL,
64 - listener: listener,
65 - })
62 + listeners = append(listeners, listener)
63 }
64
68 - listeners := make([]net.Listener, 0, len(relays))
69 - for _, relay := range relays {
70 - listeners = append(listeners, relay.listener)
65 + mergedListeners := make([]net.Listener, 0, len(listeners))
66 + for _, listener := range listeners {
67 + mergedListeners = append(mergedListeners, listener)
68 }
69
73 - merged, err := mergeListeners(listeners...)
70 + merged, err := mergeListeners(mergedListeners...)
71 if err != nil {
72 return nil, errors.Join(fmt.Errorf("merge listeners: %w", err), cleanup())
73 }
74
75 exposure := &Exposure{
76 listener: merged,
80 - relays: relays,
77 + listeners: listeners,
78 done: make(chan struct{}),
79 }
80 go exposure.monitorStartupCounts(ctx)
81
82 log.Info().
83 Str("release_version", types.ReleaseVersion).
87 - Int("relay_count", len(exposure.relays)).
84 + Int("relay_count", len(exposure.listeners)).
85 Strs("relays", exposure.RelayURLs()).
86 Msgf("exposure relay started")
87
@@ -133,30 +130,33 @@ func (e *Exposure) Addr() net.Addr {
130
131 // RelayURLs returns the normalized relay URLs backing the exposure.
132 func (e *Exposure) RelayURLs() []string {
136 - if e == nil || len(e.relays) == 0 {
133 + if e == nil || len(e.listeners) == 0 {
134 return nil
135 }
136
140 - out := make([]string, 0, len(e.relays))
141 - for _, relay := range e.relays {
142 - out = append(out, relay.relayURL)
137 + out := make([]string, 0, len(e.listeners))
138 + for _, listener := range e.listeners {
139 + if listener == nil {
140 + continue
141 + }
142 + out = append(out, listener.relayURL)
143 }
144 return out
145 }
146
147 // PublicURLs returns the de-duplicated public URLs exposed by the exposure.
148 func (e *Exposure) PublicURLs() []string {
149 - if e == nil || len(e.relays) == 0 {
149 + if e == nil || len(e.listeners) == 0 {
150 return nil
151 }
152
153 - out := make([]string, 0, len(e.relays))
153 + out := make([]string, 0, len(e.listeners))
154 seen := make(map[string]struct{})
155 - for _, relay := range e.relays {
156 - if relay.listener == nil {
155 + for _, listener := range e.listeners {
156 + if listener == nil {
157 continue
158 }
159 - rawURL := relay.listener.PublicURL()
159 + rawURL := listener.PublicURL()
160 if rawURL == "" {
161 continue
162 }
@@ -199,12 +199,12 @@ func (e *Exposure) Close() error {
199 }
200
201 event := log.Info().
202 - Int("relay_count", len(e.relays)).
202 + Int("relay_count", len(e.listeners)).
203 Strs("relays", e.RelayURLs())
204 if closeErr != nil {
205 event = log.Warn().
206 Err(closeErr).
207 - Int("relay_count", len(e.relays)).
207 + Int("relay_count", len(e.listeners)).
208 Strs("relays", e.RelayURLs())
209 }
210 event.Msg("exposure closed")
@@ -325,17 +325,17 @@ func (e *Exposure) monitorStartupCounts(ctx context.Context) {
325
326 ticker := time.NewTicker(time.Second)
327 defer ticker.Stop()
328 - prevStatuses := make(map[string]listenerStatus, len(e.relays))
328 + prevStatuses := make(map[string]listenerStatus, len(e.listeners))
329 firstRun := true
330
331 for {
332 readyCount, inactiveCount := 0, 0
333 activated := make([]string, 0)
334 deactivated := make([]string, 0)
335 - for _, relay := range e.relays {
335 + for _, listener := range e.listeners {
336 status := listenerStatusInactive
337 - if relay.listener != nil {
338 - status = relay.listener.StartupStatus()
337 + if listener != nil {
338 + status = listener.StartupStatus()
339 }
340 if status == listenerStatusReady {
341 readyCount++
@@ -343,14 +343,17 @@ func (e *Exposure) monitorStartupCounts(ctx context.Context) {
343 inactiveCount++
344 }
345
346 - if prev, ok := prevStatuses[relay.relayURL]; ok && prev != status {
346 + if listener == nil {
347 + continue
348 + }
349 + if prev, ok := prevStatuses[listener.relayURL]; ok && prev != status {
350 if status == listenerStatusReady {
348 - activated = append(activated, relay.relayURL)
351 + activated = append(activated, listener.relayURL)
352 } else {
350 - deactivated = append(deactivated, relay.relayURL)
353 + deactivated = append(deactivated, listener.relayURL)
354 }
355 }
353 - prevStatuses[relay.relayURL] = status
356 + prevStatuses[listener.relayURL] = status
357 }
358
359 if firstRun || len(activated) > 0 || len(deactivated) > 0 {
@@ -377,11 +380,6 @@ func (e *Exposure) monitorStartupCounts(ctx context.Context) {
380 }
381 }
382
380 -type exposureRelay struct {
381 - relayURL string
382 - listener *Listener
383 -}
384 -
383 type exposureConn struct {
384 net.Conn
385 id uint64