|  |  | @ -79,7 +79,7 @@ type PendingACL struct { | 
			
		
	
		
		
			
				
					
					|  |  |  |   Source NodeID |  |  |  |   Source NodeID | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | type PendingSignal struct { |  |  |  | type PendingACLSignal struct { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   Policy uuid.UUID |  |  |  |   Policy uuid.UUID | 
			
		
	
		
		
			
				
					
					|  |  |  |   Timeout uuid.UUID |  |  |  |   Timeout uuid.UUID | 
			
		
	
		
		
			
				
					
					|  |  |  |   ID uuid.UUID |  |  |  |   ID uuid.UUID | 
			
		
	
	
		
		
			
				
					|  |  | @ -91,11 +91,12 @@ type Node struct { | 
			
		
	
		
		
			
				
					
					|  |  |  |   Key ed25519.PrivateKey `gv:"key"` |  |  |  |   Key ed25519.PrivateKey `gv:"key"` | 
			
		
	
		
		
			
				
					
					|  |  |  |   ID NodeID |  |  |  |   ID NodeID | 
			
		
	
		
		
			
				
					
					|  |  |  |   Type NodeType `gv:"type"` |  |  |  |   Type NodeType `gv:"type"` | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   // TODO: move each extension to it's own db key, and extend changes to notify which extension was changed
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   Extensions map[ExtType]Extension `gv:"extensions"` |  |  |  |   Extensions map[ExtType]Extension `gv:"extensions"` | 
			
		
	
		
		
			
				
					
					|  |  |  |   Policies []Policy `gv:"policies"` |  |  |  |   Policies []Policy `gv:"policies"` | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   PendingACLs map[uuid.UUID]PendingACL `gv:"pending_acls"` |  |  |  |   PendingACLs map[uuid.UUID]PendingACL `gv:"pending_acls"` | 
			
		
	
		
		
			
				
					
					|  |  |  |   PendingSignals map[uuid.UUID]PendingSignal `gv:"pending_signal"` |  |  |  |   PendingACLSignals map[uuid.UUID]PendingACLSignal `gv:"pending_signal"` | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   // Channel for this node to receive messages from the Context
 |  |  |  |   // Channel for this node to receive messages from the Context
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   MsgChan chan *Message |  |  |  |   MsgChan chan *Message | 
			
		
	
	
		
		
			
				
					|  |  | @ -106,6 +107,8 @@ type Node struct { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   Active atomic.Bool |  |  |  |   Active atomic.Bool | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   // TODO: enhance WriteNode to write SignalQueue to a different key, and use writeSignalQueue to decide whether or not to update it
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   writeSignalQueue bool | 
			
		
	
		
		
			
				
					
					|  |  |  |   SignalQueue []QueuedSignal `gv:"signal_queue"` |  |  |  |   SignalQueue []QueuedSignal `gv:"signal_queue"` | 
			
		
	
		
		
			
				
					
					|  |  |  |   NextSignal *QueuedSignal |  |  |  |   NextSignal *QueuedSignal | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
	
		
		
			
				
					|  |  | @ -181,6 +184,7 @@ func (node *Node) QueueTimeout(dest NodeID, signal Signal, timeout time.Duration | 
			
		
	
		
		
			
				
					
					|  |  |  | func (node *Node) QueueSignal(time time.Time, signal Signal) { |  |  |  | func (node *Node) QueueSignal(time time.Time, signal Signal) { | 
			
		
	
		
		
			
				
					
					|  |  |  |   node.SignalQueue = append(node.SignalQueue, QueuedSignal{signal, time}) |  |  |  |   node.SignalQueue = append(node.SignalQueue, QueuedSignal{signal, time}) | 
			
		
	
		
		
			
				
					
					|  |  |  |   node.NextSignal, node.TimeoutChan = SoonestSignal(node.SignalQueue) |  |  |  |   node.NextSignal, node.TimeoutChan = SoonestSignal(node.SignalQueue) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   node.writeSignalQueue = true | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | func (node *Node) DequeueSignal(id uuid.UUID) error { |  |  |  | func (node *Node) DequeueSignal(id uuid.UUID) error { | 
			
		
	
	
		
		
			
				
					|  |  | @ -198,16 +202,11 @@ func (node *Node) DequeueSignal(id uuid.UUID) error { | 
			
		
	
		
		
			
				
					
					|  |  |  |   node.SignalQueue[idx] = node.SignalQueue[len(node.SignalQueue)-1] |  |  |  |   node.SignalQueue[idx] = node.SignalQueue[len(node.SignalQueue)-1] | 
			
		
	
		
		
			
				
					
					|  |  |  |   node.SignalQueue = node.SignalQueue[:len(node.SignalQueue)-1] |  |  |  |   node.SignalQueue = node.SignalQueue[:len(node.SignalQueue)-1] | 
			
		
	
		
		
			
				
					
					|  |  |  |   node.NextSignal, node.TimeoutChan = SoonestSignal(node.SignalQueue) |  |  |  |   node.NextSignal, node.TimeoutChan = SoonestSignal(node.SignalQueue) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   node.writeSignalQueue = true | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   return nil |  |  |  |   return nil | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | func (node *Node) ClearSignalQueue() { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   node.SignalQueue = []QueuedSignal{} |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   node.NextSignal = nil |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   node.TimeoutChan = nil |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | func SoonestSignal(signals []QueuedSignal) (*QueuedSignal, <-chan time.Time) { |  |  |  | func SoonestSignal(signals []QueuedSignal) (*QueuedSignal, <-chan time.Time) { | 
			
		
	
		
		
			
				
					
					|  |  |  |   var soonest_signal *QueuedSignal |  |  |  |   var soonest_signal *QueuedSignal | 
			
		
	
		
		
			
				
					
					|  |  |  |   var soonest_time time.Time |  |  |  |   var soonest_time time.Time | 
			
		
	
	
		
		
			
				
					|  |  | @ -359,7 +358,7 @@ func nodeLoop(ctx *Context, node *Node) error { | 
			
		
	
		
		
			
				
					
					|  |  |  |               msgs = append(msgs, m) |  |  |  |               msgs = append(msgs, m) | 
			
		
	
		
		
			
				
					
					|  |  |  |               timeout_signal := NewTimeoutSignal(m.Signal.ID()) |  |  |  |               timeout_signal := NewTimeoutSignal(m.Signal.ID()) | 
			
		
	
		
		
			
				
					
					|  |  |  |               node.QueueSignal(time.Now().Add(time.Second), timeout_signal) |  |  |  |               node.QueueSignal(time.Now().Add(time.Second), timeout_signal) | 
			
		
	
		
		
			
				
					
					|  |  |  |               node.PendingSignals[m.Signal.ID()] = PendingSignal{policy_type, timeout_signal.Id, msg.Signal.ID()} |  |  |  |               node.PendingACLSignals[m.Signal.ID()] = PendingACLSignal{policy_type, timeout_signal.Id, msg.Signal.ID()} | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |           } |  |  |  |           } | 
			
		
	
		
		
			
				
					
					|  |  |  |           node.PendingACLs[msg.Signal.ID()] = PendingACL{ |  |  |  |           node.PendingACLs[msg.Signal.ID()] = PendingACL{ | 
			
		
	
	
		
		
			
				
					|  |  | @ -404,6 +403,8 @@ func nodeLoop(ctx *Context, node *Node) error { | 
			
		
	
		
		
			
				
					
					|  |  |  |       node.SignalQueue = node.SignalQueue[:(l-1)] |  |  |  |       node.SignalQueue = node.SignalQueue[:(l-1)] | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |       node.NextSignal, node.TimeoutChan = SoonestSignal(node.SignalQueue) |  |  |  |       node.NextSignal, node.TimeoutChan = SoonestSignal(node.SignalQueue) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       node.writeSignalQueue = true | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |       if node.NextSignal == nil { |  |  |  |       if node.NextSignal == nil { | 
			
		
	
		
		
			
				
					
					|  |  |  |         ctx.Log.Logf("node", "NODE_TIMEOUT(%s) - PROCESSING %+v@%s - NEXT_SIGNAL nil@%+v", node.ID, signal, t, node.TimeoutChan) |  |  |  |         ctx.Log.Logf("node", "NODE_TIMEOUT(%s) - PROCESSING %+v@%s - NEXT_SIGNAL nil@%+v", node.ID, signal, t, node.TimeoutChan) | 
			
		
	
		
		
			
				
					
					|  |  |  |       } else { |  |  |  |       } else { | 
			
		
	
	
		
		
			
				
					|  |  | @ -420,9 +421,9 @@ func nodeLoop(ctx *Context, node *Node) error { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     response, ok := signal.(ResponseSignal) |  |  |  |     response, ok := signal.(ResponseSignal) | 
			
		
	
		
		
			
				
					
					|  |  |  |     if ok == true { |  |  |  |     if ok == true { | 
			
		
	
		
		
			
				
					
					|  |  |  |       info, waiting := node.PendingSignals[response.ResponseID()] |  |  |  |       info, waiting := node.PendingACLSignals[response.ResponseID()] | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |       if waiting == true { |  |  |  |       if waiting == true { | 
			
		
	
		
		
			
				
					
					|  |  |  |         delete(node.PendingSignals, response.ResponseID()) |  |  |  |         delete(node.PendingACLSignals, response.ResponseID()) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         ctx.Log.Logf("pending", "FOUND_PENDING_SIGNAL: %s - %s", node.ID, signal) |  |  |  |         ctx.Log.Logf("pending", "FOUND_PENDING_SIGNAL: %s - %s", node.ID, signal) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         req_info, exists := node.PendingACLs[info.ID] |  |  |  |         req_info, exists := node.PendingACLs[info.ID] | 
			
		
	
	
		
		
			
				
					|  |  | @ -653,7 +654,7 @@ func NewNode(ctx *Context, key ed25519.PrivateKey, node_type NodeType, buffer_si | 
			
		
	
		
		
			
				
					
					|  |  |  |     Extensions: ext_map, |  |  |  |     Extensions: ext_map, | 
			
		
	
		
		
			
				
					
					|  |  |  |     Policies: policies, |  |  |  |     Policies: policies, | 
			
		
	
		
		
			
				
					
					|  |  |  |     PendingACLs: map[uuid.UUID]PendingACL{}, |  |  |  |     PendingACLs: map[uuid.UUID]PendingACL{}, | 
			
		
	
		
		
			
				
					
					|  |  |  |     PendingSignals: map[uuid.UUID]PendingSignal{}, |  |  |  |     PendingACLSignals: map[uuid.UUID]PendingACLSignal{}, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     MsgChan: make(chan *Message, buffer_size), |  |  |  |     MsgChan: make(chan *Message, buffer_size), | 
			
		
	
		
		
			
				
					
					|  |  |  |     BufferSize: buffer_size, |  |  |  |     BufferSize: buffer_size, | 
			
		
	
		
		
			
				
					
					|  |  |  |     SignalQueue: []QueuedSignal{}, |  |  |  |     SignalQueue: []QueuedSignal{}, | 
			
		
	
	
		
		
			
				
					|  |  | 
 |