import defaultValue from "./defaultValue.js"; import defined from "./defined.js"; import RequestState from "./RequestState.js"; import RequestType from "./RequestType.js"; /** * Stores information for making a request. In general this does not need to be constructed directly. * * @alias Request * @constructor * @param {object} [options] An object with the following properties: * @param {string} [options.url] The url to request. * @param {Request.RequestCallback} [options.requestFunction] The function that makes the actual data request. * @param {Request.CancelCallback} [options.cancelFunction] The function that is called when the request is cancelled. * @param {Request.PriorityCallback} [options.priorityFunction] The function that is called to update the request's priority, which occurs once per frame. * @param {number} [options.priority=0.0] The initial priority of the request. * @param {boolean} [options.throttle=false] Whether to throttle and prioritize the request. If false, the request will be sent immediately. If true, the request will be throttled and sent based on priority. * @param {boolean} [options.throttleByServer=false] Whether to throttle the request by server. * @param {RequestType} [options.type=RequestType.OTHER] The type of request. * @param {string} [options.serverKey] A key used to identify the server that a request is going to. */ function Request(options) { options = defaultValue(options, defaultValue.EMPTY_OBJECT); const throttleByServer = defaultValue(options.throttleByServer, false); const throttle = defaultValue(options.throttle, false); /** * The URL to request. * * @type {string} */ this.url = options.url; /** * The function that makes the actual data request. * * @type {Request.RequestCallback} */ this.requestFunction = options.requestFunction; /** * The function that is called when the request is cancelled. * * @type {Request.CancelCallback} */ this.cancelFunction = options.cancelFunction; /** * The function that is called to update the request's priority, which occurs once per frame. * * @type {Request.PriorityCallback} */ this.priorityFunction = options.priorityFunction; /** * Priority is a unit-less value where lower values represent higher priority. * For world-based objects, this is usually the distance from the camera. * A request that does not have a priority function defaults to a priority of 0. * * If priorityFunction is defined, this value is updated every frame with the result of that call. * * @type {number} * @default 0.0 */ this.priority = defaultValue(options.priority, 0.0); /** * Whether to throttle and prioritize the request. If false, the request will be sent immediately. If true, the * request will be throttled and sent based on priority. * * @type {boolean} * @readonly * * @default false */ this.throttle = throttle; /** * Whether to throttle the request by server. Browsers typically support about 6-8 parallel connections * for HTTP/1 servers, and an unlimited amount of connections for HTTP/2 servers. Setting this value * to true is preferable for requests going through HTTP/1 servers. * * @type {boolean} * @readonly * * @default false */ this.throttleByServer = throttleByServer; /** * Type of request. * * @type {RequestType} * @readonly * * @default RequestType.OTHER */ this.type = defaultValue(options.type, RequestType.OTHER); /** * A key used to identify the server that a request is going to. It is derived from the url's authority and scheme. * * @type {string} * * @private */ this.serverKey = options.serverKey; /** * The current state of the request. * * @type {RequestState} * @readonly */ this.state = RequestState.UNISSUED; /** * The requests's deferred promise. * * @type {object} * * @private */ this.deferred = undefined; /** * Whether the request was explicitly cancelled. * * @type {boolean} * * @private */ this.cancelled = false; } /** * Mark the request as cancelled. * * @private */ Request.prototype.cancel = function () { this.cancelled = true; }; /** * Duplicates a Request instance. * * @param {Request} [result] The object onto which to store the result. * * @returns {Request} The modified result parameter or a new Resource instance if one was not provided. */ Request.prototype.clone = function (result) { if (!defined(result)) { return new Request(this); } result.url = this.url; result.requestFunction = this.requestFunction; result.cancelFunction = this.cancelFunction; result.priorityFunction = this.priorityFunction; result.priority = this.priority; result.throttle = this.throttle; result.throttleByServer = this.throttleByServer; result.type = this.type; result.serverKey = this.serverKey; // These get defaulted because the cloned request hasn't been issued result.state = RequestState.UNISSUED; result.deferred = undefined; result.cancelled = false; return result; }; /** * The function that makes the actual data request. * @callback Request.RequestCallback * @returns {Promise} A promise for the requested data. */ /** * The function that is called when the request is cancelled. * @callback Request.CancelCallback */ /** * The function that is called to update the request's priority, which occurs once per frame. * @callback Request.PriorityCallback * @returns {number} The updated priority value. */ export default Request;