From b90155c3b7f0e7d11b76f2d35a014b79afdf5286 Mon Sep 17 00:00:00 2001 From: Siavash Sameni Date: Thu, 26 Mar 2026 23:20:25 +0400 Subject: [PATCH] Fix web client: gracefully handle CLI members in groups MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fetchPeerKey: catch JSON parse error for CLI bincode bundles, show clear "CLI client — needs WASM bridge" message - Group send: silently skip CLI members instead of showing error per member (mixed groups work, web members get messages, CLI members are skipped without noise) Co-Authored-By: Claude Opus 4.6 (1M context) --- warzone/crates/warzone-server/src/routes/web.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/warzone/crates/warzone-server/src/routes/web.rs b/warzone/crates/warzone-server/src/routes/web.rs index fda177a..7144262 100644 --- a/warzone/crates/warzone-server/src/routes/web.rs +++ b/warzone/crates/warzone-server/src/routes/web.rs @@ -250,9 +250,15 @@ async function fetchPeerKey(peerFP) { const data = await resp.json(); const bundleBytes = Uint8Array.from(atob(data.bundle), c => c.charCodeAt(0)); const bundleStr = new TextDecoder().decode(bundleBytes); - const bundle = JSON.parse(bundleStr); - if (bundle.type !== 'web') throw new Error('Peer is CLI client (incompatible crypto). Use CLI to chat with them.'); + let bundle; + try { + bundle = JSON.parse(bundleStr); + } catch(e) { + throw new Error('CLI client — cannot encrypt (different crypto, needs WASM bridge)'); + } + + if (bundle.type !== 'web') throw new Error('CLI client — cannot encrypt (different crypto)'); const aesKey = await deriveAESKey(bundle.jwk); derivedKeys[fp] = aesKey; @@ -459,11 +465,11 @@ async function sendToGroup(groupName, text) { message: Array.from(new TextEncoder().encode(envelope)) }); } catch(e) { - addSys('Failed to encrypt for ' + memberFP.slice(0,8) + ': ' + e.message); + // Silently skip CLI members (different crypto) } } - if (messages.length === 0) return; + if (messages.length === 0) { addSys('No compatible web members to send to'); return; } await fetch(SERVER + '/v1/groups/' + groupName + '/send', { method: 'POST',