func (hl *chaincodeHandlerList) foreach(e *pb.Event, action func(h *handler)) { hl.Lock() defer hl.Unlock() //if there's no chaincode event in the event... nothing to do (why was this event sent ?) if e.GetChaincodeEvent() == nil || e.GetChaincodeEvent().ChaincodeID == "" { return } //get the event map for the chaincode if emap := hl.handlers[e.GetChaincodeEvent().ChaincodeID]; emap != nil { //get the handler map for the event if handlerMap := emap[e.GetChaincodeEvent().EventName]; handlerMap != nil { for h := range handlerMap { action(h) } } //send to handlers who want all events from the chaincode, but only if //EventName is not already "" (chaincode should NOT send nameless events though) if e.GetChaincodeEvent().EventName != "" { if handlerMap := emap[""]; handlerMap != nil { for h := range handlerMap { action(h) } } } } }
// HandleMessage handles the Openchain messages for the Peer. func (d *handler) HandleMessage(msg *pb.Event) error { //producerLogger.Debug("Handling Event") switch msg.Event.(type) { case *pb.Event_Register: eventsObj := msg.GetRegister() if err := d.register(eventsObj.Events); err != nil { return fmt.Errorf("Could not register events %s", err) } case *pb.Event_Unregister: eventsObj := msg.GetUnregister() if err := d.deregister(eventsObj.Events); err != nil { return fmt.Errorf("Could not unregister events %s", err) } case nil: default: return fmt.Errorf("Invalide type from client %T", msg.Event) } //TODO return supported events.. for now just return the received msg if err := d.ChatStream.Send(msg); err != nil { return fmt.Errorf("Error sending response to %v: %s", msg, err) } return nil }