aboutsummaryrefslogtreecommitdiffstats
path: root/rpc/xeth.go
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2015-06-24 19:38:58 +0800
committerPéter Szilágyi <peterke@gmail.com>2015-06-24 23:34:05 +0800
commite5b820c47b9343d3801e1ebbeb4a8f40843ea87c (patch)
tree8c8785f014ed8033fd26129cd553c9635631fb50 /rpc/xeth.go
parentbde2ff034317db977354e0855e6406f9428899ea (diff)
downloadgo-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.go52
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
+}