mirror of https://github.com/ethereum/go-ethereum
Web sockets handlers fully implemented. Filter handlers have yet to be implemented.pull/136/head
parent
41ae6f298e
commit
6db40ecb22
@ -1,3 +0,0 @@ |
||||
if(typeof(Promise) === "undefined") { |
||||
window.Promise = Q.Promise; |
||||
} |
@ -0,0 +1,21 @@ |
||||
window._messagingAdapter = function(data) { |
||||
navigator.qt.postMessage(data); |
||||
}; |
||||
|
||||
navigator.qt.onmessage = function(ev) { |
||||
var data = JSON.parse(ev.data) |
||||
|
||||
if(data._event !== undefined) { |
||||
eth.trigger(data._event, data.data); |
||||
} else { |
||||
if(data._seed) { |
||||
var cb = eth._callbacks[data._seed]; |
||||
if(cb) { |
||||
cb.call(this, data.data) |
||||
|
||||
// Remove the "trigger" callback
|
||||
delete eth._callbacks[ev._seed]; |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,161 @@ |
||||
package utils |
||||
|
||||
import ( |
||||
"github.com/ethereum/eth-go" |
||||
"github.com/ethereum/eth-go/ethpipe" |
||||
"github.com/ethereum/eth-go/ethutil" |
||||
"github.com/ethereum/eth-go/websocket" |
||||
) |
||||
|
||||
func args(v ...interface{}) []interface{} { |
||||
return v |
||||
} |
||||
|
||||
type WebSocketServer struct { |
||||
ethereum *eth.Ethereum |
||||
filterCallbacks map[int][]int |
||||
} |
||||
|
||||
func NewWebSocketServer(eth *eth.Ethereum) *WebSocketServer { |
||||
return &WebSocketServer{eth, make(map[int][]int)} |
||||
} |
||||
|
||||
func (self *WebSocketServer) Serv() { |
||||
pipe := ethpipe.NewJSPipe(self.ethereum) |
||||
|
||||
wsServ := websocket.NewServer("/eth", ":40404") |
||||
wsServ.MessageFunc(func(c *websocket.Client, msg *websocket.Message) { |
||||
switch msg.Call { |
||||
case "compile": |
||||
data := ethutil.NewValue(msg.Args) |
||||
bcode, err := ethutil.Compile(data.Get(0).Str(), false) |
||||
if err != nil { |
||||
c.Write(args(nil, err.Error()), msg.Seed) |
||||
} |
||||
|
||||
code := ethutil.Bytes2Hex(bcode) |
||||
c.Write(args(code, nil), msg.Seed) |
||||
case "getBlockByNumber": |
||||
args := msg.Arguments() |
||||
|
||||
block := pipe.BlockByNumber(int32(args.Get(0).Uint())) |
||||
c.Write(block, msg.Seed) |
||||
|
||||
case "getKey": |
||||
c.Write(pipe.Key().PrivateKey, msg.Seed) |
||||
case "transact": |
||||
if mp, ok := msg.Args[0].(map[string]interface{}); ok { |
||||
object := mapToTxParams(mp) |
||||
c.Write( |
||||
args(pipe.Transact(object["from"], object["to"], object["value"], object["gas"], object["gasPrice"], object["data"])), |
||||
msg.Seed, |
||||
) |
||||
|
||||
} |
||||
case "getCoinBase": |
||||
c.Write(pipe.CoinBase(), msg.Seed) |
||||
|
||||
case "getIsListening": |
||||
c.Write(pipe.IsListening(), msg.Seed) |
||||
|
||||
case "getIsMining": |
||||
c.Write(pipe.IsMining(), msg.Seed) |
||||
|
||||
case "getPeerCoint": |
||||
c.Write(pipe.PeerCount(), msg.Seed) |
||||
|
||||
case "getCountAt": |
||||
args := msg.Arguments() |
||||
|
||||
c.Write(pipe.TxCountAt(args.Get(0).Str()), msg.Seed) |
||||
|
||||
case "getCodeAt": |
||||
args := msg.Arguments() |
||||
|
||||
c.Write(len(pipe.CodeAt(args.Get(0).Str())), msg.Seed) |
||||
|
||||
case "getBlockByHash": |
||||
args := msg.Arguments() |
||||
|
||||
c.Write(pipe.BlockByHash(args.Get(0).Str()), msg.Seed) |
||||
|
||||
case "getStorageAt": |
||||
args := msg.Arguments() |
||||
|
||||
c.Write(pipe.StorageAt(args.Get(0).Str(), args.Get(1).Str()), msg.Seed) |
||||
|
||||
case "getBalanceAt": |
||||
args := msg.Arguments() |
||||
|
||||
c.Write(pipe.BalanceAt(args.Get(0).Str()), msg.Seed) |
||||
|
||||
case "getSecretToAddress": |
||||
args := msg.Arguments() |
||||
|
||||
c.Write(pipe.SecretToAddress(args.Get(0).Str()), msg.Seed) |
||||
|
||||
case "newFilter": |
||||
case "newFilterString": |
||||
case "messages": |
||||
// TODO
|
||||
} |
||||
|
||||
}) |
||||
|
||||
wsServ.Listen() |
||||
} |
||||
|
||||
func StartWebSockets(eth *eth.Ethereum) { |
||||
sock := NewWebSocketServer(eth) |
||||
go sock.Serv() |
||||
} |
||||
|
||||
// TODO This is starting to become a generic method. Move to utils
|
||||
func mapToTxParams(object map[string]interface{}) map[string]string { |
||||
// Default values
|
||||
if object["from"] == nil { |
||||
object["from"] = "" |
||||
} |
||||
if object["to"] == nil { |
||||
object["to"] = "" |
||||
} |
||||
if object["value"] == nil { |
||||
object["value"] = "" |
||||
} |
||||
if object["gas"] == nil { |
||||
object["gas"] = "" |
||||
} |
||||
if object["gasPrice"] == nil { |
||||
object["gasPrice"] = "" |
||||
} |
||||
|
||||
var dataStr string |
||||
var data []string |
||||
if str, ok := object["data"].(string); ok { |
||||
data = []string{str} |
||||
} |
||||
|
||||
for _, str := range data { |
||||
if ethutil.IsHex(str) { |
||||
str = str[2:] |
||||
|
||||
if len(str) != 64 { |
||||
str = ethutil.LeftPadString(str, 64) |
||||
} |
||||
} else { |
||||
str = ethutil.Bytes2Hex(ethutil.LeftPadBytes(ethutil.Big(str).Bytes(), 32)) |
||||
} |
||||
|
||||
dataStr += str |
||||
} |
||||
object["data"] = dataStr |
||||
|
||||
conv := make(map[string]string) |
||||
for key, value := range object { |
||||
if v, ok := value.(string); ok { |
||||
conv[key] = v |
||||
} |
||||
} |
||||
|
||||
return conv |
||||
} |
Loading…
Reference in new issue