aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/src/meshbay_node/transport
diff options
context:
space:
mode:
authorChristophe Besson <cbesson@gmail.com>2026-08-11 16:12:16 +0200
committerChristophe Besson <cbesson@gmail.com>2026-08-11 16:12:16 +0200
commitb50750466622dd6cda0fc084d39dfce000ad0081 (patch)
treeeb888909a77a88d4f824f569301e02e65faef0f3 /packages/meshbay-node/src/meshbay_node/transport
parent8b02ae3a8d64dedb198284ac743378dd38ca31c4 (diff)
downloadmeshbay-b50750466622dd6cda0fc084d39dfce000ad0081.tar.gz
fix(ui): upload chunk size, cached file display, chat names, file delete, inline thumbnails
- Upload chunks capped at 64KB to avoid WebRTC DataChannel max-message-size - Show cached files immediately while WebRTC connects (tabs visible during connection) - Persist sender_name in chat store (SQLite) — no more UUID display in history - File delete action in menu (node admin only, enforced server-side) - FILE_DELETE / FILE_DELETE_ACK MNP message types - Inline image thumbnails in chat attachments (download+decrypt, Signal-style) - Member panel: "Owner" label instead of "Group admin" to avoid hub/group admin confusion - Create group page: hint about needing a node - Refresh index after chat file attachment upload Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'packages/meshbay-node/src/meshbay_node/transport')
-rw-r--r--packages/meshbay-node/src/meshbay_node/transport/webrtc_server.py34
1 files changed, 33 insertions, 1 deletions
diff --git a/packages/meshbay-node/src/meshbay_node/transport/webrtc_server.py b/packages/meshbay-node/src/meshbay_node/transport/webrtc_server.py
index 6231310..15c8f66 100644
--- a/packages/meshbay-node/src/meshbay_node/transport/webrtc_server.py
+++ b/packages/meshbay-node/src/meshbay_node/transport/webrtc_server.py
@@ -116,6 +116,8 @@ class WebRTCPeerSession:
self._do_chat_history(msg)
elif mtype == MNP.FILE_UPLOAD:
self._do_file_upload(msg)
+ elif mtype == MNP.FILE_DELETE:
+ self._do_file_delete(msg)
else:
log.warning("Unknown MNP message type on DataChannel: %s", mtype)
except Exception as e:
@@ -276,6 +278,7 @@ class WebRTCPeerSession:
iteration=msg.get("iteration", 0),
payload=raw,
thread_id=msg.get("thread_id"),
+ sender_name=sender_name,
))
peers = self._ctx.get("_peers", {})
@@ -321,7 +324,7 @@ class WebRTCPeerSession:
{
"id": m.id,
"sender_id": m.sender_id,
- "sender_name": names.get(m.sender_id, ""),
+ "sender_name": m.sender_name or names.get(m.sender_id, ""),
"payload": m.payload.decode("utf-8", errors="replace")
if isinstance(m.payload, bytes) else m.payload,
"timestamp": m.timestamp,
@@ -373,6 +376,35 @@ class WebRTCPeerSession:
tmp_path.rename(final_path)
log.info("Upload complete: %s (%d chunks)", safe_name, total_chunks)
+ def _do_file_delete(self, msg: dict) -> None:
+ ctx = self._group_ctx()
+ file_id = msg.get("file_id", "")
+ if not file_id:
+ self._send({"type": "error", "detail": "Missing file_id"})
+ return
+
+ node_user_id = self._ctx.get("node_user_id")
+ if node_user_id and self._user_id != node_user_id:
+ self._send({"type": "error", "detail": "Only node admin can delete files"})
+ return
+
+ entry = ctx["index"].get_entry(file_id)
+ if not entry:
+ self._send({"type": "error", "detail": "File not found"})
+ return
+
+ file_path = ctx["shared_root"] / entry.path / entry.name
+ if file_path.exists():
+ file_path.unlink()
+ log.info("File deleted: %s", entry.name)
+
+ ctx["index"].remove_entry(file_id)
+ self._send({
+ "type": MNP.FILE_DELETE_ACK,
+ "v": MNP_VERSION,
+ "file_id": file_id,
+ })
+
def _send(self, obj: dict) -> None:
if self._channel and self._channel.readyState == "open":
self._channel.send(_pack(obj))