diff --git a/web/zebra-spaces.html b/web/zebra-spaces.html
index 27ba101..bd63416 100644
--- a/web/zebra-spaces.html
+++ b/web/zebra-spaces.html
@@ -1335,7 +1335,7 @@ $('btn-logout').addEventListener('click', async () => {
myHandle = ''; $('handle').value = '';
myKeys = await generateIdentity();
renderIdentity();
- logLine('', 'logged out — fresh identity '+shortHex(myKeys.pubHex));
+ logLine('', 'logged out — fresh identity '+myKeys.pubHex);
});
$('btn-vault-backup').addEventListener('click', async () => {
const pw = $('vault-pass').value;
@@ -1455,7 +1455,7 @@ function attachSfuTrack(uuid, stream){
* swap — caller already had a user gesture (entered the space) */
try { const p = a.play(); if (p && p.catch) p.catch(()=>{}); } catch(_){}
stopMeter(uuid); startMeter(uuid, stream);
- logLine('', 'sfu: receiving '+((members.get(uuid)||{}).handle || shortHex(uuid)));
+ logLine('', 'sfu: receiving '+((members.get(uuid)||{}).handle || uuid));
}
/* If we already have a cached SFU stream for this member's pubkey (from a
* prior subscribe-side ontrack), attach it. Used on peer-joined / host
@@ -1907,7 +1907,7 @@ async function sfuPublish(){
const ans = await res.json();
await pc.setRemoteDescription({ type:'answer', sdp: ans.sdp });
sfuPubPC = pc; sfuPubPeerID = ans.peer_id;
- logLine('', 'sfu: publishing as '+shortHex(sfuPubPeerID));
+ logLine('', 'sfu: publishing as '+sfuPubPeerID);
}
/* ----- screen share ----- */
@@ -1975,7 +1975,7 @@ async function sfuPublishScreen(){
if (s.track.kind === 'video') setSenderMaxBitrate(s, 6000000);
if (s.track.kind === 'audio') setSenderMaxBitrate(s, 256000);
}
- logLine('', 'sfu: sharing screen as '+shortHex(sfuScreenPeerID));
+ logLine('', 'sfu: sharing screen as '+sfuScreenPeerID);
/* render a muted local preview so the publisher sees what they're
* sharing — SFU does not echo the publisher's own stream back */
renderScreenTile(myKeys.pubHex, stream, { local: true });
@@ -2054,7 +2054,7 @@ async function sfuPublishGame(iframe){
if (s.track.kind === 'video') setSenderMaxBitrate(s, 4000000);
if (s.track.kind === 'audio') setSenderMaxBitrate(s, 256000);
}
- logLine('', 'sfu: sharing gameplay as '+shortHex(sfuGamePeerID));
+ logLine('', 'sfu: sharing gameplay as '+sfuGamePeerID);
}
async function sfuUnpublishGame(){
if (!sfuGamePC && !sfuGameStream) return;
@@ -2104,7 +2104,7 @@ async function sfuPublishCamera(){
for (const s of pc.getSenders()){
if (s.track && s.track.kind === 'video') setSenderMaxBitrate(s, 1500000);
}
- logLine('', 'sfu: camera on as '+shortHex(sfuCameraPeerID));
+ logLine('', 'sfu: camera on as '+sfuCameraPeerID);
renderCameraTile(myKeys.pubHex, stream, { local: true });
$('btn-camera-share').classList.add('hidden');
$('btn-camera-stop').classList.remove('hidden');
@@ -2168,7 +2168,7 @@ async function sfuSubscribe(){
} catch(_){}
}
if (kind === 'screen' || kind === 'camera' || kind === 'game'){
- logLine('', 'sfu ontrack: kind=' + kind + ' pub=' + shortHex(pubHex) +
+ logLine('', 'sfu ontrack: kind=' + kind + ' pub=' + pubHex +
' track=' + ev.track.kind + ' mute=' + ev.track.muted + ' state=' + ev.track.readyState);
}
if (kind === 'screen'){
@@ -2193,7 +2193,7 @@ async function sfuSubscribe(){
return;
}
if (kind !== 'mic'){
- logLine('', 'sfu: unknown kind '+kind+' from '+shortHex(pubHex));
+ logLine('', 'sfu: unknown kind '+kind+' from '+pubHex);
return;
}
/* mic audio — 400ms jitter-buffer target absorbs Wi-Fi peak jitter */
@@ -2291,7 +2291,7 @@ async function sfuSubscribe(){
});
};
sfuSubEvents.onerror = () => { /* EventSource auto-reconnects */ };
- logLine('', 'sfu: subscribed as '+shortHex(sfuSubPeerID));
+ logLine('', 'sfu: subscribed as '+sfuSubPeerID);
}
async function sfuUnsubscribe(){
@@ -2517,7 +2517,7 @@ function startMeter(uuid, stream){
if (!audioCtx) audioCtx = new (window.AudioContext||window.webkitAudioContext)();
let src;
try { src = audioCtx.createMediaStreamSource(stream); }
- catch(e){ logLine('err','meter for '+shortHex(uuid)+': '+e.message); return; }
+ catch(e){ logLine('err','meter for '+uuid+': '+e.message); return; }
const an = audioCtx.createAnalyser(); an.fftSize = 512;
src.connect(an);
const buf = new Uint8Array(an.fftSize);
@@ -2661,7 +2661,7 @@ async function handleSignal(raw){
spotlights.set(myUUID, spotlightKey());
broadcastSpotlight();
reorderTiles();
- logLine('', 'joined as '+myRole+' — uuid '+shortHex(myUUID));
+ logLine('', 'joined as '+myRole+' — uuid '+myUUID);
setStatus('connected as '+myRole, 'ok');
$('dot-call').className='dot ok';
$('btn-leave').disabled = false;
@@ -2733,7 +2733,7 @@ async function handleSignal(raw){
break;
case 'sdp-from':
try { await onSDP(m.from, m.kind, await aesDecrypt(sigKey, unb64(m.data))); }
- catch(e){ logLine('err','sdp from '+shortHex(m.from)+' failed: '+e.message); }
+ catch(e){ logLine('err','sdp from '+m.from+' failed: '+e.message); }
break;
case 'mic-state':
try { const s = JSON.parse(await aesDecrypt(sigKey, unb64(m.data)));
@@ -2762,7 +2762,7 @@ async function handleSignal(raw){
const from = members.get(m.from);
$('invite-from').textContent = 'from '+(from?from.handle:shortHex(m.from));
$('sec-invite').classList.remove('hidden');
- logLine('', 'you were invited to the mic by '+(from?from.handle:shortHex(m.from)));
+ logLine('', 'you were invited to the mic by '+(from?from.handle:m.from));
} else {
const from = members.get(m.from), to = members.get(m.to);
if (from && to) logLine('', from.handle+' invited '+to.handle+' to the mic');
@@ -2771,7 +2771,7 @@ async function handleSignal(raw){
case 'mic-invite-declined':
if (m.from === myUUID){
const to = members.get(m.to);
- logLine('', (to?to.handle:shortHex(m.to))+' declined the mic');
+ logLine('', (to?to.handle:m.to)+' declined the mic');
}
break;
case 'role-change':
@@ -2847,7 +2847,7 @@ async function handleSignal(raw){
if (mm){ mm.role = 'host';
if (m.new_host_uuid === myUUID){ myRole = 'host'; setStatus('connected as host','ok'); onRoleChanged('cohost','host'); }
else { setStatus('connected as '+myRole, 'ok'); } /* clears the space-closing warning */
- logLine('', (mm.handle||shortHex(m.new_host_uuid))+' is now host'); }
+ logLine('', (mm.handle||m.new_host_uuid)+' is now host'); }
flushSfuStreams();
renderRoom();
reorderTiles();
@@ -2956,7 +2956,7 @@ function updateRoleUI(){
* ================================================================== */
async function connectToPeer(uuid, weOffer){
if (peers.has(uuid)) return;
- if (!micStream){ try { await getMic(); } catch(e){ logLine('err','mic for '+shortHex(uuid)+': '+e.message); return; } }
+ if (!micStream){ try { await getMic(); } catch(e){ logLine('err','mic for '+uuid+': '+e.message); return; } }
const pc = new RTCPeerConnection(rtcConfig);
peers.set(uuid, pc);
for (const tr of micStream.getTracks()){ tagTrack(tr); pc.addTrack(tr, micStream); }
@@ -2973,7 +2973,7 @@ async function connectToPeer(uuid, weOffer){
pc.onicecandidate = (ev) => { /* using waitForIceGathering pattern, candidates ignored */ };
pc.onconnectionstatechange = () => {
if (pc.connectionState === 'failed' && peers.get(uuid) === pc){
- logLine('', 'peer '+shortHex(uuid)+' failed — reconnecting');
+ logLine('', 'peer '+uuid+' failed — reconnecting');
tearPeer(uuid);
/* let the offerer drive recovery */
setTimeout(()=>{ if (members.has(uuid) && canSpeak(members.get(uuid).role) && canSpeak(myRole))
@@ -3526,8 +3526,8 @@ logLine('', 'ready — pick a handle, type a rendezvous code, enter the space');