Add configuration option for DIMSE connections to fix connections to DCM4CHEE (#23)
This commit is contained in:
parent
3e4b66cfcd
commit
804488458c
@ -50,11 +50,14 @@ var getInstanceRetrievalParams = function(studyInstanceUID, seriesInstanceUID) {
|
|||||||
// Orthanc has a bug here so we can't retrieve sequences at the moment
|
// Orthanc has a bug here so we can't retrieve sequences at the moment
|
||||||
// https://groups.google.com/forum/#!topic/orthanc-users/ghKJfvtnK8Y
|
// https://groups.google.com/forum/#!topic/orthanc-users/ghKJfvtnK8Y
|
||||||
//0x00082112: '' // sourceImageSequence
|
//0x00082112: '' // sourceImageSequence
|
||||||
}
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
Meteor.startup(function() {
|
Meteor.startup(function() {
|
||||||
if (!Meteor.settings.servers.dimse || !Meteor.settings.servers.dimse.length) return;
|
if (!Meteor.settings.servers.dimse || !Meteor.settings.servers.dimse.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: [custom-servers] use active server and check if type is DIMSE
|
// TODO: [custom-servers] use active server and check if type is DIMSE
|
||||||
var peers = Meteor.settings.servers.dimse[0].peers;
|
var peers = Meteor.settings.servers.dimse[0].peers;
|
||||||
console.log('Adding DIMSE peers');
|
console.log('Adding DIMSE peers');
|
||||||
@ -169,7 +172,9 @@ DIMSE._retrieveInstancesBySeries = function(conn, series, studyInstanceUID, call
|
|||||||
};
|
};
|
||||||
|
|
||||||
DIMSE.retrieveInstancesByStudyOnlyMulti = function(studyInstanceUID, params, options) {
|
DIMSE.retrieveInstancesByStudyOnlyMulti = function(studyInstanceUID, params, options) {
|
||||||
if (!studyInstanceUID) return [];
|
if (!studyInstanceUID) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
var series = DIMSE.retrieveSeries(studyInstanceUID, params, options), instances = [];
|
var series = DIMSE.retrieveSeries(studyInstanceUID, params, options), instances = [];
|
||||||
series.forEach(function(seriesData){
|
series.forEach(function(seriesData){
|
||||||
@ -182,7 +187,9 @@ DIMSE.retrieveInstancesByStudyOnlyMulti = function(studyInstanceUID, params, opt
|
|||||||
};
|
};
|
||||||
|
|
||||||
DIMSE.retrieveInstancesByStudyOnly = function(studyInstanceUID, params, options) {
|
DIMSE.retrieveInstancesByStudyOnly = function(studyInstanceUID, params, options) {
|
||||||
if (!studyInstanceUID) return [];
|
if (!studyInstanceUID) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
var future = new Future;
|
var future = new Future;
|
||||||
DIMSE.associate([C.SOP_STUDY_ROOT_FIND], function(pdu){
|
DIMSE.associate([C.SOP_STUDY_ROOT_FIND], function(pdu){
|
||||||
@ -222,7 +229,7 @@ DIMSE.retrieveInstancesByStudyOnly = function(studyInstanceUID, params, options)
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
return future.wait();
|
return future.wait();
|
||||||
}
|
};
|
||||||
|
|
||||||
DIMSE.retrieveSeries = function(studyInstanceUID, params, options) {
|
DIMSE.retrieveSeries = function(studyInstanceUID, params, options) {
|
||||||
var future = new Future;
|
var future = new Future;
|
||||||
@ -264,7 +271,6 @@ DIMSE.retrieveInstances = function(studyInstanceUID, seriesInstanceUID, params,
|
|||||||
var future = new Future;
|
var future = new Future;
|
||||||
DIMSE.associate([C.SOP_STUDY_ROOT_FIND], function(pdu) {
|
DIMSE.associate([C.SOP_STUDY_ROOT_FIND], function(pdu) {
|
||||||
var defaultParams = getInstanceRetrievalParams(studyInstanceUID, seriesInstanceUID);
|
var defaultParams = getInstanceRetrievalParams(studyInstanceUID, seriesInstanceUID);
|
||||||
|
|
||||||
var result = this.findInstances(Object.assign(defaultParams, params)),
|
var result = this.findInstances(Object.assign(defaultParams, params)),
|
||||||
o = this;
|
o = this;
|
||||||
|
|
||||||
|
|||||||
@ -26,7 +26,6 @@ getStudyMetadata = function(studyInstanceUid, doneCallback, failCallback) {
|
|||||||
// If no study metadata is in the cache variable, we need to retrieve it from
|
// If no study metadata is in the cache variable, we need to retrieve it from
|
||||||
// the server with a call.
|
// the server with a call.
|
||||||
Meteor.call('GetStudyMetadata', studyInstanceUid, function(error, study) {
|
Meteor.call('GetStudyMetadata', studyInstanceUid, function(error, study) {
|
||||||
log.info('worklistStudy getStudyMetadata: ' + studyInstanceUid);
|
|
||||||
console.timeEnd('getStudyMetadata');
|
console.timeEnd('getStudyMetadata');
|
||||||
|
|
||||||
if (Meteor.user && Meteor.user()) {
|
if (Meteor.user && Meteor.user()) {
|
||||||
@ -48,6 +47,10 @@ getStudyMetadata = function(studyInstanceUid, doneCallback, failCallback) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!study) {
|
||||||
|
throw "GetStudyMetadata: No study data returned from server";
|
||||||
|
}
|
||||||
|
|
||||||
// Once we have retrieved the data, we sort the series' by series
|
// Once we have retrieved the data, we sort the series' by series
|
||||||
// and instance number in ascending order
|
// and instance number in ascending order
|
||||||
sortStudy(study);
|
sortStudy(study);
|
||||||
|
|||||||
@ -21,6 +21,7 @@ function getSourceImageInstanceUid(instance) {
|
|||||||
* Returns an object populated with study metadata, including the
|
* Returns an object populated with study metadata, including the
|
||||||
* series list.
|
* series list.
|
||||||
*
|
*
|
||||||
|
* @param studyInstanceUid
|
||||||
* @param resultData
|
* @param resultData
|
||||||
* @returns {{seriesList: Array, patientName: *, patientId: *, accessionNumber: *, studyDate: *, modalities: *, studyDescription: *, imageCount: *, studyInstanceUid: *}}
|
* @returns {{seriesList: Array, patientName: *, patientId: *, accessionNumber: *, studyDate: *, modalities: *, studyDescription: *, imageCount: *, studyInstanceUid: *}}
|
||||||
*/
|
*/
|
||||||
@ -104,6 +105,8 @@ function resultDataToStudyMetadata(studyInstanceUid, resultData) {
|
|||||||
series.instances.push(instanceSummary);
|
series.instances.push(instanceSummary);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
studyData.studyInstanceUid = studyInstanceUid;
|
||||||
|
|
||||||
return studyData;
|
return studyData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,13 +116,18 @@ function resultDataToStudyMetadata(studyInstanceUid, resultData) {
|
|||||||
* @returns {{seriesList: Array, patientName: *, patientId: *, accessionNumber: *, studyDate: *, modalities: *, studyDescription: *, imageCount: *, studyInstanceUid: *}}
|
* @returns {{seriesList: Array, patientName: *, patientId: *, accessionNumber: *, studyDate: *, modalities: *, studyDescription: *, imageCount: *, studyInstanceUid: *}}
|
||||||
*/
|
*/
|
||||||
Services.DIMSE.RetrieveMetadata = function(studyInstanceUid) {
|
Services.DIMSE.RetrieveMetadata = function(studyInstanceUid) {
|
||||||
var result = DIMSE.retrieveInstances(studyInstanceUid);
|
// TODO: Find active server
|
||||||
|
const activeServer = Meteor.settings.servers.dimse[0].peers[0];
|
||||||
|
const supportsInstanceRetrievalByStudyUid = activeServer.supportsInstanceRetrievalByStudyUid;
|
||||||
|
let results;
|
||||||
|
|
||||||
var study = resultDataToStudyMetadata(studyInstanceUid, result);
|
// Check explicitly for a value of false, since this property
|
||||||
if (!study) {
|
// may be left undefined in config files
|
||||||
study = {};
|
if (supportsInstanceRetrievalByStudyUid === false) {
|
||||||
|
results = DIMSE.retrieveInstancesByStudyOnly(studyInstanceUid);
|
||||||
|
} else {
|
||||||
|
results = DIMSE.retrieveInstances(studyInstanceUid);
|
||||||
}
|
}
|
||||||
|
|
||||||
study.studyInstanceUid = studyInstanceUid;
|
return resultDataToStudyMetadata(studyInstanceUid, results);
|
||||||
return study;
|
|
||||||
};
|
};
|
||||||
|
|||||||
40
config/dcm4cheeDIMSE.json
Normal file
40
config/dcm4cheeDIMSE.json
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"servers": {
|
||||||
|
"dicomWeb": [
|
||||||
|
{
|
||||||
|
"name": "DCM4CHEE",
|
||||||
|
"wadoUriRootNOTE": "either this uri is not correct for wado-uri or wado-uri is not configured on orthanc currently",
|
||||||
|
"wadoUriRoot": "http://localhost:8043/dcm4chee-arc/aets/DCM4CHEE/wado",
|
||||||
|
"qidoRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/rs",
|
||||||
|
"wadoRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/rs",
|
||||||
|
"qidoSupportsIncludeField": false,
|
||||||
|
"imageRendering": "wadouri",
|
||||||
|
"requestOptions": {
|
||||||
|
"auth": "admin:admin",
|
||||||
|
"logRequests": true,
|
||||||
|
"logResponses": false,
|
||||||
|
"logTiming": true
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
"dimse": [{
|
||||||
|
"name": "DCM4CHEE_DIMSE",
|
||||||
|
"peers": [
|
||||||
|
{
|
||||||
|
"host": "localhost",
|
||||||
|
"port": 4242,
|
||||||
|
"aeTitle": "DCM4CHEE",
|
||||||
|
"default": true,
|
||||||
|
"supportsInstanceRetrievalByStudyUid": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"host": "0.0.0.0",
|
||||||
|
"port": 11112,
|
||||||
|
"aeTitle": "DCM4CHEE",
|
||||||
|
"default": true,
|
||||||
|
"server": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
"defaultServiceType": "dimse"
|
||||||
|
}
|
||||||
@ -5,14 +5,13 @@ var http = require('http'),
|
|||||||
httpProxy = require('http-proxy');
|
httpProxy = require('http-proxy');
|
||||||
|
|
||||||
var proxy = httpProxy.createProxyServer({
|
var proxy = httpProxy.createProxyServer({
|
||||||
target: 'http://192.168.99.100:8080',
|
target: 'http://localhost:8080',
|
||||||
auth: 'user:user'
|
auth: 'user:user'
|
||||||
}).listen(8080);
|
}).listen(8043);
|
||||||
|
|
||||||
proxy.on('proxyRes', function(proxyReq, req, res, options) {
|
proxy.on('proxyRes', function(proxyReq, req, res, options) {
|
||||||
// add the CORS header to the response
|
// add the CORS header to the response
|
||||||
res.setHeader('Access-Control-Allow-Origin', '*');
|
res.setHeader('Access-Control-Allow-Origin', '*');
|
||||||
console.log(proxyReq);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
proxy.on('error', function(e) {
|
proxy.on('error', function(e) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user