my-sea voice: guard before NVM disconnects voice + harden mute (honor pre-stream mute) — TDD
Phase 4 of the my-sea voice batch (user-spec 2026-05-29). ── Voice-disconnect guard (item 6, the achievable slice) ── Every my-sea navigation is a full page reload, which tears the WebRTC mesh down — so voice can't literally persist across a reload without an SPA-style no-reload nav (a separate, larger refactor, deferred). What ships now: the gear-menu NVM warns before dropping the call. - _my_sea_gear.html: the NVM routes through an inline, dependency-free `mySeaGuardedNav(event, url)`. When voice is LIVE (VoiceRoom.localStream) AND the target leaves my_sea (`url` has no `/my-sea`), it pops the shared guard portal — "Leave the Sea? You'll disconnect from voice." — before navigating; confirm proceeds, dismiss stays. NVMs that stay within my_sea, or any nav with no live mic, go straight through. Covers all NVMs (owner my_sea, the gatekeeper, the spectator) since they all include this partial. ── Bug B: desktop mute (mute robustness) ── - voice-mesh.js: extracted `_applyMute()` and call it from join (post- getUserMedia) as well as toggleMute. On desktop the first join pops a mic- permission prompt; a mute toggled while that prompt is open used to be lost because the stream didn't exist yet — re-applying after it resolves makes the mute stick. Teardown resets `muted=false` so a rejoin starts clean. - voice-glow.js: setVoiceState now syncs the voice btn's own flags (.in-call / .muted / dataset.inCall) to the mesh truth, so a rejoin starts clean and the glow's DOM fallback can't get stuck "live". Tests: +5 VoiceMeshSpec mute specs (incl. the pre-stream-mute Bug-B case); +2 NVM-guard FTs (warn when live / pass through when not); 3 gear-NVM ITs updated for the mySeaGuardedNav markup. 286 gameboard ITs + 433 Jasmine specs green. Note: true cross-view voice persistence (no-reload within-my_sea nav) + the desktop-mute live confirmation remain to verify on staging w. Redis up. Code architected by Disco DeDisco <discodedisco@outlook.com> Git commit message Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -9,8 +9,33 @@
|
||||
{# `<button>` + reads correctly as sans-serif). #}
|
||||
{# See [[feedback-btn-vs-anchor-font-family]]. #}
|
||||
{% if not nvm_url %}{% url 'gameboard' as nvm_url %}{% endif %}
|
||||
{# mySeaGuardedNav — defined inline (dependency-free; this partial loads on #}
|
||||
{# pages w/o the voice JS). When voice is LIVE and the NVM target leaves #}
|
||||
{# my_sea entirely (url has no `/my-sea`), warn via the shared guard portal #}
|
||||
{# before navigating, since the page reload tears the mesh down for this #}
|
||||
{# party. NVMs that stay within my_sea, or any nav with no live mic, go #}
|
||||
{# straight through. (Voice-disconnect guard — user-spec 2026-05-29.) #}
|
||||
<script>
|
||||
window.mySeaGuardedNav = window.mySeaGuardedNav || function (e, url) {
|
||||
var live = window.VoiceRoom && window.VoiceRoom.localStream;
|
||||
var leavesMySea = url.indexOf('/my-sea') === -1;
|
||||
if (live && leavesMySea && typeof window.showGuard === 'function') {
|
||||
if (e && e.preventDefault) e.preventDefault();
|
||||
var anchor = (e && (e.currentTarget || e.target)) || document.body;
|
||||
window.showGuard(
|
||||
anchor,
|
||||
'Leave the Sea?<br>You’ll disconnect from voice.',
|
||||
function () { window.location.href = url; }, // confirm
|
||||
null, // dismiss = stay
|
||||
{ yesLabel: 'NVM' }
|
||||
);
|
||||
return;
|
||||
}
|
||||
window.location.href = url;
|
||||
};
|
||||
</script>
|
||||
<div id="id_my_sea_menu" style="display:none">
|
||||
<button type="button" class="btn btn-cancel" onclick="location.href='{{ nvm_url }}'">NVM</button>
|
||||
<button type="button" class="btn btn-cancel" onclick="mySeaGuardedNav(event, '{{ nvm_url }}')">NVM</button>
|
||||
{# Spectator-only BYE (Phase B) — drops presence (status=LEFT, frees seat #}
|
||||
{# 2C, kills voice). Rendered below NVM only when the caller passes a #}
|
||||
{# `leave_url`; the owner's pages never do, so their menu is unchanged. #}
|
||||
|
||||
Reference in New Issue
Block a user