cod-dicomweb-server
Version:
A wadors server proxy that get data from a Cloud Optimized Dicom format.
60 lines (59 loc) • 2.41 kB
JavaScript
import { CustomError } from './classes/customClasses';
import { createMetadataJsonUrl } from './classes/utils';
import { createMetadataFileName, getDirectoryHandle, readFile, writeFile } from './fileAccessSystemUtils';
class MetadataManager {
metadataPromises = {};
constructor() { }
addDeidMetadata(jsonMetadata, url) {
const { cod } = jsonMetadata;
const [studyUID, _, seriesUID] = url.match(/studies\/(.*?)\/metadata/)?.[1].split('/') || [];
if (!cod || !studyUID || !seriesUID) {
console.warn('Missing required metadata properties: cod, studyUID, or seriesUID');
return;
}
for (const sopUID in cod.instances) {
const instance = cod.instances[sopUID];
instance.metadata.DeidStudyInstanceUID = { Value: [studyUID] };
instance.metadata.DeidSeriesInstanceUID = { Value: [seriesUID] };
instance.metadata.DeidSopInstanceUID = { Value: [sopUID] };
}
}
getMetadataFromCache(url) {
return this.metadataPromises[url];
}
async getMetadata(params, headers) {
const url = createMetadataJsonUrl(params);
if (!url) {
throw new CustomError('Error creating metadata json url');
}
const cachedMetadata = this.getMetadataFromCache(url);
if (cachedMetadata) {
return await cachedMetadata;
}
const directoryHandle = await getDirectoryHandle();
const fileName = createMetadataFileName(url);
const locallyCachedMetadata = (await readFile(directoryHandle, fileName, { isJson: true }));
if (locallyCachedMetadata) {
return locallyCachedMetadata;
}
try {
this.metadataPromises[url] = fetch(url, { headers })
.then((response) => {
if (!response.ok) {
throw new CustomError(`Failed to fetch metadata: ${response.statusText}`);
}
return response.json();
})
.then((data) => {
this.addDeidMetadata(data, url);
return writeFile(directoryHandle, fileName, data, true).then(() => data);
});
return await this.metadataPromises[url];
}
catch (error) {
console.error(error);
throw error;
}
}
}
export default MetadataManager;