@ -69,6 +69,17 @@ func (m NodeMutationLastSeen) Apply(n *tailcfg.Node) {
n . LastSeen = ptr . To ( m . LastSeen )
n . LastSeen = ptr . To ( m . LastSeen )
}
}
// NodeMutationCap is a NodeMutation that says a node's
// [tailcfg.CapabilityVersion] value has changed.
type NodeMutationCap struct {
mutatingNodeID
Cap tailcfg . CapabilityVersion
}
func ( m NodeMutationCap ) Apply ( n * tailcfg . Node ) {
n . Cap = m . Cap
}
var peerChangeFields = sync . OnceValue ( func ( ) [ ] reflect . StructField {
var peerChangeFields = sync . OnceValue ( func ( ) [ ] reflect . StructField {
var fields [ ] reflect . StructField
var fields [ ] reflect . StructField
rt := reflect . TypeFor [ tailcfg . PeerChange ] ( )
rt := reflect . TypeFor [ tailcfg . PeerChange ] ( )
@ -105,6 +116,8 @@ func NodeMutationsFromPatch(p *tailcfg.PeerChange) (_ []NodeMutation, ok bool) {
ret = append ( ret , NodeMutationOnline { mutatingNodeID ( p . NodeID ) , * p . Online } )
ret = append ( ret , NodeMutationOnline { mutatingNodeID ( p . NodeID ) , * p . Online } )
case "LastSeen" :
case "LastSeen" :
ret = append ( ret , NodeMutationLastSeen { mutatingNodeID ( p . NodeID ) , * p . LastSeen } )
ret = append ( ret , NodeMutationLastSeen { mutatingNodeID ( p . NodeID ) , * p . LastSeen } )
case "Cap" :
ret = append ( ret , NodeMutationCap { mutatingNodeID ( p . NodeID ) , p . Cap } )
}
}
}
}
return ret , true
return ret , true