You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
181 lines
5.8 KiB
JavaScript
181 lines
5.8 KiB
JavaScript
import defaultValue from "./defaultValue.js";
|
|
import defined from "./defined.js";
|
|
import formatError from "./formatError.js";
|
|
|
|
/**
|
|
* Provides details about an error that occurred in an {@link ImageryProvider} or a {@link TerrainProvider}.
|
|
*
|
|
* @alias TileProviderError
|
|
* @constructor
|
|
*
|
|
* @param {ImageryProvider|TerrainProvider} provider The imagery or terrain provider that experienced the error.
|
|
* @param {String} message A message describing the error.
|
|
* @param {Number} [x] The X coordinate of the tile that experienced the error, or undefined if the error
|
|
* is not specific to a particular tile.
|
|
* @param {Number} [y] The Y coordinate of the tile that experienced the error, or undefined if the error
|
|
* is not specific to a particular tile.
|
|
* @param {Number} [level] The level of the tile that experienced the error, or undefined if the error
|
|
* is not specific to a particular tile.
|
|
* @param {Number} [timesRetried=0] The number of times this operation has been retried.
|
|
* @param {Error} [error] The error or exception that occurred, if any.
|
|
*/
|
|
function TileProviderError(
|
|
provider,
|
|
message,
|
|
x,
|
|
y,
|
|
level,
|
|
timesRetried,
|
|
error
|
|
) {
|
|
/**
|
|
* The {@link ImageryProvider} or {@link TerrainProvider} that experienced the error.
|
|
* @type {ImageryProvider|TerrainProvider}
|
|
*/
|
|
this.provider = provider;
|
|
|
|
/**
|
|
* The message describing the error.
|
|
* @type {String}
|
|
*/
|
|
this.message = message;
|
|
|
|
/**
|
|
* The X coordinate of the tile that experienced the error. If the error is not specific
|
|
* to a particular tile, this property will be undefined.
|
|
* @type {Number}
|
|
*/
|
|
this.x = x;
|
|
|
|
/**
|
|
* The Y coordinate of the tile that experienced the error. If the error is not specific
|
|
* to a particular tile, this property will be undefined.
|
|
* @type {Number}
|
|
*/
|
|
this.y = y;
|
|
|
|
/**
|
|
* The level-of-detail of the tile that experienced the error. If the error is not specific
|
|
* to a particular tile, this property will be undefined.
|
|
* @type {Number}
|
|
*/
|
|
this.level = level;
|
|
|
|
/**
|
|
* The number of times this operation has been retried.
|
|
* @type {Number}
|
|
* @default 0
|
|
*/
|
|
this.timesRetried = defaultValue(timesRetried, 0);
|
|
|
|
/**
|
|
* True if the failed operation should be retried; otherwise, false. The imagery or terrain provider
|
|
* will set the initial value of this property before raising the event, but any listeners
|
|
* can change it. The value after the last listener is invoked will be acted upon.
|
|
* @type {Boolean}
|
|
* @default false
|
|
*/
|
|
this.retry = false;
|
|
|
|
/**
|
|
* The error or exception that occurred, if any.
|
|
* @type {Error}
|
|
*/
|
|
this.error = error;
|
|
}
|
|
|
|
/**
|
|
* Handles an error in an {@link ImageryProvider} or {@link TerrainProvider} by raising an event if it has any listeners, or by
|
|
* logging the error to the console if the event has no listeners. This method also tracks the number
|
|
* of times the operation has been retried and will automatically retry if requested to do so by the
|
|
* event listeners.
|
|
*
|
|
* @param {TileProviderError} previousError The error instance returned by this function the last
|
|
* time it was called for this error, or undefined if this is the first time this error has
|
|
* occurred.
|
|
* @param {ImageryProvider|TerrainProvider} provider The imagery or terrain provider that encountered the error.
|
|
* @param {Event} event The event to raise to inform listeners of the error.
|
|
* @param {String} message The message describing the error.
|
|
* @param {Number} x The X coordinate of the tile that experienced the error, or undefined if the
|
|
* error is not specific to a particular tile.
|
|
* @param {Number} y The Y coordinate of the tile that experienced the error, or undefined if the
|
|
* error is not specific to a particular tile.
|
|
* @param {Number} level The level-of-detail of the tile that experienced the error, or undefined if the
|
|
* error is not specific to a particular tile.
|
|
* @param {TileProviderError.RetryFunction} retryFunction The function to call to retry the operation. If undefined, the
|
|
* operation will not be retried.
|
|
* @param {Error} [errorDetails] The error or exception that occurred, if any.
|
|
* @returns {TileProviderError} The error instance that was passed to the event listeners and that
|
|
* should be passed to this function the next time it is called for the same error in order
|
|
* to track retry counts.
|
|
*/
|
|
TileProviderError.handleError = function (
|
|
previousError,
|
|
provider,
|
|
event,
|
|
message,
|
|
x,
|
|
y,
|
|
level,
|
|
retryFunction,
|
|
errorDetails
|
|
) {
|
|
var error = previousError;
|
|
if (!defined(previousError)) {
|
|
error = new TileProviderError(
|
|
provider,
|
|
message,
|
|
x,
|
|
y,
|
|
level,
|
|
0,
|
|
errorDetails
|
|
);
|
|
} else {
|
|
error.provider = provider;
|
|
error.message = message;
|
|
error.x = x;
|
|
error.y = y;
|
|
error.level = level;
|
|
error.retry = false;
|
|
error.error = errorDetails;
|
|
++error.timesRetried;
|
|
}
|
|
|
|
if (event.numberOfListeners > 0) {
|
|
event.raiseEvent(error);
|
|
} else {
|
|
console.log(
|
|
'An error occurred in "' +
|
|
provider.constructor.name +
|
|
'": ' +
|
|
formatError(message)
|
|
);
|
|
}
|
|
|
|
if (error.retry && defined(retryFunction)) {
|
|
retryFunction();
|
|
}
|
|
|
|
return error;
|
|
};
|
|
|
|
/**
|
|
* Handles success of an operation by resetting the retry count of a previous error, if any. This way,
|
|
* if the error occurs again in the future, the listeners will be informed that it has not yet been retried.
|
|
*
|
|
* @param {TileProviderError} previousError The previous error, or undefined if this operation has
|
|
* not previously resulted in an error.
|
|
*/
|
|
TileProviderError.handleSuccess = function (previousError) {
|
|
if (defined(previousError)) {
|
|
previousError.timesRetried = -1;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* A function that will be called to retry the operation.
|
|
* @callback TileProviderError.RetryFunction
|
|
*/
|
|
export default TileProviderError;
|