sample_chain/order/orderServer.go

103 lines
1.8 KiB
Go

package order
import (
"fmt"
"io"
"schain/order/token"
pb "schain/proto"
"github.com/pkg/errors"
)
type OrderServer struct {
Address string
pb.UnimplementedChaincodeSupportServer
}
type recvMsg struct {
msg *pb.ChaincodeMessage
err error
}
func NewOrderServer(addr string) *OrderServer {
return &OrderServer{Address: addr}
}
func (os *OrderServer) Register(ServerStream pb.ChaincodeSupport_RegisterServer) error {
hdl := NewOrderHandler(ServerStream)
msgAvail := make(chan *recvMsg, 1)
errc := make(chan error)
receiveMessage := func() {
in, err := ServerStream.Recv()
msgAvail <- &recvMsg{in, err}
}
go receiveMessage()
for {
select {
case rmsg := <-msgAvail:
switch {
case rmsg.err == io.EOF:
return errors.New("received EOF, ending chaincode stream")
case rmsg.err != nil:
err := fmt.Errorf("receive failed: %s", rmsg.err)
return err
case rmsg.msg == nil:
err := errors.New("received nil message, ending chaincode stream")
return err
default:
err := hdl.HandleMessage(rmsg.msg, errc)
if err != nil {
err = fmt.Errorf("error handling message: %s", err)
return err
}
go receiveMessage()
}
case sendErr := <-errc:
if sendErr != nil {
err := fmt.Errorf("error sending: %s", sendErr)
return err
}
}
}
}
func (os *OrderServer) Start() error {
if os.Address == "" {
return errors.New("address must be specified")
}
var err error
/*tlsCfg, err := internal.LoadTLSConfig()
if err != nil {
return err
}
server, err := internal.NewServer(os.Address, tlsCfg)
if err != nil {
return err
}*/
server, err := token.NewServer(os.Address)
if err != nil {
return err
}
defer server.Stop()
pb.RegisterChaincodeSupportServer(server.Server, os)
return server.Start()
}