From 06feca1f4accb4fdc1584e5f7ff923d6b130103f Mon Sep 17 00:00:00 2001 From: Bill Wallace Date: Fri, 23 Sep 2022 16:24:18 -0400 Subject: [PATCH] fix(cornerstoneCache):Race condition on cache notification (#2900) --- .../src/Viewport/OHIFCornerstoneViewport.tsx | 20 +++++++++---------- .../Overlays/ViewportOrientationMarkers.tsx | 2 +- .../CornerstoneCacheService.ts | 8 ++++++-- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.tsx b/extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.tsx index 24fa1e45f..c20cea0ba 100644 --- a/extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.tsx +++ b/extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.tsx @@ -232,22 +232,22 @@ const OHIFCornerstoneViewport = React.memo(props => { } const loadViewportData = async () => { - const viewportData = await CornerstoneCacheService.getViewportData( + await CornerstoneCacheService.getViewportData( viewportIndex, displaySets, viewportOptions.viewportType, dataSource, + (viewportDataLoaded) => { + CornerstoneViewportService.setViewportDisplaySets( + viewportIndex, + viewportDataLoaded, + viewportOptions, + displaySetOptions + ); + setViewportData(viewportDataLoaded); + }, initialImageIndex ); - - CornerstoneViewportService.setViewportDisplaySets( - viewportIndex, - viewportData, - viewportOptions, - displaySetOptions - ); - - setViewportData(viewportData); }; loadViewportData(); diff --git a/extensions/cornerstone/src/Viewport/Overlays/ViewportOrientationMarkers.tsx b/extensions/cornerstone/src/Viewport/Overlays/ViewportOrientationMarkers.tsx index 6bea5975a..1570ba008 100644 --- a/extensions/cornerstone/src/Viewport/Overlays/ViewportOrientationMarkers.tsx +++ b/extensions/cornerstone/src/Viewport/Overlays/ViewportOrientationMarkers.tsx @@ -137,7 +137,7 @@ function ViewportOrientationMarkers({ } const imageIndex = imageSliceData.imageIndex; - const imageId = viewportData?.imageIds[imageIndex]; + const imageId = viewportData.imageIds?.[imageIndex]; // Workaround for below TODO stub if (!imageId) { diff --git a/extensions/cornerstone/src/services/ViewportService/CornerstoneCacheService.ts b/extensions/cornerstone/src/services/ViewportService/CornerstoneCacheService.ts index ba19dfa49..0e65bf5f7 100644 --- a/extensions/cornerstone/src/services/ViewportService/CornerstoneCacheService.ts +++ b/extensions/cornerstone/src/services/ViewportService/CornerstoneCacheService.ts @@ -32,6 +32,8 @@ const EVENTS = { VIEWPORT_DATA_CHANGED: 'event::cornerstone::viewportdatachanged', }; +export type IViewportData = StackData | VolumeData; + class CornerstoneCacheService { stackImageIds: Map = new Map(); volumeImageIds: Map = new Map(); @@ -57,10 +59,11 @@ class CornerstoneCacheService { displaySets: unknown[], viewportType: string, dataSource: unknown, + callback: (val: IViewportData) => unknown, initialImageIndex?: number ): Promise { const cs3DViewportType = getCornerstoneViewportType(viewportType); - let viewportData: StackData | VolumeData; + let viewportData: IViewportData; if (cs3DViewportType === Enums.ViewportType.STACK) { viewportData = await this._getStackViewportData( @@ -76,6 +79,8 @@ class CornerstoneCacheService { viewportData.viewportType = cs3DViewportType; + await callback(viewportData); + this._broadcastEvent(this.EVENTS.VIEWPORT_DATA_CHANGED, { viewportData, viewportIndex, @@ -83,7 +88,6 @@ class CornerstoneCacheService { return viewportData; } - public async invalidateViewportData( viewportData: VolumeData, invalidatedDisplaySetInstanceUID: string,