47 lines
1.5 KiB
JavaScript
47 lines
1.5 KiB
JavaScript
'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);
|
|
}
|
|
}
|
|
})();
|