aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/src/meshbay_node/transport/quic_server.py
diff options
context:
space:
mode:
authorChristophe Besson <cbesson@gmail.com>2026-08-16 15:28:53 +0200
committerChristophe Besson <cbesson@gmail.com>2026-08-16 15:28:53 +0200
commitfd770dc6293be67298f582de5800f2ca6fe24a8b (patch)
treedf8a393741ccf391b5bb4fa490980c632695cbdd /packages/meshbay-node/src/meshbay_node/transport/quic_server.py
parent0bd3f805ffbd04b40b5150474336a5e5d200e72b (diff)
downloadmeshbay-fd770dc6293be67298f582de5800f2ca6fe24a8b.tar.gz
feat(common): MNP 0.2 — liveness, and chat history read the way it is written
`get_messages` pages forward from the oldest message. That is the right shape for "what happened since I last looked" and the wrong one for opening a conversation, and the browser asked it for `since=0, limit=200` — so a group with more than two hundred messages showed its first two hundred and the exchange anyone came for was unreachable. Demonstrated on 300 messages: the newest was simply absent from the answer. `get_recent` and `get_before` page backwards, cursored on the row id rather than the timestamp. Nothing makes a `time.time()` float unique, and a cursor on a value two rows can share eventually skips a message or repeats it. PING/PONG covers liveness on an already-open channel: a DataChannel whose peer vanished without closing still reads as connected, and nothing noticed until a real request hung. It is not a discovery mechanism — opening a connection to ping costs a full ICE/DTLS handshake, measured at 0.6-7 s across two ISPs — so presence in the group list comes from the hub's registry instead. Both additions are backward compatible: an 0.1 peer sends no `before` and is answered with the newest page, which is what it wanted. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Diffstat (limited to 'packages/meshbay-node/src/meshbay_node/transport/quic_server.py')
-rw-r--r--packages/meshbay-node/src/meshbay_node/transport/quic_server.py5
1 files changed, 5 insertions, 0 deletions
diff --git a/packages/meshbay-node/src/meshbay_node/transport/quic_server.py b/packages/meshbay-node/src/meshbay_node/transport/quic_server.py
index ed3925d..73e668c 100644
--- a/packages/meshbay-node/src/meshbay_node/transport/quic_server.py
+++ b/packages/meshbay-node/src/meshbay_node/transport/quic_server.py
@@ -203,6 +203,11 @@ class _MNPServerProtocol(QuicConnectionProtocol):
self._do_stream_segment_sync(stream_id, msg)
elif mtype == MNP.CHAT_MESSAGE:
self._do_chat_message_sync(stream_id, msg)
+ elif mtype == MNP.PING:
+ # Liveness is transport-agnostic, and a native client over QUIC
+ # has the same half-open problem a DataChannel does.
+ self._send(stream_id, {"type": MNP.PONG, "v": MNP_VERSION,
+ "token": msg.get("token")})
else:
log.warning("Unknown MNP message type: %s", mtype)
except Exception as e: