Implemented filter for ws + fixes

* proper 0xhex
* filters fixed
* start of filter manager
* accounts for ws. Closes #246
This commit is contained in:
obscuren
2015-01-10 00:51:56 +01:00
parent 491c23a728
commit e3da85faed
10 changed files with 144 additions and 93 deletions

View File

@ -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"
)
@ -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) {
@ -112,15 +120,32 @@ 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)
}
}
})
@ -128,6 +153,15 @@ func (self *WebSocketServer) Serv() {
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")