|  |  |  | @ -185,6 +185,37 @@ func (ext *LockableExt) HandleErrorSignal(log Logger, node *Node, source NodeID, | 
		
	
		
			
				|  |  |  |  |   return msgs | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | func (ext *LockableExt) HandleLinkSignal(log Logger, node *Node, source NodeID, signal *IDStringSignal) Messages { | 
		
	
		
			
				|  |  |  |  |   id := signal.NodeID | 
		
	
		
			
				|  |  |  |  |   action := signal.Str | 
		
	
		
			
				|  |  |  |  |   msgs := Messages {} | 
		
	
		
			
				|  |  |  |  |   if ext.State == Unlocked { | 
		
	
		
			
				|  |  |  |  |     switch action { | 
		
	
		
			
				|  |  |  |  |     case "add": | 
		
	
		
			
				|  |  |  |  |       _, exists := ext.Requirements[id] | 
		
	
		
			
				|  |  |  |  |       if exists == true { | 
		
	
		
			
				|  |  |  |  |         msgs = msgs.Add(node.ID, node.Key, NewErrorSignal(signal.ID(), "already_requirement"), source) | 
		
	
		
			
				|  |  |  |  |       } else { | 
		
	
		
			
				|  |  |  |  |         ext.Requirements[id] = Unlocked | 
		
	
		
			
				|  |  |  |  |         msgs = msgs.Add(node.ID, node.Key, NewErrorSignal(signal.ID(), "req_added"), source) | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |     case "remove": | 
		
	
		
			
				|  |  |  |  |       _, exists := ext.Requirements[id] | 
		
	
		
			
				|  |  |  |  |       if exists == false { | 
		
	
		
			
				|  |  |  |  |         msgs = msgs.Add(node.ID, node.Key, NewErrorSignal(signal.ID(), "not_requirement"), source) | 
		
	
		
			
				|  |  |  |  |       } else { | 
		
	
		
			
				|  |  |  |  |         delete(ext.Requirements, id) | 
		
	
		
			
				|  |  |  |  |         msgs = msgs.Add(node.ID, node.Key, NewErrorSignal(signal.ID(), "req_removed"), source) | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |     default: | 
		
	
		
			
				|  |  |  |  |       msgs = msgs.Add(node.ID, node.Key, NewErrorSignal(signal.ID(), "unknown_action"), source) | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |   } else { | 
		
	
		
			
				|  |  |  |  |     msgs = msgs.Add(node.ID, node.Key, NewErrorSignal(signal.ID(), "not_unlocked"), source) | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |   return msgs | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | // Handle a LockSignal and update the extensions owner/requirement states
 | 
		
	
		
			
				|  |  |  |  | func (ext *LockableExt) HandleLockSignal(log Logger, node *Node, source NodeID, signal *StringSignal) Messages { | 
		
	
		
			
				|  |  |  |  |   state := signal.Str | 
		
	
	
		
			
				
					|  |  |  | @ -321,6 +352,8 @@ func (ext *LockableExt) Process(ctx *Context, node *Node, source NodeID, signal | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |   case Direct: | 
		
	
		
			
				|  |  |  |  |     switch signal.Type() { | 
		
	
		
			
				|  |  |  |  |     case LinkSignalType: | 
		
	
		
			
				|  |  |  |  |       messages = ext.HandleLinkSignal(ctx.Log, node, source, signal.(*IDStringSignal)) | 
		
	
		
			
				|  |  |  |  |     case LockSignalType: | 
		
	
		
			
				|  |  |  |  |       messages = ext.HandleLockSignal(ctx.Log, node, source, signal.(*StringSignal)) | 
		
	
		
			
				|  |  |  |  |     case ErrorSignalType: | 
		
	
	
		
			
				
					|  |  |  | 
 |