AnPv2/Public/ecma/Drivers/FilesDriver.ecma.js

155 lines
4.2 KiB
JavaScript

"use strict";
/**
* @typedef {import("../Application/AnP.ecma.js").AnP} AnP
*/
/**
* @class FilesDriver
* @constructor
* @param {!AnP} anp
* @returns {void}
* @access public
* @static
*/
export const FilesDriver = (function(){
/**
* @callback files_driver_start_callback
* @param {!boolean} ok
* @returns {boolean}
*/
/**
* @constructs FilesDriver
* @param {!AnP} anp
* @returns {void}
* @access private
* @static
*/
const FilesDriver = function(anp){
/** @type {FilesDriver} */
const self = this;
/** @type {boolean} */
let started = false,
/** @type {boolean} */
closed = false,
/** @type {string} */
default_http_method = "GET",
/** @type {boolean} */
default_http_asynchronous = true,
/** @type {number} */
default_timeout = 2000;
/**
* @returns {void}
* @access private
*/
const constructor = () => {
self.update();
};
/**
* @param {?files_driver_start_callback} [callback = null]
* @returns {boolean}
* @access public
*/
this.update = (callback = null) => {
default_http_method = anp.settings.get([
"http_method", "default_http_method"
], null, default_http_method);
default_http_asynchronous = anp.settings.get([
"http_asynchronous", "default_http_asynchronous"
], null, default_http_asynchronous);
default_timeout = anp.settings.get([
"timeout", "default_timeout"
], null, default_timeout);
Common.execute(callback);
return true;
};
/**
* @param {?files_driver_start_callback} [callback = null]
* @returns {boolean}
* @access public
*/
this.start = (callback = null) => {
if(started){
return false;
};
started = true;
self.update(callback);
return true;
};
this.load = (path, callback = null, inputs = null) => {
/** @type {boolean} */
let ended = false,
/** @type {number} */
error = 0;
/** @type {XMLHttpRequest} */
const ajax = new XMLHttpRequest(),
/** @type {number} */
timeout = Common.get_value([
"timeout", "ajax_timeout", "default_timeout"
], inputs, default_timeout),
/** @type {number} */
date = Date.now(),
end = code => {
code && (error |= 1 << code);
!ended && (ended = true) &&
Common.execute(
callback,
ajax.responseText,
ajax.status,
ajax.readyState,
error,
error === 0
);
};
ajax.open(
Common.get_value([
"method", "http_method", "default_http_method"
], inputs, default_http_method),
path,
Common.get_value([
"asynchronous", "http_asynchronous", "default_http_asynchronous"
], inputs, default_http_asynchronous)
);
ajax.timeout = timeout;
ajax.onreadystatechange = function(){
if(ended)
return;
if(ajax.readyState === 4)
end((
ajax.status >= 200 && ajax.status < 300
) || [301, 302, 304].includes(ajax.status) ? 0 : 1);
else if(Date.now() - date >= timeout)
end(2);
};
ajax.send(null);
ajax.onerror = () => {end(3);}
ajax.onabort = () => {end(4);}
ajax.ontimeout = () => {end(5);}
return ajax;
};
constructor();
};
return FilesDriver;
})();