fix: Revert "refactor: Reduce bundle size (#1575)" (#1622)

This reverts commit 81dcbe294d.
This commit is contained in:
Danny Brown 2020-04-09 07:06:41 -04:00 committed by GitHub
parent 70672ed663
commit d21af3f133
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 136 additions and 174 deletions

View File

@ -1,5 +1,5 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import { getReactVtkjsViewport } from './utils/getReactVtkjsViewport'; import { getImageData, loadImageData } from 'react-vtkjs-viewport';
import ConnectedVTKViewport from './ConnectedVTKViewport'; import ConnectedVTKViewport from './ConnectedVTKViewport';
import LoadingIndicator from './LoadingIndicator.js'; import LoadingIndicator from './LoadingIndicator.js';
import OHIF from '@ohif/core'; import OHIF from '@ohif/core';
@ -69,7 +69,7 @@ class OHIFVTKViewport extends Component {
}; };
static defaultProps = { static defaultProps = {
onScroll: () => { }, onScroll: () => {},
}; };
static id = 'OHIFVTKViewport'; static id = 'OHIFVTKViewport';
@ -133,8 +133,7 @@ class OHIFVTKViewport extends Component {
displaySetInstanceUID, displaySetInstanceUID,
SOPClassUID, SOPClassUID,
SOPInstanceUID, SOPInstanceUID,
frameIndex, frameIndex
reactVtkjsViewport
) => { ) => {
const stack = OHIFVTKViewport.getCornerstoneStack( const stack = OHIFVTKViewport.getCornerstoneStack(
studies, studies,
@ -145,10 +144,7 @@ class OHIFVTKViewport extends Component {
frameIndex frameIndex
); );
const imageDataObject = reactVtkjsViewport.getImageData( const imageDataObject = getImageData(stack.imageIds, displaySetInstanceUID);
stack.imageIds,
displaySetInstanceUID
);
let labelmapDataObject; let labelmapDataObject;
let labelmapColorLUT; let labelmapColorLUT;
@ -261,9 +257,7 @@ class OHIFVTKViewport extends Component {
return volumeActor; return volumeActor;
} }
async setStateFromProps() { setStateFromProps() {
const reactVtkjsViewport = await getReactVtkjsViewport();
const { studies, displaySet } = this.props.viewportData; const { studies, displaySet } = this.props.viewportData;
const { const {
StudyInstanceUID, StudyInstanceUID,
@ -301,10 +295,8 @@ class OHIFVTKViewport extends Component {
studies, studies,
StudyInstanceUID, StudyInstanceUID,
displaySetInstanceUID, displaySetInstanceUID,
sopClassUIDs[0],
SOPInstanceUID, SOPInstanceUID,
frameIndex, frameIndex
reactVtkjsViewport
); );
this.imageDataObject = imageDataObject; this.imageDataObject = imageDataObject;
@ -325,7 +317,7 @@ class OHIFVTKViewport extends Component {
dataDetails, dataDetails,
}, },
() => { () => {
this.loadProgressively(imageDataObject, reactVtkjsViewport); this.loadProgressively(imageDataObject);
// TODO: There must be a better way to do this. // TODO: There must be a better way to do this.
// We do this so that if all the data is available the react-vtkjs-viewport // We do this so that if all the data is available the react-vtkjs-viewport
@ -343,26 +335,26 @@ class OHIFVTKViewport extends Component {
); );
} }
async componentDidMount() { componentDidMount() {
await this.setStateFromProps(); this.setStateFromProps();
} }
async componentDidUpdate(prevProps) { componentDidUpdate(prevProps) {
const { displaySet } = this.props.viewportData; const { displaySet } = this.props.viewportData;
const prevDisplaySet = prevProps.viewportData.displaySet; const prevDisplaySet = prevProps.viewportData.displaySet;
if ( if (
displaySet.displaySetInstanceUID !== displaySet.displaySetInstanceUID !==
prevDisplaySet.displaySetInstanceUID || prevDisplaySet.displaySetInstanceUID ||
displaySet.SOPInstanceUID !== prevDisplaySet.SOPInstanceUID || displaySet.SOPInstanceUID !== prevDisplaySet.SOPInstanceUID ||
displaySet.frameIndex !== prevDisplaySet.frameIndex displaySet.frameIndex !== prevDisplaySet.frameIndex
) { ) {
await this.setStateFromProps(); this.setStateFromProps();
} }
} }
loadProgressively(imageDataObject, reactVtkjsViewport) { loadProgressively(imageDataObject) {
reactVtkjsViewport.loadImageData(imageDataObject); loadImageData(imageDataObject);
const { isLoading, insertPixelDataPromises } = imageDataObject; const { isLoading, insertPixelDataPromises } = imageDataObject;

View File

@ -1,16 +1,9 @@
import React, { useEffect, useCallback } from 'react'; import React, { useEffect, useCallback } from 'react';
// import { View2D } from 'react-vtkjs-viewport'; import { View2D } from 'react-vtkjs-viewport';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import asyncComponent from './asyncComponent.js';
import { getReactVtkjsViewport } from './utils/getReactVtkjsViewport';
import './VTKViewport.css'; import './VTKViewport.css';
const View2D = asyncComponent(async () => {
const reactVtkjsViewport = await getReactVtkjsViewport();
return { default: reactVtkjsViewport.View2D };
});
const VTKViewport = props => { const VTKViewport = props => {
const style = { width: '100%', height: '100%', position: 'relative' }; const style = { width: '100%', height: '100%', position: 'relative' };
@ -59,7 +52,7 @@ VTKViewport.propTypes = {
}; };
VTKViewport.defaultProps = { VTKViewport.defaultProps = {
onScroll: () => { }, onScroll: () => {},
}; };
export default VTKViewport; export default VTKViewport;

View File

@ -1,5 +1,10 @@
import throttle from 'lodash.throttle'; import throttle from 'lodash.throttle';
import { getReactVtkjsViewport } from './utils/getReactVtkjsViewport'; import {
vtkInteractorStyleMPRCrosshairs,
vtkInteractorStyleMPRWindowLevel,
vtkInteractorStyleMPRRotate,
vtkSVGCrosshairsWidget,
} from 'react-vtkjs-viewport';
import setMPRLayout from './utils/setMPRLayout.js'; import setMPRLayout from './utils/setMPRLayout.js';
import setViewportToVTK from './utils/setViewportToVTK.js'; import setViewportToVTK from './utils/setViewportToVTK.js';
@ -119,18 +124,16 @@ const commandsModule = ({ commandsManager }) => {
_setView(api, [0, 1, 0], [0, 0, 1]); _setView(api, [0, 1, 0], [0, 0, 1]);
}, },
enableRotateTool: async () => { enableRotateTool: () => {
const reactVtkjsViewport = await getReactVtkjsViewport();
apis.forEach(api => { apis.forEach(api => {
const istyle = reactVtkjsViewport.vtkInteractorStyleMPRRotate.newInstance(); const istyle = vtkInteractorStyleMPRRotate.newInstance();
api.setInteractorStyle({ istyle }); api.setInteractorStyle({ istyle });
}); });
}, },
enableCrosshairsTool: async () => { enableCrosshairsTool: () => {
const reactVtkjsViewport = await getReactVtkjsViewport();
apis.forEach((api, apiIndex) => { apis.forEach((api, apiIndex) => {
const istyle = reactVtkjsViewport.vtkInteractorStyleMPRCrosshairs.newInstance(); const istyle = vtkInteractorStyleMPRCrosshairs.newInstance();
api.setInteractorStyle({ api.setInteractorStyle({
istyle, istyle,
@ -138,7 +141,7 @@ const commandsModule = ({ commandsManager }) => {
}); });
}); });
}, },
enableLevelTool: async () => { enableLevelTool: () => {
function updateVOI(apis, windowWidth, windowCenter) { function updateVOI(apis, windowWidth, windowCenter) {
apis.forEach(api => { apis.forEach(api => {
api.updateVOI(windowWidth, windowCenter); api.updateVOI(windowWidth, windowCenter);
@ -159,9 +162,8 @@ const commandsModule = ({ commandsManager }) => {
}, },
}; };
const reactVtkjsViewport = await getReactVtkjsViewport();
apis.forEach(api => { apis.forEach(api => {
const istyle = reactVtkjsViewport.vtkInteractorStyleMPRWindowLevel.newInstance(); const istyle = vtkInteractorStyleMPRWindowLevel.newInstance();
api.setInteractorStyle({ istyle, callbacks }); api.setInteractorStyle({ istyle, callbacks });
}); });
@ -258,15 +260,14 @@ const commandsModule = ({ commandsManager }) => {
} }
// Add widgets and set default interactorStyle of each viewport. // Add widgets and set default interactorStyle of each viewport.
const reactVtkjsViewport = await getReactVtkjsViewport();
apis.forEach((api, apiIndex) => { apis.forEach((api, apiIndex) => {
api.addSVGWidget( api.addSVGWidget(
reactVtkjsViewport.vtkSVGCrosshairsWidget.newInstance(), vtkSVGCrosshairsWidget.newInstance(),
'crosshairsWidget' 'crosshairsWidget'
); );
const uid = api.uid; const uid = api.uid;
const istyle = reactVtkjsViewport.vtkInteractorStyleMPRCrosshairs.newInstance(); const istyle = vtkInteractorStyleMPRCrosshairs.newInstance();
api.setInteractorStyle({ api.setInteractorStyle({
istyle, istyle,

View File

@ -1,5 +0,0 @@
export function getReactVtkjsViewport() {
return import(
/* webpackChunkName: "ReactVtkjsViewport" */ 'react-vtkjs-viewport'
);
}

View File

@ -1,10 +1,10 @@
import cornerstone from 'cornerstone-core'; import cornerstone from 'cornerstone-core';
import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader';
import { import {
clearStudyLoadingProgress, clearStudyLoadingProgress,
setStudyLoadingProgress, setStudyLoadingProgress,
} from '../redux/actions'; } from '../redux/actions';
import StackManager from '../utils/StackManager'; import StackManager from '../utils/StackManager';
import { getCornerstoneWADOImageLoader } from '../utils/cornerstoneWADOImageLoader';
class BaseLoadingListener { class BaseLoadingListener {
constructor(stack, options = {}) { constructor(stack, options = {}) {
@ -103,8 +103,7 @@ class DICOMFileLoadingListener extends BaseLoadingListener {
this._checkCachedData(); this._checkCachedData();
} }
async _checkCachedData() { _checkCachedData() {
const cornerstoneWADOImageLoader = await getCornerstoneWADOImageLoader();
const dataSet = cornerstoneWADOImageLoader.wadouri.dataSetCacheManager.get( const dataSet = cornerstoneWADOImageLoader.wadouri.dataSetCacheManager.get(
this._dataSetUrl this._dataSetUrl
); );

View File

@ -1,8 +1,8 @@
import DICOMWeb from '../../../DICOMWeb'; import DICOMWeb from '../../../DICOMWeb';
import metadataProvider from '../../../classes/MetadataProvider'; import metadataProvider from '../../../classes/MetadataProvider';
import getWADORSImageId from '../../../utils/getWADORSImageId'; import getWADORSImageId from '../../../utils/getWADORSImageId';
import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader';
import getReferencedSeriesSequence from './getReferencedSeriesSequence'; import getReferencedSeriesSequence from './getReferencedSeriesSequence';
import { getCornerstoneWADOImageLoader } from '../../../utils/cornerstoneWADOImageLoader';
/** /**
* Create a plain JS object that describes a study (a study descriptor object) * Create a plain JS object that describes a study (a study descriptor object)
@ -160,7 +160,6 @@ async function makeSOPInstance(server, study, instance) {
const wadoRSMetadata = Object.assign(instance); const wadoRSMetadata = Object.assign(instance);
const cornerstoneWADOImageLoader = await getCornerstoneWADOImageLoader();
if (sopInstance.NumberOfFrames) { if (sopInstance.NumberOfFrames) {
for (let i = 0; i < sopInstance.NumberOfFrames; i++) { for (let i = 0; i < sopInstance.NumberOfFrames; i++) {
const wadorsImageId = getWADORSImageId(sopInstance, i); const wadorsImageId = getWADORSImageId(sopInstance, i);

View File

@ -1,5 +0,0 @@
export function getCornerstoneWADOImageLoader() {
return import(
/* webpackChunkName: "CornerstoneWADOImageLoader" */ 'cornerstone-wado-image-loader'
);
}

View File

@ -1,7 +1,7 @@
import cornerstone from 'cornerstone-core'; import cornerstone from 'cornerstone-core';
import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader';
import { api } from 'dicomweb-client'; import { api } from 'dicomweb-client';
import DICOMWeb from '../DICOMWeb'; import DICOMWeb from '../DICOMWeb';
import { getCornerstoneWADOImageLoader } from './cornerstoneWADOImageLoader';
const getImageId = imageObj => { const getImageId = imageObj => {
if (!imageObj) { if (!imageObj) {
@ -86,7 +86,7 @@ const getImageLoaderType = imageId => {
}; };
class DicomLoaderService { class DicomLoaderService {
async getLocalData(dataset, studies) { getLocalData(dataset, studies) {
if (dataset && dataset.localFile) { if (dataset && dataset.localFile) {
// Use referenced imageInstance // Use referenced imageInstance
const imageInstance = getImageInstance(dataset); const imageInstance = getImageInstance(dataset);
@ -98,7 +98,6 @@ class DicomLoaderService {
} }
if (!someInvalidStrings(imageId)) { if (!someInvalidStrings(imageId)) {
const cornerstoneWADOImageLoader = await getCornerstoneWADOImageLoader();
return cornerstoneWADOImageLoader.wadouri.loadFileRequest(imageId); return cornerstoneWADOImageLoader.wadouri.loadFileRequest(imageId);
} }
} }
@ -177,16 +176,16 @@ class DicomLoaderService {
} }
} }
async *getLoaderIterator(dataset, studies) { *getLoaderIterator(dataset, studies) {
yield await this.getLocalData(dataset, studies); yield this.getLocalData(dataset, studies);
yield this.getDataByImageType(dataset); yield this.getDataByImageType(dataset);
yield this.getDataByDatasetType(dataset); yield this.getDataByDatasetType(dataset);
} }
async findDicomDataPromise(dataset, studies) { findDicomDataPromise(dataset, studies) {
const loaderIterator = this.getLoaderIterator(dataset, studies); const loaderIterator = this.getLoaderIterator(dataset, studies);
// it returns first valid retriever method. // it returns first valid retriever method.
for await (const loader of loaderIterator) { for (const loader of loaderIterator) {
if (loader) { if (loader) {
return loader; return loader;
} }

View File

@ -34,7 +34,10 @@ import i18n from '@ohif/i18n';
import './config'; import './config';
/** Utils */ /** Utils */
import { getUserManagerForOpenIdConnectClient } from './utils/index.js'; import {
getUserManagerForOpenIdConnectClient,
initWebWorkers,
} from './utils/index.js';
/** Extensions */ /** Extensions */
import { GenericViewerCommands, MeasurementsPanel } from './appExtensions'; import { GenericViewerCommands, MeasurementsPanel } from './appExtensions';
@ -137,6 +140,7 @@ class App extends Component {
*/ */
_initHotkeys(appConfigHotkeys); _initHotkeys(appConfigHotkeys);
_initServers(servers); _initServers(servers);
initWebWorkers();
} }
render() { render() {

View File

@ -1,4 +1,7 @@
import OHIF from '@ohif/core';
import cornerstone from 'cornerstone-core'; import cornerstone from 'cornerstone-core';
import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader';
import dicomParser from 'dicom-parser';
import version from './version.js'; import version from './version.js';
let homepage; let homepage;
@ -12,4 +15,31 @@ window.info = {
homepage, homepage,
}; };
// For debugging
//if (process.env.node_env === 'development') {
window.cornerstone = cornerstone; window.cornerstone = cornerstone;
window.cornerstoneWADOImageLoader = cornerstoneWADOImageLoader;
//}
cornerstoneWADOImageLoader.external.cornerstone = cornerstone;
cornerstoneWADOImageLoader.external.dicomParser = dicomParser;
OHIF.user.getAccessToken = () => {
// TODO: Get the Redux store from somewhere else
const state = window.store.getState();
if (!state.oidc || !state.oidc.user) {
return;
}
return state.oidc.user.access_token;
};
cornerstoneWADOImageLoader.configure({
beforeSend: function(xhr) {
const headers = OHIF.DICOMWeb.getAuthorizationHeader();
if (headers.Authorization) {
xhr.setRequestHeader('Authorization', headers.Authorization);
}
},
});

View File

@ -3,7 +3,7 @@ import FileLoaderService from './localFileLoaders/fileLoaderService';
const processFile = async file => { const processFile = async file => {
try { try {
const fileLoaderService = new FileLoaderService(file); const fileLoaderService = new FileLoaderService(file);
const imageId = await fileLoaderService.addFile(file); const imageId = fileLoaderService.addFile(file);
const image = await fileLoaderService.loadFile(file, imageId); const image = await fileLoaderService.loadFile(file, imageId);
const dataset = await fileLoaderService.getDataset(image, imageId); const dataset = await fileLoaderService.getDataset(image, imageId);
const studies = await fileLoaderService.getStudies(dataset, imageId); const studies = await fileLoaderService.getStudies(dataset, imageId);

View File

@ -1,14 +1,13 @@
import * as dcmjs from 'dcmjs'; import * as dcmjs from 'dcmjs';
import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader';
import FileLoader from './fileLoader'; import FileLoader from './fileLoader';
import OHIF from '@ohif/core'; import OHIF from '@ohif/core';
import { getCornerstoneWADOImageLoader } from '../../utils/cornerstoneWADOImageLoader';
const metadataProvider = OHIF.cornerstone.metadataProvider; const metadataProvider = OHIF.cornerstone.metadataProvider;
const DICOMFileLoader = new (class extends FileLoader { const DICOMFileLoader = new (class extends FileLoader {
fileType = 'application/dicom'; fileType = 'application/dicom';
async loadFile(file, imageId) { loadFile(file, imageId) {
const cornerstoneWADOImageLoader = await getCornerstoneWADOImageLoader();
return cornerstoneWADOImageLoader.wadouri.loadFileRequest(imageId); return cornerstoneWADOImageLoader.wadouri.loadFileRequest(imageId);
} }

View File

@ -1,7 +1,7 @@
import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader';
import FileLoader from './fileLoader'; import FileLoader from './fileLoader';
import PDFFileLoader from './pdfFileLoader'; import PDFFileLoader from './pdfFileLoader';
import DICOMFileLoader from './dicomFileLoader'; import DICOMFileLoader from './dicomFileLoader';
import { getCornerstoneWADOImageLoader } from '../../utils/cornerstoneWADOImageLoader';
class FileLoaderService extends FileLoader { class FileLoaderService extends FileLoader {
fileType; fileType;
@ -53,8 +53,7 @@ class FileLoaderService extends FileLoader {
return result; return result;
} }
async addFile(file) { addFile(file) {
const cornerstoneWADOImageLoader = await getCornerstoneWADOImageLoader();
return cornerstoneWADOImageLoader.wadouri.fileManager.add(file); return cornerstoneWADOImageLoader.wadouri.fileManager.add(file);
} }

View File

@ -1,10 +1,9 @@
import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader';
import FileLoader from './fileLoader'; import FileLoader from './fileLoader';
import { getCornerstoneWADOImageLoader } from '../../utils/cornerstoneWADOImageLoader';
const PDFFileLoader = new (class extends FileLoader { const PDFFileLoader = new (class extends FileLoader {
fileType = 'application/pdf'; fileType = 'application/pdf';
async loadFile(file, imageId) { loadFile(file, imageId) {
const cornerstoneWADOImageLoader = await getCornerstoneWADOImageLoader();
return cornerstoneWADOImageLoader.wadouri.loadFileRequest(imageId); return cornerstoneWADOImageLoader.wadouri.loadFileRequest(imageId);
} }

View File

@ -1,5 +1,4 @@
import asyncComponent from '../components/AsyncComponent.js'; import asyncComponent from '../components/AsyncComponent.js';
import { withCornerstone } from '../utils/cornerstoneWADOImageLoader';
import OHIF from '@ohif/core'; import OHIF from '@ohif/core';
const { urlUtil: UrlUtil } = OHIF.utils; const { urlUtil: UrlUtil } = OHIF.utils;
@ -10,10 +9,8 @@ const IHEInvokeImageDisplay = asyncComponent(() =>
/* webpackChunkName: "IHEInvokeImageDisplay" */ './IHEInvokeImageDisplay.js' /* webpackChunkName: "IHEInvokeImageDisplay" */ './IHEInvokeImageDisplay.js'
) )
); );
const ViewerRouting = withCornerstone( const ViewerRouting = asyncComponent(() =>
asyncComponent(() => import(/* webpackChunkName: "ViewerRouting" */ './ViewerRouting.js')
import(/* webpackChunkName: "ViewerRouting" */ './ViewerRouting.js')
)
); );
const StudyListRouting = asyncComponent(() => const StudyListRouting = asyncComponent(() =>
@ -21,18 +18,12 @@ const StudyListRouting = asyncComponent(() =>
/* webpackChunkName: "StudyListRouting" */ '../studylist/StudyListRouting.js' /* webpackChunkName: "StudyListRouting" */ '../studylist/StudyListRouting.js'
) )
); );
const StandaloneRouting = withCornerstone( const StandaloneRouting = asyncComponent(() =>
asyncComponent(() => import(/* webpackChunkName: "ConnectedStandaloneRouting" */ '../connectedComponents/ConnectedStandaloneRouting.js')
import(
/* webpackChunkName: "ConnectedStandaloneRouting" */ '../connectedComponents/ConnectedStandaloneRouting.js'
)
)
); );
const ViewerLocalFileData = withCornerstone( const ViewerLocalFileData = asyncComponent(() =>
asyncComponent(() => import(
import( /* webpackChunkName: "ViewerLocalFileData" */ '../connectedComponents/ViewerLocalFileData.js'
/* webpackChunkName: "ViewerLocalFileData" */ '../connectedComponents/ViewerLocalFileData.js'
)
) )
); );

View File

@ -1,79 +0,0 @@
import OHIF from '@ohif/core';
import cornerstone from 'cornerstone-core';
import dicomParser from 'dicom-parser';
import React from 'react';
export function getCornerstoneWADOImageLoader() {
return import(
/* webpackChunkName: "CornerstoneWADOImageLoader" */ 'cornerstone-wado-image-loader'
);
}
let initialized = false;
export async function initCornerstoneWADOImageLoader() {
if (initialized) return;
const cornerstoneWADOImageLoader = await getCornerstoneWADOImageLoader();
// For debugging
//if (process.env.node_env === 'development') {
window.cornerstoneWADOImageLoader = cornerstoneWADOImageLoader;
//}
cornerstoneWADOImageLoader.external.cornerstone = cornerstone;
cornerstoneWADOImageLoader.external.dicomParser = dicomParser;
OHIF.user.getAccessToken = () => {
// TODO: Get the Redux store from somewhere else
const state = window.store.getState();
if (!state.oidc || !state.oidc.user) {
return;
}
return state.oidc.user.accesstoken;
};
cornerstoneWADOImageLoader.configure({
beforeSend: function (xhr) {
const headers = OHIF.DICOMWeb.getAuthorizationHeader();
if (headers.Authorization) {
xhr.setRequestHeader('Authorization', headers.Authorization);
}
},
});
const config = {
maxWebWorkers: Math.max(navigator.hardwareConcurrency - 1, 1),
startWebWorkersOnDemand: true,
taskConfiguration: {
decodeTask: {
initializeCodecsOnStartup: false,
usePDFJS: false,
strict: false,
},
},
};
cornerstoneWADOImageLoader.webWorkerManager.initialize(config);
initialized = true;
}
export function withCornerstone(Component) {
// eslint-disable-next-line react/display-name
return props => {
const [
cornerstoneWADOImageLoaderInitialized,
setCornerstoneWADOImageLoaderInitialized,
] = React.useState(false);
React.useEffect(() => {
initCornerstoneWADOImageLoader().then(() =>
setCornerstoneWADOImageLoaderInitialized(true)
);
}, []);
if (!cornerstoneWADOImageLoaderInitialized) {
return null;
}
return <Component {...props} />;
};
}

View File

@ -1,3 +1,4 @@
import getUserManagerForOpenIdConnectClient from './getUserManagerForOpenIdConnectClient.js'; import getUserManagerForOpenIdConnectClient from './getUserManagerForOpenIdConnectClient.js';
import initWebWorkers from './initWebWorkers.js';
export { getUserManagerForOpenIdConnectClient }; export { getUserManagerForOpenIdConnectClient, initWebWorkers };

View File

@ -5,7 +5,7 @@ describe('utils', () => {
const utilExports = Object.keys(utils).sort(); const utilExports = Object.keys(utils).sort();
expect(utilExports).toEqual( expect(utilExports).toEqual(
['getUserManagerForOpenIdConnectClient'].sort() ['getUserManagerForOpenIdConnectClient', 'initWebWorkers'].sort()
); );
}); });
}); });

View File

@ -0,0 +1,22 @@
import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader';
let initialized = false;
export default function initWebWorkers() {
const config = {
maxWebWorkers: Math.max(navigator.hardwareConcurrency - 1, 1),
startWebWorkersOnDemand: true,
taskConfiguration: {
decodeTask: {
initializeCodecsOnStartup: false,
usePDFJS: false,
strict: false,
},
},
};
if (!initialized) {
cornerstoneWADOImageLoader.webWorkerManager.initialize(config);
initialized = true;
}
}

View File

@ -0,0 +1,23 @@
import initWebWorkers from './initWebWorkers.js';
import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader';
describe('initWebWorkers', () => {
it("initializes cornerstoneWADOImageLoader's web workers", () => {
initWebWorkers();
expect(
cornerstoneWADOImageLoader.webWorkerManager.initialize
).toHaveBeenCalled();
});
});
describe('initWebWorkers', () => {
it("initializes cornerstoneWADOImageLoader's web workers only once", () => {
initWebWorkers();
initWebWorkers();
expect(
cornerstoneWADOImageLoader.webWorkerManager.initialize
).toHaveBeenCalledTimes(1);
});
});