update announce packet format and broadcast all known peers on websocket connect

This commit is contained in:
liamcottle
2024-04-30 22:40:21 +12:00
parent 99512be59a
commit 262e0b9cad
2 changed files with 48 additions and 5 deletions

View File

@@ -314,9 +314,10 @@
break;
}
case 'announce': {
this.peers[json.destination_hash] = {
destination_hash: json.destination_hash,
app_data: json.app_data,
this.peers[json.announce.destination_hash] = {
destination_hash: json.announce.destination_hash,
app_data: json.announce.app_data,
last_announce_timestamp: json.announce.last_announce_timestamp,
}
break;
}

46
web.py
View File

@@ -5,6 +5,7 @@ import http
import json
import mimetypes
import os
import time
import RNS
import LXMF
@@ -127,6 +128,9 @@ class ReticulumWebChat:
# send config to all clients
await self.send_config_to_websocket_clients()
# send known peers to all clients
await self.send_known_peers_to_websocket_clients()
# handle client messages until disconnected
while True:
try:
@@ -206,6 +210,41 @@ class ReticulumWebChat:
},
}))
# broadcasts known peers to all websocket clients
async def send_known_peers_to_websocket_clients(self):
# process known peers
known_peers = []
for destination_hash in RNS.Identity.known_destinations:
known_destination = RNS.Identity.known_destinations[destination_hash]
last_announce_timestamp = known_destination[0]
known_peers.append({
"destination_hash": destination_hash.hex(),
"app_data": self.convert_app_data_to_string(RNS.Identity.recall_app_data(destination_hash)),
"last_announce_timestamp": last_announce_timestamp,
})
# send known peers to websocket clients
await self.websocket_broadcast(json.dumps({
"type": "known_peers",
"known_peers": known_peers,
}))
# convert app data to string, or return none unable to do so
def convert_app_data_to_string(self, app_data):
# attempt to convert to utf-8 string
if app_data is not None:
try:
return app_data.decode("utf-8")
except:
# ignore failure to convert to string
pass
# unable to convert to string
return None
# convert an lxmf message to a dictionary, for sending over websocket
def convert_lxmf_message_to_dict(self, lxmf_message: LXMF.LXMessage):
@@ -391,8 +430,11 @@ class ReticulumWebChat:
# send received lxmf announce to all websocket clients
asyncio.run(self.websocket_broadcast(json.dumps({
"type": "announce",
"destination_hash": destination_hash.hex(),
"app_data": parsed_app_data,
"announce": {
"destination_hash": destination_hash.hex(),
"app_data": parsed_app_data,
"last_announce_timestamp": time.time(),
},
})))