UNPKG

cod-dicomweb-server

Version:

A wadors server proxy that get data from a Cloud Optimized Dicom format.

101 lines (100 loc) 3.87 kB
import { get } from 'idb-keyval'; import { FILE_SYSTEM_ROUTES, IDB_DIR_HANDLE_KEY } from './constants/dataRetrieval'; let directoryHandle; export async function getDirectoryHandle() { try { if (!directoryHandle) { directoryHandle = (await get(IDB_DIR_HANDLE_KEY)); } if (!directoryHandle) { directoryHandle = await navigator.storage.getDirectory(); } return directoryHandle; } catch (error) { console.warn(`Error getting directoryhandle: ${error.message}`); } } export async function readFile(directoryHandle, name, offsets) { if (!name) { return; } let pathParts = name.split('/'); let currentDir = directoryHandle; try { for (let i = 0; i < pathParts.length - 1; i++) { currentDir = await currentDir.getDirectoryHandle(pathParts[i]); } const fileName = pathParts.at(-1); const fileHandle = await currentDir.getFileHandle(fileName); return await fileHandle.getFile().then((file) => file.arrayBuffer()); } catch (error) { console.warn(`Error reading the file ${name}: ${error.message}`); if (offsets && pathParts[0] === FILE_SYSTEM_ROUTES.Partial) { try { const seriesInstanceUID = pathParts.at(-1).slice(0, name.lastIndexOf('.')).split('_')[0]; pathParts = pathParts.slice(1); for (let i = 0; i < pathParts.length - 1; i++) { currentDir = await currentDir.getDirectoryHandle(pathParts[i]); } const fileHandle = await directoryHandle.getFileHandle(seriesInstanceUID + '.tar'); const fileArraybuffer = await fileHandle.getFile().then((file) => file.arrayBuffer()); return fileArraybuffer.slice(offsets.startByte, offsets.endByte); } catch (error) { console.warn(`Error reading the file ${name}: ${error.message}`); } } } } export async function writeFile(directoryHandle, name, file) { try { const pathParts = name.split('/'); let currentDir = directoryHandle; for (let i = 0; i < pathParts.length - 1; i++) { currentDir = await currentDir.getDirectoryHandle(pathParts[i], { create: true }); } const fileName = pathParts[pathParts.length - 1]; const fileHandle = await currentDir.getFileHandle(fileName, { create: true }); // @ts-ignore const fileWritable = await fileHandle.createWritable(); await fileWritable.write(file); await fileWritable.close(); } catch (error) { console.warn(`Error writing the file ${name}: ${error.message}`); } } export function download(fileName, file) { try { const blob = new Blob([file], { type: 'application/x-tar' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = fileName; a.click(); URL.revokeObjectURL(url); return true; } catch (error) { console.warn(`Error downloading file - ${fileName}: ` + error.message); return false; } } export async function clearPartialFiles() { try { await directoryHandle.removeEntry(FILE_SYSTEM_ROUTES.Partial, { recursive: true }); } catch (error) { console.warn(`Error clearing partial files: ${error.message}`); } } export function createStreamingFileName(url) { return url.split('series/')[1]; } export function createPartialFileName(url, offsets) { const seriesInstanceUID = url.split('series/')[1].split('.tar')[0]; const offsetPart = `${offsets ? `_${offsets?.startByte}_${offsets?.endByte}` : ''}`; return `${FILE_SYSTEM_ROUTES.Partial}/${seriesInstanceUID}${offsetPart}.dcm`; }