|
|
|
@ -26,12 +26,18 @@ import ( |
|
|
|
|
"path/filepath" |
|
|
|
|
"strings" |
|
|
|
|
|
|
|
|
|
"encoding/json" |
|
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/cmd/utils" |
|
|
|
|
"github.com/ethereum/go-ethereum/common/docserver" |
|
|
|
|
re "github.com/ethereum/go-ethereum/jsre" |
|
|
|
|
"github.com/ethereum/go-ethereum/rpc" |
|
|
|
|
"github.com/ethereum/go-ethereum/rpc/codec" |
|
|
|
|
"github.com/ethereum/go-ethereum/rpc/comms" |
|
|
|
|
"github.com/ethereum/go-ethereum/rpc/shared" |
|
|
|
|
"github.com/peterh/liner" |
|
|
|
|
"github.com/robertkrimen/otto" |
|
|
|
|
"github.com/ethereum/go-ethereum/rpc/api" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
type prompter interface { |
|
|
|
@ -120,9 +126,27 @@ func (js *jsre) apiBindings(ipcpath string) { |
|
|
|
|
if err != nil { |
|
|
|
|
utils.Fatalf("Error setting web3 provider: %v", err) |
|
|
|
|
} |
|
|
|
|
_, err = js.re.Eval(` |
|
|
|
|
var eth = web3.eth; |
|
|
|
|
`) |
|
|
|
|
|
|
|
|
|
apis, err := js.suportedApis(ipcpath) |
|
|
|
|
if err != nil { |
|
|
|
|
utils.Fatalf("Unable to determine supported api's: %v", err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// load only supported API's in javascript runtime
|
|
|
|
|
shortcuts := "var eth = web3.eth; " |
|
|
|
|
for _, apiName := range apis { |
|
|
|
|
if apiName == api.Web3ApiName || apiName == api.EthApiName { |
|
|
|
|
continue // manually mapped
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if err = js.re.Compile(fmt.Sprintf("%s.js", apiName), api.Javascript(apiName)); err == nil { |
|
|
|
|
shortcuts += fmt.Sprintf("var %s = web3.%s; ", apiName, apiName) |
|
|
|
|
} else { |
|
|
|
|
utils.Fatalf("Error loading %s.js: %v", apiName, err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
_, err = js.re.Eval(shortcuts) |
|
|
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
utils.Fatalf("Error setting namespaces: %v", err) |
|
|
|
@ -170,11 +194,59 @@ func (self *jsre) exec(filename string) error { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (self *jsre) suportedApis(ipcpath string) ([]string, error) { |
|
|
|
|
config := comms.IpcConfig{ |
|
|
|
|
Endpoint: ipcpath, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
client, err := comms.NewIpcClient(config, codec.JSON) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
req := shared.Request{ |
|
|
|
|
Id: 1, |
|
|
|
|
Jsonrpc: "2.0", |
|
|
|
|
Method: "support_apis", |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
err = client.Send(req) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
res, err := client.Recv() |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if sucRes, ok := res.(shared.SuccessResponse); ok { |
|
|
|
|
data, _ := json.Marshal(sucRes.Result) |
|
|
|
|
apis := make([]string, 0) |
|
|
|
|
err = json.Unmarshal(data, &apis) |
|
|
|
|
if err == nil { |
|
|
|
|
return apis, nil |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return nil, fmt.Errorf("Unable to determine supported API's") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// show summary of current geth instance
|
|
|
|
|
func (self *jsre) welcome() { |
|
|
|
|
func (self *jsre) welcome(ipcpath string) { |
|
|
|
|
self.re.Eval(` |
|
|
|
|
console.log('Connected to ' + web3.version.client); |
|
|
|
|
console.log(' Connected to: ' + web3.version.client); |
|
|
|
|
`) |
|
|
|
|
|
|
|
|
|
if apis, err := self.suportedApis(ipcpath); err == nil { |
|
|
|
|
apisStr := "" |
|
|
|
|
for _, api := range apis { |
|
|
|
|
apisStr += api + " " |
|
|
|
|
} |
|
|
|
|
self.re.Eval(fmt.Sprintf(`console.log("Available api's: %s");`, apisStr)) |
|
|
|
|
} else { |
|
|
|
|
utils.Fatalf("unable to determine supported api's - %v", err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (self *jsre) interactive() { |
|
|
|
|