| package memberlist |
| |
| // EventDelegate is a simpler delegate that is used only to receive |
| // notifications about members joining and leaving. The methods in this |
| // delegate may be called by multiple goroutines, but never concurrently. |
| // This allows you to reason about ordering. |
| type EventDelegate interface { |
| // NotifyJoin is invoked when a node is detected to have joined. |
| // The Node argument must not be modified. |
| NotifyJoin(*Node) |
| |
| // NotifyLeave is invoked when a node is detected to have left. |
| // The Node argument must not be modified. |
| NotifyLeave(*Node) |
| |
| // NotifyUpdate is invoked when a node is detected to have |
| // updated, usually involving the meta data. The Node argument |
| // must not be modified. |
| NotifyUpdate(*Node) |
| } |
| |
| // ChannelEventDelegate is used to enable an application to receive |
| // events about joins and leaves over a channel instead of a direct |
| // function call. |
| // |
| // Care must be taken that events are processed in a timely manner from |
| // the channel, since this delegate will block until an event can be sent. |
| type ChannelEventDelegate struct { |
| Ch chan<- NodeEvent |
| } |
| |
| // NodeEventType are the types of events that can be sent from the |
| // ChannelEventDelegate. |
| type NodeEventType int |
| |
| const ( |
| NodeJoin NodeEventType = iota |
| NodeLeave |
| NodeUpdate |
| ) |
| |
| // NodeEvent is a single event related to node activity in the memberlist. |
| // The Node member of this struct must not be directly modified. It is passed |
| // as a pointer to avoid unnecessary copies. If you wish to modify the node, |
| // make a copy first. |
| type NodeEvent struct { |
| Event NodeEventType |
| Node *Node |
| } |
| |
| func (c *ChannelEventDelegate) NotifyJoin(n *Node) { |
| c.Ch <- NodeEvent{NodeJoin, n} |
| } |
| |
| func (c *ChannelEventDelegate) NotifyLeave(n *Node) { |
| c.Ch <- NodeEvent{NodeLeave, n} |
| } |
| |
| func (c *ChannelEventDelegate) NotifyUpdate(n *Node) { |
| c.Ch <- NodeEvent{NodeUpdate, n} |
| } |