PairDrop/public/scripts/sw-file-digester.js

48 lines
No EOL
1.4 KiB
JavaScript

self.addEventListener('message', async e => {
try {
switch (e.data.type) {
case "part":
await this.onPart(e.data.name, e.data.buffer, e.data.offset);
break;
case "get-file":
await this.onGetFile(e.data.name);
break;
}
}
catch (e) {
self.postMessage({type: "error", error: e});
}
})
async function getFileHandle(fileName) {
const root = await navigator.storage.getDirectory();
return await root.getFileHandle(fileName, {create: true});
}
async function getAccessHandle(fileName) {
const fileHandle = await getFileHandle(fileName);
// Create FileSystemSyncAccessHandle on the file.
return await fileHandle.createSyncAccessHandle();
}
async function onPart(fileName, buffer, offset) {
const accessHandle = await getAccessHandle(fileName);
// Write the message to the end of the file.
let encodedMessage = new DataView(buffer);
accessHandle.write(encodedMessage, { at: offset });
accessHandle.close();
self.postMessage({type: "part", part: encodedMessage});
encodedMessage = null;
}
async function onGetFile(fileName) {
const fileHandle = await getFileHandle(fileName);
let file = await fileHandle.getFile();
self.postMessage({type: "file", file: file});
file = null;
// Todo: delete file from storage
}