'use strict'; // Calls `createLock` with a file handle for `fileName`. Returns the lock if it // succeeds. Returns undefined if it doesn't. export async function tryToCreateLock(fileName, createLock) { const dir = await navigator.storage.getDirectory(); const fileHandle = await dir.getFileHandle(fileName, {create: true}); try { return await createLock(fileHandle); } catch { return undefined; } } // Returns a function that forwards `funcName` and the `args` passed to it to // the `bfcache-test-worker.js` dedicated worker. // // Will create the dedicated worker if it doesn't already exist. export const forwardToDedicatedWorker = (() => { let dedicatedWorker; // Returns a promise that resolves with the next dedicated worker result. Or // rejects if there is an error on the worker. function getNextDedicatedWorkerResult(dedicatedWorker) { return new Promise((resolve, reject) => { dedicatedWorker.addEventListener('message', ({data}) => { resolve(data); }, {once: true}); dedicatedWorker.addEventListener('error', () => { reject(new Error('An error occurred on the dedicated worker.')); }, {once: true}); }); } return function(funcName) { return (...args) => { if (!dedicatedWorker) { dedicatedWorker = new Worker( `/fs/resources/bfcache-test-worker.js`, {type: 'module'}); } dedicatedWorker.postMessage({funcName, args}); return getNextDedicatedWorkerResult(dedicatedWorker); } } })();