UNPKG

libreblog

Version:

An in-browser Static Site Generator focused on content-rich blogs and news websites

132 lines (116 loc) 4.56 kB
const saveFile = async function(filename, filedata, messageId) { try { const opfsRoot = await navigator.storage.getDirectory(); const mediaFolder = await opfsRoot.getDirectoryHandle("media", {create: true}); const fileHandle = await mediaFolder.getFileHandle(filename, {create: true}); const accessHandle = await fileHandle.createSyncAccessHandle(); accessHandle.write(filedata, {at: 0}); accessHandle.flush(); accessHandle.close(); postMessage({messageId: messageId, result: "ok", type: "response"}); } catch(e) { postMessage({messageId: messageId, result: e, type: "error"}); } } const deleteFile = async function(filename, messageId) { try { const opfsRoot = await navigator.storage.getDirectory(); const mediaFolder = await opfsRoot.getDirectoryHandle("media"); await mediaFolder.removeEntry(filename); postMessage({messageId: messageId, result: "ok", type: "response"}); } catch(e) { postMessage({messageId: messageId, result: e, type: "error"}); } } const listFiles = async function(messageId) { try { const opfsRoot = await navigator.storage.getDirectory(); const mediaFolder = await opfsRoot.getDirectoryHandle("media", {create: true}); let result = []; for await (let [name, fileHandle] of mediaFolder) { const file = await fileHandle.getFile(); const objectUrl = URL.createObjectURL(file); result.push({name: name, url: objectUrl}); } postMessage({messageId: messageId, result: result, type: "response"}); } catch(e) { postMessage({messageId: messageId, result: e, type: "error"}); } } const listFilesWithSize = async function(messageId) { try { const opfsRoot = await navigator.storage.getDirectory(); const mediaFolder = await opfsRoot.getDirectoryHandle("media", {create: true}); let result = []; for await (let [name, fileHandle] of mediaFolder) { const file = await fileHandle.getFile(); const accessHandle = await fileHandle.createSyncAccessHandle(); const fileSize = accessHandle.getSize(); accessHandle.close(); result.push({name: name, size: fileSize}); } postMessage({messageId: messageId, result: result, type: "response"}); } catch(e) { postMessage({messageId: messageId, result: e, type: "error"}); } } const listFilesWithData = async function(messageId) { try { const opfsRoot = await navigator.storage.getDirectory(); const mediaFolder = await opfsRoot.getDirectoryHandle("media", {create: true}); let result = []; for await (let [name, fileHandle] of mediaFolder) { const file = await fileHandle.getFile(); const accessHandle = await fileHandle.createSyncAccessHandle(); const fileSize = accessHandle.getSize(); const dataView = new DataView(new ArrayBuffer(fileSize)); accessHandle.read(dataView, { at: 0 }); accessHandle.close(); result.push({name: name, data: dataView.buffer}); } postMessage({messageId: messageId, result: result, type: "response"}); } catch(e) { postMessage({messageId: messageId, result: e, type: "error"}); } } const getFile = async function(filename, messageId) { try { const opfsRoot = await navigator.storage.getDirectory(); const mediaFolder = await opfsRoot.getDirectoryHandle("media"); const fileHandle = await mediaFolder.getFileHandle(filename); const file = await fileHandle.getFile(); const objectUrl = URL.createObjectURL(file); const accessHandle = await fileHandle.createSyncAccessHandle(); const fileSize = accessHandle.getSize(); const dataView = new DataView(new ArrayBuffer(fileSize)); accessHandle.read(dataView, { at: 0 }); accessHandle.close(); postMessage({messageId: messageId, result: {data: dataView.buffer, url: objectUrl}, type: "response"}); } catch(e) { postMessage({messageId: messageId, result: e, type: "error"}); } } onmessage = function (msgEvent) { const msg = msgEvent.data; switch(msg.type) { case 'get-file': getFile(msg.filename, msg.messageId); break; case 'save-file': saveFile(msg.filename, msg.filedata, msg.messageId); break; case 'delete-file': deleteFile(msg.filename, msg.messageId); break; case 'list-files': listFiles(msg.messageId); break; case 'list-files-with-data': listFilesWithData(msg.messageId); break; case 'list-files-with-size': listFilesWithSize(msg.messageId); break; default: } };