diff --git a/public/scripts/network.js b/public/scripts/network.js index f0986af..5b73cb4 100644 --- a/public/scripts/network.js +++ b/public/scripts/network.js @@ -1813,6 +1813,13 @@ class FileDigester { }); } + function deleteFile() { + fileWorker.postMessage({ + type: "delete-file", + name: _this._name + }) + } + function onPart(part) { // remove old chunk from buffer _this._buffer[i] = null; @@ -1831,16 +1838,23 @@ class FileDigester { function onFile(file) { _this._buffer = []; - fileWorker.terminate(); _this._fileCompleteCallback(file); + deleteFile(); + } + + function onFileDeleted() { + // File Digestion complete -> Tidy up + fileWorker.terminate(); } function onError(error) { - // an error occurred. Use memory method instead. + // an error occurred. Logger.error(error); Logger.warn('Failed to process file via service-worker. Do not use Firefox private mode to prevent this.') - fileWorker.terminate(); + + // Use memory method instead and tidy up. _this.processFileViaMemory(); + fileWorker.terminate(); } sendPart(this._buffer[i], offset); @@ -1853,6 +1867,9 @@ class FileDigester { case "file": onFile(e.data.file); break; + case "file-deleted": + onFileDeleted(); + break; case "error": onError(e.data.error); break; diff --git a/public/scripts/sw-file-digester.js b/public/scripts/sw-file-digester.js index 0a2bb3b..eaf36ba 100644 --- a/public/scripts/sw-file-digester.js +++ b/public/scripts/sw-file-digester.js @@ -7,6 +7,9 @@ self.addEventListener('message', async e => { case "get-file": await this.onGetFile(e.data.name); break; + case "delete-file": + await this.onDeleteFile(e.data.name); + break; } } catch (e) { @@ -32,7 +35,9 @@ async function onPart(fileName, buffer, offset) { // Write the message to the end of the file. let encodedMessage = new DataView(buffer); accessHandle.write(encodedMessage, { at: offset }); - accessHandle.close(); + + // Always close FileSystemSyncAccessHandle if done. + accessHandle.close(); accessHandle.close(); self.postMessage({type: "part", part: encodedMessage}); encodedMessage = null; @@ -43,6 +48,19 @@ async function onGetFile(fileName) { let file = await fileHandle.getFile(); self.postMessage({type: "file", file: file}); - file = null; - // Todo: delete file from storage +} + +async function onDeleteFile(fileName) { + const accessHandle = await getAccessHandle(fileName); + + // Truncate the file to 0 bytes + accessHandle.truncate(0); + + // Persist changes to disk. + accessHandle.flush(); + + // Always close FileSystemSyncAccessHandle if done. + accessHandle.close(); + + self.postMessage({type: "file-deleted"}); } \ No newline at end of file