ohif-viewer/extensions/default/src/DicomWebDataSource/index.js

140 lines
4.2 KiB
JavaScript
Raw Normal View History

2020-05-07 15:56:26 +02:00
import { api } from 'dicomweb-client';
2020-05-13 05:10:21 +02:00
import {
mapParams,
search as qidoSearch,
seriesInStudy,
processResults,
processSeriesResults,
} from './qido.js';
2020-05-11 18:56:46 +02:00
import { dicomMetadataStore, IWebApiDataSource, utils } from '@ohif/core';
import * as dcmjs from 'dcmjs';
2020-05-12 14:49:32 +02:00
import { retrieveStudyMetadata } from './retrieveStudyMetadata.js';
2020-05-11 18:56:46 +02:00
2020-05-12 14:49:32 +02:00
const { naturalizeDataset } = dcmjs.data.DicomMetaDictionary;
2020-05-11 18:56:46 +02:00
const { urlUtil } = utils;
2020-05-07 15:56:26 +02:00
/**
*
* @param {string} name - Data source name
* @param {string} wadoUriRoot - Legacy? (potentially unused/replaced)
* @param {string} qidoRoot - Base URL to use for QIDO requests
* @param {string} wadoRoot - Base URL to use for WADO requests
* @param {boolean} qidoSupportsIncludeField - Whether QIDO supports the "Include" option to request additional fields in response
* @param {string} imageRengering - wadors | ? (unsure of where/how this is used)
* @param {string} thumbnailRendering - wadors | ? (unsure of where/how this is used)
* @param {bool} lazyLoadStudy - "enableStudyLazyLoad"; Request series meta async instead of blocking
*/
function createDicomWebApi(dicomWebConfig) {
2020-05-11 18:56:46 +02:00
const { qidoRoot, wadoRoot, enableStudyLazyLoad } = dicomWebConfig;
const qidoConfig = {
2020-05-07 15:56:26 +02:00
url: qidoRoot,
// headers: DICOMWeb.getAuthorizationHeader(server),
};
2020-05-11 18:56:46 +02:00
const wadoConfig = {
url: wadoRoot,
};
// TODO -> Two clients sucks, but its better than 1000.
// TODO -> We'll need to merge auth later.
const qidoDicomWebClient = new api.DICOMwebClient(qidoConfig);
const wadoDicomWebClient = new api.DICOMwebClient(wadoConfig);
2020-05-07 15:56:26 +02:00
2020-05-08 06:29:57 +02:00
return IWebApiDataSource.create({
2020-05-07 15:56:26 +02:00
query: {
studies: {
mapParams: mapParams.bind(),
search: async function(origParams) {
const { studyInstanceUid, seriesInstanceUid, ...mappedParams } =
mapParams(origParams) || {};
const results = await qidoSearch(
2020-05-11 18:56:46 +02:00
qidoDicomWebClient,
2020-05-12 21:27:59 +02:00
undefined,
undefined,
mappedParams
);
return processResults(results);
},
2020-05-07 15:56:26 +02:00
processResults: processResults.bind(),
},
2020-05-12 21:27:59 +02:00
series: {
// mapParams: mapParams.bind(),
2020-05-13 05:10:21 +02:00
search: async function(studyInstanceUid) {
const results = await seriesInStudy(
2020-05-12 21:27:59 +02:00
qidoDicomWebClient,
2020-05-13 05:10:21 +02:00
studyInstanceUid
2020-05-12 21:27:59 +02:00
);
2020-05-13 05:10:21 +02:00
return processSeriesResults(results);
2020-05-12 21:27:59 +02:00
},
// processResults: processResults.bind(),
},
2020-05-07 15:56:26 +02:00
instances: {
search: (studyInstanceUid, queryParamaters) =>
qidoSearch.call(
2020-05-07 15:56:26 +02:00
undefined,
2020-05-11 18:56:46 +02:00
qidoDicomWebClient,
2020-05-07 15:56:26 +02:00
studyInstanceUid,
null,
queryParamaters
),
},
},
2020-05-11 18:56:46 +02:00
retrieve: {
series: {
metadata: (queryParams, callback) => {
let { StudyInstanceUIDs } = urlUtil.parse(queryParams, true);
StudyInstanceUIDs = urlUtil.paramString.parseParam(StudyInstanceUIDs);
if (!StudyInstanceUIDs) {
throw new Error(
'Incomplete queryParams, missing StudyInstanceUIDs'
);
}
2020-05-12 14:49:32 +02:00
const storeInstances = instances => {
const naturalizedInstances = instances.map(naturalizeDataset);
dicomMetadataStore.addInstances(naturalizedInstances);
callback(naturalizedInstances);
};
const studyPromises = StudyInstanceUIDs.map(StudyInstanceUID =>
retrieveStudyMetadata(
wadoDicomWebClient,
StudyInstanceUID,
enableStudyLazyLoad
)
);
studyPromises.forEach(studyPromise => {
studyPromise.then(seriesPromises => {
seriesPromises.forEach(seriesPromise => {
seriesPromise.then(instances => {
debugger;
storeInstances(instances);
});
});
});
});
2020-05-11 18:56:46 +02:00
// TEMP use dummy data.
2020-05-12 14:49:32 +02:00
//const { naturalizeDataset } = dcmjs.data.DicomMetaDictionary;
//const instances = exampleInstances.map(naturalizeDataset);
2020-05-11 18:56:46 +02:00
// TEMP
2020-05-12 14:49:32 +02:00
//dicomMetadataStore.addInstances(instances);
//callback(instances);
2020-05-11 18:56:46 +02:00
},
},
},
2020-05-07 15:56:26 +02:00
});
}
export { createDicomWebApi };