mirror of
https://github.com/status-im/status-go.git
synced 2025-02-06 11:56:01 +00:00
Updated Whisper Push Notifications (markdown)
parent
864086c471
commit
39169de843
@ -280,19 +280,96 @@ var registerDevice = function (chatId, chatKey) {
|
||||
So, on `Device A` side, we have Chat Session Key, and we registered the device with that session. Now, we need to send/share the SymKey:
|
||||
|
||||
```js
|
||||
var shareChatKey = function (chatId, chatKey) {
|
||||
console.log('chat session key: ', chatKey)
|
||||
// pre-defined test identity (it gets injected automatically by statusd)
|
||||
var deviceBIdentity = '0x04eedbaafd6adf4a9233a13e7b1c3c14461fffeba2e9054b8d456ce5f6ebeafadcbf3dce3716253fbc391277fa5a086b60b283daf61fb5b1f26895f456c2f31ae3';
|
||||
|
||||
// it is up to you how you share secret among participants, here is sample
|
||||
var err = web3.shh.post({
|
||||
from: identity,
|
||||
to: deviceBIdentity,
|
||||
topics: ["chatKeySharing"],
|
||||
payload: '{"chat": "' + chatId + '", "key": "' + chatKey + '"}',
|
||||
ttl: 20
|
||||
});
|
||||
if (err !== null) {
|
||||
console.log("message NOT sent")
|
||||
} else {
|
||||
console.log("message sent OK")
|
||||
}
|
||||
};
|
||||
```
|
||||
You are free to use your own topic key, and format. What is important is the fact that Chat Session Key gets to the counter-party.
|
||||
|
||||
On `Device B` side, we need to wait for shared key, and then, once we get it, register `Device B` with the chat session.
|
||||
|
||||
```js
|
||||
```
|
||||
var web3 = new Web3();
|
||||
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8745'));
|
||||
|
||||
Time to trigger notifications:
|
||||
```js
|
||||
// pre-defined test identity (it gets injected automatically by statusd)
|
||||
var identity = '0x04eedbaafd6adf4a9233a13e7b1c3c14461fffeba2e9054b8d456ce5f6ebeafadcbf3dce3716253fbc391277fa5a086b60b283daf61fb5b1f26895f456c2f31ae3';
|
||||
if (!web3.shh.hasIdentity(identity)) {
|
||||
throw 'idenitity "0x04eedbaafd6adf4a9233a13e7b1c3c14461fffeba2e9054b8d456ce5f6ebeafadcbf3dce3716253fbc391277fa5a086b60b283daf61fb5b1f26895f456c2f31ae3" not found in whisper';
|
||||
}
|
||||
|
||||
// for for key sharing, it is up to you how you implement it (which topic to use etc)
|
||||
var filter = web3.shh.filter({
|
||||
to: identity, // wait for anon. messages to ourselves
|
||||
topics: ['chatKeySharing']
|
||||
});
|
||||
filter.watch(function (error, result) {
|
||||
if (!error) {
|
||||
console.log("Chat key received: ", result);
|
||||
// response will be in JSON, e.g. {chat: "0xdeadbeef", key: "0x04e68e37433baf55ddc2fe9f7533e4e722bcdad4239c98df92f3522907ced72d"}
|
||||
var payload = JSON.parse(web3.toAscii(result.payload));
|
||||
console.log(payload);
|
||||
|
||||
// no need to watch for the filter any more
|
||||
filter.stopWatching();
|
||||
|
||||
// let's save incoming key
|
||||
var keyname = payload.chat + '-chatkey';
|
||||
web3.shh.deleteSymKey(keyname);
|
||||
web3.shh.addSymKey(keyname, payload.key);
|
||||
|
||||
// now register ourselves
|
||||
var deviceId = 'some-device-id'; // you obtain this from FCM
|
||||
registerDevice(web3, identity, payload.chat, payload.key, deviceId);
|
||||
|
||||
// finally, trigger the notifications on all registered device (except for yourself)
|
||||
// at this point it is really trivial, use the key + specific topic:
|
||||
var err = web3.shh.post({
|
||||
from: identity,
|
||||
topics: [sendNotificationTopic],
|
||||
payload: "Hello, you've got mail!!", // yes, arbitrary data!
|
||||
ttl: 20,
|
||||
keyname: keyname
|
||||
});
|
||||
if (err !== null) {
|
||||
console.log("message NOT sent")
|
||||
} else {
|
||||
console.log("message sent OK")
|
||||
}
|
||||
}
|
||||
});
|
||||
```
|
||||
We provide all the code for `Device B` in a single chunk. Basically, all that `Device B` does, is: wait for shared key, register device, trigger notification.
|
||||
|
||||
# Implementation notes I: One-to-One Chats
|
||||
|
||||
# Implementation notes II: Group Chats
|
||||
|
||||
# Complete Sample
|
||||
|
||||
Full sample page used for testing can be found here: https://gist.github.com/farazdagi/5ac082ddf006d00de422385f07d41ad3
|
||||
|
||||
In order to use that page you need to start the following:
|
||||
```bash
|
||||
statusd --datadir app1 --http --httpport 8645 wnode # as Device A
|
||||
statusd --datadir app2 --http --httpport 8745 wnode # as Device B
|
||||
statusd --datadir wnode1 wnode --notify --password asdfasdf --injectaccounts=false # as notification server
|
||||
```
|
||||
|
||||
# Limitations
|
Loading…
x
Reference in New Issue
Block a user