'use strict'; // Map of id => function that releases a lock. const held = new Map(); let next_lock_id = 1; self.addEventListener('message', e => { function respond(data) { self.postMessage(Object.assign(data, {rqid: e.data.rqid})); } switch (e.data.op) { case 'request': navigator.locks.request( e.data.name, { mode: e.data.mode || 'exclusive', ifAvailable: e.data.ifAvailable || false }, lock => { if (lock === null) { respond({ack: 'request', failed: true}); return; } let lock_id = next_lock_id++; let release; const promise = new Promise(r => { release = r; }); held.set(lock_id, release); respond({ack: 'request', lock_id: lock_id}); return promise; }); break; case 'release': held.get(e.data.lock_id)(); held.delete(e.data.lock_id); respond({ack: 'release', lock_id: e.data.lock_id}); break; } });