Skip to content

Commit

Permalink
Implemented filter for ws + fixes
Browse files Browse the repository at this point in the history
* proper 0xhex
* filters fixed
* start of filter manager
* accounts for ws. Closes #246
  • Loading branch information
obscuren committed Jan 9, 2015
1 parent 491c23a commit e3da85f
Show file tree
Hide file tree
Showing 10 changed files with 144 additions and 93 deletions.
2 changes: 1 addition & 1 deletion cmd/mist/assets/qml/browser.qml
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ Rectangle {
onMessages: {
// Bit of a cheat to get proper JSON
var m = JSON.parse(JSON.parse(JSON.stringify(messages)))
webview.postEvent("messages", id, m);
webview.postEvent("eth_changed", id, m);
}

function onShhMessage(message, id) {
Expand Down
1 change: 1 addition & 0 deletions cmd/mist/ui_lib.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib {
lib := &UiLib{JSXEth: xeth.NewJSXEth(eth), engine: engine, eth: eth, assetPath: assetPath, jsEngine: javascript.NewJSRE(eth), filterCallbacks: make(map[int][]int)} //, filters: make(map[int]*xeth.JSFilter)}
lib.miner = miner.New(eth.KeyManager().Address(), eth)
lib.filterManager = filter.NewFilterManager(eth.EventMux())
go lib.filterManager.Start()

return lib
}
Expand Down
54 changes: 44 additions & 10 deletions cmd/utils/websockets.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,14 @@
package utils

import (
"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/filter"
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/state"
"github.com/ethereum/go-ethereum/ui/qt"
"github.com/ethereum/go-ethereum/websocket"
"github.com/ethereum/go-ethereum/xeth"
)
Expand All @@ -35,16 +40,19 @@ func args(v ...interface{}) []interface{} {
}

type WebSocketServer struct {
ethereum *eth.Ethereum
filterCallbacks map[int][]int
eth *eth.Ethereum
filterManager *filter.FilterManager
}

func NewWebSocketServer(eth *eth.Ethereum) *WebSocketServer {
return &WebSocketServer{eth, make(map[int][]int)}
filterManager := filter.NewFilterManager(eth.EventMux())
go filterManager.Start()

return &WebSocketServer{eth, filterManager}
}

func (self *WebSocketServer) Serv() {
pipe := xeth.NewJSXEth(self.ethereum)
pipe := xeth.NewJSXEth(self.eth)

wsServ := websocket.NewServer("/eth", ":40404")
wsServ.MessageFunc(func(c *websocket.Client, msg *websocket.Message) {
Expand Down Expand Up @@ -112,22 +120,48 @@ func (self *WebSocketServer) Serv() {

c.Write(pipe.BalanceAt(args.Get(0).Str()), msg.Id)

case "eth_secretToAddress":
args := msg.Arguments()

c.Write(pipe.SecretToAddress(args.Get(0).Str()), msg.Id)
case "eth_accounts":
c.Write(pipe.Accounts(), msg.Id)

case "eth_newFilter":
if mp, ok := msg.Args[0].(map[string]interface{}); ok {
var id int
filter := qt.NewFilterFromMap(mp, self.eth)
filter.MessageCallback = func(messages state.Messages) {
c.Event(toMessages(messages), "eth_changed", id)
}
id = self.filterManager.InstallFilter(filter)
c.Write(id, msg.Id)
}
case "eth_newFilterString":
case "eth_messages":
// TODO
var id int
filter := core.NewFilter(self.eth)
filter.BlockCallback = func(block *types.Block) {
c.Event(nil, "eth_changed", id)
}
id = self.filterManager.InstallFilter(filter)
c.Write(id, msg.Id)
case "eth_filterLogs":
filter := self.filterManager.GetFilter(int(msg.Arguments().Get(0).Uint()))
if filter != nil {
c.Write(toMessages(filter.Find()), msg.Id)
}
}

})

wsServ.Listen()
}

func toMessages(messages state.Messages) (msgs []xeth.JSMessage) {
msgs = make([]xeth.JSMessage, len(messages))
for i, msg := range messages {
msgs[i] = xeth.NewJSMessage(msg)
}

return
}

func StartWebSockets(eth *eth.Ethereum) {
wslogger.Infoln("Starting WebSockets")

Expand Down
2 changes: 2 additions & 0 deletions event/filter/old_filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
package filter

import (
"fmt"
"sync"

"github.com/ethereum/go-ethereum/core"
Expand Down Expand Up @@ -78,6 +79,7 @@ out:
self.filterMu.RUnlock()

case state.Messages:
fmt.Println("got messages")
self.filterMu.RLock()
for _, filter := range self.filters {
if filter.MessageCallback != nil {
Expand Down
20 changes: 15 additions & 5 deletions ui/filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,16 @@ import (
"github.com/ethereum/go-ethereum/ethutil"
)

func fromHex(s string) []byte {
if len(s) > 1 {
if s[0:2] == "0x" {
s = s[2:]
}
return ethutil.Hex2Bytes(s)
}
return nil
}

func NewFilterFromMap(object map[string]interface{}, eth core.EthManager) *core.Filter {
filter := core.NewFilter(eth)

Expand All @@ -20,12 +30,12 @@ func NewFilterFromMap(object map[string]interface{}, eth core.EthManager) *core.

if object["to"] != nil {
val := ethutil.NewValue(object["to"])
filter.AddTo(ethutil.Hex2Bytes(val.Str()))
filter.AddTo(fromHex(val.Str()))
}

if object["from"] != nil {
val := ethutil.NewValue(object["from"])
filter.AddFrom(ethutil.Hex2Bytes(val.Str()))
filter.AddFrom(fromHex(val.Str()))
}

if object["max"] != nil {
Expand All @@ -48,11 +58,11 @@ func NewFilterFromMap(object map[string]interface{}, eth core.EthManager) *core.
// Conversion methodn
func mapToAccountChange(m map[string]interface{}) (d core.AccountChange) {
if str, ok := m["id"].(string); ok {
d.Address = ethutil.Hex2Bytes(str)
d.Address = fromHex(str)
}

if str, ok := m["at"].(string); ok {
d.StateAddress = ethutil.Hex2Bytes(str)
d.StateAddress = fromHex(str)
}

return
Expand All @@ -62,7 +72,7 @@ func mapToAccountChange(m map[string]interface{}) (d core.AccountChange) {
// ["aabbccdd", {id: "ccddee", at: "11223344"}], "aabbcc", {id: "ccddee", at: "1122"}
func makeAltered(v interface{}) (d []core.AccountChange) {
if str, ok := v.(string); ok {
d = append(d, core.AccountChange{ethutil.Hex2Bytes(str), nil})
d = append(d, core.AccountChange{fromHex(str), nil})
} else if obj, ok := v.(map[string]interface{}); ok {
d = append(d, mapToAccountChange(obj))
} else if slice, ok := v.([]interface{}); ok {
Expand Down
5 changes: 0 additions & 5 deletions ui/qt/filter.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package qt

import (
"fmt"

"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/ui"
"gopkg.in/qml.v1"
Expand All @@ -23,13 +21,10 @@ func makeAltered(v interface{}) (d []core.AccountChange) {
var s []interface{}
qList.Convert(&s)

fmt.Println(s)

d = makeAltered(s)
} else if qMap, ok := v.(*qml.Map); ok {
var m map[string]interface{}
qMap.Convert(&m)
fmt.Println(m)

d = makeAltered(m)
}
Expand Down
8 changes: 7 additions & 1 deletion websocket/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,13 @@ func (c *Client) Conn() *ws.Conn {
}

func (c *Client) Write(data interface{}, id int) {
msg := &Message{Id: id, Data: data}
c.write(&Message{Id: id, Data: data})
}
func (c *Client) Event(data interface{}, ev string, id int) {
c.write(&Message{Id: id, Data: data, Event: ev})
}

func (c *Client) write(msg *Message) {
select {
case c.ch <- msg:
default:
Expand Down
9 changes: 5 additions & 4 deletions websocket/message.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@ package websocket
import "github.com/ethereum/go-ethereum/ethutil"

type Message struct {
Call string `json:"call"`
Args []interface{} `json:"args"`
Id int `json:"_id"`
Data interface{} `json:"data"`
Call string `json:"call"`
Args []interface{} `json:"args"`
Id int `json:"_id"`
Data interface{} `json:"data"`
Event string `json:"_event"`
}

func (self *Message) Arguments() *ethutil.Value {
Expand Down
Loading

0 comments on commit e3da85f

Please sign in to comment.