package appchain import ( "errors" "github.com/link33/sidecar/model/pb" ) func (a *appChain) ID() string { return a.client.ID() } func (a *appChain) Type() string { return a.client.Type() } // TODO appchain func (a *appChain) Tag() string { return a.client.Type() } func (a *appChain) Name() string { return a.client.Name() } // Send 接收的数据只能是IBTPX相关的结构,以及查询完成,需要同步返回的数据 func (a *appChain) Send(msg *pb.Message) (*pb.Message, error) { // TODO 调用该执行。 // a.ExecuteIBTP() // a.Rollback() t := msg.Type switch { case t == pb.Message_IBTP_SEND: ibpx := &pb.IBTPX{} err := ibpx.Unmarshal(msg.Payload.Data) if err != nil { return nil, err } ibtp := ibpx.GetIbtp() ibtp, err = a.ExecuteIBTP(ibtp) if err != nil { return nil, err } if ibtp == nil { // TODO return nil, errors.New("ibtp wrong") } if ibtp.Type == pb.IBTP_RECEIPT_FAILURE || pb.IBTP_RECEIPT_SUCCESS == ibtp.Type { // //TODO 默认路由 ix := pb.IBTPX{ Ibtp: ibtp, Mode: "", RouteSign: nil, RouteMethod: "", RouteMethodArg: nil, IsValid: false, } d, err := ix.Marshal() if err != nil { return nil, err } m := pb.Msg(pb.Message_IBTP_RECEIPT_SEND, true, d) return m, nil } return nil, nil default: return nil, errors.New("msg error") } } func (a *appChain) AsyncSend(msg *pb.Message) error { // TODO 调用该执行。 // a.ExecuteIBTP() // a.Rollback() panic("implement me") } // ListenIBTPX 监听IBTPX数据。 func (a *appChain) ListenIBTPX() <-chan *pb.Message { ibtpCh := a.ListenIBTP() func() { for { select { case ibtp := <-ibtpCh: // TODO ibtp to ibtpx data, _ := ibtp.Marshal() msg := pb.Msg(pb.Message_IBTP_SEND, true, data) a.msgCh <- msg case <-a.ctx.Done(): break } } }() return a.msgCh } // 同一个接口,不同的实现,行为可以不一样。 // 对原始交易背书,交易查询、回执查询、回滚、回调不需要。 // 即只对GetIBTP得到的交易背书。如何映射,