Added whisper js api
This commit is contained in:
		@@ -59,15 +59,18 @@ Rectangle {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Component.onCompleted: {
 | 
					    Component.onCompleted: {
 | 
				
			||||||
        //webview.url = "http://etherian.io"
 | 
					        webview.url = "http://etherian.io"
 | 
				
			||||||
	webview.url = "file:///Users/jeffrey/test.html"
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    signal messages(var messages, int id);
 | 
					    signal messages(var messages, int id);
 | 
				
			||||||
    onMessages: {
 | 
					    onMessages: {
 | 
				
			||||||
        // Bit of a cheat to get proper JSON
 | 
					        // Bit of a cheat to get proper JSON
 | 
				
			||||||
        var m = JSON.parse(JSON.parse(JSON.stringify(messages)))
 | 
					        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 {
 | 
					    Item {
 | 
				
			||||||
@@ -328,6 +331,33 @@ Rectangle {
 | 
				
			|||||||
                        require(1);
 | 
					                        require(1);
 | 
				
			||||||
                        eth.uninstallFilter(data.args[0])
 | 
					                        eth.uninstallFilter(data.args[0])
 | 
				
			||||||
                        break;
 | 
					                        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) {
 | 
					                } catch(e) {
 | 
				
			||||||
                    console.log(data.call + ": " + e)
 | 
					                    console.log(data.call + ": " + e)
 | 
				
			||||||
@@ -349,8 +379,8 @@ Rectangle {
 | 
				
			|||||||
            function postData(seed, data) {
 | 
					            function postData(seed, data) {
 | 
				
			||||||
                webview.experimental.postMessage(JSON.stringify({data: data, _id: seed}))
 | 
					                webview.experimental.postMessage(JSON.stringify({data: data, _id: seed}))
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            function postEvent(event, data) {
 | 
					            function postEvent(event, id, data) {
 | 
				
			||||||
                webview.experimental.postMessage(JSON.stringify({data: data, _event: event}))
 | 
					                webview.experimental.postMessage(JSON.stringify({data: data, _id: id, _event: event}))
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            function onWatchedCb(data, id) {
 | 
					            function onWatchedCb(data, id) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,7 @@ Rectangle {
 | 
				
			|||||||
		var t = shh.watch({}, root)
 | 
							var t = shh.watch({}, root)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	function onMessage(message) {
 | 
						function onShhMessage(message, i) {
 | 
				
			||||||
		whisperModel.insert(0, {from: message.from, payload: eth.toAscii(message.payload)})
 | 
							whisperModel.insert(0, {from: message.from, payload: eth.toAscii(message.payload)})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,38 +43,6 @@ import (
 | 
				
			|||||||
	"gopkg.in/qml.v1"
 | 
						"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")
 | 
					var guilogger = logger.NewLogger("GUI")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Gui struct {
 | 
					type Gui struct {
 | 
				
			||||||
@@ -535,3 +503,35 @@ func (gui *Gui) privateKey() string {
 | 
				
			|||||||
func (gui *Gui) address() []byte {
 | 
					func (gui *Gui) address() []byte {
 | 
				
			||||||
	return gui.eth.KeyManager().Address()
 | 
						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()
 | 
						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) {
 | 
					func (self *UiLib) NewFilter(object map[string]interface{}) (id int) {
 | 
				
			||||||
	filter := qt.NewFilterFromMap(object, self.eth)
 | 
						filter := qt.NewFilterFromMap(object, self.eth)
 | 
				
			||||||
	filter.MessageCallback = func(messages state.Messages) {
 | 
						filter.MessageCallback = func(messages state.Messages) {
 | 
				
			||||||
@@ -312,88 +389,3 @@ func mapToTxParams(object map[string]interface{}) map[string]string {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return conv
 | 
						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 {
 | 
					type Message struct {
 | 
				
			||||||
	ref     *whisper.Message
 | 
						ref     *whisper.Message
 | 
				
			||||||
	Flags   byte
 | 
						Flags   int32
 | 
				
			||||||
	Payload string
 | 
						Payload string
 | 
				
			||||||
	From    string
 | 
						From    string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -16,7 +16,7 @@ type Message struct {
 | 
				
			|||||||
func ToQMessage(msg *whisper.Message) *Message {
 | 
					func ToQMessage(msg *whisper.Message) *Message {
 | 
				
			||||||
	return &Message{
 | 
						return &Message{
 | 
				
			||||||
		ref:     msg,
 | 
							ref:     msg,
 | 
				
			||||||
		Flags:   msg.Flags,
 | 
							Flags:   int32(msg.Flags),
 | 
				
			||||||
		Payload: ethutil.Bytes2Hex(msg.Payload),
 | 
							Payload: ethutil.Bytes2Hex(msg.Payload),
 | 
				
			||||||
		From:    ethutil.Bytes2Hex(crypto.FromECDSAPub(msg.Recover())),
 | 
							From:    ethutil.Bytes2Hex(crypto.FromECDSAPub(msg.Recover())),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,9 +33,9 @@ func (self *Whisper) SetView(view qml.Object) {
 | 
				
			|||||||
	self.view = view
 | 
						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))
 | 
						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),
 | 
							Ttl:    time.Duration(ttl),
 | 
				
			||||||
		To:     crypto.ToECDSAPub(fromHex(to)),
 | 
							To:     crypto.ToECDSAPub(fromHex(to)),
 | 
				
			||||||
		From:   crypto.ToECDSA(fromHex(from)),
 | 
							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 {
 | 
					func (self *Whisper) Watch(opts map[string]interface{}, view *qml.Common) int {
 | 
				
			||||||
	filter := filterFromMap(opts)
 | 
						filter := filterFromMap(opts)
 | 
				
			||||||
 | 
						var i int
 | 
				
			||||||
	filter.Fn = func(msg *whisper.Message) {
 | 
						filter.Fn = func(msg *whisper.Message) {
 | 
				
			||||||
		if view != nil {
 | 
							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{}
 | 
						self.watches[i] = &Watch{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return i
 | 
						return i
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -175,7 +175,7 @@ func (self *Whisper) add(envelope *Envelope) error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if !self.expiry[envelope.Expiry].Has(hash) {
 | 
						if !self.expiry[envelope.Expiry].Has(hash) {
 | 
				
			||||||
		self.expiry[envelope.Expiry].Add(hash)
 | 
							self.expiry[envelope.Expiry].Add(hash)
 | 
				
			||||||
		self.postEvent(envelope)
 | 
							go self.postEvent(envelope)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user