"use strict"; import {Utils} from "../Utils/Utils.ecma.js"; import {Check} from "../Utils/Check.ecma.js"; /** * @typedef {import("../Application/AnP.ecma.js").AnP} AnP */ /** * @callback anp_url_path_driver_default_callback * @returns {void} */ /** * @callback anp_url_path_driver_callback * @param {?string} response * @param {!number} status * @param {!number} state * @param {!boolean} ok * @param {!string} message * @returns {void} */ /** * @callback anp_url_path_driver_ajax_end_callback * @param {!string} message * @returns {void} */ /** * @callback anp_url_path_driver_load_json_each_callback * @param {?any} item * @param {!anp_url_path_driver_default_callback} calback * @returns {void} */ /** * @class * @constructor * @param {!AnP} anp * @returns {void} * @access public */ export const URLPathDriver = (function(){ /** * @constructs URLPathDriver * @param {!AnP} anp * @returns {void} * @access private */ const URLPathDriver = function(anp){ /** @type {URLPathDriver} */ const self = this; /** @type {boolean} */ let started = false, /** @type {boolean} */ default_timeout = false; /** * @returns {void} * @access public */ this.set_basics = () => { default_timeout = anp.settings.get(["ajax_timeout", "timeout"], null, default_timeout); }; /** * @returns {void} * @access private */ const constructor = () => { self.set_basics(); }; /** * @param {?anp_start_callback} callback * @returns {boolean} * @access public */ this.start = (callback = null) => { /** @type {!anp_start_callback} */ const end = ok => { Utils.execute(callback, ok); return ok; }; return end(started ? false : started = true); }; /** * @param {!XMLHttpRequest} ajax * @param {!anp_url_path_driver_callback} callback * @param {?(Object.|Array.)} inputs * @param {?(string|Object.|Array.)} [data = null] * @returns {XMLHttpRequest} * @access private */ const execute = (ajax, callback, inputs, data = null) => { let ended = false; const date = Date.now(), timeout = Utils.get_value(["ajax_timeout", "timeout"], inputs, default_timeout), end = message => { !ended && (ended = true) && Utils.execute( callback, ajax.responseText, ajax.status, ajax.readyState, message == "OK", message ); }; ajax.timeout = timeout; ajax.onreadystatechange = () => { if(ended) return; if(ajax.readyState == 4) end((ajax.status >= 200 && ajax.status < 300) || [301, 302, 304].includes(ajax.status) ? "OK" : "HTTP_ERROR"); else if(timeout && Date.now() - date > timeout) end("FORCED_TIMEOUT"); }; ajax.onabort = () => end("ABORTED"); ajax.onerror = () => end("ERROR"); ajax.ontimeout = () => end("TIMEOUT"); ajax.send(data); return ajax; }; /** * @param {!string} url * @param {!anp_url_path_driver_callback} callback * @param {?(object.|Array.)} [inputs = null] * @returns {XMLHttpRequest} * @access public */ this.get = (url, callback = null, inputs = null) => { /** @type {XMLHttpRequest} */ const ajax = new XMLHttpRequest(); ajax.open("get", url, true); return execute(ajax, callback, inputs); }; /** * @param {!(string|Object.|Array.)} inputs * @param {!anp_url_path_driver_default_callback} each_callback * @param {?anp_url_path_driver_default_callback} [end_callback = null] * @param {!boolean} [only_dictionaries = true] * @returns {void} * @access public */ this.load_json = (inputs, each_callback, end_callback = null, only_dictionaries = true) => { if(Check.is_string(inputs)){ /** @type {Object.|Array.|null} */ let json; try{ json = JSON.parse(inputs); }catch(exception){}; if(json) self.load_json(json, each_callback, end_callback, only_dictionaries); else self.get(inputs, (response, status, state, ok, message) => { try{ json = JSON.parse(response); }catch(exception){}; self.load_json(json, each_callback, end_callback, only_dictionaries); }); }else if(Check.is_array(inputs)){ if(only_dictionaries) Utils.execute_items(inputs, (item, callback) => { self.load_json(item, each_callback, callback, only_dictionaries); }, end_callback); else Utils.execute(each_callback, inputs, end_callback); }else if(Check.is_dictionary(inputs)) Utils.execute(each_callback, inputs, end_callback); else Utils.execute(end_callback); }; constructor(); }; return URLPathDriver; })();