(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 silent = false; 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.length){ delete sbs[pack.name]; socket.send(JSON.stringify({ action:"unsubscribe", name: pack.name })); } }; master.silent = function(code){ var temp = silent; silent = true; code(); silent = temp; }; 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); var now = silent || socket; var pack = null; const result = new Promise(function(resolve, reject){ pack = { data:{ id:uid(), name:key, args: args }, status:"new", resolve:resolve, reject:reject }; queue.push(pack); }); if (!silent && master.oncall) master.oncall(result, key); if (now) send(pack); else setTimeout(send, 1); return result; }; } function send(pack){ pack = pack ? [pack] : queue.filter(function(obj){ return obj.status === "new"; }) pack = pack.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 (!silent && 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":{"view":{"getAll":1,"getOne":1,"copy":1,"save":1},"project":{"getAll":1,"getOne":1,"copy":1,"save":1,"getShares":1,"saveShares":1,"getStyles":1,"saveStyles":1},"data":{"getAll":1,"save":1,"getDefault":1},"user":{"restore":1,"update":1},"room":{"join":1,"leave":1,"visitors":1}},"data":{"user":null,"rights":{"AdminApp":1,"AdminUsers":2,"ManageFragments":3},"version":1},"key":"14e1958b3b8a7f5f","websocket":"wss://designer.webix.com/api/v1","version":"2"}; config.url = config.url || url; window.remote = Remote(config); }).call({});