/* Teaching probe for the supplied loopback-only generated-tone fixture. Never requests microphone, calls play(), or reads user files. */ async function probeTeachingPreload(mode, fetchSeparately = false) { if (location.hostname !== '127.0.0.1') throw new Error('Use only the supplied local fixture'); if (!['none', 'metadata', 'auto', 'deferred-source'].includes(mode)) throw new Error('Unknown teaching preload mode'); const audio = document.createElement('audio'); audio.muted = true; audio.preload = mode === 'deferred-source' ? 'none' : mode; if (mode !== 'deferred-source') audio.src = '/tone.wav'; document.body.append(audio); if (mode !== 'deferred-source') audio.load(); let separateFetchBytes = null; if (fetchSeparately) { const response = await fetch('/tone.wav', {cache: 'no-store'}); if (!response.ok) throw new Error('Local teaching audio unavailable'); separateFetchBytes = (await response.arrayBuffer()).byteLength; } await new Promise(resolve => setTimeout(resolve, 1200)); const snapshot = { requestedMode: mode, sourceAssigned: mode !== 'deferred-source', loadCalledBeforeObservation: mode !== 'deferred-source', reflectedPreload: audio.preload, readyState: audio.readyState, networkState: audio.networkState, finiteDuration: Number.isFinite(audio.duration) ? audio.duration : null, paused: audio.paused, currentTime: audio.currentTime, separateFetchBytes, observationWindowMs: 1200, playbackPerformed: false }; audio.removeAttribute('src'); audio.load(); audio.remove(); return snapshot; }