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

51.92% Statements 27/52
42.86% Branches 6/14
61.54% Functions 8/13
51.92% Lines 27/52
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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127                  10×                 10× 10×       10× 10× 10× 10× 10× 10×   10×   10×                                   10×                                                                                     10× 10×             10× 10×     10×             10×   10×        
import createImage from '../createImage.js';
import parseImageId from './parseImageId.js';
import dataSetCacheManager from './dataSetCacheManager.js';
import loadFileRequest from './loadFileRequest.js';
import getPixelData from './getPixelData.js';
import { xhrRequest } from '../internal/index.js';
 
// add a decache callback function to clear out our dataSetCacheManager
function addDecache (imageLoadObject, imageId) {
  imageLoadObject.decache = function () {
    // console.log('decache');
    const parsedImageId = parseImageId(imageId);
 
    dataSetCacheManager.unload(parsedImageId.url);
  };
}
 
function loadImageFromPromise (dataSetPromise, imageId, frame = 0, sharedCacheKey, options, callbacks) {
  const start = new Date().getTime();
  const imageLoadObject = {
    cancelFn: undefined
  };
 
  imageLoadObject.promise = new Promise((resolve, reject) => {
    dataSetPromise.then((dataSet/* , xhr*/) => {
      const pixelData = getPixelData(dataSet, frame);
      const transferSyntax = dataSet.string('x00020010');
      const loadEnd = new Date().getTime();
      const imagePromise = createImage(imageId, pixelData, transferSyntax, options);
 
      addDecache(imageLoadObject, imageId);
 
      imagePromise.then((image) => {
        image.data = dataSet;
        image.sharedCacheKey = sharedCacheKey;
        const end = new Date().getTime();
 
        image.loadTimeInMS = loadEnd - start;
        image.totalTimeInMS = end - start;
        Iif (callbacks !== undefined && callbacks.imageDoneCallback !== undefined) {
          callbacks.imageDoneCallback(image);
        }
        resolve(image);
      }, function (error) {
        // Reject the error, and the dataSet
        reject({
          error,
          dataSet
        });
      });
    }, function (error) {
      // Reject the error
      reject({
        error
      });
    });
  });
 
  return imageLoadObject;
}
 
function loadImageFromDataSet (dataSet, imageId, frame = 0, sharedCacheKey, options) {
  const start = new Date().getTime();
 
  const promise = new Promise((resolve, reject) => {
    const loadEnd = new Date().getTime();
    let imagePromise;
 
    try {
      const pixelData = getPixelData(dataSet, frame);
      const transferSyntax = dataSet.string('x00020010');
 
      imagePromise = createImage(imageId, pixelData, transferSyntax, options);
    } catch (error) {
      // Reject the error, and the dataSet
      reject({
        error,
        dataSet
      });
 
      return;
    }
 
    imagePromise.then((image) => {
      image.data = dataSet;
      image.sharedCacheKey = sharedCacheKey;
      const end = new Date().getTime();
 
      image.loadTimeInMS = loadEnd - start;
      image.totalTimeInMS = end - start;
      resolve(image);
    }, reject);
  });
 
  return {
    promise,
    cancelFn: undefined
  };
}
 
function getLoaderForScheme (scheme) {
  Eif (scheme === 'dicomweb' || scheme === 'wadouri') {
    return xhrRequest;
  } else if (scheme === 'dicomfile') {
    return loadFileRequest;
  }
}
 
function loadImage (imageId, options) {
  const parsedImageId = parseImageId(imageId);
  const loader = getLoaderForScheme(parsedImageId.scheme);
 
  // if the dataset for this url is already loaded, use it
  Iif (dataSetCacheManager.isLoaded(parsedImageId.url)) {
    const dataSet = dataSetCacheManager.get(parsedImageId.url, loader, imageId);
 
    return loadImageFromDataSet(dataSet, imageId, parsedImageId.frame, parsedImageId.url, options);
  }
 
  // load the dataSet via the dataSetCacheManager
  const dataSetPromise = dataSetCacheManager.load(parsedImageId.url, loader, imageId);
 
  return loadImageFromPromise(dataSetPromise, imageId, parsedImageId.frame, parsedImageId.url, options);
}
 
export { loadImageFromPromise, getLoaderForScheme, loadImage };