UNPKG

xcloudsdk

Version:

xcloud sdk

433 lines (432 loc) 14.9 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.hsdk = void 0; class cacheManager { constructor(cachePrefix) { this._maxExpireDate = new Date("Fri, 31 Dec 9999 23:59:59 UTC"); this._cachePrefix = ""; this._defaultSerializer = { serialize: function (item) { return JSON.stringify(item); }, // fix for "illegal access" error on Android when JSON.parse is // passed null deserialize: function (data) { return data && JSON.parse(data); }, }; this._cachePrefix = cachePrefix; } isValidDate(date) { return (Object.prototype.toString.call(date) === "[object Date]" && !isNaN(date.getTime())); } getExpiresDate(expires, now) { now = now || new Date(); if (typeof expires === "number") { expires = expires === Infinity ? this._maxExpireDate : new Date(now.getTime() + expires * 1000); } else if (typeof expires === "string") { expires = new Date(expires); } if (expires && !this.isValidDate(expires)) { throw new Error("`expires` parameter cannot be converted to a valid Date instance"); } return expires; } isCacheItem(item) { if (typeof item !== "object") { return false; } if (item) { if ("c" in item && "exp" in item && "v" in item) { return true; } } return false; } checkCacheItemIfEffective(cacheItem) { var timeNow = new Date().getTime(); return timeNow < cacheItem.exp; } setCache(key, value, exp) { var now = new Date().getTime(); var exp = exp || 7000; var expires = this.getExpiresDate(exp, new Date()); var cacheItem = { v: this._defaultSerializer.serialize(value), exp: expires.getTime(), c: now, }; sessionStorage.setItem(this._cachePrefix + key, this._defaultSerializer.serialize(cacheItem)); } deleteCache(key) { sessionStorage.removeItem(this._cachePrefix + key); return key; } getTokenCache(key) { var cacheItem = null; try { cacheItem = this._defaultSerializer.deserialize(sessionStorage.getItem(this._cachePrefix + key)); } catch (e) { return null; } if (cacheItem != null && this.isCacheItem(cacheItem)) { var value = this._defaultSerializer.deserialize(cacheItem.v); if (this.checkCacheItemIfEffective(cacheItem)) { return value; } else { value.AccessToken = null; } } return null; } } class requestHelper { constructor(prefix) { this._tokenoption = new tokenOption(); this._config = { v: "2.0", format: "json", app_key: "", authorizetype: "Code", sign: "", timestamp: "", sdkversion: "h-sdk-net-20180201", }; this._cache = new cacheManager(prefix); } //创建请求 createXHR() { var xhr = new XMLHttpRequest(); if (xhr == null) { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } return xhr; } getAuthHeaders(token) { let auth = "Bearer " + token; return { Authorization: auth, }; } //格式化参数 formatFormParams(data) { let arr = []; for (var name in data) { arr.push(encodeURIComponent(name) + "=" + encodeURIComponent(data[name])); } arr.push(("v=" + Math.random()).replace(".", "")); return arr.join("&"); } request(url, options, isform) { return new Promise((resolve, reject) => { let xhr = this.createXHR(); xhr.open(options.method, url); if (options.onCreate) { options.onCreate(xhr); } if (options.headers) { Object.keys(options.headers).forEach((k) => { xhr.setRequestHeader(k, options.headers[k]); }); } xhr.upload.addEventListener("progress", (evt) => { if (evt.lengthComputable && options.onProgress) { options.onProgress({ loaded: evt.loaded, total: evt.total, }); } }); xhr.onreadystatechange = () => { let responseText = xhr.responseText; if (xhr.readyState !== 4) { return; } let reqId = ""; //xhr.getResponseHeader("x-reqId") || ""; if (xhr.status !== 200) { let message = `xhr request failed, code: ${xhr.status};`; if (responseText) { message = message + ` response: ${responseText}`; } reject({ code: xhr.status, message: message, reqId: reqId, isRequestError: true, }); } resolve({ data: JSON.parse(responseText), reqId: reqId, }); }; if (isform) { xhr.send(this.formatFormParams(options.data)); } else { xhr.send(JSON.stringify(options.data)); } }); } getToken(refresh = false) { var tokeninfo = this._cache.getTokenCache("token"); //获取token,并进行缓存 var header = { "Content-Type": "application/json; charset=utf-8", }; return new Promise((resolve, reject) => { if (tokeninfo == null) { console.log("请求token"); return this.request(this._tokenoption.tokenurl + "/api/Auth/token", { headers: header, method: "POST", data: { AppId: this._config.app_key, AuthorizeType: this._config.authorizetype, UserId: this._tokenoption.userid, Password: this._tokenoption.password, Code: this._tokenoption.code, }, }, false).then((res) => { var result = res.data; if (result.IsSuccess) { var data = result.Data; tokeninfo = { accesstoken: data.AccessToken, refreshtoken: data.RefreshToken, }; this._cache.setCache("token", tokeninfo, 7000); resolve(tokeninfo); // return tokeninfo; } else { reject(result.ErrorMessage); // throw result.ErrorMessage; } }, (err) => { //其他错误信息 reject(err); // return { // Success: false, // Data: err // }; }); } else if (tokeninfo != null && tokeninfo.refreshtoken && refresh) { //通过RefreshToken,获取accesstoken console.log("通过刷新请求token"); return this.request(this._tokenoption.tokenurl + "/api/Auth/refreshtoken?refreshToken=" + encodeURIComponent(tokeninfo.refreshtoken), { headers: header, method: "POST", }, false).then((res1) => { let res = res1; var result = res.data; if (result.IsSuccess) { var data = result.Data; tokeninfo = { accesstoken: data.AccessToken, refreshtoken: data.RefreshToken, }; this._cache.setCache("token", tokeninfo, 7000); resolve(tokeninfo); // return tokeninfo; } else { reject(result.ErrorMessage); // throw result.ErrorMessage; } }, (err) => { //其他错误信息 reject(err); // return { // Success: false, // Data: err // }; }); } else { return resolve(tokeninfo); } }); } setParam(inputs = {}, tables = []) { var hrequest = { input: [], tables: [], }; for (var i in inputs) { if (inputs.hasOwnProperty(i) && typeof inputs[i] !== "function") { hrequest.input.push({ name: i, value: inputs[i], }); } } var paramStr = JSON.stringify(hrequest); var tokeninfo = this._cache.getTokenCache("token"); var params = Object.assign({}, this._config, { param: paramStr, token: tokeninfo.accesstoken, }); return params; } convertOutput(result) { var output = {}; for (var i in result.output) { var item = result.output[i]; output[item.Name] = item.value; } return output; } //通过用户名模式获取token settokenbyuser(userid, password) { this._cache.deleteCache("token"); this._tokenoption.userid = userid; this._tokenoption.password = password; this.getToken(false) .then((res) => { console.log(res.accesstoken); }) .catch((reject) => { console.log(reject); }); } //通过Code模式获取token settokenbycode(code) { this._cache.deleteCache("token"); this._tokenoption.code = code; this.getToken(false) .then((res) => { console.log(res.accesstoken); }) .catch((reject) => { console.log(reject); }); } init(options, tokenoption) { Object.assign(this._config, options); Object.assign(this._tokenoption, tokenoption); //this._tokenoption = tokenoption; } } class tokenOption { constructor() { this.tokenurl = ""; this.authorizetype = "Code"; // 必填,授权类型UserName,Code this.userid = ""; this.password = ""; this.code = ""; } } class hsdk { constructor(prefix) { this._requestHelper = new requestHelper(prefix); } config(options, tokenoption) { this._requestHelper.init(options, tokenoption); } request(url_1) { return __awaiter(this, arguments, void 0, function* (url, inputs = {}, tables = []) { var header = { "Content-Type": "application/x-www-form-urlencoded", }; var tokeninfo = yield this._requestHelper.getToken(); //请求数据 return this._requestHelper .request(url, { headers: header, method: "POST", data: this._requestHelper.setParam(inputs, tables), }, true) .then((res) => { var result = res.data; if (result.ErrorCode == 0) { var output = this._requestHelper.convertOutput(result); return { Success: true, Message: result.ErrorMessage, Data: output, }; } if (result.ErrorCode == 3012) { //token过期,需要通过refreshtoken重新获取 this._requestHelper .getToken(true) .then((res) => { console.log(res.accesstoken); }) .catch((reject) => { console.log(reject); }); } else { //其他错误信息 return { Success: false, Message: result.ErrorMessage, Code: result.ErrorCode, }; } }, (err) => { //其他错误信息 return { Success: false, Data: err, }; }); }); } //通过用户名模式获取token settokenbyuser(userid, password) { this._requestHelper.settokenbyuser(userid, password); } //通过Code模式获取token settokenbycode(code) { this._requestHelper.settokenbycode(code); } getToken() { this._requestHelper.getToken(); } //通过refreshToken模式获取token settokenbyrefresh() { this._requestHelper .getToken(true) .then((res) => { console.log(res.accesstoken); }) .catch((reject) => { console.log(reject); }); } getparam(inputs = {}, tables = []) { return this._requestHelper.setParam(inputs, tables); } getoutput(result) { return this._requestHelper.convertOutput(result); } } exports.hsdk = hsdk; var hsdk1 = new hsdk(""); exports.default = hsdk1; var w = window; if (!w.hsdk) { w.hsdk = new hsdk("sdk"); }