all files / src/imageLoader/wadors/ loadImage.js

39.29% Statements 11/28
80% Branches 8/10
20% Functions 1/5
39.29% Lines 11/28
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77                          14×     14×   14×                                                                                                    
import metaDataManager from './metaDataManager.js';
import getPixelData from './getPixelData.js';
import createImage from '../createImage.js';
 
/**
 * Helper method to extract the transfer-syntax from the response of the server.
 * @param {string} contentType The value of the content-type header as returned by the WADO-RS server.
 * @return The transfer-syntax as announced by the server, or Implicit Little Endian by default.
 */
export function getTransferSyntaxForContentType (contentType) {
  let transferSyntax = '1.2.840.10008.1.2'; // Default is Implicit Little Endian.
 
  if (contentType) {
    // Browse through the content type parameters
    const parameters = contentType.split(';');
 
    for (const parameterIndex in parameters) {
      let parameter = parameters[parameterIndex];
       
      // Look for a transfer-syntax=XXXX pair
      const parameterValues = parameter.split('=');
 
      if (parameterValues.length !== 2) {
        continue;
      }
 
      if (parameterValues[0].trim() === 'transfer-syntax') {
        transferSyntax = parameterValues[1].trim() || transferSyntax;
      }
    }
  }
 
  return transferSyntax;
}
 
function loadImage (imageId, options) {
  const start = new Date().getTime();
  const uri = imageId.substring(7);
 
  const promise = new Promise((resolve, reject) => {
    // check to make sure we have metadata for this imageId
    const metaData = metaDataManager.get(imageId);
 
    if (metaData === undefined) {
      const error = new Error(`no metadata for imageId ${imageId}`);
 
      return reject(error);
    }
 
    // TODO: load bulk data items that we might need
    const mediaType = 'multipart/related; type="application/octet-stream"'; // 'image/dicom+jp2';
 
    // get the pixel data from the server
    getPixelData(uri, imageId, mediaType).then((result) => {
      const transferSyntax = getTransferSyntaxForContentType(result.contentType);
      const pixelData = result.imageFrame.pixelData;
      const imagePromise = createImage(imageId, pixelData, transferSyntax, options);
 
      imagePromise.then((image) => {
        // add the loadTimeInMS property
        const end = new Date().getTime();
 
        image.loadTimeInMS = end - start;
        resolve(image);
      }, reject);
    }, reject);
  });
 
  return {
    promise,
    cancelFn: undefined
  };
}
 
export default loadImage;