diff options
Diffstat (limited to 'ethereum')
-rw-r--r-- | ethereum/javascript_runtime.go (renamed from ethereum/javascript_console.go) | 126 | ||||
-rw-r--r-- | ethereum/repl.go | 97 |
2 files changed, 123 insertions, 100 deletions
diff --git a/ethereum/javascript_console.go b/ethereum/javascript_runtime.go index 07d69dafc..b06fb9460 100644 --- a/ethereum/javascript_console.go +++ b/ethereum/javascript_runtime.go @@ -9,11 +9,6 @@ import ( "github.com/robertkrimen/otto" ) -type Repl interface { - Start() - Stop() -} - type JSRE struct { ethereum *eth.Ethereum vm *otto.Otto @@ -44,20 +39,18 @@ func NewJSRE(ethereum *eth.Ethereum) *JSRE { go re.mainLoop() re.Bind("eth", &JSEthereum{re.lib, re.vm}) - t, _ := re.vm.Get("eth") - t.Object().Set("watch", func(call otto.FunctionCall) otto.Value { - addr, _ := call.Argument(0).ToString() - cb := call.Argument(1) - re.objectCb[addr] = append(re.objectCb[addr], cb) + re.initStdFuncs() - event := "object:" + string(ethutil.FromHex(addr)) - ethereum.Reactor().Subscribe(event, re.changeChan) + return re +} - return otto.UndefinedValue() - }) +func (self *JSRE) Bind(name string, v interface{}) { + self.vm.Set(name, v) +} - return re +func (self *JSRE) Run(code string) (otto.Value, error) { + return self.vm.Run(code) } func (self *JSRE) Stop() { @@ -95,94 +88,27 @@ out: } } -func (self *JSRE) Bind(name string, v interface{}) { - self.vm.Set(name, v) -} - -func (self *JSRE) Run(code string) (otto.Value, error) { - return self.vm.Run(code) -} - -type JSRepl struct { - re *JSRE - - prompt string -} - -func NewJSRepl(ethereum *eth.Ethereum) *JSRepl { - return &JSRepl{re: NewJSRE(ethereum), prompt: "> "} -} - -func (self *JSRepl) Start() { - self.read() -} - -func (self *JSRepl) Stop() { - self.re.Stop() -} - -func (self *JSRepl) parseInput(code string) { - defer func() { - if r := recover(); r != nil { - fmt.Println("[native] error", r) - } - }() - - value, err := self.re.Run(code) - if err != nil { - fmt.Println(err) - return - } - - self.PrintValue(value) -} - -// The JSEthereum object attempts to wrap the PEthereum object and returns -// meaningful javascript objects -type JSEthereum struct { - *ethpub.PEthereum - vm *otto.Otto -} - -func (self *JSEthereum) GetKey() otto.Value { - return self.toVal(self.PEthereum.GetKey()) -} - -func (self *JSEthereum) GetStateObject(addr string) otto.Value { - return self.toVal(self.PEthereum.GetStateObject(addr)) -} - -func (self *JSEthereum) Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr string) otto.Value { - r, err := self.PEthereum.Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr) - if err != nil { - fmt.Println(err) - - return otto.UndefinedValue() - } - - return self.toVal(r) -} - -func (self *JSEthereum) Create(key, valueStr, gasStr, gasPriceStr, initStr, bodyStr string) otto.Value { - r, err := self.PEthereum.Create(key, valueStr, gasStr, gasPriceStr, initStr, bodyStr) - - if err != nil { - fmt.Println(err) - - return otto.UndefinedValue() - } - - return self.toVal(r) -} +func (self *JSRE) initStdFuncs() { + t, _ := self.vm.Get("eth") + eth := t.Object() + eth.Set("watch", func(call otto.FunctionCall) otto.Value { + addr, _ := call.Argument(0).ToString() + cb := call.Argument(1) -func (self *JSEthereum) toVal(v interface{}) otto.Value { - result, err := self.vm.ToValue(v) + self.objectCb[addr] = append(self.objectCb[addr], cb) - if err != nil { - fmt.Println(err) + event := "object:" + string(ethutil.FromHex(addr)) + self.ethereum.Reactor().Subscribe(event, self.changeChan) return otto.UndefinedValue() - } + }) + eth.Set("addPeer", func(call otto.FunctionCall) otto.Value { + host, err := call.Argument(0).ToString() + if err != nil { + return otto.FalseValue() + } + self.ethereum.ConnectToPeer(host) - return result + return otto.TrueValue() + }) } diff --git a/ethereum/repl.go b/ethereum/repl.go new file mode 100644 index 000000000..c0b63c0a5 --- /dev/null +++ b/ethereum/repl.go @@ -0,0 +1,97 @@ +package main + +import ( + "fmt" + "github.com/ethereum/eth-go" + "github.com/ethereum/eth-go/ethpub" + "github.com/robertkrimen/otto" +) + +type Repl interface { + Start() + Stop() +} + +type JSRepl struct { + re *JSRE + + prompt string +} + +func NewJSRepl(ethereum *eth.Ethereum) *JSRepl { + return &JSRepl{re: NewJSRE(ethereum), prompt: "> "} +} + +func (self *JSRepl) Start() { + self.read() +} + +func (self *JSRepl) Stop() { + self.re.Stop() +} + +func (self *JSRepl) parseInput(code string) { + defer func() { + if r := recover(); r != nil { + fmt.Println("[native] error", r) + } + }() + + value, err := self.re.Run(code) + if err != nil { + fmt.Println(err) + return + } + + self.PrintValue(value) +} + +// The JSEthereum object attempts to wrap the PEthereum object and returns +// meaningful javascript objects +type JSEthereum struct { + *ethpub.PEthereum + vm *otto.Otto +} + +func (self *JSEthereum) GetKey() otto.Value { + return self.toVal(self.PEthereum.GetKey()) +} + +func (self *JSEthereum) GetStateObject(addr string) otto.Value { + return self.toVal(self.PEthereum.GetStateObject(addr)) +} + +func (self *JSEthereum) Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr string) otto.Value { + r, err := self.PEthereum.Transact(key, recipient, valueStr, gasStr, gasPriceStr, dataStr) + if err != nil { + fmt.Println(err) + + return otto.UndefinedValue() + } + + return self.toVal(r) +} + +func (self *JSEthereum) Create(key, valueStr, gasStr, gasPriceStr, initStr, bodyStr string) otto.Value { + r, err := self.PEthereum.Create(key, valueStr, gasStr, gasPriceStr, initStr, bodyStr) + + if err != nil { + fmt.Println(err) + + return otto.UndefinedValue() + } + + return self.toVal(r) +} + +func (self *JSEthereum) toVal(v interface{}) otto.Value { + result, err := self.vm.ToValue(v) + + if err != nil { + fmt.Println(err) + + return otto.UndefinedValue() + } + + return result +} |