var API = (function() { function _api() { var api = this; var Sha256={hash:function(t){t=t.utf8Encode();for(var r=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],o=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],n=(t+=String.fromCharCode(128)).length/4+2,e=Math.ceil(n/16),a=new Array(e),h=0;h>>t|r<<32-t},"Σ0":function(t){return Sha256.ROTR(2,t)^Sha256.ROTR(13,t)^Sha256.ROTR(22,t)},"Σ1":function(t){return Sha256.ROTR(6,t)^Sha256.ROTR(11,t)^Sha256.ROTR(25,t)},"σ0":function(t){return Sha256.ROTR(7,t)^Sha256.ROTR(18,t)^t>>>3},"σ1":function(t){return Sha256.ROTR(17,t)^Sha256.ROTR(19,t)^t>>>10},Ch:function(t,r,o){return t&r^~t&o},Maj:function(t,r,o){return t&r^t&o^r&o},toHexStr:function(t){for(var r="",o=7;0<=o;o--)r+=(t>>>4*o&15).toString(16);return r}};void 0===String.prototype.utf8Encode&&(String.prototype.utf8Encode=function(){return unescape(encodeURIComponent(this))}),void 0===String.prototype.utf8Decode&&(String.prototype.utf8Decode=function(){try{return decodeURIComponent(escape(this))}catch(t){return this}}); _api.prototype.hash = function(str) { return Sha256 && Sha256.hash(str); }; _api.prototype.createTime = function(difficult) { if(difficult) { var current_date = (new Date()).valueOf().toString(); var random = Math.random().toString(); return api.hash(current_date + random); } return Date.now() + 3000; } _api.prototype.getDeviceId = function() { var device = api.getItem('device'); if(!device) { device = api.createTime(true); api.setItem('device', device); } return device; }; _api.prototype.getItem = function(key) { return (localStorage && localStorage.getItem && localStorage.getItem(key)) || ''; }; _api.prototype.setItem = function(key, value) { localStorage && localStorage.setItem && localStorage.setItem(key, value); }; this.requests = []; this.RESULT_PARAM_NAME = 'result'; this.ERROR_PARAM_NAME = 'error'; this.DATA_PARAM_NAME = 'params'; this.APP_ID = ''; this.APP_VERSION = '0.0.23'; this.DEVICE_ID = this.getDeviceId(); this.clientInfo = { deviceId: this.DEVICE_ID, appId: this.APP_ID, appVersion: this.APP_VERSION, os: navigator.platform }; this.ids = {}; _api.prototype.ajax = function(request) { var alwaysSent = false; var noSent = false; var data = { url: request.url || '/api/', method: (request.data ? 'POST' : 'GET'), yes: request.yes, no: request.no, always: request.always, abort: request.abort, data: request.data }; try { var x = new(XMLHttpRequest || ActiveXObject)('MSXML2.XMLHTTP.3.0'); x.open(data.method, data.url, 1); if(!(request.data instanceof FormData)) { x.setRequestHeader('Content-type', 'application/json; charset=utf-8'); request.data = JSON.stringify(request.data); } x.onreadystatechange = function () { if(x.readyState > 3) { var response = null; try { var response = JSON.parse(x.responseText); } catch(e) { } var isBatch = false; if(!(response instanceof Array)) { response = [response]; } else { isBatch = true; } var list = response; var success = true; for(var k in list) { var response = list[k]; if(response) { if(!response.error) { if(response[api.RESULT_PARAM_NAME]) { if(response[api.RESULT_PARAM_NAME]['token']) api.setItem('token', response[api.RESULT_PARAM_NAME]['token']); if(response[api.RESULT_PARAM_NAME]['refreshToken']) api.setItem('refreshToken', response[api.RESULT_PARAM_NAME]['refreshToken']); if(response[api.RESULT_PARAM_NAME]['session']) api.setItem('session', response[api.RESULT_PARAM_NAME]['session']); } if(isBatch) { if(response.id) { api.ids[response.id] && api.ids[response.id].yes && api.ids[response.id].yes(response[api.RESULT_PARAM_NAME], response, x); } } else { data.yes && data.yes(response[api.RESULT_PARAM_NAME], response, x); } } else { if(response[api.ERROR_PARAM_NAME]['code'] == -30400) { api.accessDenied(); } else if(response[api.ERROR_PARAM_NAME]['code'] == -30200) { api.requests.push(data); if(api.requests.length < 2) { api.refreshToken(function(d) { for(var k in api.requests) { var v = api.requests[k]; if(v.data instanceof Array) { api.reqBatch(v.data, v.yes, v.no, v.always, v.abort, true); } else { api.req(v.data, v.yes, v.no, v.always, v.abort, true); } } api.requests = []; }, function(){ api.accessDenied(); }); } return x; } else if(response[api.ERROR_PARAM_NAME]['code'] == -30100 || response[api.ERROR_PARAM_NAME]['code'] == -30110) { api.trigger && api.trigger('captcha_needed', function(captcha) { if(captcha) { data.data[api.DATA_PARAM_NAME]['captcha'] = captcha; api.req(data.data, data.yes, data.no, data.always, data.abort); } else { data.no && data.no({}, {}, x); data.always && data.always(x); } }, response[api.ERROR_PARAM_NAME]['code'] == -30110); return x; } success = false; if(isBatch) { if(response.id) { api.ids[response.id] && api.ids[response.id].no && api.ids[response.id].no(response[api.ERROR_PARAM_NAME], response, x); } } else { data.no && data.no(response[api.ERROR_PARAM_NAME], response, x); } } } else { data.no && data.no(x.responseText, x); } if(response && response.id) { api.ids[response.id] && api.ids[response.id].always && api.ids[response.id].always(x); } } if(isBatch) { if(success) { data.yes && data.yes(list, x); } else { data.no && data.no(list, x); } } noSent = true; alwaysSent = true; data.always && data.always(x); } }; x.addEventListener('abort', function(){ data.abort && data.abort(x); }); x.send(request.data); } catch(e) { !noSent && data.no && data.no(x); !alwaysSent && data.always && data.always(x); } return x; }; /*_api.prototype.hash = function(b){function c(a,b){return a>>>b|a<<32-b}for(var d,e,f=Math.pow,g=f(2,32),h="length",i="",j=[],k=8*b[h],l=api.hash.h=api.hash.h||[],m=api.hash.k=api.hash.k||[],n=m[h],o={},p=2;64>n;p++)if(!o[p]){for(d=0;313>d;d+=p)o[d]=p;l[n]=f(p,.5)*g|0,m[n++]=f(p,1/3)*g|0}for(b+="\x80";b[h]%64-56;)b+="\x00";for(d=0;d>8)return;j[d>>2]|=e<<(3-d)%4*8}for(j[j[h]]=k/g|0,j[j[h]]=k,e=0;ed;d++){var s=q[d-15],t=q[d-2],u=l[0],v=l[4],w=l[7]+(c(v,6)^c(v,11)^c(v,25))+(v&l[5]^~v&l[6])+m[d]+(q[d]=16>d?q[d]:q[d-16]+(c(s,7)^c(s,18)^s>>>3)+q[d-7]+(c(t,17)^c(t,19)^t>>>10)|0),x=(c(u,2)^c(u,13)^c(u,22))+(u&l[1]^u&l[2]^l[1]&l[2]);l=[w+x|0].concat(l),l[4]=l[4]+w|0}for(d=0;8>d;d++)l[d]=l[d]+r[d]|0}for(d=0;8>d;d++)for(e=3;e+1;e--){var y=l[d]>>8*e&255;i+=(16>y?0:"")+y.toString(16)}return i};*/ _api.prototype.getValueByPath = function(obj, path, notsave) { return path.split('.').reduce(function(prev, curr) { return notsave ? prev[curr] : (prev ? prev[curr] : undefined) }, obj || self) }; _api.prototype.getQuery = function(obj, prefix) { var str = [], p; for (p in obj) { if (obj.hasOwnProperty(p)) { var k = prefix ? prefix + "[" + p + "]" : p, v = obj[p]; str.push((v !== null && typeof v === "object") ? api.getQuery(v, k) : encodeURIComponent(k) + "=" + encodeURIComponent(v)); } } return str.join("&"); }; _api.prototype.getStrictUrl = function(data) { api.sign(data); var d = data[api.DATA_PARAM_NAME]; delete data[api.DATA_PARAM_NAME]; d.method = data.method; var res = '/_api/?' + api.getQuery(d); return res; }; _api.prototype.getAuthUrl = function(redirect_uri, group) { var state = { group: group, redirect_uri: redirect_uri, }; var query = api.getQuery(state); var res = '/oauth/?' + query; return res; }; _api.prototype.getStrictRequest = function(data) { var data = api._req(data, null, null, null, null, true); return data; }; _api.prototype.req = function(data, yes, no, always, abort) { data.id = api.createTime(true); return api._req(data, yes, no, always, abort); } _api.prototype.req2 = function(formData, yes, no, always, abort) { let json = formData.get('request'); let data = JSON.parse(json); data['jsonrpc'] = '2.0'; data['id'] = api.createTime(true); api.sign(data); formData.set('request', JSON.stringify(data)); return api.ajax({ data: formData, yes: yes, no: no, always: always, abort: abort }); } _api.prototype.reqBatch = function(batch, yes, no, always, abort, saveId) { var list = []; for(var k in batch) { var v = batch[k]; if(!saveId) v.id = api.createTime(true); api.ids[v.id] = { yes: v.yes, no: v.no, always: v.always, abort: v.abort }; if(v.yes) delete v.yes; if(v.no) delete v.no; if(v.always) delete v.always; if(v.abort) delete v.abort; v = api._req(v, api.ids[v.id].yes, api.ids[v.id].no, api.ids[v.id].always, api.ids[v.id].abort, true); list.push(v); } return api.ajax({ data: list, yes: yes, no: no, always: always, abort: abort }); } _api.prototype.notify = function(data, yes, no, always, abort) { // data.id = api.createTime(true); return api._req(data, yes, no, always, abort); } _api.prototype._req = function(data, yes, no, always, abort, noExecute) { data['jsonrpc'] = '2.0'; if(data.data) { data[api.DATA_PARAM_NAME] = data.data; delete data.data; } if(data.service && data.method) { data.method = data.service + '.' + data.method; delete data.service; } if(!data[api.DATA_PARAM_NAME]) data[api.DATA_PARAM_NAME] = {}; if (api.externalLog) { data[api.DATA_PARAM_NAME]['log'] = api.externalLog; } var check = data['method']; if(check == 'AuthService.GetTokenByUsername') { api.resetAccountData(); var account_key = (data[api.DATA_PARAM_NAME]['username'] + '').trim().toLowerCase(); var password = data[api.DATA_PARAM_NAME]['password']; api.setItem('account_key', account_key); api.setItem('account_key_hash', api.hash(account_key)); api.setItem('ticket', api.hash(password)); api.sign(data); delete data[api.DATA_PARAM_NAME]['password']; data[api.DATA_PARAM_NAME]['clientInfo'] = api.clientInfo; if(noExecute) return data; return api.ajax({ data: data, yes: yes, no: no, always: always, abort: abort }); } else if(check == 'AuthService.CreateTokenBySession') { api.setItem('token', ''); api.setItem('refreshToken', ''); data[api.DATA_PARAM_NAME]['session'] = api.getItem('session'); data[api.DATA_PARAM_NAME]['clientInfo'] = api.clientInfo; } else if(check == 'AuthService.SendCodeToPhone') { api.resetAccountData(); var phone = (data[api.DATA_PARAM_NAME]['phone'] || '').replace(/\D/ig, ''); api.setItem('account_key', phone); api.setItem('account_key_hash', api.hash(phone)); data[api.DATA_PARAM_NAME]['clientInfo'] = api.clientInfo; } api.sign(data); if(noExecute) return data; return api.ajax({ data: data, yes: yes, no: no, always: always, abort: abort }); }; _api.prototype.setTicket = function(pin) { api.setItem('ticket', api.hash(pin)); }; _api.prototype.getAccountKey = function() { return api.getItem('account_key'); }; _api.prototype.sign = function(data) { data[api.DATA_PARAM_NAME]['token'] = api.getItem('token') || ''; // data[api.DATA_PARAM_NAME]['time'] = api.createTime(true); // var signature = api.hash(data['method'] + data[api.DATA_PARAM_NAME]['time'] + data[api.DATA_PARAM_NAME]['token'] + api.getItem('account_key_hash') + api.getItem('session') + api.getItem('ticket')); // data[api.DATA_PARAM_NAME]['signature'] = signature; return data; }; _api.prototype.refreshToken = function(yes, no) { api.req({ method: 'AuthService.RefreshToken', params: { refreshToken: api.getItem('refreshToken') } }, yes, no); }; _api.prototype.logout = function(yes, no) { api.req({ method: 'AuthService.DeleteToken', params: { } }, yes, no); api.resetAccountData(); window.WS && window.WS.refresh(); }; _api.prototype.accessDenied = function(yes, no) { api.accessDeniedHandler && api.accessDeniedHandler(); api.trigger && api.trigger('access_denied', api.getItem('token')); }; _api.prototype.resetAccountData = function() { api.requests = []; api.setItem('account_key', null); api.setItem('account_key_hash', null); api.setItem('session', ''); api.setItem('ticket', ''); api.setItem('token', ''); api.setItem('refreshToken', ''); }; }; return new _api(); })(); if (typeof module != 'undefined' && module.exports) { (function(window,undefined){const ALL_CALLBACKS='*';const define=Object.defineProperties;const entries=Object.entries;const on=(callbacks,el)=>(event,fn)=>{if(callbacks.has(event)){callbacks.get(event).add(fn)}else{callbacks.set(event,new Set().add(fn))};return el};const off=(callbacks,el)=>(event,fn)=>{if(event===ALL_CALLBACKS&&!fn){callbacks.clear()}else{if(fn){const fns=callbacks.get(event);if(fns){fns.delete(fn);if(fns.size===0)callbacks.delete(event)}}else callbacks.delete(event)};return el};const one=(callbacks,el)=>(event,fn)=>{function on(...args){el.off(event,on);fn.apply(el,args)};return el.on(event,on)};const trigger=(callbacks,el)=>(event,...args)=>{const fns=callbacks.get(event);if(fns)fns.forEach(fn=>fn.apply(el,args));if(callbacks.get(ALL_CALLBACKS)&&event!==ALL_CALLBACKS){el.trigger(ALL_CALLBACKS,event,...args)};return el};const observable=function(el){const callbacks=new Map();const methods={on,off,one,trigger};el=el||{};define(el,entries(methods).reduce((acc,[key,method])=>{acc[key]={value:method(callbacks,el),enumerable:!1,writable:!1,configurable:!1};return acc},{}));return el};observable(API)})(); module.exports = API; }