UNPKG

cod-dicomweb-server

Version:

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

60 lines (59 loc) 2.41 kB
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;