Fix web client: gracefully handle CLI members in groups

- 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) <noreply@anthropic.com>
This commit is contained in:
Siavash Sameni
2026-03-26 23:20:25 +04:00
parent 5cf7e8a02f
commit b90155c3b7

View File

@@ -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',