@cornerstonejs/core
Version:
Cornerstone3D Core
78 lines (77 loc) • 3.19 kB
JavaScript
import cache from '../cache/cache.js';
import StreamingImageVolume from '../cache/classes/StreamingImageVolume.js';
import { RequestType } from '../enums/index.js';
import imageLoadPoolManager from '../requestPool/imageLoadPoolManager.js';
import { generateVolumePropsFromImageIds } from '../utilities/generateVolumePropsFromImageIds.js';
import { loadImage } from './imageLoader.js';
function cornerstoneStreamingImageVolumeLoader(volumeId, options) {
if (!options || !options.imageIds || !options.imageIds.length) {
throw new Error('ImageIds must be provided to create a streaming image volume');
}
async function getStreamingImageVolume() {
if (options.imageIds[0].split(':')[0] === 'wadouri') {
const [middleImageIndex, lastImageIndex] = [
Math.floor(options.imageIds.length / 2),
options.imageIds.length - 1,
];
const indexesToPrefetch = [0, middleImageIndex, lastImageIndex];
await Promise.all(indexesToPrefetch.map((index) => {
if (cache.isLoaded(options.imageIds[index])) {
return Promise.resolve(true);
}
return new Promise((resolve, reject) => {
const imageId = options.imageIds[index];
imageLoadPoolManager.addRequest(async () => {
loadImage(imageId)
.then(() => {
console.log(`Prefetched imageId: ${imageId}`);
resolve(true);
})
.catch((err) => {
reject(err);
});
}, RequestType.Prefetch, { volumeId }, 1);
});
})).catch(console.error);
}
const volumeProps = generateVolumePropsFromImageIds(options.imageIds, volumeId);
const { dimensions, spacing, origin, direction, metadata, imageIds, dataType, numberOfComponents, } = volumeProps;
const streamingImageVolume = new StreamingImageVolume({
volumeId,
metadata,
dimensions,
spacing,
origin,
direction,
imageIds,
dataType,
numberOfComponents,
}, {
imageIds,
loadStatus: {
loaded: false,
loading: false,
cancelled: false,
cachedFrames: [],
callbacks: [],
},
});
return streamingImageVolume;
}
const streamingImageVolumePromise = getStreamingImageVolume();
return {
promise: streamingImageVolumePromise,
decache: () => {
streamingImageVolumePromise.then((streamingImageVolume) => {
streamingImageVolume.destroy();
streamingImageVolume = null;
});
},
cancel: () => {
streamingImageVolumePromise.then((streamingImageVolume) => {
streamingImageVolume.cancelLoading();
});
},
};
}
export { cornerstoneStreamingImageVolumeLoader };