package manger import ( "encoding/json" appchainmgr "github.com/meshplus/bitxhub-core/appchain-mgr" "github.com/sirupsen/logrus" "gitlab.33.cn/link33/sidecar/internal/peermgr" "gitlab.33.cn/link33/sidecar/internal/port" "gitlab.33.cn/link33/sidecar/model/pb" ) type Manager struct { logger logrus.FieldLogger appchainMgr appchainmgr.AppchainMgr pm peermgr.PeerManager // router router.Router } func (mgr *Manager) Start() error { return mgr.pm.Start() } func (mgr *Manager) Stop() error { return mgr.pm.Stop() } func NewManager(addr string, pm peermgr.PeerManager, Mgr appchainmgr.AppchainMgr, logger logrus.FieldLogger) (*Manager, error) { am := &Manager{ appchainMgr: Mgr, logger: logger, pm: pm, } err := pm.RegisterMultiMsgHandler([]pb.Message_Type{ pb.Message_APPCHAIN_REGISTER, pb.Message_APPCHAIN_UPDATE, pb.Message_APPCHAIN_GET, }, am.handleMessage) if err != nil { return nil, err } return am, nil } func (mgr *Manager) handleMessage(s port.Port, msg *pb.Message) { var res []byte var ok bool switch msg.Type { case pb.Message_APPCHAIN_REGISTER: ok, res = mgr.appchainMgr.Register(msg.Payload.Data) case pb.Message_APPCHAIN_UPDATE: ok, res = mgr.appchainMgr.Update(msg.Payload.Data) case pb.Message_APPCHAIN_GET: app := &appchainmgr.Appchain{} if err := json.Unmarshal(msg.Payload.Data, app); err != nil { mgr.logger.Error(err) return } ok, res = mgr.appchainMgr.QueryById(app.ID, nil) default: m := "wrong appchain message type" res = []byte(m) mgr.logger.Error(m) } ackMsg := pb.Msg(msg.Type, ok, res) err := s.AsyncSend(ackMsg) if err != nil { mgr.logger.Error(err) } appchainRes := &appchainmgr.Appchain{} if err := json.Unmarshal(res, appchainRes); err != nil { mgr.logger.Error(err) return } mgr.logger.WithFields(logrus.Fields{ "type": msg.Type, "from_id": appchainRes.ID, "name": appchainRes.Name, "desc": appchainRes.Desc, "chain_type": appchainRes.ChainType, "consensus_type": appchainRes.ConsensusType, }).Info("Handle appchain message") }