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 }