Added whisper js api
This commit is contained in:
parent
e42517754a
commit
4051c0333f
@ -59,15 +59,18 @@ Rectangle {
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
//webview.url = "http://etherian.io"
|
||||
webview.url = "file:///Users/jeffrey/test.html"
|
||||
webview.url = "http://etherian.io"
|
||||
}
|
||||
|
||||
signal messages(var messages, int id);
|
||||
onMessages: {
|
||||
// Bit of a cheat to get proper JSON
|
||||
var m = JSON.parse(JSON.parse(JSON.stringify(messages)))
|
||||
webview.postEvent("messages", [m, id]);
|
||||
webview.postEvent("messages", id, m);
|
||||
}
|
||||
|
||||
function onShhMessage(message, id) {
|
||||
webview.postEvent("shhChanged", id, message)
|
||||
}
|
||||
|
||||
Item {
|
||||
@ -328,6 +331,33 @@ Rectangle {
|
||||
require(1);
|
||||
eth.uninstallFilter(data.args[0])
|
||||
break;
|
||||
|
||||
|
||||
case "shhNewFilter":
|
||||
require(1);
|
||||
var id = shh.watch(data.args[0], window);
|
||||
postData(data._id, id);
|
||||
break;
|
||||
|
||||
case "newIdentity":
|
||||
postData(data._id, shh.newIdentity())
|
||||
break
|
||||
|
||||
case "post":
|
||||
require(1);
|
||||
var params = data.args[0];
|
||||
var fields = ["payload", "to", "from"];
|
||||
for(var i = 0; i < fields.length; i++) {
|
||||
params[fields[i]] = params[fields[i]] || "";
|
||||
}
|
||||
if(typeof params.payload === "object") { params.payload = params.payload.join(""); }
|
||||
params.topics = params.topics || [];
|
||||
params.priority = params.priority || 1000;
|
||||
params.ttl = params.ttl || 100;
|
||||
|
||||
console.log(JSON.stringify(params))
|
||||
shh.post(params.payload, params.to, params.from, params.topics, params.priority, params.ttl);
|
||||
break;
|
||||
}
|
||||
} catch(e) {
|
||||
console.log(data.call + ": " + e)
|
||||
@ -349,8 +379,8 @@ Rectangle {
|
||||
function postData(seed, data) {
|
||||
webview.experimental.postMessage(JSON.stringify({data: data, _id: seed}))
|
||||
}
|
||||
function postEvent(event, data) {
|
||||
webview.experimental.postMessage(JSON.stringify({data: data, _event: event}))
|
||||
function postEvent(event, id, data) {
|
||||
webview.experimental.postMessage(JSON.stringify({data: data, _id: id, _event: event}))
|
||||
}
|
||||
|
||||
function onWatchedCb(data, id) {
|
||||
|
@ -24,7 +24,7 @@ Rectangle {
|
||||
var t = shh.watch({}, root)
|
||||
}
|
||||
|
||||
function onMessage(message) {
|
||||
function onShhMessage(message, i) {
|
||||
whisperModel.insert(0, {from: message.from, payload: eth.toAscii(message.payload)})
|
||||
}
|
||||
|
||||
|
@ -43,38 +43,6 @@ import (
|
||||
"gopkg.in/qml.v1"
|
||||
)
|
||||
|
||||
/*
|
||||
func LoadExtension(path string) (uintptr, error) {
|
||||
lib, err := ffi.NewLibrary(path)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
so, err := lib.Fct("sharedObject", ffi.Pointer, nil)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
ptr := so()
|
||||
|
||||
err = lib.Close()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return ptr.Interface().(uintptr), nil
|
||||
}
|
||||
*/
|
||||
/*
|
||||
vec, errr := LoadExtension("/Users/jeffrey/Desktop/build-libqmltest-Desktop_Qt_5_2_1_clang_64bit-Debug/liblibqmltest_debug.dylib")
|
||||
fmt.Printf("Fetched vec with addr: %#x\n", vec)
|
||||
if errr != nil {
|
||||
fmt.Println(errr)
|
||||
} else {
|
||||
context.SetVar("vec", (unsafe.Pointer)(vec))
|
||||
}
|
||||
*/
|
||||
|
||||
var guilogger = logger.NewLogger("GUI")
|
||||
|
||||
type Gui struct {
|
||||
@ -535,3 +503,35 @@ func (gui *Gui) privateKey() string {
|
||||
func (gui *Gui) address() []byte {
|
||||
return gui.eth.KeyManager().Address()
|
||||
}
|
||||
|
||||
/*
|
||||
func LoadExtension(path string) (uintptr, error) {
|
||||
lib, err := ffi.NewLibrary(path)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
so, err := lib.Fct("sharedObject", ffi.Pointer, nil)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
ptr := so()
|
||||
|
||||
err = lib.Close()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return ptr.Interface().(uintptr), nil
|
||||
}
|
||||
*/
|
||||
/*
|
||||
vec, errr := LoadExtension("/Users/jeffrey/Desktop/build-libqmltest-Desktop_Qt_5_2_1_clang_64bit-Debug/liblibqmltest_debug.dylib")
|
||||
fmt.Printf("Fetched vec with addr: %#x\n", vec)
|
||||
if errr != nil {
|
||||
fmt.Println(errr)
|
||||
} else {
|
||||
context.SetVar("vec", (unsafe.Pointer)(vec))
|
||||
}
|
||||
*/
|
||||
|
@ -225,6 +225,83 @@ func (self *UiLib) StartDebugger() {
|
||||
dbWindow.Show()
|
||||
}
|
||||
|
||||
func (self *UiLib) Transact(params map[string]interface{}) (string, error) {
|
||||
object := mapToTxParams(params)
|
||||
|
||||
return self.JSXEth.Transact(
|
||||
object["from"],
|
||||
object["to"],
|
||||
object["value"],
|
||||
object["gas"],
|
||||
object["gasPrice"],
|
||||
object["data"],
|
||||
)
|
||||
}
|
||||
|
||||
func (self *UiLib) Compile(code string) (string, error) {
|
||||
bcode, err := ethutil.Compile(code, false)
|
||||
if err != nil {
|
||||
return err.Error(), err
|
||||
}
|
||||
|
||||
return ethutil.Bytes2Hex(bcode), err
|
||||
}
|
||||
|
||||
func (self *UiLib) Call(params map[string]interface{}) (string, error) {
|
||||
object := mapToTxParams(params)
|
||||
|
||||
return self.JSXEth.Execute(
|
||||
object["to"],
|
||||
object["value"],
|
||||
object["gas"],
|
||||
object["gasPrice"],
|
||||
object["data"],
|
||||
)
|
||||
}
|
||||
|
||||
func (self *UiLib) AddLocalTransaction(to, data, gas, gasPrice, value string) int {
|
||||
return self.miner.AddLocalTx(&miner.LocalTx{
|
||||
To: ethutil.Hex2Bytes(to),
|
||||
Data: ethutil.Hex2Bytes(data),
|
||||
Gas: gas,
|
||||
GasPrice: gasPrice,
|
||||
Value: value,
|
||||
}) - 1
|
||||
}
|
||||
|
||||
func (self *UiLib) RemoveLocalTransaction(id int) {
|
||||
self.miner.RemoveLocalTx(id)
|
||||
}
|
||||
|
||||
func (self *UiLib) SetGasPrice(price string) {
|
||||
self.miner.MinAcceptedGasPrice = ethutil.Big(price)
|
||||
}
|
||||
|
||||
func (self *UiLib) ToggleMining() bool {
|
||||
if !self.miner.Mining() {
|
||||
self.miner.Start()
|
||||
|
||||
return true
|
||||
} else {
|
||||
self.miner.Stop()
|
||||
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func (self *UiLib) ToHex(data string) string {
|
||||
return "0x" + ethutil.Bytes2Hex([]byte(data))
|
||||
}
|
||||
|
||||
func (self *UiLib) ToAscii(data string) string {
|
||||
start := 0
|
||||
if len(data) > 1 && data[0:2] == "0x" {
|
||||
start = 2
|
||||
}
|
||||
return string(ethutil.Hex2Bytes(data[start:]))
|
||||
}
|
||||
|
||||
/// Ethereum filter methods
|
||||
func (self *UiLib) NewFilter(object map[string]interface{}) (id int) {
|
||||
filter := qt.NewFilterFromMap(object, self.eth)
|
||||
filter.MessageCallback = func(messages state.Messages) {
|
||||
@ -312,88 +389,3 @@ func mapToTxParams(object map[string]interface{}) map[string]string {
|
||||
|
||||
return conv
|
||||
}
|
||||
|
||||
func (self *UiLib) Transact(params map[string]interface{}) (string, error) {
|
||||
object := mapToTxParams(params)
|
||||
|
||||
return self.JSXEth.Transact(
|
||||
object["from"],
|
||||
object["to"],
|
||||
object["value"],
|
||||
object["gas"],
|
||||
object["gasPrice"],
|
||||
object["data"],
|
||||
)
|
||||
}
|
||||
|
||||
func (self *UiLib) Compile(code string) (string, error) {
|
||||
bcode, err := ethutil.Compile(code, false)
|
||||
if err != nil {
|
||||
return err.Error(), err
|
||||
}
|
||||
|
||||
return ethutil.Bytes2Hex(bcode), err
|
||||
}
|
||||
|
||||
func (self *UiLib) Call(params map[string]interface{}) (string, error) {
|
||||
object := mapToTxParams(params)
|
||||
|
||||
return self.JSXEth.Execute(
|
||||
object["to"],
|
||||
object["value"],
|
||||
object["gas"],
|
||||
object["gasPrice"],
|
||||
object["data"],
|
||||
)
|
||||
}
|
||||
|
||||
func (self *UiLib) AddLocalTransaction(to, data, gas, gasPrice, value string) int {
|
||||
return self.miner.AddLocalTx(&miner.LocalTx{
|
||||
To: ethutil.Hex2Bytes(to),
|
||||
Data: ethutil.Hex2Bytes(data),
|
||||
Gas: gas,
|
||||
GasPrice: gasPrice,
|
||||
Value: value,
|
||||
}) - 1
|
||||
}
|
||||
|
||||
func (self *UiLib) RemoveLocalTransaction(id int) {
|
||||
self.miner.RemoveLocalTx(id)
|
||||
}
|
||||
|
||||
func (self *UiLib) SetGasPrice(price string) {
|
||||
self.miner.MinAcceptedGasPrice = ethutil.Big(price)
|
||||
}
|
||||
|
||||
func (self *UiLib) ToggleMining() bool {
|
||||
if !self.miner.Mining() {
|
||||
self.miner.Start()
|
||||
|
||||
return true
|
||||
} else {
|
||||
self.miner.Stop()
|
||||
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func (self *UiLib) ToHex(data string) string {
|
||||
return "0x" + ethutil.Bytes2Hex([]byte(data))
|
||||
}
|
||||
|
||||
func (self *UiLib) ToAscii(data string) string {
|
||||
start := 0
|
||||
if len(data) > 1 && data[0:2] == "0x" {
|
||||
start = 2
|
||||
}
|
||||
return string(ethutil.Hex2Bytes(data[start:]))
|
||||
}
|
||||
|
||||
/*
|
||||
// XXX Refactor me & MOVE
|
||||
func (self *Ethereum) InstallFilter(filter *core.Filter) (id int) {
|
||||
return self.filterManager.InstallFilter(filter)
|
||||
}
|
||||
func (self *Ethereum) UninstallFilter(id int) { self.filterManager.UninstallFilter(id) }
|
||||
func (self *Ethereum) GetFilter(id int) *core.Filter { return self.filterManager.GetFilter(id) }
|
||||
*/
|
||||
|
@ -8,7 +8,7 @@ import (
|
||||
|
||||
type Message struct {
|
||||
ref *whisper.Message
|
||||
Flags byte
|
||||
Flags int32
|
||||
Payload string
|
||||
From string
|
||||
}
|
||||
@ -16,7 +16,7 @@ type Message struct {
|
||||
func ToQMessage(msg *whisper.Message) *Message {
|
||||
return &Message{
|
||||
ref: msg,
|
||||
Flags: msg.Flags,
|
||||
Flags: int32(msg.Flags),
|
||||
Payload: ethutil.Bytes2Hex(msg.Payload),
|
||||
From: ethutil.Bytes2Hex(crypto.FromECDSAPub(msg.Recover())),
|
||||
}
|
||||
|
@ -33,9 +33,9 @@ func (self *Whisper) SetView(view qml.Object) {
|
||||
self.view = view
|
||||
}
|
||||
|
||||
func (self *Whisper) Post(data string, to, from string, topics []string, pow, ttl uint32) {
|
||||
func (self *Whisper) Post(data, to, from string, topics []string, priority, ttl uint32) {
|
||||
msg := whisper.NewMessage(fromHex(data))
|
||||
envelope, err := msg.Seal(time.Duration(pow), whisper.Opts{
|
||||
envelope, err := msg.Seal(time.Duration(priority*100000), whisper.Opts{
|
||||
Ttl: time.Duration(ttl),
|
||||
To: crypto.ToECDSAPub(fromHex(to)),
|
||||
From: crypto.ToECDSA(fromHex(from)),
|
||||
@ -64,13 +64,14 @@ func (self *Whisper) HasIdentity(key string) bool {
|
||||
|
||||
func (self *Whisper) Watch(opts map[string]interface{}, view *qml.Common) int {
|
||||
filter := filterFromMap(opts)
|
||||
var i int
|
||||
filter.Fn = func(msg *whisper.Message) {
|
||||
if view != nil {
|
||||
view.Call("onMessage", ToQMessage(msg))
|
||||
view.Call("onShhMessage", ToQMessage(msg), i)
|
||||
}
|
||||
}
|
||||
|
||||
i := self.Whisper.Watch(filter)
|
||||
i = self.Whisper.Watch(filter)
|
||||
self.watches[i] = &Watch{}
|
||||
|
||||
return i
|
||||
|
@ -175,7 +175,7 @@ func (self *Whisper) add(envelope *Envelope) error {
|
||||
|
||||
if !self.expiry[envelope.Expiry].Has(hash) {
|
||||
self.expiry[envelope.Expiry].Add(hash)
|
||||
self.postEvent(envelope)
|
||||
go self.postEvent(envelope)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
Loading…
Reference in New Issue
Block a user