(function(){ var scs = document.getElementsByTagName("script"); var url = scs[scs.length-1].getAttribute("src"); scs = null; (function (root) { if (typeof exports === "object") { // Node, CommonJS-like module.exports = Remote; } else { // Browser globals (root is window) root.remote = Remote; } }(this)); function Remote(config){ if (typeof config === "string") { return fetchConfig(config).then(function(cfg){ return cfg.json(); }).then(function(cfg){ return Remote(cfg).active; }); } var master = { version: config.version }; var url = config.url; var csrf = config.key; var queue = []; var seed = 1; var socket = null; var key; master.data = {}; for (key in config.data) master.data[key] = config.data[key]; master.api = {}; for (key in config.api){ var obj = {}; var cfg = config.api[key]; for (var method in cfg) obj[method] = wrapper(key+"."+method); master.api[key] = obj; } const connectSocket = function(){ return new Promise(function(res){ const sbs = {}; const and = config.websocket.indexOf("?")!=-1?"&":"?"; socket = new WebSocket(config.websocket+and+"key="+csrf); socket.onclose = function(){ setTimeout(connectSocket, 2000); }; socket.onmessage = function (ev) { const pack = JSON.parse(ev.data); if (pack.action === "result") parseData(pack.data, []); else if (pack.action === "event") triggerEvent(pack.data); else if (pack.action == "active") res(master); else { if (master.onerror) master.onerror(pack.data || "WebSocket error"); } }; function triggerEvent(data){ const all = sbs[data.name]; if (all){ for (var i=0; i a.id != pack.id); if (!all.lenght){ delete sbs[pack.id]; socket.send(JSON.stringify({ action:"unsubscribe", name })); } }; master.on = { attachEvent : master.attachEvent, detachEvent:master.detachEvent }; }); }; if (config.websocket && window.WebSocket){ master.reset = function(){ if (socket){ socket.onclose = function(){}; socket.close(); } return master.active = connectSocket(); }; master.reset(); } else { master.active = Promise.resolve(master); } function uid(){ return (seed++).toString(); } function wrapper(key){ return function(){ var args = [].slice.call(arguments); const result = new Promise(function(resolve, reject){ queue.push({ data:{ id:uid(), name:key, args: args }, status:"new", resolve:resolve, reject:reject }); setTimeout(send, 1); }); if (master.oncall){ master.oncall(result, key); } return result; }; } function send(){ var pack = queue.filter(function(obj){ return obj.status === "new"; }).map(function(obj){ obj.status = "wait"; return obj.data; }); if (!pack.length) return; if (socket){ return socket.send(JSON.stringify({ action:"remote", body:pack })); } var headers = { "Accept": "application/json", "Content-Type": "application/json", "Remote-CSRF": csrf }; var data = window.fetch ? fetch(url, { method: "POST", credentials: "include", headers:headers, body:JSON.stringify(pack) }) : webix.ajax().headers(headers).post(url, JSON.stringify(pack)).then(function(obj){ parseData(obj.json(), pack); }); data["catch"](function(){ return false; }).then(function(res){ if (res && res.ok){ res.json().then(function(data){ parseData(data, pack); }); } else { parseData(false, pack); } }); if (master.onload){ master.onload(data); } } function fetchConfig(url){ var headers = { "Accept": "application/json" }; return window.fetch ? fetch(url, { credentials: "include", headers:headers}) : webix.ajax().headers(headers).get(url); } function parseData(data, pack){ var all = {}; var i; if (!data){ for (i=0; i=0; i--){ var test = queue[i]; var check = all[test.data.id]; if (check){ if (check.error){ test.reject(check.error); if (master.onerror) master.onerror(check.error); } else test.resolve(check.data); queue.splice(i, 1); } } } return master; } var config = {"api":{"unit":{"changeStatus":1,"assignOwner":1,"getAll":1,"getOne":1,"addBatch":1,"updateBatch":1,"deleteBatch":1,"getFullInfo":1,"getByTag":1,"genSerial":1},"person":{"getAll":1,"getOne":1,"getFullInfo":1,"refresh":1},"unittype":{"save":1,"getAll":1,"getOne":1,"add":1},"report":{"newOnes":1,"statusOnes":1,"byTime":1,"getHorders":1,"getLostUnits":1,"getOwnedBroken":1,"getMixedOwned":1,"getArchivedSubtypes":1,"getArchivedUnits":1},"tag":{"save":1,"getAll":1,"getOne":1},"user":{"save":1,"getOne":1,"getAll":1,"restore":1,"updateSettings":1,"getUserNames":1},"role":{"save":1,"getAll":1,"getOne":1,"getRights":1},"auth":{"restore":1,"getUserNames":1,"updateSettings":1}},"data":{"version":1,"rights":{"EditUsers":1,"EditTypes":2,"EditData":3},"graceTime":{"delete":2880},"user":{"id":1,"name":"Owner","email":"max@xbsoftware.com","rights":[2,3]}},"key":"1c1393becb84b08e","websocket":"wss://inventory.demos.webix.com/api/v1","version":"2"}; config.url = config.url || url; window.remote = Remote(config); }).call({});