aboutsummaryrefslogtreecommitdiffstats
path: root/javascript/javascript_runtime.go
diff options
context:
space:
mode:
Diffstat (limited to 'javascript/javascript_runtime.go')
-rw-r--r--javascript/javascript_runtime.go135
1 files changed, 11 insertions, 124 deletions
diff --git a/javascript/javascript_runtime.go b/javascript/javascript_runtime.go
index 893ad5d33..36b14a057 100644
--- a/javascript/javascript_runtime.go
+++ b/javascript/javascript_runtime.go
@@ -6,14 +6,7 @@ import (
"os"
"path"
"path/filepath"
-
- "github.com/ethereum/go-ethereum/core"
- "github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/eth"
- "github.com/ethereum/go-ethereum/ethutil"
- "github.com/ethereum/go-ethereum/event"
"github.com/ethereum/go-ethereum/logger"
- "github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/xeth"
"github.com/obscuren/otto"
)
@@ -21,11 +14,8 @@ import (
var jsrelogger = logger.NewLogger("JSRE")
type JSRE struct {
- ethereum *eth.Ethereum
- Vm *otto.Otto
- xeth *xeth.XEth
-
- events event.Subscription
+ Vm *otto.Otto
+ xeth *xeth.XEth
objectCb map[string][]otto.Value
}
@@ -44,12 +34,10 @@ func (jsre *JSRE) LoadIntFile(file string) {
jsre.LoadExtFile(path.Join(assetPath, file))
}
-func NewJSRE(ethereum *eth.Ethereum) *JSRE {
+func NewJSRE(xeth *xeth.XEth) *JSRE {
re := &JSRE{
- ethereum,
otto.New(),
- xeth.New(ethereum),
- nil,
+ xeth,
make(map[string][]otto.Value),
}
@@ -59,14 +47,7 @@ func NewJSRE(ethereum *eth.Ethereum) *JSRE {
// Load extra javascript files
re.LoadIntFile("bignumber.min.js")
- // Subscribe to events
- mux := ethereum.EventMux()
- re.events = mux.Subscribe(core.NewBlockEvent{})
-
- // We have to make sure that, whoever calls this, calls "Stop"
- go re.mainLoop()
-
- re.Bind("eth", &JSEthereum{re.xeth, re.Vm, ethereum})
+ re.Bind("eth", &JSEthereum{re.xeth, re.Vm})
re.initStdFuncs()
@@ -83,6 +64,12 @@ func (self *JSRE) Run(code string) (otto.Value, error) {
return self.Vm.Run(code)
}
+func (self *JSRE) initStdFuncs() {
+ t, _ := self.Vm.Get("eth")
+ eth := t.Object()
+ eth.Set("require", self.require)
+}
+
func (self *JSRE) Require(file string) error {
if len(filepath.Ext(file)) == 0 {
file += ".js"
@@ -99,84 +86,6 @@ func (self *JSRE) Require(file string) error {
return nil
}
-func (self *JSRE) Stop() {
- self.events.Unsubscribe()
- jsrelogger.Infoln("stopped")
-}
-
-func (self *JSRE) mainLoop() {
- for _ = range self.events.Chan() {
- }
-}
-
-func (self *JSRE) initStdFuncs() {
- t, _ := self.Vm.Get("eth")
- eth := t.Object()
- eth.Set("connect", self.connect)
- eth.Set("require", self.require)
- eth.Set("stopMining", self.stopMining)
- eth.Set("startMining", self.startMining)
- eth.Set("dump", self.dump)
- eth.Set("export", self.export)
-}
-
-/*
- * The following methods are natively implemented javascript functions
- */
-
-func (self *JSRE) dump(call otto.FunctionCall) otto.Value {
- var block *types.Block
-
- if len(call.ArgumentList) > 0 {
- if call.Argument(0).IsNumber() {
- num, _ := call.Argument(0).ToInteger()
- block = self.ethereum.ChainManager().GetBlockByNumber(uint64(num))
- } else if call.Argument(0).IsString() {
- hash, _ := call.Argument(0).ToString()
- block = self.ethereum.ChainManager().GetBlock(ethutil.Hex2Bytes(hash))
- } else {
- fmt.Println("invalid argument for dump. Either hex string or number")
- }
-
- if block == nil {
- fmt.Println("block not found")
-
- return otto.UndefinedValue()
- }
-
- } else {
- block = self.ethereum.ChainManager().CurrentBlock()
- }
-
- statedb := state.New(block.Root(), self.ethereum.Db())
-
- v, _ := self.Vm.ToValue(statedb.RawDump())
-
- return v
-}
-
-func (self *JSRE) stopMining(call otto.FunctionCall) otto.Value {
- self.xeth.Miner().Stop()
-
- return otto.TrueValue()
-}
-
-func (self *JSRE) startMining(call otto.FunctionCall) otto.Value {
- self.xeth.Miner().Start()
- return otto.TrueValue()
-}
-
-func (self *JSRE) connect(call otto.FunctionCall) otto.Value {
- nodeURL, err := call.Argument(0).ToString()
- if err != nil {
- return otto.FalseValue()
- }
- if err := self.ethereum.SuggestPeer(nodeURL); err != nil {
- return otto.FalseValue()
- }
- return otto.TrueValue()
-}
-
func (self *JSRE) require(call otto.FunctionCall) otto.Value {
file, err := call.Argument(0).ToString()
if err != nil {
@@ -191,25 +100,3 @@ func (self *JSRE) require(call otto.FunctionCall) otto.Value {
return t
}
-
-func (self *JSRE) export(call otto.FunctionCall) otto.Value {
- if len(call.ArgumentList) == 0 {
- fmt.Println("err: require file name")
- return otto.FalseValue()
- }
-
- fn, err := call.Argument(0).ToString()
- if err != nil {
- fmt.Println(err)
- return otto.FalseValue()
- }
-
- data := self.ethereum.ChainManager().Export()
-
- if err := ethutil.WriteFile(fn, data); err != nil {
- fmt.Println(err)
- return otto.FalseValue()
- }
-
- return otto.TrueValue()
-}