| 96 | } |
| 97 | |
| 98 | func newNodeUpdater( |
| 99 | logger slog.Logger, callback func(n *Node), |
| 100 | id tailcfg.NodeID, np key.NodePublic, dp key.DiscoPublic, |
| 101 | ) *nodeUpdater { |
| 102 | u := &nodeUpdater{ |
| 103 | phased: phased{Cond: *(sync.NewCond(&sync.Mutex{}))}, |
| 104 | logger: logger, |
| 105 | id: id, |
| 106 | key: np, |
| 107 | discoKey: dp, |
| 108 | derpForcedWebsockets: make(map[int]string), |
| 109 | callback: callback, |
| 110 | } |
| 111 | go u.updateLoop() |
| 112 | return u |
| 113 | } |
| 114 | |
| 115 | // nodeLocked returns the current best node information. u.L must be held. |
| 116 | func (u *nodeUpdater) nodeLocked() *Node { |