Source code

Revision control

Copy as Markdown

Other Tools

'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);
}
}
})();