cod-dicomweb-server
Version:
A wadors server proxy that get data from a Cloud Optimized Dicom format.
101 lines (100 loc) • 3.87 kB
JavaScript
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`;
}