github.com/aigarnetwork/aigar@v0.0.0-20191115204914-d59a6eb70f8e/signer/core/stdioui.go (about)

     1  //  Copyright 2018 The go-ethereum Authors
     2  //  Copyright 2019 The go-aigar Authors
     3  //  This file is part of the go-aigar library.
     4  //
     5  //  The go-aigar library is free software: you can redistribute it and/or modify
     6  //  it under the terms of the GNU Lesser General Public License as published by
     7  //  the Free Software Foundation, either version 3 of the License, or
     8  //  (at your option) any later version.
     9  //
    10  //  The go-aigar library is distributed in the hope that it will be useful,
    11  //  but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    13  //  GNU Lesser General Public License for more details.
    14  //
    15  //  You should have received a copy of the GNU Lesser General Public License
    16  //  along with the go-aigar library. If not, see <http://www.gnu.org/licenses/>.
    17  
    18  package core
    19  
    20  import (
    21  	"context"
    22  	"sync"
    23  
    24  	"github.com/AigarNetwork/aigar/internal/ethapi"
    25  	"github.com/AigarNetwork/aigar/log"
    26  	"github.com/AigarNetwork/aigar/rpc"
    27  )
    28  
    29  type StdIOUI struct {
    30  	client rpc.Client
    31  	mu     sync.Mutex
    32  }
    33  
    34  func NewStdIOUI() *StdIOUI {
    35  	client, err := rpc.DialContext(context.Background(), "stdio://")
    36  	if err != nil {
    37  		log.Crit("Could not create stdio client", "err", err)
    38  	}
    39  	ui := &StdIOUI{client: *client}
    40  	return ui
    41  }
    42  
    43  func (ui *StdIOUI) RegisterUIServer(api *UIServerAPI) {
    44  	ui.client.RegisterName("clef", api)
    45  }
    46  
    47  // dispatch sends a request over the stdio
    48  func (ui *StdIOUI) dispatch(serviceMethod string, args interface{}, reply interface{}) error {
    49  	err := ui.client.Call(&reply, serviceMethod, args)
    50  	if err != nil {
    51  		log.Info("Error", "exc", err.Error())
    52  	}
    53  	return err
    54  }
    55  
    56  // notify sends a request over the stdio, and does not listen for a response
    57  func (ui *StdIOUI) notify(serviceMethod string, args interface{}) error {
    58  	ctx := context.Background()
    59  	err := ui.client.Notify(ctx, serviceMethod, args)
    60  	if err != nil {
    61  		log.Info("Error", "exc", err.Error())
    62  	}
    63  	return err
    64  }
    65  
    66  func (ui *StdIOUI) ApproveTx(request *SignTxRequest) (SignTxResponse, error) {
    67  	var result SignTxResponse
    68  	err := ui.dispatch("ui_approveTx", request, &result)
    69  	return result, err
    70  }
    71  
    72  func (ui *StdIOUI) ApproveSignData(request *SignDataRequest) (SignDataResponse, error) {
    73  	var result SignDataResponse
    74  	err := ui.dispatch("ui_approveSignData", request, &result)
    75  	return result, err
    76  }
    77  
    78  func (ui *StdIOUI) ApproveListing(request *ListRequest) (ListResponse, error) {
    79  	var result ListResponse
    80  	err := ui.dispatch("ui_approveListing", request, &result)
    81  	return result, err
    82  }
    83  
    84  func (ui *StdIOUI) ApproveNewAccount(request *NewAccountRequest) (NewAccountResponse, error) {
    85  	var result NewAccountResponse
    86  	err := ui.dispatch("ui_approveNewAccount", request, &result)
    87  	return result, err
    88  }
    89  
    90  func (ui *StdIOUI) ShowError(message string) {
    91  	err := ui.notify("ui_showError", &Message{message})
    92  	if err != nil {
    93  		log.Info("Error calling 'ui_showError'", "exc", err.Error(), "msg", message)
    94  	}
    95  }
    96  
    97  func (ui *StdIOUI) ShowInfo(message string) {
    98  	err := ui.notify("ui_showInfo", Message{message})
    99  	if err != nil {
   100  		log.Info("Error calling 'ui_showInfo'", "exc", err.Error(), "msg", message)
   101  	}
   102  }
   103  func (ui *StdIOUI) OnApprovedTx(tx ethapi.SignTransactionResult) {
   104  	err := ui.notify("ui_onApprovedTx", tx)
   105  	if err != nil {
   106  		log.Info("Error calling 'ui_onApprovedTx'", "exc", err.Error(), "tx", tx)
   107  	}
   108  }
   109  
   110  func (ui *StdIOUI) OnSignerStartup(info StartupInfo) {
   111  	err := ui.notify("ui_onSignerStartup", info)
   112  	if err != nil {
   113  		log.Info("Error calling 'ui_onSignerStartup'", "exc", err.Error(), "info", info)
   114  	}
   115  }
   116  func (ui *StdIOUI) OnInputRequired(info UserInputRequest) (UserInputResponse, error) {
   117  	var result UserInputResponse
   118  	err := ui.dispatch("ui_onInputRequired", info, &result)
   119  	if err != nil {
   120  		log.Info("Error calling 'ui_onInputRequired'", "exc", err.Error(), "info", info)
   121  	}
   122  	return result, err
   123  }