Keep ordinary app launches available while optional policy loads

This commit is contained in:
archipelago
2026-10-07 01:05:33 -04:00
parent f1fb388ded
commit cffb74326a
6 changed files with 100 additions and 22 deletions
+1 -1
View File
@@ -49,7 +49,7 @@ export function attachAudioBridge({ parentOrigin, snapshot, actions, unlocked =
if (session) send({type:'archipelago:media-state',session,available:false})
closed = true; session = null
host.removeEventListener('message',message); host.removeEventListener('pageshow',ready); host.removeEventListener('pagehide',leave)
actions.pause?.()
try { Promise.resolve(actions.pause?.()).catch(() => {}) } catch { /* App teardown still releases the bridge. */ }
}
function leave(event) { if (!event.persisted) dispose() }
host.addEventListener('message',message); host.addEventListener('pageshow',ready); host.addEventListener('pagehide',leave)
@@ -36,3 +36,10 @@ test('stale queued commands do not control a replacement handshake',async()=>{
assert.deepEqual(f.calls,[])
f.bridge.dispose()
})
test('dispose releases listeners even if the app pause action rejects',async()=>{
const handlers=new Map()
const host={parent:{postMessage(){}},addEventListener:(name,fn)=>handlers.set(name,fn),removeEventListener:name=>handlers.delete(name)}
const bridge=attachAudioBridge({parentOrigin:'https://node.test',host,snapshot:()=>null,actions:{pause:async()=>{throw Error('player already closed')}}})
bridge.dispose();await new Promise(setImmediate);assert.equal(handlers.size,0)
})