| <title>Web Locks</title> |
| <script> |
| var unblock = {}; |
| var blocked = {}; |
| |
| var next_request_id = 1; |
| |
| function AcquireLock(lock_name) { |
| blocked[lock_name] = new Promise(r => { unblock[lock_name] = r; }); |
| navigator.locks.request(lock_name, {}, async lock => { |
| await blocked[lock_name]; |
| }); |
| } |
| |
| function StealLock(lock_name) { |
| blocked[lock_name] = new Promise(r => { unblock[lock_name] = r; }); |
| navigator.locks.request(lock_name, {steal: true}, async lock => { |
| await blocked[lock_name]; |
| }); |
| } |
| |
| function ReleaseLock(lock_name) { |
| unblock[lock_name](); |
| } |
| |
| function AcquireReleaseLockFromDedicatedWorker() { |
| return new Promise(resolve => { |
| const worker = new Worker('dedicated_worker.js'); |
| let data = {op: 'acquire_lock', rqid: next_request_id++}; |
| worker.postMessage(data); |
| const listener = event => { |
| if (event.data.rqid !== data.rqid) |
| return; |
| worker.onmessage = undefined; |
| resolve(event.data); |
| }; |
| worker.onmessage = listener; |
| }); |
| } |
| |
| function AcquireReleaseLockFromSharedWorker() { |
| return new Promise(resolve => { |
| const worker = new SharedWorker('shared_worker.js'); |
| let data = {op: 'acquire_lock', rqid: next_request_id++}; |
| worker.port.postMessage(data); |
| const listener = event => { |
| if (event.data.rqid !== data.rqid) |
| return; |
| worker.port.onmessage = undefined; |
| resolve(event.data); |
| }; |
| worker.port.onmessage = listener; |
| }); |
| } |
| |
| function AcquireReleaseLockFromServiceWorker() { |
| return new Promise(async resolve => { |
| await navigator.serviceWorker.register('service_worker.js'); |
| registration = await navigator.serviceWorker.ready; |
| |
| var message_channel = new MessageChannel(); |
| message_channel.port1.onmessage = event => { |
| if (event.data.rqid !== data.rqid) |
| return; |
| message_channel.port1.onmessage = undefined; |
| resolve(event.data); |
| } |
| let data = {op: 'acquire_lock', rqid: next_request_id++}; |
| registration.active.postMessage( |
| data, [message_channel.port2]); |
| }); |
| } |
| </script> |