|
|
|
|
@ -57,6 +57,7 @@ type relayManager struct {
|
|
|
|
|
newServerEndpointCh chan newRelayServerEndpointEvent
|
|
|
|
|
rxHandshakeDiscoMsgCh chan relayHandshakeDiscoMsgEvent
|
|
|
|
|
serversCh chan set.Set[netip.AddrPort]
|
|
|
|
|
getServersCh chan chan set.Set[netip.AddrPort]
|
|
|
|
|
|
|
|
|
|
discoInfoMu sync.Mutex // guards the following field
|
|
|
|
|
discoInfoByServerDisco map[key.DiscoPublic]*relayHandshakeDiscoInfo
|
|
|
|
|
@ -185,10 +186,29 @@ func (r *relayManager) runLoop() {
|
|
|
|
|
if !r.hasActiveWorkRunLoop() {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
case getServersCh := <-r.getServersCh:
|
|
|
|
|
r.handleGetServersRunLoop(getServersCh)
|
|
|
|
|
if !r.hasActiveWorkRunLoop() {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (r *relayManager) handleGetServersRunLoop(getServersCh chan set.Set[netip.AddrPort]) {
|
|
|
|
|
servers := make(set.Set[netip.AddrPort], len(r.serversByAddrPort))
|
|
|
|
|
for server := range r.serversByAddrPort {
|
|
|
|
|
servers.Add(server)
|
|
|
|
|
}
|
|
|
|
|
getServersCh <- servers
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (r *relayManager) getServers() set.Set[netip.AddrPort] {
|
|
|
|
|
ch := make(chan set.Set[netip.AddrPort])
|
|
|
|
|
relayManagerInputEvent(r, nil, &r.getServersCh, ch)
|
|
|
|
|
return <-ch
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (r *relayManager) handleServersUpdateRunLoop(update set.Set[netip.AddrPort]) {
|
|
|
|
|
for k, v := range r.serversByAddrPort {
|
|
|
|
|
if !update.Contains(k) {
|
|
|
|
|
@ -244,6 +264,7 @@ func (r *relayManager) init() {
|
|
|
|
|
r.newServerEndpointCh = make(chan newRelayServerEndpointEvent)
|
|
|
|
|
r.rxHandshakeDiscoMsgCh = make(chan relayHandshakeDiscoMsgEvent)
|
|
|
|
|
r.serversCh = make(chan set.Set[netip.AddrPort])
|
|
|
|
|
r.getServersCh = make(chan chan set.Set[netip.AddrPort])
|
|
|
|
|
r.runLoopStoppedCh = make(chan struct{}, 1)
|
|
|
|
|
r.runLoopStoppedCh <- struct{}{}
|
|
|
|
|
})
|
|
|
|
|
|