diff options
author | Péter Szilágyi <peterke@gmail.com> | 2015-06-24 19:38:58 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2015-06-24 23:34:05 +0800 |
commit | e5b820c47b9343d3801e1ebbeb4a8f40843ea87c (patch) | |
tree | 8c8785f014ed8033fd26129cd553c9635631fb50 /rpc/xeth.go | |
parent | bde2ff034317db977354e0855e6406f9428899ea (diff) | |
download | go-tangerine-e5b820c47b9343d3801e1ebbeb4a8f40843ea87c.tar go-tangerine-e5b820c47b9343d3801e1ebbeb4a8f40843ea87c.tar.gz go-tangerine-e5b820c47b9343d3801e1ebbeb4a8f40843ea87c.tar.bz2 go-tangerine-e5b820c47b9343d3801e1ebbeb4a8f40843ea87c.tar.lz go-tangerine-e5b820c47b9343d3801e1ebbeb4a8f40843ea87c.tar.xz go-tangerine-e5b820c47b9343d3801e1ebbeb4a8f40843ea87c.tar.zst go-tangerine-e5b820c47b9343d3801e1ebbeb4a8f40843ea87c.zip |
cmd/geth, rpc/api: extend metrics API, add a basic monitor command
Diffstat (limited to 'rpc/xeth.go')
-rw-r--r-- | rpc/xeth.go | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/rpc/xeth.go b/rpc/xeth.go new file mode 100644 index 000000000..b3e844380 --- /dev/null +++ b/rpc/xeth.go @@ -0,0 +1,52 @@ +package rpc + +import ( + "encoding/json" + "fmt" + "reflect" + "sync/atomic" + + "github.com/ethereum/go-ethereum/rpc/comms" + "github.com/ethereum/go-ethereum/rpc/shared" +) + +// Xeth is a native API interface to a remote node. +type Xeth struct { + client comms.EthereumClient + reqId uint32 +} + +// NewXeth constructs a new native API interface to a remote node. +func NewXeth(client comms.EthereumClient) *Xeth { + return &Xeth{ + client: client, + } +} + +// Call invokes a method with the given parameters are the remote node. +func (self *Xeth) Call(method string, params []interface{}) (map[string]interface{}, error) { + // Assemble the json RPC request + data, err := json.Marshal(params) + if err != nil { + return nil, err + } + req := &shared.Request{ + Id: atomic.AddUint32(&self.reqId, 1), + Jsonrpc: "2.0", + Method: method, + Params: data, + } + // Send the request over and process the response + if err := self.client.Send(req); err != nil { + return nil, err + } + res, err := self.client.Recv() + if err != nil { + return nil, err + } + value, ok := res.(map[string]interface{}) + if !ok { + return nil, fmt.Errorf("Invalid response type: have %v, want %v", reflect.TypeOf(res), reflect.TypeOf(make(map[string]interface{}))) + } + return value, nil +} |