diff --git a/docs/latest/viewer/configuration.md b/docs/latest/viewer/configuration.md index 348b9a4c1..838e5f5a4 100644 --- a/docs/latest/viewer/configuration.md +++ b/docs/latest/viewer/configuration.md @@ -11,6 +11,14 @@ are: ```js window.config = { routerBasename: '/', + /** + * "White Labeling" is used to change the branding, look, and feel of the OHIF + * Viewer. These settings, and the color variables that are used by our components, + * are the easiest way to rebrand the application. + * + * More extensive changes are made possible through swapping out the UI library, + * Viewer project, or extensions. + */ whiteLabeling: { /* Optional: Should return a React component to be rendered in the "Logo" section of the application's Top Navigation bar */ createLogoComponentFn: function(React) { @@ -30,6 +38,32 @@ window.config = { }); }, }, + /** + * Internally, the OHIF Viewer fetches data primarily with the + * `cornerstoneWADOImageLoader` and the `DICOMWebClient`. If either of these + * receive a non-200 response, this method allows you to handle that error. + * + * Common use cases include: + * - Showing a notification with the UINotificationService + * - Redirecting the user + * - Refreshing an auth token + * + * @param {Object} error - JS new Error() + * @param {XMLHttpRequest} error.request - The XHR request that's onreadystate change triggered this callback + * @param {string} error.response - The XHR's response property + * @param {number} error.status - The XHR's status property + */ + httpErrorHandler: error => { + const { request: xhr, response, status } = err; + const { responseType, statusText } = xhr; + + // In local files, status is 0 upon success in Firefox + if (xhr.readyState === XMLHttpRequest.DONE) { + console.log(statusText, response, responseType); + } else { + console.warn('Likely CORS error'); + } + }, extensions: [], showStudyList: true, filterQueryParam: false, diff --git a/extensions/cornerstone/package.json b/extensions/cornerstone/package.json index 03f6479d7..1fddef806 100644 --- a/extensions/cornerstone/package.json +++ b/extensions/cornerstone/package.json @@ -35,7 +35,7 @@ "cornerstone-core": "^2.2.8", "cornerstone-math": "^0.1.8", "cornerstone-tools": "4.12.5", - "cornerstone-wado-image-loader": "^3.0.0", + "cornerstone-wado-image-loader": "^3.1.0", "dcmjs": "^0.10.1", "dicom-parser": "^1.8.3", "hammerjs": "^2.0.8", diff --git a/extensions/dicom-p10-downloader/package.json b/extensions/dicom-p10-downloader/package.json index bacb065f4..40aa15a6b 100644 --- a/extensions/dicom-p10-downloader/package.json +++ b/extensions/dicom-p10-downloader/package.json @@ -33,6 +33,7 @@ }, "dependencies": { "@babel/runtime": "^7.5.5", + "dicomweb-client": "^0.6.0", "file-saver": "^2.0.2", "jszip": "^3.2.2" } diff --git a/extensions/vtk/package.json b/extensions/vtk/package.json index d44071cd0..1126a9e59 100644 --- a/extensions/vtk/package.json +++ b/extensions/vtk/package.json @@ -34,7 +34,7 @@ "@ohif/ui": "^0.50.0", "cornerstone-core": "^2.2.8", "cornerstone-tools": "4.12.5", - "cornerstone-wado-image-loader": "^3.0.0", + "cornerstone-wado-image-loader": "^3.1.0", "dcmjs": "^0.10.1", "dicom-parser": "^1.8.3", "i18next": "^17.0.3", @@ -56,7 +56,7 @@ "@ohif/core": "^2.7.1", "@ohif/ui": "^1.4.3", "cornerstone-tools": "4.12.5", - "cornerstone-wado-image-loader": "^3.0.0", + "cornerstone-wado-image-loader": "^3.1.0", "dicom-parser": "^1.8.3", "gh-pages": "^2.0.1", "i18next": "^17.0.3", diff --git a/platform/core/package.json b/platform/core/package.json index e17c4a71f..fc38dc859 100644 --- a/platform/core/package.json +++ b/platform/core/package.json @@ -33,14 +33,14 @@ "peerDependencies": { "cornerstone-core": "^2.2.8", "cornerstone-tools": "4.12.5", - "cornerstone-wado-image-loader": "^3.0.0", + "cornerstone-wado-image-loader": "^3.1.0", "dicom-parser": "^1.8.3" }, "dependencies": { "@babel/runtime": "^7.5.5", "ajv": "^6.10.0", "dcmjs": "^0.12.0", - "dicomweb-client": "^0.5.2", + "dicomweb-client": "^0.6.0", "immer": "6.0.2", "isomorphic-base64": "^1.0.2", "lodash.clonedeep": "^4.5.0", diff --git a/platform/core/src/DICOMSR/handleStructuredReport.js b/platform/core/src/DICOMSR/handleStructuredReport.js index c98dda29a..20b56ce79 100644 --- a/platform/core/src/DICOMSR/handleStructuredReport.js +++ b/platform/core/src/DICOMSR/handleStructuredReport.js @@ -5,6 +5,7 @@ import DICOMWeb from '../DICOMWeb'; import parseDicomStructuredReport from './parseDicomStructuredReport'; import parseMeasurementsData from './parseMeasurementsData'; import getAllDisplaySets from './utils/getAllDisplaySets'; +import errorHandler from '../errorHandler'; const VERSION_NAME = 'dcmjs-0.0'; const TRANSFER_SYNTAX_UID = '1.2.840.10008.1.2.1'; @@ -21,6 +22,7 @@ const retrieveMeasurementFromSR = async (series, studies, serverUrl) => { const config = { url: serverUrl, headers: DICOMWeb.getAuthorizationHeader(), + errorInterceptor: errorHandler.getHTTPErrorHandler(), }; const dicomWeb = new api.DICOMwebClient(config); @@ -71,6 +73,7 @@ const stowSRFromMeasurements = async (measurements, serverUrl) => { const config = { url: serverUrl, headers: DICOMWeb.getAuthorizationHeader(), + errorInterceptor: errorHandler.getHTTPErrorHandler(), }; const dicomWeb = new api.DICOMwebClient(config); diff --git a/platform/core/src/classes/metadata/StudyMetadata.js b/platform/core/src/classes/metadata/StudyMetadata.js index cd344e8cc..911427f67 100644 --- a/platform/core/src/classes/metadata/StudyMetadata.js +++ b/platform/core/src/classes/metadata/StudyMetadata.js @@ -11,6 +11,7 @@ import { api } from 'dicomweb-client'; import { isImage } from '../../utils/isImage'; import isDisplaySetReconstructable from '../../utils/isDisplaySetReconstructable'; import isLowPriorityModality from '../../utils/isLowPriorityModality'; +import errorHandler from '../../errorHandler'; export class StudyMetadata extends Metadata { constructor(data, uid) { @@ -102,10 +103,7 @@ export class StudyMetadata extends Metadata { * @param {SeriesMetadata} series The series metadata object from which the display sets will be created * @returns {Array} The list of display sets created for the given series object */ - _createDisplaySetsForSeries( - sopClassHandlerModules, - series, - ) { + _createDisplaySetsForSeries(sopClassHandlerModules, series) { const study = this; const displaySets = []; @@ -293,14 +291,13 @@ export class StudyMetadata extends Metadata { } // Loop through the series (SeriesMetadata) - this.forEachSeries( - series => { - const displaySetsForSeries = this._createDisplaySetsForSeries( - sopClassHandlerModules, - series, - ); + this.forEachSeries(series => { + const displaySetsForSeries = this._createDisplaySetsForSeries( + sopClassHandlerModules, + series + ); - displaySets.push(...displaySetsForSeries); + displaySets.push(...displaySetsForSeries); }); return sortDisplaySetList(displaySets); @@ -321,7 +318,10 @@ export class StudyMetadata extends Metadata { return false; } - const displaySets = this._createDisplaySetsForSeries(sopClassHandlerModules, series) + const displaySets = this._createDisplaySetsForSeries( + sopClassHandlerModules, + series + ); // Note: filtering in place because this._displaySets has writable: false for (let i = this._displaySets.length - 1; i >= 0; i--) { @@ -835,9 +835,11 @@ function _getDisplaySetFromSopClassModule( const plugin = handlersForSopClassUID[0]; const headers = DICOMWeb.getAuthorizationHeader(); + const errorInterceptor = errorHandler.getHTTPErrorHandler(); const dicomWebClient = new dwc({ url: study.getData().wadoRoot, headers, + errorInterceptor, }); let displaySet = plugin.getDisplaySetFromSeries( diff --git a/platform/core/src/errorHandler.js b/platform/core/src/errorHandler.js new file mode 100644 index 000000000..4b0fc72c0 --- /dev/null +++ b/platform/core/src/errorHandler.js @@ -0,0 +1,6 @@ +// These should be overridden by the implementation +const errorHandler = { + getHTTPErrorHandler: () => null, +}; + +export default errorHandler; diff --git a/platform/core/src/index.js b/platform/core/src/index.js index d8b3586b3..3f7727d2d 100644 --- a/platform/core/src/index.js +++ b/platform/core/src/index.js @@ -18,6 +18,7 @@ import string from './string.js'; import studies from './studies/'; import ui from './ui'; import user from './user.js'; +import errorHandler from './errorHandler.js'; import utils, { hotkeys } from './utils/'; import { @@ -46,6 +47,7 @@ const OHIF = { string, ui, user, + errorHandler, object, log, DICOMWeb, @@ -79,6 +81,7 @@ export { string, ui, user, + errorHandler, object, log, DICOMWeb, diff --git a/platform/core/src/index.test.js b/platform/core/src/index.test.js index cc0e2a690..47ee09488 100644 --- a/platform/core/src/index.test.js +++ b/platform/core/src/index.test.js @@ -24,6 +24,7 @@ describe('Top level exports', () => { 'header', 'cornerstone', 'default', // + 'errorHandler', 'string', 'ui', 'user', diff --git a/platform/core/src/studies/services/qido/instances.js b/platform/core/src/studies/services/qido/instances.js index 105baefef..5ecf99d34 100644 --- a/platform/core/src/studies/services/qido/instances.js +++ b/platform/core/src/studies/services/qido/instances.js @@ -1,6 +1,8 @@ import DICOMWeb from '../../../DICOMWeb/'; import { api } from 'dicomweb-client'; +import errorHandler from '../../../errorHandler'; + /** * Parses data returned from a QIDO search and transforms it into * an array of series that are present in the study @@ -79,6 +81,7 @@ export default function Instances(server, StudyInstanceUID) { const config = { url: server.qidoRoot, headers: DICOMWeb.getAuthorizationHeader(server), + errorInterceptor: errorHandler.getHTTPErrorHandler(), }; const dicomWeb = new api.DICOMwebClient(config); const queryParams = getQIDOQueryParams( diff --git a/platform/core/src/studies/services/qido/studies.js b/platform/core/src/studies/services/qido/studies.js index 7a798855a..93cb292d4 100644 --- a/platform/core/src/studies/services/qido/studies.js +++ b/platform/core/src/studies/services/qido/studies.js @@ -1,6 +1,8 @@ import { api } from 'dicomweb-client'; import DICOMWeb from '../../../DICOMWeb/'; +import errorHandler from '../../../errorHandler'; + /** * Creates a QIDO date string for a date range query * Assumes the year is positive, at most 4 digits long. @@ -115,6 +117,7 @@ export default function Studies(server, filter) { const config = { url: server.qidoRoot, headers: DICOMWeb.getAuthorizationHeader(server), + errorInterceptor: errorHandler.getHTTPErrorHandler(), }; const dicomWeb = new api.DICOMwebClient(config); diff --git a/platform/core/src/studies/services/wado/retrieveMetadataLoaderAsync.js b/platform/core/src/studies/services/wado/retrieveMetadataLoaderAsync.js index 74d18a79a..81585772b 100644 --- a/platform/core/src/studies/services/wado/retrieveMetadataLoaderAsync.js +++ b/platform/core/src/studies/services/wado/retrieveMetadataLoaderAsync.js @@ -9,6 +9,8 @@ import { addInstancesToStudy, } from './studyInstanceHelpers'; +import errorHandler from '../../../errorHandler'; + const { naturalizeDataset } = dcmjs.data.DicomMetaDictionary; /** @@ -73,6 +75,7 @@ export default class RetrieveMetadataLoaderAsync extends RetrieveMetadataLoader const client = new api.DICOMwebClient({ url: server.qidoRoot, headers: DICOMWeb.getAuthorizationHeader(server), + errorInterceptor: errorHandler.getHTTPErrorHandler(), }); this.client = client; @@ -117,7 +120,7 @@ export default class RetrieveMetadataLoaderAsync extends RetrieveMetadataLoader return { seriesInstanceUIDsMap, - seriesData + seriesData, }; } @@ -155,11 +158,14 @@ export default class RetrieveMetadataLoaderAsync extends RetrieveMetadataLoader SeriesDescription: series.SeriesDescription, SeriesNumber: series.SeriesNumber, Modality: series.Modality, - instances: [] + instances: [], }; if (study.series[idx]) { - study.series[idx] = Object.assign(seriesDataFromQIDO, study.series[idx]); + study.series[idx] = Object.assign( + seriesDataFromQIDO, + study.series[idx] + ); } else { study.series[idx] = seriesDataFromQIDO; } diff --git a/platform/core/src/studies/services/wado/retrieveMetadataLoaderSync.js b/platform/core/src/studies/services/wado/retrieveMetadataLoaderSync.js index 19147d069..90d1ae988 100644 --- a/platform/core/src/studies/services/wado/retrieveMetadataLoaderSync.js +++ b/platform/core/src/studies/services/wado/retrieveMetadataLoaderSync.js @@ -3,6 +3,8 @@ import DICOMWeb from '../../../DICOMWeb/'; import { createStudyFromSOPInstanceList } from './studyInstanceHelpers'; import RetrieveMetadataLoader from './retrieveMetadataLoader'; +import errorHandler from '../../../errorHandler'; + /** * Class for sync load of study metadata. * It inherits from RetrieveMetadataLoader @@ -58,6 +60,7 @@ export default class RetrieveMetadataLoaderSync extends RetrieveMetadataLoader { const client = new api.DICOMwebClient({ url: server.wadoRoot, headers: DICOMWeb.getAuthorizationHeader(server), + errorInterceptor: errorHandler.getHTTPErrorHandler(), }); this.client = client; diff --git a/platform/core/src/utils/dicomLoaderService.js b/platform/core/src/utils/dicomLoaderService.js index 42d3faad7..f0792129a 100644 --- a/platform/core/src/utils/dicomLoaderService.js +++ b/platform/core/src/utils/dicomLoaderService.js @@ -3,6 +3,8 @@ import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'; import { api } from 'dicomweb-client'; import DICOMWeb from '../DICOMWeb'; +import errorHandler from '../errorHandler'; + const getImageId = imageObj => { if (!imageObj) { return; @@ -57,11 +59,13 @@ const wadorsRetriever = ( studyInstanceUID, seriesInstanceUID, sopInstanceUID, - headers = DICOMWeb.getAuthorizationHeader() + headers = DICOMWeb.getAuthorizationHeader(), + errorInterceptor = errorHandler.getHTTPErrorHandler() ) => { const config = { url, headers, + errorInterceptor, }; const dicomWeb = new api.DICOMwebClient(config); diff --git a/platform/core/src/utils/metadataProvider/fetchOverlayData.js b/platform/core/src/utils/metadataProvider/fetchOverlayData.js index dc408bf10..11e4d99cd 100644 --- a/platform/core/src/utils/metadataProvider/fetchOverlayData.js +++ b/platform/core/src/utils/metadataProvider/fetchOverlayData.js @@ -3,6 +3,8 @@ import DICOMWeb from '../../DICOMWeb'; import str2ab from '../str2ab'; import unpackOverlay from './unpackOverlay'; +import errorHandler from '../../errorHandler'; + export default async function fetchOverlayData(instance, server) { const OverlayDataPromises = []; const OverlayDataTags = []; @@ -21,14 +23,20 @@ export default async function fetchOverlayData(instance, server) { const inlineBinaryData = atob(instance[OverlayDataTag].InlineBinary); const arraybuffer = str2ab(inlineBinaryData); - instance[OverlayDataTag] = unpackOverlay(arraybuffer) - } else if (instance[OverlayDataTag] && instance[OverlayDataTag].BulkDataURI) { + instance[OverlayDataTag] = unpackOverlay(arraybuffer); + } else if ( + instance[OverlayDataTag] && + instance[OverlayDataTag].BulkDataURI + ) { OverlayDataPromises.push( _getOverlayData(instance[OverlayDataTag], server) ); OverlayDataTags.push(OverlayDataTag); - } else if (instance[OverlayDataTag] && instance[OverlayDataTag] instanceof ArrayBuffer) { - instance[OverlayDataTag] = unpackOverlay(instance[OverlayDataTag]) + } else if ( + instance[OverlayDataTag] && + instance[OverlayDataTag] instanceof ArrayBuffer + ) { + instance[OverlayDataTag] = unpackOverlay(instance[OverlayDataTag]); } } @@ -60,6 +68,7 @@ async function _getOverlayData(tag, server) { const config = { url: server.wadoRoot, //BulkDataURI is absolute, so this isn't used headers: DICOMWeb.getAuthorizationHeader(server), + errorInterceptor: errorHandler.getHTTPErrorHandler(), }; const dicomWeb = new api.DICOMwebClient(config); const options = { @@ -71,5 +80,3 @@ async function _getOverlayData(tag, server) { .then(result => result[0]) .then(unpackOverlay); } - - diff --git a/platform/core/src/utils/metadataProvider/fetchPaletteColorLookupTableData.js b/platform/core/src/utils/metadataProvider/fetchPaletteColorLookupTableData.js index 75e9e72c1..7ebde41fe 100644 --- a/platform/core/src/utils/metadataProvider/fetchPaletteColorLookupTableData.js +++ b/platform/core/src/utils/metadataProvider/fetchPaletteColorLookupTableData.js @@ -2,6 +2,8 @@ import { api } from 'dicomweb-client'; import DICOMWeb from '../../DICOMWeb'; import str2ab from '../str2ab'; +import errorHandler from '../../errorHandler'; + export default async function fetchPaletteColorLookupTableData( instance, server @@ -146,6 +148,7 @@ function _getPaletteColor(server, paletteColorLookupTableData, lutDescriptor) { const config = { url: server.wadoRoot, //BulkDataURI is absolute, so this isn't used headers: DICOMWeb.getAuthorizationHeader(server), + errorInterceptor: errorHandler.getHTTPErrorHandler(), }; const dicomWeb = new api.DICOMwebClient(config); const options = { @@ -164,6 +167,8 @@ function _getPaletteColor(server, paletteColorLookupTableData, lutDescriptor) { resolve(arrayBufferToPaletteColorLUT(arraybuffer)); }); } else { - return Promise.resolve(arrayBufferToPaletteColorLUT(paletteColorLookupTableData)); + return Promise.resolve( + arrayBufferToPaletteColorLUT(paletteColorLookupTableData) + ); } } diff --git a/platform/viewer/package.json b/platform/viewer/package.json index adbd71ed8..c2834d77b 100644 --- a/platform/viewer/package.json +++ b/platform/viewer/package.json @@ -66,7 +66,7 @@ "cornerstone-core": "^2.2.8", "cornerstone-math": "^0.1.8", "cornerstone-tools": "4.12.5", - "cornerstone-wado-image-loader": "^3.0.0", + "cornerstone-wado-image-loader": "^3.1.0", "dcmjs": "^0.12.0", "dicom-parser": "^1.8.3", "dicomweb-client": "^0.4.4", diff --git a/platform/viewer/public/config/idc.js b/platform/viewer/public/config/idc.js new file mode 100644 index 000000000..204fa4d0e --- /dev/null +++ b/platform/viewer/public/config/idc.js @@ -0,0 +1,19 @@ +window.config = function(props) { + var servicesManager = props.servicesManager; + + return { + routerBasename: '/', + enableGoogleCloudAdapter: true, + enableGoogleCloudAdapterUI: false, + showStudyList: true, + httpErrorHandler: error => { + // This is 429 when rejected from the public idc sandbox too often. + console.warn(error.status); + + // Could use services manager here to bring up a dialog/modal if needed. + console.warn('test, navigate to https://ohif.org/'); + window.location = 'https://ohif.org/'; + }, + healthcareApiEndpoint: 'https://idc-sandbox-002.appspot.com/v1beta1', + }; +}; diff --git a/platform/viewer/src/App.js b/platform/viewer/src/App.js index 5c39a99e5..f41ff394b 100644 --- a/platform/viewer/src/App.js +++ b/platform/viewer/src/App.js @@ -31,7 +31,8 @@ import { import i18n from '@ohif/i18n'; // TODO: This should not be here -import './config'; +//import './config'; +import { setConfiguration } from './config'; /** Utils */ import { @@ -123,6 +124,8 @@ class App extends Component { oidc, } = this._appConfig; + setConfiguration(this._appConfig); + this.initUserManager(oidc); _initServices([ UINotificationService, diff --git a/platform/viewer/src/config.js b/platform/viewer/src/config.js index 3b8a1f2e9..7983a5f9b 100644 --- a/platform/viewer/src/config.js +++ b/platform/viewer/src/config.js @@ -3,43 +3,59 @@ import cornerstone from 'cornerstone-core'; import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'; import dicomParser from 'dicom-parser'; import version from './version.js'; +import AppContext from './context/AppContext'; -let homepage; -const { process } = window; -if (process && process.env && process.env.PUBLIC_URL) { - homepage = process.env.PUBLIC_URL; -} - -window.info = { - version, - homepage, -}; - -// For debugging -//if (process.env.node_env === 'development') { -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; +export function setConfiguration(appConfig) { + let homepage; + const { process } = window; + if (process && process.env && process.env.PUBLIC_URL) { + homepage = process.env.PUBLIC_URL; } - return state.oidc.user.access_token; -}; + window.info = { + version, + homepage, + }; -cornerstoneWADOImageLoader.configure({ - beforeSend: function(xhr) { - const headers = OHIF.DICOMWeb.getAuthorizationHeader(); + // For debugging + //if (process.env.node_env === 'development') { + window.cornerstone = cornerstone; + window.cornerstoneWADOImageLoader = cornerstoneWADOImageLoader; + //} - if (headers.Authorization) { - xhr.setRequestHeader('Authorization', headers.Authorization); + 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; + }; + + OHIF.errorHandler.getHTTPErrorHandler = () => { + // const { appConfig = {} } = AppContext; + + return appConfig.httpErrorHandler; + }; + + cornerstoneWADOImageLoader.configure({ + beforeSend: function(xhr) { + const headers = OHIF.DICOMWeb.getAuthorizationHeader(); + + if (headers.Authorization) { + xhr.setRequestHeader('Authorization', headers.Authorization); + } + }, + errorInterceptor: error => { + // const { appConfig = {} } = AppContext; + + if (typeof appConfig.httpErrorHandler === 'function') { + appConfig.httpErrorHandler(errorHandler); + } + }, + }); +} diff --git a/platform/viewer/src/googleCloud/api/DicomUploadService.js b/platform/viewer/src/googleCloud/api/DicomUploadService.js index 6db849ab3..d5b85c839 100644 --- a/platform/viewer/src/googleCloud/api/DicomUploadService.js +++ b/platform/viewer/src/googleCloud/api/DicomUploadService.js @@ -1,5 +1,6 @@ import { httpErrorToStr, checkDicomFile } from '../utils/helpers'; import { api } from 'dicomweb-client'; +import { errorHandler } from '@ohif/core'; class DicomUploadService { async smartUpload(files, url, uploadCallback, cancellationToken) { @@ -22,8 +23,7 @@ class DicomUploadService { let error = null; try { if (chunk.length > 1) throw new Error('Not implemented'); - if (chunk.length === 1) - await this.simpleUpload(chunk[0], url); + if (chunk.length === 1) await this.simpleUpload(chunk[0], url); } catch (err) { // It looks like a stupid bug of Babel that err is not an actual Exception object error = httpErrorToStr(err); @@ -76,11 +76,12 @@ class DicomUploadService { getClient(url) { const headers = this.retrieveAuthHeaderFunc(); + const errorInterceptor = errorHandler.getHTTPErrorHandler(); // TODO: a bit weird we are creating a new dicomweb client instance for every upload return new api.DICOMwebClient({ url, - headers + headers, }); } } diff --git a/yarn.lock b/yarn.lock index 1a9cf638f..c8fb0c16a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1247,13 +1247,34 @@ pirates "^4.0.0" source-map-support "^0.5.9" -"@babel/runtime@7.1.2", "@babel/runtime@7.5.5", "@babel/runtime@7.6.0", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": +"@babel/runtime@7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.1.2.tgz#81c89935f4647706fc54541145e6b4ecfef4b8e3" + integrity sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg== + dependencies: + regenerator-runtime "^0.12.0" + +"@babel/runtime@7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.0.tgz#4fc1d642a9fd0299754e8b5de62c631cf5568205" + integrity sha512-89eSBLJsxNxOERC0Op4vd+0Bqm6wRMqMbFtV3i0/fbaWw/mJ8Q3eBvgX0G4SyrOOLCtbu98HspF8o09MRT+KzQ== + dependencies: + regenerator-runtime "^0.13.2" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132" integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ== dependencies: regenerator-runtime "^0.13.2" +"@babel/runtime@^7.6.0", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" + integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0": version "7.6.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" @@ -5953,10 +5974,10 @@ cornerstone-tools@4.12.5: "@babel/runtime" "7.1.2" cornerstone-math "0.1.7" -cornerstone-wado-image-loader@^3.0.0: - version "3.0.6" - resolved "https://registry.yarnpkg.com/cornerstone-wado-image-loader/-/cornerstone-wado-image-loader-3.0.6.tgz#7b2be91f8f658de3a7474e029aa8314a35725132" - integrity sha512-1luWOh1GzkboZ3uxfu4T8vh7K9nlDiiEbQ4dYIY9oobRZVZQbQiLT8wEZPbb4JTUe7UWJISHPCNgtAU8UE9DNw== +cornerstone-wado-image-loader@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cornerstone-wado-image-loader/-/cornerstone-wado-image-loader-3.1.0.tgz#6007470be896678636da3188f194f5e66ed07858" + integrity sha512-n2yadbwK7rCHqJyh5AUmYVPUY5m7boKpheK60sXV41Z0eSZLin9Ja+P9yeAvkg0VGV+/zaBZGPUGY3YyjdWBgg== dependencies: dicom-parser "^1.8.3" pako "^1.0.10" @@ -6858,6 +6879,11 @@ dicomweb-client@^0.5.2: resolved "https://registry.yarnpkg.com/dicomweb-client/-/dicomweb-client-0.5.2.tgz#aa5a4a6a5044b0702bb0a8a2662c86cd16901951" integrity sha512-e11n2+g7HfBuMyopWq76W11eSZJ707g4U1XiO8URA+23aoe0g1kGAtlPB29NKXl7zX7RznTJ7wfRBxFkW6EJDA== +dicomweb-client@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/dicomweb-client/-/dicomweb-client-0.6.0.tgz#5e35ada52fe0155af1cc1f0e84f9c7f76477f92d" + integrity sha512-VAkBg4W6odIo2XsFxqjN/rptd7bQ8oHpRuKH5d46E9BUIPzRschazE8Dx1xg7/l3N3f1M70jB7yJ339arAXiDQ== + diff-sequences@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" @@ -11428,9 +11454,9 @@ jszip@3.2.2: set-immediate-shim "~1.0.1" jszip@^3.2.2: - version "3.3.0" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.3.0.tgz#29d72c21a54990fa885b11fc843db320640d5271" - integrity sha512-EJ9k766htB1ZWnsV5ZMDkKLgA+201r/ouFF8R2OigVjVdcm2rurcBrrdXaeqBJbqnUVMko512PYmlncBKE1Huw== + version "3.4.0" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.4.0.tgz#1a69421fa5f0bb9bc222a46bca88182fba075350" + integrity sha512-gZAOYuPl4EhPTXT0GjhI3o+ZAz3su6EhLrKUoAivcKqyqC7laS5JEv4XWZND9BgcDcF83vI85yGbDmDR6UhrIg== dependencies: lie "~3.3.0" pako "~1.0.2" @@ -16385,7 +16411,12 @@ regenerator-runtime@^0.11.0, regenerator-runtime@^0.11.1: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.13.1, regenerator-runtime@^0.13.2: +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== + +regenerator-runtime@^0.13.1, regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4: version "0.13.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==