github.com/okex/exchain@v1.8.0/libs/tendermint/privval/signer_server.go (about)

     1  package privval
     2  
     3  import (
     4  	"io"
     5  	"sync"
     6  
     7  	"github.com/okex/exchain/libs/tendermint/libs/service"
     8  	"github.com/okex/exchain/libs/tendermint/types"
     9  )
    10  
    11  // ValidationRequestHandlerFunc handles different remoteSigner requests
    12  type ValidationRequestHandlerFunc func(
    13  	privVal types.PrivValidator,
    14  	requestMessage SignerMessage,
    15  	chainID string) (SignerMessage, error)
    16  
    17  type SignerServer struct {
    18  	service.BaseService
    19  
    20  	endpoint *SignerDialerEndpoint
    21  	chainID  string
    22  	privVal  types.PrivValidator
    23  
    24  	handlerMtx               sync.Mutex
    25  	validationRequestHandler ValidationRequestHandlerFunc
    26  }
    27  
    28  func NewSignerServer(endpoint *SignerDialerEndpoint, chainID string, privVal types.PrivValidator) *SignerServer {
    29  	ss := &SignerServer{
    30  		endpoint:                 endpoint,
    31  		chainID:                  chainID,
    32  		privVal:                  privVal,
    33  		validationRequestHandler: DefaultValidationRequestHandler,
    34  	}
    35  
    36  	ss.BaseService = *service.NewBaseService(endpoint.Logger, "SignerServer", ss)
    37  
    38  	return ss
    39  }
    40  
    41  // OnStart implements service.Service.
    42  func (ss *SignerServer) OnStart() error {
    43  	go ss.serviceLoop()
    44  	return nil
    45  }
    46  
    47  // OnStop implements service.Service.
    48  func (ss *SignerServer) OnStop() {
    49  	ss.endpoint.Logger.Debug("SignerServer: OnStop calling Close")
    50  	_ = ss.endpoint.Close()
    51  }
    52  
    53  // SetRequestHandler override the default function that is used to service requests
    54  func (ss *SignerServer) SetRequestHandler(validationRequestHandler ValidationRequestHandlerFunc) {
    55  	ss.handlerMtx.Lock()
    56  	defer ss.handlerMtx.Unlock()
    57  	ss.validationRequestHandler = validationRequestHandler
    58  }
    59  
    60  func (ss *SignerServer) servicePendingRequest() {
    61  	if !ss.IsRunning() {
    62  		return // Ignore error from closing.
    63  	}
    64  
    65  	req, err := ss.endpoint.ReadMessage()
    66  	if err != nil {
    67  		if err != io.EOF {
    68  			ss.Logger.Error("SignerServer: HandleMessage", "err", err)
    69  		}
    70  		return
    71  	}
    72  
    73  	var res SignerMessage
    74  	{
    75  		// limit the scope of the lock
    76  		ss.handlerMtx.Lock()
    77  		defer ss.handlerMtx.Unlock()
    78  		res, err = ss.validationRequestHandler(ss.privVal, req, ss.chainID)
    79  		if err != nil {
    80  			// only log the error; we'll reply with an error in res
    81  			ss.Logger.Error("SignerServer: handleMessage", "err", err)
    82  		}
    83  	}
    84  
    85  	if res != nil {
    86  		err = ss.endpoint.WriteMessage(res)
    87  		if err != nil {
    88  			ss.Logger.Error("SignerServer: writeMessage", "err", err)
    89  		}
    90  	}
    91  }
    92  
    93  func (ss *SignerServer) serviceLoop() {
    94  	for {
    95  		select {
    96  		default:
    97  			err := ss.endpoint.ensureConnection()
    98  			if err != nil {
    99  				return
   100  			}
   101  			ss.servicePendingRequest()
   102  
   103  		case <-ss.Quit():
   104  			return
   105  		}
   106  	}
   107  }