feat: configuration to hook into XHR Error handling
* Error handling. * Fix error handling, add redirect example. * remove debugger * docs: whitelabeling and httpErrorHandler * bump dicomweb-client version * bump cornerstone-wado-image-loader version * Add more documentation around httpErrorHandler callback * test: add errorHandler as an expected top level export Co-authored-by: dannyrb <danny.ri.brown@gmail.com>
This commit is contained in:
parent
273f31ad56
commit
e96205de35
@ -11,6 +11,14 @@ are:
|
|||||||
```js
|
```js
|
||||||
window.config = {
|
window.config = {
|
||||||
routerBasename: '/',
|
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: {
|
whiteLabeling: {
|
||||||
/* Optional: Should return a React component to be rendered in the "Logo" section of the application's Top Navigation bar */
|
/* Optional: Should return a React component to be rendered in the "Logo" section of the application's Top Navigation bar */
|
||||||
createLogoComponentFn: function(React) {
|
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: [],
|
extensions: [],
|
||||||
showStudyList: true,
|
showStudyList: true,
|
||||||
filterQueryParam: false,
|
filterQueryParam: false,
|
||||||
|
|||||||
@ -35,7 +35,7 @@
|
|||||||
"cornerstone-core": "^2.2.8",
|
"cornerstone-core": "^2.2.8",
|
||||||
"cornerstone-math": "^0.1.8",
|
"cornerstone-math": "^0.1.8",
|
||||||
"cornerstone-tools": "4.12.5",
|
"cornerstone-tools": "4.12.5",
|
||||||
"cornerstone-wado-image-loader": "^3.0.0",
|
"cornerstone-wado-image-loader": "^3.1.0",
|
||||||
"dcmjs": "^0.10.1",
|
"dcmjs": "^0.10.1",
|
||||||
"dicom-parser": "^1.8.3",
|
"dicom-parser": "^1.8.3",
|
||||||
"hammerjs": "^2.0.8",
|
"hammerjs": "^2.0.8",
|
||||||
|
|||||||
@ -33,6 +33,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.5.5",
|
"@babel/runtime": "^7.5.5",
|
||||||
|
"dicomweb-client": "^0.6.0",
|
||||||
"file-saver": "^2.0.2",
|
"file-saver": "^2.0.2",
|
||||||
"jszip": "^3.2.2"
|
"jszip": "^3.2.2"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -34,7 +34,7 @@
|
|||||||
"@ohif/ui": "^0.50.0",
|
"@ohif/ui": "^0.50.0",
|
||||||
"cornerstone-core": "^2.2.8",
|
"cornerstone-core": "^2.2.8",
|
||||||
"cornerstone-tools": "4.12.5",
|
"cornerstone-tools": "4.12.5",
|
||||||
"cornerstone-wado-image-loader": "^3.0.0",
|
"cornerstone-wado-image-loader": "^3.1.0",
|
||||||
"dcmjs": "^0.10.1",
|
"dcmjs": "^0.10.1",
|
||||||
"dicom-parser": "^1.8.3",
|
"dicom-parser": "^1.8.3",
|
||||||
"i18next": "^17.0.3",
|
"i18next": "^17.0.3",
|
||||||
@ -56,7 +56,7 @@
|
|||||||
"@ohif/core": "^2.7.1",
|
"@ohif/core": "^2.7.1",
|
||||||
"@ohif/ui": "^1.4.3",
|
"@ohif/ui": "^1.4.3",
|
||||||
"cornerstone-tools": "4.12.5",
|
"cornerstone-tools": "4.12.5",
|
||||||
"cornerstone-wado-image-loader": "^3.0.0",
|
"cornerstone-wado-image-loader": "^3.1.0",
|
||||||
"dicom-parser": "^1.8.3",
|
"dicom-parser": "^1.8.3",
|
||||||
"gh-pages": "^2.0.1",
|
"gh-pages": "^2.0.1",
|
||||||
"i18next": "^17.0.3",
|
"i18next": "^17.0.3",
|
||||||
|
|||||||
@ -33,14 +33,14 @@
|
|||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"cornerstone-core": "^2.2.8",
|
"cornerstone-core": "^2.2.8",
|
||||||
"cornerstone-tools": "4.12.5",
|
"cornerstone-tools": "4.12.5",
|
||||||
"cornerstone-wado-image-loader": "^3.0.0",
|
"cornerstone-wado-image-loader": "^3.1.0",
|
||||||
"dicom-parser": "^1.8.3"
|
"dicom-parser": "^1.8.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.5.5",
|
"@babel/runtime": "^7.5.5",
|
||||||
"ajv": "^6.10.0",
|
"ajv": "^6.10.0",
|
||||||
"dcmjs": "^0.12.0",
|
"dcmjs": "^0.12.0",
|
||||||
"dicomweb-client": "^0.5.2",
|
"dicomweb-client": "^0.6.0",
|
||||||
"immer": "6.0.2",
|
"immer": "6.0.2",
|
||||||
"isomorphic-base64": "^1.0.2",
|
"isomorphic-base64": "^1.0.2",
|
||||||
"lodash.clonedeep": "^4.5.0",
|
"lodash.clonedeep": "^4.5.0",
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import DICOMWeb from '../DICOMWeb';
|
|||||||
import parseDicomStructuredReport from './parseDicomStructuredReport';
|
import parseDicomStructuredReport from './parseDicomStructuredReport';
|
||||||
import parseMeasurementsData from './parseMeasurementsData';
|
import parseMeasurementsData from './parseMeasurementsData';
|
||||||
import getAllDisplaySets from './utils/getAllDisplaySets';
|
import getAllDisplaySets from './utils/getAllDisplaySets';
|
||||||
|
import errorHandler from '../errorHandler';
|
||||||
|
|
||||||
const VERSION_NAME = 'dcmjs-0.0';
|
const VERSION_NAME = 'dcmjs-0.0';
|
||||||
const TRANSFER_SYNTAX_UID = '1.2.840.10008.1.2.1';
|
const TRANSFER_SYNTAX_UID = '1.2.840.10008.1.2.1';
|
||||||
@ -21,6 +22,7 @@ const retrieveMeasurementFromSR = async (series, studies, serverUrl) => {
|
|||||||
const config = {
|
const config = {
|
||||||
url: serverUrl,
|
url: serverUrl,
|
||||||
headers: DICOMWeb.getAuthorizationHeader(),
|
headers: DICOMWeb.getAuthorizationHeader(),
|
||||||
|
errorInterceptor: errorHandler.getHTTPErrorHandler(),
|
||||||
};
|
};
|
||||||
|
|
||||||
const dicomWeb = new api.DICOMwebClient(config);
|
const dicomWeb = new api.DICOMwebClient(config);
|
||||||
@ -71,6 +73,7 @@ const stowSRFromMeasurements = async (measurements, serverUrl) => {
|
|||||||
const config = {
|
const config = {
|
||||||
url: serverUrl,
|
url: serverUrl,
|
||||||
headers: DICOMWeb.getAuthorizationHeader(),
|
headers: DICOMWeb.getAuthorizationHeader(),
|
||||||
|
errorInterceptor: errorHandler.getHTTPErrorHandler(),
|
||||||
};
|
};
|
||||||
|
|
||||||
const dicomWeb = new api.DICOMwebClient(config);
|
const dicomWeb = new api.DICOMwebClient(config);
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import { api } from 'dicomweb-client';
|
|||||||
import { isImage } from '../../utils/isImage';
|
import { isImage } from '../../utils/isImage';
|
||||||
import isDisplaySetReconstructable from '../../utils/isDisplaySetReconstructable';
|
import isDisplaySetReconstructable from '../../utils/isDisplaySetReconstructable';
|
||||||
import isLowPriorityModality from '../../utils/isLowPriorityModality';
|
import isLowPriorityModality from '../../utils/isLowPriorityModality';
|
||||||
|
import errorHandler from '../../errorHandler';
|
||||||
|
|
||||||
export class StudyMetadata extends Metadata {
|
export class StudyMetadata extends Metadata {
|
||||||
constructor(data, uid) {
|
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
|
* @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
|
* @returns {Array} The list of display sets created for the given series object
|
||||||
*/
|
*/
|
||||||
_createDisplaySetsForSeries(
|
_createDisplaySetsForSeries(sopClassHandlerModules, series) {
|
||||||
sopClassHandlerModules,
|
|
||||||
series,
|
|
||||||
) {
|
|
||||||
const study = this;
|
const study = this;
|
||||||
const displaySets = [];
|
const displaySets = [];
|
||||||
|
|
||||||
@ -293,14 +291,13 @@ export class StudyMetadata extends Metadata {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Loop through the series (SeriesMetadata)
|
// Loop through the series (SeriesMetadata)
|
||||||
this.forEachSeries(
|
this.forEachSeries(series => {
|
||||||
series => {
|
const displaySetsForSeries = this._createDisplaySetsForSeries(
|
||||||
const displaySetsForSeries = this._createDisplaySetsForSeries(
|
sopClassHandlerModules,
|
||||||
sopClassHandlerModules,
|
series
|
||||||
series,
|
);
|
||||||
);
|
|
||||||
|
|
||||||
displaySets.push(...displaySetsForSeries);
|
displaySets.push(...displaySetsForSeries);
|
||||||
});
|
});
|
||||||
|
|
||||||
return sortDisplaySetList(displaySets);
|
return sortDisplaySetList(displaySets);
|
||||||
@ -321,7 +318,10 @@ export class StudyMetadata extends Metadata {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const displaySets = this._createDisplaySetsForSeries(sopClassHandlerModules, series)
|
const displaySets = this._createDisplaySetsForSeries(
|
||||||
|
sopClassHandlerModules,
|
||||||
|
series
|
||||||
|
);
|
||||||
|
|
||||||
// Note: filtering in place because this._displaySets has writable: false
|
// Note: filtering in place because this._displaySets has writable: false
|
||||||
for (let i = this._displaySets.length - 1; i >= 0; i--) {
|
for (let i = this._displaySets.length - 1; i >= 0; i--) {
|
||||||
@ -835,9 +835,11 @@ function _getDisplaySetFromSopClassModule(
|
|||||||
|
|
||||||
const plugin = handlersForSopClassUID[0];
|
const plugin = handlersForSopClassUID[0];
|
||||||
const headers = DICOMWeb.getAuthorizationHeader();
|
const headers = DICOMWeb.getAuthorizationHeader();
|
||||||
|
const errorInterceptor = errorHandler.getHTTPErrorHandler();
|
||||||
const dicomWebClient = new dwc({
|
const dicomWebClient = new dwc({
|
||||||
url: study.getData().wadoRoot,
|
url: study.getData().wadoRoot,
|
||||||
headers,
|
headers,
|
||||||
|
errorInterceptor,
|
||||||
});
|
});
|
||||||
|
|
||||||
let displaySet = plugin.getDisplaySetFromSeries(
|
let displaySet = plugin.getDisplaySetFromSeries(
|
||||||
|
|||||||
6
platform/core/src/errorHandler.js
Normal file
6
platform/core/src/errorHandler.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
// These should be overridden by the implementation
|
||||||
|
const errorHandler = {
|
||||||
|
getHTTPErrorHandler: () => null,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default errorHandler;
|
||||||
@ -18,6 +18,7 @@ import string from './string.js';
|
|||||||
import studies from './studies/';
|
import studies from './studies/';
|
||||||
import ui from './ui';
|
import ui from './ui';
|
||||||
import user from './user.js';
|
import user from './user.js';
|
||||||
|
import errorHandler from './errorHandler.js';
|
||||||
import utils, { hotkeys } from './utils/';
|
import utils, { hotkeys } from './utils/';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@ -46,6 +47,7 @@ const OHIF = {
|
|||||||
string,
|
string,
|
||||||
ui,
|
ui,
|
||||||
user,
|
user,
|
||||||
|
errorHandler,
|
||||||
object,
|
object,
|
||||||
log,
|
log,
|
||||||
DICOMWeb,
|
DICOMWeb,
|
||||||
@ -79,6 +81,7 @@ export {
|
|||||||
string,
|
string,
|
||||||
ui,
|
ui,
|
||||||
user,
|
user,
|
||||||
|
errorHandler,
|
||||||
object,
|
object,
|
||||||
log,
|
log,
|
||||||
DICOMWeb,
|
DICOMWeb,
|
||||||
|
|||||||
@ -24,6 +24,7 @@ describe('Top level exports', () => {
|
|||||||
'header',
|
'header',
|
||||||
'cornerstone',
|
'cornerstone',
|
||||||
'default', //
|
'default', //
|
||||||
|
'errorHandler',
|
||||||
'string',
|
'string',
|
||||||
'ui',
|
'ui',
|
||||||
'user',
|
'user',
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
import DICOMWeb from '../../../DICOMWeb/';
|
import DICOMWeb from '../../../DICOMWeb/';
|
||||||
import { api } from 'dicomweb-client';
|
import { api } from 'dicomweb-client';
|
||||||
|
|
||||||
|
import errorHandler from '../../../errorHandler';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses data returned from a QIDO search and transforms it into
|
* Parses data returned from a QIDO search and transforms it into
|
||||||
* an array of series that are present in the study
|
* an array of series that are present in the study
|
||||||
@ -79,6 +81,7 @@ export default function Instances(server, StudyInstanceUID) {
|
|||||||
const config = {
|
const config = {
|
||||||
url: server.qidoRoot,
|
url: server.qidoRoot,
|
||||||
headers: DICOMWeb.getAuthorizationHeader(server),
|
headers: DICOMWeb.getAuthorizationHeader(server),
|
||||||
|
errorInterceptor: errorHandler.getHTTPErrorHandler(),
|
||||||
};
|
};
|
||||||
const dicomWeb = new api.DICOMwebClient(config);
|
const dicomWeb = new api.DICOMwebClient(config);
|
||||||
const queryParams = getQIDOQueryParams(
|
const queryParams = getQIDOQueryParams(
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
import { api } from 'dicomweb-client';
|
import { api } from 'dicomweb-client';
|
||||||
import DICOMWeb from '../../../DICOMWeb/';
|
import DICOMWeb from '../../../DICOMWeb/';
|
||||||
|
|
||||||
|
import errorHandler from '../../../errorHandler';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a QIDO date string for a date range query
|
* Creates a QIDO date string for a date range query
|
||||||
* Assumes the year is positive, at most 4 digits long.
|
* Assumes the year is positive, at most 4 digits long.
|
||||||
@ -115,6 +117,7 @@ export default function Studies(server, filter) {
|
|||||||
const config = {
|
const config = {
|
||||||
url: server.qidoRoot,
|
url: server.qidoRoot,
|
||||||
headers: DICOMWeb.getAuthorizationHeader(server),
|
headers: DICOMWeb.getAuthorizationHeader(server),
|
||||||
|
errorInterceptor: errorHandler.getHTTPErrorHandler(),
|
||||||
};
|
};
|
||||||
|
|
||||||
const dicomWeb = new api.DICOMwebClient(config);
|
const dicomWeb = new api.DICOMwebClient(config);
|
||||||
|
|||||||
@ -9,6 +9,8 @@ import {
|
|||||||
addInstancesToStudy,
|
addInstancesToStudy,
|
||||||
} from './studyInstanceHelpers';
|
} from './studyInstanceHelpers';
|
||||||
|
|
||||||
|
import errorHandler from '../../../errorHandler';
|
||||||
|
|
||||||
const { naturalizeDataset } = dcmjs.data.DicomMetaDictionary;
|
const { naturalizeDataset } = dcmjs.data.DicomMetaDictionary;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -73,6 +75,7 @@ export default class RetrieveMetadataLoaderAsync extends RetrieveMetadataLoader
|
|||||||
const client = new api.DICOMwebClient({
|
const client = new api.DICOMwebClient({
|
||||||
url: server.qidoRoot,
|
url: server.qidoRoot,
|
||||||
headers: DICOMWeb.getAuthorizationHeader(server),
|
headers: DICOMWeb.getAuthorizationHeader(server),
|
||||||
|
errorInterceptor: errorHandler.getHTTPErrorHandler(),
|
||||||
});
|
});
|
||||||
|
|
||||||
this.client = client;
|
this.client = client;
|
||||||
@ -117,7 +120,7 @@ export default class RetrieveMetadataLoaderAsync extends RetrieveMetadataLoader
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
seriesInstanceUIDsMap,
|
seriesInstanceUIDsMap,
|
||||||
seriesData
|
seriesData,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -155,11 +158,14 @@ export default class RetrieveMetadataLoaderAsync extends RetrieveMetadataLoader
|
|||||||
SeriesDescription: series.SeriesDescription,
|
SeriesDescription: series.SeriesDescription,
|
||||||
SeriesNumber: series.SeriesNumber,
|
SeriesNumber: series.SeriesNumber,
|
||||||
Modality: series.Modality,
|
Modality: series.Modality,
|
||||||
instances: []
|
instances: [],
|
||||||
};
|
};
|
||||||
|
|
||||||
if (study.series[idx]) {
|
if (study.series[idx]) {
|
||||||
study.series[idx] = Object.assign(seriesDataFromQIDO, study.series[idx]);
|
study.series[idx] = Object.assign(
|
||||||
|
seriesDataFromQIDO,
|
||||||
|
study.series[idx]
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
study.series[idx] = seriesDataFromQIDO;
|
study.series[idx] = seriesDataFromQIDO;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,6 +3,8 @@ import DICOMWeb from '../../../DICOMWeb/';
|
|||||||
import { createStudyFromSOPInstanceList } from './studyInstanceHelpers';
|
import { createStudyFromSOPInstanceList } from './studyInstanceHelpers';
|
||||||
import RetrieveMetadataLoader from './retrieveMetadataLoader';
|
import RetrieveMetadataLoader from './retrieveMetadataLoader';
|
||||||
|
|
||||||
|
import errorHandler from '../../../errorHandler';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class for sync load of study metadata.
|
* Class for sync load of study metadata.
|
||||||
* It inherits from RetrieveMetadataLoader
|
* It inherits from RetrieveMetadataLoader
|
||||||
@ -58,6 +60,7 @@ export default class RetrieveMetadataLoaderSync extends RetrieveMetadataLoader {
|
|||||||
const client = new api.DICOMwebClient({
|
const client = new api.DICOMwebClient({
|
||||||
url: server.wadoRoot,
|
url: server.wadoRoot,
|
||||||
headers: DICOMWeb.getAuthorizationHeader(server),
|
headers: DICOMWeb.getAuthorizationHeader(server),
|
||||||
|
errorInterceptor: errorHandler.getHTTPErrorHandler(),
|
||||||
});
|
});
|
||||||
|
|
||||||
this.client = client;
|
this.client = client;
|
||||||
|
|||||||
@ -3,6 +3,8 @@ 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 errorHandler from '../errorHandler';
|
||||||
|
|
||||||
const getImageId = imageObj => {
|
const getImageId = imageObj => {
|
||||||
if (!imageObj) {
|
if (!imageObj) {
|
||||||
return;
|
return;
|
||||||
@ -57,11 +59,13 @@ const wadorsRetriever = (
|
|||||||
studyInstanceUID,
|
studyInstanceUID,
|
||||||
seriesInstanceUID,
|
seriesInstanceUID,
|
||||||
sopInstanceUID,
|
sopInstanceUID,
|
||||||
headers = DICOMWeb.getAuthorizationHeader()
|
headers = DICOMWeb.getAuthorizationHeader(),
|
||||||
|
errorInterceptor = errorHandler.getHTTPErrorHandler()
|
||||||
) => {
|
) => {
|
||||||
const config = {
|
const config = {
|
||||||
url,
|
url,
|
||||||
headers,
|
headers,
|
||||||
|
errorInterceptor,
|
||||||
};
|
};
|
||||||
const dicomWeb = new api.DICOMwebClient(config);
|
const dicomWeb = new api.DICOMwebClient(config);
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,8 @@ import DICOMWeb from '../../DICOMWeb';
|
|||||||
import str2ab from '../str2ab';
|
import str2ab from '../str2ab';
|
||||||
import unpackOverlay from './unpackOverlay';
|
import unpackOverlay from './unpackOverlay';
|
||||||
|
|
||||||
|
import errorHandler from '../../errorHandler';
|
||||||
|
|
||||||
export default async function fetchOverlayData(instance, server) {
|
export default async function fetchOverlayData(instance, server) {
|
||||||
const OverlayDataPromises = [];
|
const OverlayDataPromises = [];
|
||||||
const OverlayDataTags = [];
|
const OverlayDataTags = [];
|
||||||
@ -21,14 +23,20 @@ export default async function fetchOverlayData(instance, server) {
|
|||||||
const inlineBinaryData = atob(instance[OverlayDataTag].InlineBinary);
|
const inlineBinaryData = atob(instance[OverlayDataTag].InlineBinary);
|
||||||
const arraybuffer = str2ab(inlineBinaryData);
|
const arraybuffer = str2ab(inlineBinaryData);
|
||||||
|
|
||||||
instance[OverlayDataTag] = unpackOverlay(arraybuffer)
|
instance[OverlayDataTag] = unpackOverlay(arraybuffer);
|
||||||
} else if (instance[OverlayDataTag] && instance[OverlayDataTag].BulkDataURI) {
|
} else if (
|
||||||
|
instance[OverlayDataTag] &&
|
||||||
|
instance[OverlayDataTag].BulkDataURI
|
||||||
|
) {
|
||||||
OverlayDataPromises.push(
|
OverlayDataPromises.push(
|
||||||
_getOverlayData(instance[OverlayDataTag], server)
|
_getOverlayData(instance[OverlayDataTag], server)
|
||||||
);
|
);
|
||||||
OverlayDataTags.push(OverlayDataTag);
|
OverlayDataTags.push(OverlayDataTag);
|
||||||
} else if (instance[OverlayDataTag] && instance[OverlayDataTag] instanceof ArrayBuffer) {
|
} else if (
|
||||||
instance[OverlayDataTag] = unpackOverlay(instance[OverlayDataTag])
|
instance[OverlayDataTag] &&
|
||||||
|
instance[OverlayDataTag] instanceof ArrayBuffer
|
||||||
|
) {
|
||||||
|
instance[OverlayDataTag] = unpackOverlay(instance[OverlayDataTag]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,6 +68,7 @@ async function _getOverlayData(tag, server) {
|
|||||||
const config = {
|
const config = {
|
||||||
url: server.wadoRoot, //BulkDataURI is absolute, so this isn't used
|
url: server.wadoRoot, //BulkDataURI is absolute, so this isn't used
|
||||||
headers: DICOMWeb.getAuthorizationHeader(server),
|
headers: DICOMWeb.getAuthorizationHeader(server),
|
||||||
|
errorInterceptor: errorHandler.getHTTPErrorHandler(),
|
||||||
};
|
};
|
||||||
const dicomWeb = new api.DICOMwebClient(config);
|
const dicomWeb = new api.DICOMwebClient(config);
|
||||||
const options = {
|
const options = {
|
||||||
@ -71,5 +80,3 @@ async function _getOverlayData(tag, server) {
|
|||||||
.then(result => result[0])
|
.then(result => result[0])
|
||||||
.then(unpackOverlay);
|
.then(unpackOverlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -2,6 +2,8 @@ import { api } from 'dicomweb-client';
|
|||||||
import DICOMWeb from '../../DICOMWeb';
|
import DICOMWeb from '../../DICOMWeb';
|
||||||
import str2ab from '../str2ab';
|
import str2ab from '../str2ab';
|
||||||
|
|
||||||
|
import errorHandler from '../../errorHandler';
|
||||||
|
|
||||||
export default async function fetchPaletteColorLookupTableData(
|
export default async function fetchPaletteColorLookupTableData(
|
||||||
instance,
|
instance,
|
||||||
server
|
server
|
||||||
@ -146,6 +148,7 @@ function _getPaletteColor(server, paletteColorLookupTableData, lutDescriptor) {
|
|||||||
const config = {
|
const config = {
|
||||||
url: server.wadoRoot, //BulkDataURI is absolute, so this isn't used
|
url: server.wadoRoot, //BulkDataURI is absolute, so this isn't used
|
||||||
headers: DICOMWeb.getAuthorizationHeader(server),
|
headers: DICOMWeb.getAuthorizationHeader(server),
|
||||||
|
errorInterceptor: errorHandler.getHTTPErrorHandler(),
|
||||||
};
|
};
|
||||||
const dicomWeb = new api.DICOMwebClient(config);
|
const dicomWeb = new api.DICOMwebClient(config);
|
||||||
const options = {
|
const options = {
|
||||||
@ -164,6 +167,8 @@ function _getPaletteColor(server, paletteColorLookupTableData, lutDescriptor) {
|
|||||||
resolve(arrayBufferToPaletteColorLUT(arraybuffer));
|
resolve(arrayBufferToPaletteColorLUT(arraybuffer));
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
return Promise.resolve(arrayBufferToPaletteColorLUT(paletteColorLookupTableData));
|
return Promise.resolve(
|
||||||
|
arrayBufferToPaletteColorLUT(paletteColorLookupTableData)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -66,7 +66,7 @@
|
|||||||
"cornerstone-core": "^2.2.8",
|
"cornerstone-core": "^2.2.8",
|
||||||
"cornerstone-math": "^0.1.8",
|
"cornerstone-math": "^0.1.8",
|
||||||
"cornerstone-tools": "4.12.5",
|
"cornerstone-tools": "4.12.5",
|
||||||
"cornerstone-wado-image-loader": "^3.0.0",
|
"cornerstone-wado-image-loader": "^3.1.0",
|
||||||
"dcmjs": "^0.12.0",
|
"dcmjs": "^0.12.0",
|
||||||
"dicom-parser": "^1.8.3",
|
"dicom-parser": "^1.8.3",
|
||||||
"dicomweb-client": "^0.4.4",
|
"dicomweb-client": "^0.4.4",
|
||||||
|
|||||||
19
platform/viewer/public/config/idc.js
Normal file
19
platform/viewer/public/config/idc.js
Normal file
@ -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',
|
||||||
|
};
|
||||||
|
};
|
||||||
@ -31,7 +31,8 @@ import {
|
|||||||
import i18n from '@ohif/i18n';
|
import i18n from '@ohif/i18n';
|
||||||
|
|
||||||
// TODO: This should not be here
|
// TODO: This should not be here
|
||||||
import './config';
|
//import './config';
|
||||||
|
import { setConfiguration } from './config';
|
||||||
|
|
||||||
/** Utils */
|
/** Utils */
|
||||||
import {
|
import {
|
||||||
@ -123,6 +124,8 @@ class App extends Component {
|
|||||||
oidc,
|
oidc,
|
||||||
} = this._appConfig;
|
} = this._appConfig;
|
||||||
|
|
||||||
|
setConfiguration(this._appConfig);
|
||||||
|
|
||||||
this.initUserManager(oidc);
|
this.initUserManager(oidc);
|
||||||
_initServices([
|
_initServices([
|
||||||
UINotificationService,
|
UINotificationService,
|
||||||
|
|||||||
@ -3,43 +3,59 @@ import cornerstone from 'cornerstone-core';
|
|||||||
import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader';
|
import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader';
|
||||||
import dicomParser from 'dicom-parser';
|
import dicomParser from 'dicom-parser';
|
||||||
import version from './version.js';
|
import version from './version.js';
|
||||||
|
import AppContext from './context/AppContext';
|
||||||
|
|
||||||
let homepage;
|
export function setConfiguration(appConfig) {
|
||||||
const { process } = window;
|
let homepage;
|
||||||
if (process && process.env && process.env.PUBLIC_URL) {
|
const { process } = window;
|
||||||
homepage = process.env.PUBLIC_URL;
|
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return state.oidc.user.access_token;
|
window.info = {
|
||||||
};
|
version,
|
||||||
|
homepage,
|
||||||
|
};
|
||||||
|
|
||||||
cornerstoneWADOImageLoader.configure({
|
// For debugging
|
||||||
beforeSend: function(xhr) {
|
//if (process.env.node_env === 'development') {
|
||||||
const headers = OHIF.DICOMWeb.getAuthorizationHeader();
|
window.cornerstone = cornerstone;
|
||||||
|
window.cornerstoneWADOImageLoader = cornerstoneWADOImageLoader;
|
||||||
|
//}
|
||||||
|
|
||||||
if (headers.Authorization) {
|
cornerstoneWADOImageLoader.external.cornerstone = cornerstone;
|
||||||
xhr.setRequestHeader('Authorization', headers.Authorization);
|
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);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import { httpErrorToStr, checkDicomFile } from '../utils/helpers';
|
import { httpErrorToStr, checkDicomFile } from '../utils/helpers';
|
||||||
import { api } from 'dicomweb-client';
|
import { api } from 'dicomweb-client';
|
||||||
|
import { errorHandler } from '@ohif/core';
|
||||||
|
|
||||||
class DicomUploadService {
|
class DicomUploadService {
|
||||||
async smartUpload(files, url, uploadCallback, cancellationToken) {
|
async smartUpload(files, url, uploadCallback, cancellationToken) {
|
||||||
@ -22,8 +23,7 @@ class DicomUploadService {
|
|||||||
let error = null;
|
let error = null;
|
||||||
try {
|
try {
|
||||||
if (chunk.length > 1) throw new Error('Not implemented');
|
if (chunk.length > 1) throw new Error('Not implemented');
|
||||||
if (chunk.length === 1)
|
if (chunk.length === 1) await this.simpleUpload(chunk[0], url);
|
||||||
await this.simpleUpload(chunk[0], url);
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// It looks like a stupid bug of Babel that err is not an actual Exception object
|
// It looks like a stupid bug of Babel that err is not an actual Exception object
|
||||||
error = httpErrorToStr(err);
|
error = httpErrorToStr(err);
|
||||||
@ -76,11 +76,12 @@ class DicomUploadService {
|
|||||||
|
|
||||||
getClient(url) {
|
getClient(url) {
|
||||||
const headers = this.retrieveAuthHeaderFunc();
|
const headers = this.retrieveAuthHeaderFunc();
|
||||||
|
const errorInterceptor = errorHandler.getHTTPErrorHandler();
|
||||||
|
|
||||||
// TODO: a bit weird we are creating a new dicomweb client instance for every upload
|
// TODO: a bit weird we are creating a new dicomweb client instance for every upload
|
||||||
return new api.DICOMwebClient({
|
return new api.DICOMwebClient({
|
||||||
url,
|
url,
|
||||||
headers
|
headers,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
49
yarn.lock
49
yarn.lock
@ -1247,13 +1247,34 @@
|
|||||||
pirates "^4.0.0"
|
pirates "^4.0.0"
|
||||||
source-map-support "^0.5.9"
|
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"
|
version "7.5.5"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132"
|
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132"
|
||||||
integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==
|
integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
regenerator-runtime "^0.13.2"
|
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":
|
"@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"
|
version "7.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6"
|
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"
|
"@babel/runtime" "7.1.2"
|
||||||
cornerstone-math "0.1.7"
|
cornerstone-math "0.1.7"
|
||||||
|
|
||||||
cornerstone-wado-image-loader@^3.0.0:
|
cornerstone-wado-image-loader@^3.1.0:
|
||||||
version "3.0.6"
|
version "3.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/cornerstone-wado-image-loader/-/cornerstone-wado-image-loader-3.0.6.tgz#7b2be91f8f658de3a7474e029aa8314a35725132"
|
resolved "https://registry.yarnpkg.com/cornerstone-wado-image-loader/-/cornerstone-wado-image-loader-3.1.0.tgz#6007470be896678636da3188f194f5e66ed07858"
|
||||||
integrity sha512-1luWOh1GzkboZ3uxfu4T8vh7K9nlDiiEbQ4dYIY9oobRZVZQbQiLT8wEZPbb4JTUe7UWJISHPCNgtAU8UE9DNw==
|
integrity sha512-n2yadbwK7rCHqJyh5AUmYVPUY5m7boKpheK60sXV41Z0eSZLin9Ja+P9yeAvkg0VGV+/zaBZGPUGY3YyjdWBgg==
|
||||||
dependencies:
|
dependencies:
|
||||||
dicom-parser "^1.8.3"
|
dicom-parser "^1.8.3"
|
||||||
pako "^1.0.10"
|
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"
|
resolved "https://registry.yarnpkg.com/dicomweb-client/-/dicomweb-client-0.5.2.tgz#aa5a4a6a5044b0702bb0a8a2662c86cd16901951"
|
||||||
integrity sha512-e11n2+g7HfBuMyopWq76W11eSZJ707g4U1XiO8URA+23aoe0g1kGAtlPB29NKXl7zX7RznTJ7wfRBxFkW6EJDA==
|
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:
|
diff-sequences@^24.9.0:
|
||||||
version "24.9.0"
|
version "24.9.0"
|
||||||
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5"
|
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"
|
set-immediate-shim "~1.0.1"
|
||||||
|
|
||||||
jszip@^3.2.2:
|
jszip@^3.2.2:
|
||||||
version "3.3.0"
|
version "3.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.3.0.tgz#29d72c21a54990fa885b11fc843db320640d5271"
|
resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.4.0.tgz#1a69421fa5f0bb9bc222a46bca88182fba075350"
|
||||||
integrity sha512-EJ9k766htB1ZWnsV5ZMDkKLgA+201r/ouFF8R2OigVjVdcm2rurcBrrdXaeqBJbqnUVMko512PYmlncBKE1Huw==
|
integrity sha512-gZAOYuPl4EhPTXT0GjhI3o+ZAz3su6EhLrKUoAivcKqyqC7laS5JEv4XWZND9BgcDcF83vI85yGbDmDR6UhrIg==
|
||||||
dependencies:
|
dependencies:
|
||||||
lie "~3.3.0"
|
lie "~3.3.0"
|
||||||
pako "~1.0.2"
|
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"
|
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
|
||||||
integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
|
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"
|
version "0.13.5"
|
||||||
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697"
|
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697"
|
||||||
integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==
|
integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user