iboot-http-client 1.1.7 → 1.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const M=require("pino"),B=require("pino-pretty"),L=require("js-md5"),p=require("crypto-js"),D={GENERAL:0,PHONE:1,EMAIL:2},R={TYPE_MGT:0,TYPE_C:1,TYPE_B:2},K={FROM_WEB:1,FROM_PC:2,FROM_WX_MINI_PRO:3,FROM_WX_PLU:4,FROM_WX_E:5,FROM_APP:6,FROM_DEVICE:7},H={unknown:0,male:1,female:2},$=B({colorize:!0,destination:process.stdout,translateTime:"SYS:yyyy-mm-dd HH:MM:ss",ignore:"pid,hostname",messageFormat:"{msg}",singleLine:!0}),u=M({name:process.env.APP_NAME??"iBoot",level:process.env.APP_ENV==="production"?"info":"debug",nestedKey:"payload"},$),T=n=>Array.isArray(n)||typeof n=="object"&&Object.prototype.toString.call(n)==="[object Array]",_=n=>{const t=n||32,e="ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",s=e.length;let r="";for(let o=0;o<t;o++)r+=e.charAt(Math.floor(Math.random()*s));return r},N=(n,t)=>{const e={};return n.split("&").forEach(r=>{const o=r.split("=");o[1]&&(!t||t.indexOf(o[0])==-1)&&(e[o[0]]=o[1])}),e},m=n=>!n||n==""||n.length==0?"":encodeURIComponent(n).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\'/g,"%27").replace(/\!/g,"%21").replace(/\~/g,"%7E"),x=(n,t)=>{const e={"M+":n.getMonth()+1,"d+":n.getDate(),"h+":n.getHours(),"m+":n.getMinutes(),"s+":n.getSeconds(),"q+":Math.floor((n.getMonth()+3)/3),S:n.getMilliseconds()};if(/(y+)/.test(t)){const r=new RegExp(/(y+)/).exec(t);let o=0;r&&r.length>0&&(o=r[0].length),t=t.replace(/(y+)/,n.getFullYear()+"").substring(4-o)}for(const s in e){const r="("+s+")",o=new RegExp(r);if(o.test(t)){const i=o.exec(t);let c=0;i&&i.length>0&&(c=i[0].length),t=t.replace(o,c==1?e[s].toString():("00"+e[s]).substring(e[s].toString().length))}}return t},U="zh-CN",O="_device_id_key",S="_current_website_key",A="Get request error!",I="Post request error!",g={IBOOT_DEVICE_ID:"did",IBOOT_LANG:"lang",IBOOT_WEBSITE_ID:"web_id",IBOOT_WEBSITE_NO:"web_no",IBOOT_TOKEN:"_t",IBOOT_USER:"_u"},y={DEVICE_ID:"Device-Id",LANG:"Lang",WEBSITE_ID:"Website-Id",WEBSITE_NO:"Website-No"},v=()=>{const n=localStorage.getItem(O)??"",t=localStorage.getItem(S),e=t!=null?JSON.parse(t):null,s={};return n.length>0&&(s["Device-Id"]=n),e&&(s.Lang=e.language,e.websiteId&&(s["Website-Id"]=e.websiteId),e.websiteNo&&(s["Website-No"]=e.websiteNo)),s},F=(n,t)=>{localStorage.setItem(O,n),t&&localStorage.setItem(S,JSON.stringify(t))},C=async(n,t)=>{if(t?.data){const i=new URLSearchParams(t.data);n.indexOf("?")!=-1?n+=`&${i}`:n+=`?${i}`}const e=v(),s=t?.headers;if(s)for(const i in s){const c=s[i];c&&(e[i]=c)}u.debug({url:n,headers:e},"GET");const r=await fetch(n,{method:"GET",headers:e,cache:t?.useCache?"force-cache":"default"});if(r.ok){const i=await r.json();return u.debug(i,"GET_RESULT"),i}const o={code:r.status,success:!1,msg:r.statusText};return u.error(o),o},w=async(n,t)=>{const e=t?.data??{},s=t?.headers;let r;const o=new Headers(v());if(e instanceof FormData?r=e:(r=JSON.stringify(e),o.set("Content-Type","application/json")),s)for(let a in s){const l=s[a];l&&o.set(a,l)}u.debug({url:n,headers:o},"POST");const i=await fetch(n,{method:"POST",headers:o,body:r});if(i.ok){const a=await i.json();return u.debug(a,"POST_RESULT"),a}const c={code:i.status,success:!1,msg:i.statusText};return u.error(c),c},W=async(n,t)=>{const e=await C(n,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??A);return}throw Error(e.msg??A)},j=async(n,t)=>{const e=await w(n,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??I);return}throw Error(e.msg??I)},G=async(n,t)=>{const e=await w(n,t);return e.success?(t?.showSuccess&&t.showSuccess(e.msg??"SUCCESS"),!0):(t?.showError&&t.showError(e.msg??I),!1)},k=n=>{const t=n.headers.get(y.DEVICE_ID),e=n.headers.get(y.LANG),s=n.headers.get(y.WEBSITE_ID),r=n.headers.get(y.WEBSITE_NO),o={};return t&&t.length>0&&(o.deviceId=t),e&&e.length>0&&(o.lang=e),s&&s.length>0&&(o.websiteId=s),r&&r.length>0&&(o.websiteNo=r),o},Y=n=>{if(!n.get)throw new Error("cookies get function is undefined");const t={},e=n.get(g.IBOOT_DEVICE_ID),s=n.get(g.IBOOT_LANG),r=n.get(g.IBOOT_WEBSITE_ID),o=n.get(g.IBOOT_WEBSITE_NO);return e&&e.length>0&&(t.deviceId=e),s&&s.length>0&&(t.lang=s),r&&r.length>0&&(t.websiteId=r),o&&o.length>0&&(t.websiteNo=o),t},J=n=>{if(n.get){const t=n.get(g.IBOOT_USER);if(t&&t.length>0)return JSON.parse(t)}return null},V=n=>{if(n.get){const t=n.get(g.IBOOT_USER);if(t&&t.length>0){const e=JSON.parse(t),s=e.username,r=e.userType.toString(),o=n.get(g.IBOOT_TOKEN);if(o)return{username:s,utype:r,token:o}}}},q=(n,t)=>{const{id:e,name:s,username:r,nickname:o,headImg:i,token:c,lastLoginTime:a,deviceId:l,userType:d,mustChangePwd:f}=n,h={id:e,name:s,username:r,nickname:o||s,headImg:i,lastLoginTime:a,deviceId:l,userType:d,accountType:0,needToReview:!1,socketOnline:!1,mustChangePwd:f};if(!t.set)throw new Error("cookies set function is undefined");t.set(g.IBOOT_TOKEN,c,{path:"/",secure:process.env.APP_ENV==="production",httpOnly:!0,sameSite:"strict"}),t.set(g.IBOOT_USER,JSON.stringify(h))},X=n=>{if(!n.set)throw new Error("cookies set function is undefined");if(n.set(g.IBOOT_TOKEN,"",{maxAge:-1,httpOnly:!0,path:"/"}),n.set(g.IBOOT_USER,"",{maxAge:-1,httpOnly:!0,path:"/"}),!n.delete)throw new Error("cookies delete function is undefined");n.delete(g.IBOOT_TOKEN),n.delete(g.IBOOT_USER)};class z{baseUrl;helloMethod;apiKey;userType;userFrom;deviceId;version="1";lang;websiteId;websiteNo;constructor(t){process.env.APP_ENV==="production"||u.warn("This is currently a development environment!"),this.baseUrl=process.env.APP_BASEURL,this.apiKey=process.env.APP_APIKEY,this.userFrom=process.env.APP_USERFROM??"1",this.helloMethod=t.helloURL??"",this.userType=t.userType??R.TYPE_MGT,this.deviceId=t.deviceId??_(10),this.lang=t.lang??U,this.websiteId=t.websiteId,this.websiteNo=t.websiteNo}encrypt(t){const e=p.enc.Utf8.parse(this.apiKey);return p.AES.encrypt(t,e).toString()}decrypt(t){const e=p.enc.Utf8.parse(this.apiKey);return p.AES.decrypt(t,e,{mode:p.mode.ECB}).toString(p.enc.Utf8)}convertUrlParameter(t){const e=[];for(const s in t){let r=t[s];if(r&&typeof r=="string")r=r.trim();else if(r&&typeof r=="object"){if(T(r)){if(r.length===0)continue;for(let o=0;o<r.length;o++){const i=r[o];for(const c in i){const a=i[c]??void 0;if(a){if(typeof a=="object")T(a)&&a.forEach((l,d)=>{if(l)for(const f in l){const h=l[f];if(h&&h.toString().length>0){const E=`[${o.toString()}].${c+`[${d.toString()}].${f}`}=${m(h)}`;e.push(s+E)}}});else if(a.toString().length>0){const l=`[${o.toString()}].${c}=${m(a.toString())}`;e.push(s+l)}}}}}else for(const o in r){const i=r[o];if(i!=null&&i!=""&&i.length!=0){const c=`.${o}=${m(i)}`;e.push(s+c)}}continue}else r&&typeof r=="function"&&(r=null);r!=null&&r!=""&&r.length!=0&&e.push(s+"="+m(r))}return e&&e.join("&")}async sign(t){const e="&key="+await this.helloIboot(),s=[];for(const a in t)s.push(a);s.sort((a,l)=>a.toLowerCase().localeCompare(l.toLowerCase()));const r=[];s.forEach(a=>{let l=t[a];typeof l=="object"&&(l=JSON.stringify(l)),r.push(a+"="+l)});const o=r.join("&"),i=L.md5((o+e).toLocaleUpperCase()),c={params:o,md5:i};return u.debug(c,"API_SIGN"),i}assemblyParameter(t,e){const s=t??{};return s.timestamp=Date.now()+"",s.echostr=_(10),s.version=this.version,s.deviceId=this.deviceId,s.webid=this.websiteId,s.apiKey=this.apiKey,e&&e.length>0&&(s.username=e),s}async assemblyHeader({urlParams:t,token:e}){const s={"Content-Type":"application/x-www-form-urlencoded","Res-Type":"json","Device-Id":this.deviceId,"User-Type":e?.utype.toString()??this.userType.toString(),"User-From":this.userFrom,"Api-Key":this.apiKey};this.lang&&this.lang.length>0&&(s.Lang=this.lang),this.websiteId&&this.websiteId.length>0&&(s["Web-Id"]=this.websiteId),this.websiteNo&&this.websiteNo.length>0&&(s["Web-No"]=this.websiteNo),e&&(e.token&&e.token.length>0&&e.username&&e.username.length>0&&(s.Authorization=e.token,s.Username=e.username),e.xcsrf&&(s[e.xcsrf.csrfHeader]=e.xcsrf.csrfToken));const r=N(t),o=await this.sign(r);return s.Sign=o,s}async helloIboot(){if(this.helloMethod.length<=0)return this.apiKey;const t=this.getApiUrl(this.helloMethod),e={"Content-Type":"application/x-www-form-urlencoded","Res-Type":"json","Api-Key":this.apiKey},s={url:t,headers:e};u.debug(s,"HELLO");const r=await fetch(t,{method:"GET",headers:e,credentials:"include",cache:"force-cache"});if(r.ok){const o=await r.json();return u.debug(o.data,"HELLO RESULT"),o.data}throw new Error("hello iBoot error!")}getApiUrl(t){return`${this.baseUrl}/${t}`}async csrf(){const t=await this.get({url:"guest/csrf"});if(t.success){const e=t.data;if(e)return e.csrfToken.toString()}}async get({url:t,data:e,token:s,cache:r="default"}){const o=this.assemblyParameter(e),i=this.convertUrlParameter(o),c=await this.assemblyHeader({urlParams:i,token:s}),a=`${this.getApiUrl(t)}?${i.toString()}`,l={url:a,headers:c};u.info(l,"GET");const d=await fetch(a,{method:"GET",headers:c,credentials:"include",cache:r});if(d.ok){const h=await d.json();return u.debug(h,"GET_RESULT"),h}const f={code:d.status,success:!1,msg:d.statusText};return u.error(f),f}async post({url:t,data:e,token:s,cache:r="default"}){e=e?{...e}:{};const o=e.buffer??void 0,i=e.boundary??void 0;o&&delete e.buffer,i&&delete e.boundary;const c=this.assemblyParameter(e),a=this.convertUrlParameter(c),l=await this.assemblyHeader({urlParams:a,token:s});o&&i&&(l["Content-Type"]=`multipart/form-data; boundary=${i}`);const d=this.getApiUrl(t),f={url:d,headers:l,params:c};u.info(f,"POST");const h=o?`${d}?${a}`:d,E=await fetch(h,{method:"POST",headers:l,body:o||a.toString(),credentials:"include",cache:r});if(E.ok){const P=await E.json();return u.debug(P,"POST_RESULT"),P}const b={code:E.status,success:!1,msg:E.statusText};return u.error(b),b}async stream({url:t,data:e,token:s}){e=e?{...e}:{};const r=e.buffer??void 0,o=e.boundary??void 0;r&&delete e.buffer,o&&delete e.boundary;const i=this.assemblyParameter(e),c=this.convertUrlParameter(i),a=await this.assemblyHeader({urlParams:c,token:s});r&&o&&(a["Content-Type"]=`multipart/form-data; boundary=${o}`),a.Connection="keep-alive",a["X-Accel-Buffering"]="no",a["Cache-Control"]="no-cache";const l=this.getApiUrl(t);try{const d=r?`${l}?${c}`:l,f={url:l,headers:a,params:i};u.info(f,"STREAM");const h=await fetch(d,{method:"POST",headers:a,body:r||c.toString(),credentials:"include"});if(!h.ok)throw new Error(`HTTP error! status: ${h.status}`);if(!h.body)throw new Error("No response body");return new Response(h.body,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}catch(d){throw d}}}exports.ACCOUNT_TYPE_MAP=D;exports.COOKIE_NAMES=g;exports.CURRENT_WEBSITE_KEY=S;exports.DEFAULT_LOCALE=U;exports.DEVICE_ID_KEY=O;exports.HttpClient=z;exports.USER_FORM_MAP=K;exports.USER_SEX_MAP=H;exports.USER_TYPE_MAP=R;exports.cleanToken=X;exports.dateFormat=x;exports.get=C;exports.getHttpOpts=k;exports.getHttpOptsByCookie=Y;exports.getLoginUser=J;exports.getToken=V;exports.iGet=W;exports.iPost=j;exports.iPostSuccess=G;exports.isArray=T;exports.logger=u;exports.post=w;exports.randomString=_;exports.setDefaultRequestHeader=F;exports.setToken=q;exports.urlEncode=m;exports.urlParamToJson=N;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const M=require("pino"),B=require("pino-pretty"),L=require("js-md5"),p=require("crypto-js"),D={GENERAL:0,PHONE:1,EMAIL:2},A={TYPE_MGT:0,TYPE_C:1,TYPE_B:2},H={FROM_WEB:1,FROM_PC:2,FROM_WX_MINI_PRO:3,FROM_WX_PLU:4,FROM_WX_E:5,FROM_APP:6,FROM_DEVICE:7},K={unknown:0,male:1,female:2},$=B({colorize:!0,destination:process.stdout,translateTime:"SYS:yyyy-mm-dd HH:MM:ss",ignore:"pid,hostname",messageFormat:"{msg}",singleLine:!0}),u=M({name:process.env.APP_NAME??"iBoot",level:process.env.APP_ENV==="production"?"info":"debug",nestedKey:"payload"},$),T=r=>Array.isArray(r)||typeof r=="object"&&Object.prototype.toString.call(r)==="[object Array]",_=r=>{const t=r||32,e="ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",s=e.length;let n="";for(let o=0;o<t;o++)n+=e.charAt(Math.floor(Math.random()*s));return n},N=(r,t)=>{const e={};return r.split("&").forEach(n=>{const o=n.split("=");o[1]&&(!t||t.indexOf(o[0])==-1)&&(e[o[0]]=o[1])}),e},m=r=>!r||r==""||r.length==0?"":encodeURIComponent(r).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\'/g,"%27").replace(/\!/g,"%21").replace(/\~/g,"%7E"),x=(r,t)=>{const e={"M+":r.getMonth()+1,"d+":r.getDate(),"h+":r.getHours(),"m+":r.getMinutes(),"s+":r.getSeconds(),"q+":Math.floor((r.getMonth()+3)/3),S:r.getMilliseconds()};if(/(y+)/.test(t)){const n=new RegExp(/(y+)/).exec(t);let o=0;n&&n.length>0&&(o=n[0].length),t=t.replace(/(y+)/,r.getFullYear()+"").substring(4-o)}for(const s in e){const n="("+s+")",o=new RegExp(n);if(o.test(t)){const i=o.exec(t);let c=0;i&&i.length>0&&(c=i[0].length),t=t.replace(o,c==1?e[s].toString():("00"+e[s]).substring(e[s].toString().length))}}return t},U="zh-CN",I="_device_id_key",O="_current_website_key",R="Get request error!",S="Post request error!",g={IBOOT_DEVICE_ID:"did",IBOOT_LANG:"lang",IBOOT_WEBSITE_ID:"web_id",IBOOT_WEBSITE_NO:"web_no",IBOOT_TOKEN:"_t",IBOOT_USER:"_u"},y={DEVICE_ID:"Device-Id",LANG:"Lang",WEBSITE_ID:"Website-Id",WEBSITE_NO:"Website-No"},v=()=>{const r=localStorage.getItem(I)??"",t=localStorage.getItem(O),e=t!=null?JSON.parse(t):null,s={};return r.length>0&&(s["Device-Id"]=r),e&&(s.Lang=e.language,e.websiteId&&(s["Website-Id"]=e.websiteId),e.websiteNo&&(s["Website-No"]=e.websiteNo)),s},F=(r,t)=>{localStorage.setItem(I,r),t&&localStorage.setItem(O,JSON.stringify(t))},C=async(r,t)=>{if(t?.data){const i=new URLSearchParams(t.data);r.indexOf("?")!=-1?r+=`&${i}`:r+=`?${i}`}const e=v(),s=t?.headers;if(s)for(const i in s){const c=s[i];c&&(e[i]=c)}u.debug({url:r,headers:e},"GET");const n=await fetch(r,{method:"GET",headers:e,cache:t?.useCache?"force-cache":"default"});if(n.ok){const i=await n.json();return u.debug(i,"GET_RESULT"),i}const o={code:n.status,success:!1,msg:n.statusText};return u.error(o),o},w=async(r,t)=>{const e=t?.data??{},s=t?.headers;let n;const o=new Headers(v());if(e instanceof FormData?n=e:(n=JSON.stringify(e),o.set("Content-Type","application/json")),s)for(let a in s){const l=s[a];l&&o.set(a,l)}u.debug({url:r,headers:o},"POST");const i=await fetch(r,{method:"POST",headers:o,body:n});if(i.ok){const a=await i.json();return u.debug(a,"POST_RESULT"),a}const c={code:i.status,success:!1,msg:i.statusText};return u.error(c),c},W=async(r,t)=>{const e=await C(r,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??R);return}throw Error(e.msg??R)},j=async(r,t)=>{const e=await w(r,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??S);return}throw Error(e.msg??S)},G=async(r,t)=>{const e=await w(r,t);return e.success?(t?.showSuccess&&t.showSuccess(e.msg??"SUCCESS"),!0):(t?.showError&&t.showError(e.msg??S),!1)},k=r=>{const t=r.headers.get(y.DEVICE_ID),e=r.headers.get(y.LANG),s=r.headers.get(y.WEBSITE_ID),n=r.headers.get(y.WEBSITE_NO),o={};return t&&t.length>0&&(o.deviceId=t),e&&e.length>0&&(o.lang=e),s&&s.length>0&&(o.websiteId=s),n&&n.length>0&&(o.websiteNo=n),o},Y=r=>{if(!r.get)throw new Error("cookies get function is undefined");const t={},e=r.get(g.IBOOT_DEVICE_ID),s=r.get(g.IBOOT_LANG),n=r.get(g.IBOOT_WEBSITE_ID),o=r.get(g.IBOOT_WEBSITE_NO);return e&&e.length>0&&(t.deviceId=e),s&&s.length>0&&(t.lang=s),n&&n.length>0&&(t.websiteId=n),o&&o.length>0&&(t.websiteNo=o),t},J=r=>{if(r.get){const t=r.get(g.IBOOT_USER);if(t&&t.length>0)return JSON.parse(t)}return null},V=r=>{if(r.get){const t=r.get(g.IBOOT_USER);if(t&&t.length>0){const e=JSON.parse(t),s=e.username,n=e.userType.toString(),o=r.get(g.IBOOT_TOKEN);if(o)return{username:s,utype:n,token:o}}}},q=(r,t)=>{const{id:e,name:s,username:n,nickname:o,headImg:i,token:c,lastLoginTime:a,deviceId:l,userType:d,mustChangePwd:f}=r,h={id:e,name:s,username:n,nickname:o||s,headImg:i,lastLoginTime:a,deviceId:l,userType:d,accountType:0,needToReview:!1,socketOnline:!1,mustChangePwd:f};if(!t.set)throw new Error("cookies set function is undefined");t.set(g.IBOOT_TOKEN,c,{path:"/",secure:process.env.APP_ENV==="production",httpOnly:!0,sameSite:"strict"}),t.set(g.IBOOT_USER,JSON.stringify(h))},X=r=>{if(!r.set)throw new Error("cookies set function is undefined");if(r.set(g.IBOOT_TOKEN,"",{maxAge:-1,httpOnly:!0,path:"/"}),r.set(g.IBOOT_USER,"",{maxAge:-1,httpOnly:!0,path:"/"}),!r.delete)throw new Error("cookies delete function is undefined");r.delete(g.IBOOT_TOKEN),r.delete(g.IBOOT_USER)};class z{baseUrl;helloMethod;apiKey;userType;userFrom;deviceId;version="1";lang;websiteId;websiteNo;constructor(t){process.env.APP_ENV==="production"||u.warn("This is currently a development environment!"),this.baseUrl=process.env.APP_BASEURL,this.apiKey=process.env.APP_APIKEY,this.userFrom=process.env.APP_USERFROM??"1",this.helloMethod=t.helloURL??"",this.userType=t.userType??A.TYPE_MGT,this.deviceId=t.deviceId??_(10),this.lang=t.lang??U,this.websiteId=t.websiteId,this.websiteNo=t.websiteNo}encrypt(t){const e=p.enc.Utf8.parse(this.apiKey);return p.AES.encrypt(t,e).toString()}decrypt(t){const e=p.enc.Utf8.parse(this.apiKey);return p.AES.decrypt(t,e,{mode:p.mode.ECB}).toString(p.enc.Utf8)}convertUrlParameter(t){const e=[];for(const s in t){let n=t[s];if(n&&typeof n=="string")n=n.trim();else if(n&&typeof n=="object"){if(T(n)){if(n.length===0)continue;for(let o=0;o<n.length;o++){const i=n[o];for(const c in i){const a=i[c]??void 0;if(a){if(typeof a=="object")T(a)&&a.forEach((l,d)=>{if(l)for(const f in l){const h=l[f];if(h&&h.toString().length>0){const E=`[${o.toString()}].${c+`[${d.toString()}].${f}`}=${m(h)}`;e.push(s+E)}}});else if(a.toString().length>0){const l=`[${o.toString()}].${c}=${m(a.toString())}`;e.push(s+l)}}}}}else for(const o in n){const i=n[o];if(i!=null&&i!=""&&i.length!=0){const c=`.${o}=${m(i)}`;e.push(s+c)}}continue}else n&&typeof n=="function"&&(n=null);n!=null&&n!=""&&n.length!=0&&e.push(s+"="+m(n))}return e&&e.join("&")}async sign(t){const e="&key="+await this.helloIboot(),s=[];for(const a in t)s.push(a);s.sort((a,l)=>a.toLowerCase().localeCompare(l.toLowerCase()));const n=[];s.forEach(a=>{let l=t[a];typeof l=="object"&&(l=JSON.stringify(l)),n.push(a+"="+l)});const o=n.join("&"),i=L.md5((o+e).toLocaleUpperCase()),c={params:o,md5:i};return u.debug(c,"API_SIGN"),i}assemblyParameter(t,e){const s=t??{};return s.timestamp=Date.now()+"",s.echostr=_(10),s.version=this.version,s.deviceId=this.deviceId,s.webid=this.websiteId,s.apiKey=this.apiKey,e&&e.length>0&&(s.username=e),s}async assemblyHeader({urlParams:t,token:e}){const s={"Content-Type":"application/x-www-form-urlencoded","Res-Type":"json","Device-Id":this.deviceId,"User-Type":e?.utype.toString()??this.userType.toString(),"User-From":this.userFrom,"Api-Key":this.apiKey};this.lang&&this.lang.length>0&&(s.Lang=this.lang),this.websiteId&&this.websiteId.length>0&&(s["Web-Id"]=this.websiteId),this.websiteNo&&this.websiteNo.length>0&&(s["Web-No"]=this.websiteNo),e&&(e.token&&e.token.length>0&&e.username&&e.username.length>0&&(s.Authorization=e.token,s.Username=e.username),e.xcsrf&&(s[e.xcsrf.csrfHeader]=e.xcsrf.csrfToken));const n=N(t),o=await this.sign(n);return s.Sign=o,s}async helloIboot(){if(this.helloMethod.length<=0)return this.apiKey;const t=this.getApiUrl(this.helloMethod),e={"Content-Type":"application/x-www-form-urlencoded","Res-Type":"json","Api-Key":this.apiKey},s={url:t,headers:e};u.debug(s,"HELLO");const n=await fetch(t,{method:"GET",headers:e,credentials:"include",cache:"force-cache"});if(n.ok){const o=await n.json();return u.debug(o.data,"HELLO RESULT"),o.data}throw new Error("hello iBoot error!")}getApiUrl(t){return`${this.baseUrl}/${t}`}async csrf(){const t=await this.get({url:"guest/csrf"});if(t.success){const e=t.data;if(e)return e.csrfToken.toString()}}async get({url:t,data:e,token:s,cache:n="default"}){const o=this.assemblyParameter(e),i=this.convertUrlParameter(o),c=await this.assemblyHeader({urlParams:i,token:s}),a=`${this.getApiUrl(t)}?${i.toString()}`,l={url:a,headers:c};u.info(l,"GET");const d=await fetch(a,{method:"GET",headers:c,credentials:"include",cache:n});if(d.ok){const h=await d.json();return u.debug(h,"GET_RESULT"),u.debug(d.headers,"RES_HEADERS"),h}const f={code:d.status,success:!1,msg:d.statusText};return u.error(f),f}async post({url:t,data:e,token:s,cache:n="default"}){e=e?{...e}:{};const o=e.buffer??void 0,i=e.boundary??void 0;o&&delete e.buffer,i&&delete e.boundary;const c=this.assemblyParameter(e),a=this.convertUrlParameter(c),l=await this.assemblyHeader({urlParams:a,token:s});o&&i&&(l["Content-Type"]=`multipart/form-data; boundary=${i}`);const d=this.getApiUrl(t),f={url:d,headers:l,params:c};u.info(f,"POST");const h=o?`${d}?${a}`:d,E=await fetch(h,{method:"POST",headers:l,body:o||a.toString(),credentials:"include",cache:n});if(E.ok){const P=await E.json();return u.debug(P,"POST_RESULT"),u.debug(E.headers,"RES_HEADERS"),P}const b={code:E.status,success:!1,msg:E.statusText};return u.error(b),b}async stream({url:t,data:e,token:s}){e=e?{...e}:{};const n=e.buffer??void 0,o=e.boundary??void 0;n&&delete e.buffer,o&&delete e.boundary;const i=this.assemblyParameter(e),c=this.convertUrlParameter(i),a=await this.assemblyHeader({urlParams:c,token:s});n&&o&&(a["Content-Type"]=`multipart/form-data; boundary=${o}`),a.Connection="keep-alive",a["X-Accel-Buffering"]="no",a["Cache-Control"]="no-cache";const l=this.getApiUrl(t);try{const d=n?`${l}?${c}`:l,f={url:l,headers:a,params:i};u.info(f,"STREAM");const h=await fetch(d,{method:"POST",headers:a,body:n||c.toString(),credentials:"include"});if(!h.ok)throw new Error(`HTTP error! status: ${h.status}`);if(!h.body)throw new Error("No response body");return new Response(h.body,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}catch(d){throw d}}}exports.ACCOUNT_TYPE_MAP=D;exports.COOKIE_NAMES=g;exports.CURRENT_WEBSITE_KEY=O;exports.DEFAULT_LOCALE=U;exports.DEVICE_ID_KEY=I;exports.HttpClient=z;exports.USER_FORM_MAP=H;exports.USER_SEX_MAP=K;exports.USER_TYPE_MAP=A;exports.cleanToken=X;exports.dateFormat=x;exports.get=C;exports.getHttpOpts=k;exports.getHttpOptsByCookie=Y;exports.getLoginUser=J;exports.getToken=V;exports.iGet=W;exports.iPost=j;exports.iPostSuccess=G;exports.isArray=T;exports.logger=u;exports.post=w;exports.randomString=_;exports.setDefaultRequestHeader=F;exports.setToken=q;exports.urlEncode=m;exports.urlParamToJson=N;
2
2
  //# sourceMappingURL=iboot-http-client.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"iboot-http-client.cjs.js","sources":["../src/types/user.ts","../src/logger.ts","../src/utils.ts","../src/http-client.ts"],"sourcesContent":["export const ACCOUNT_TYPE_MAP = {\r\n GENERAL : 0,\r\n PHONE : 1,\r\n EMAIL : 2\r\n}\r\n\r\nexport const USER_TYPE_MAP = {\r\n TYPE_MGT : 0,\r\n TYPE_C : 1,\r\n TYPE_B : 2\r\n}\r\n\r\nexport const USER_FORM_MAP = {\r\n FROM_WEB : 1,\r\n FROM_PC : 2,\r\n FROM_WX_MINI_PRO : 3,\r\n FROM_WX_PLU : 4,\r\n FROM_WX_E : 5,\r\n FROM_APP : 6,\r\n FROM_DEVICE : 7\r\n}\r\n\r\nexport const USER_SEX_MAP = {\r\n unknown:0,\r\n male:1,\r\n female:2,\r\n}\r\n\r\nexport type ACCOUNT_TYPE = typeof ACCOUNT_TYPE_MAP[keyof typeof ACCOUNT_TYPE_MAP];\r\nexport type USER_TYPE = typeof USER_TYPE_MAP[keyof typeof USER_TYPE_MAP];\r\nexport type USER_FORM = typeof USER_FORM_MAP[keyof typeof USER_FORM_MAP];\r\nexport type USER_SEX = typeof USER_SEX_MAP[keyof typeof USER_SEX_MAP];\r\n\r\n// User interface\r\nexport interface User {\r\n id: string;\r\n name: string;\r\n userType: USER_TYPE;\r\n username?: string;\r\n nickname?: string;\r\n sex?: USER_SEX;\r\n headImg?: string;\r\n lastLoginTime?: string;\r\n tokenExpired?: string;\r\n deviceId?: string;\r\n status?: number;\r\n accountType?: number;\r\n enabled?: boolean;\r\n userFrom?: USER_FORM;\r\n needToReview?: boolean;\r\n socketOnline?: boolean;\r\n createTime?: string;\r\n mustChangePwd?: boolean;\r\n}","import pino from \"pino\";\r\nimport PinoPretty from \"pino-pretty\";\r\n// import koffi from 'koffi';\r\n\r\n// if (typeof window === 'undefined' && process.platform === 'win32') {\r\n// try {\r\n// const CP_UTF8 = 65001;\r\n// const kernel32 = koffi.load('Kernel32');\r\n// const setConsoleOutputCP = kernel32.func('SetConsoleOutputCP', 'bool', ['int']);\r\n// const setConsoleCP = kernel32.func('SetConsoleCP', 'bool', ['int']);\r\n// setConsoleOutputCP(CP_UTF8);\r\n// setConsoleCP(CP_UTF8);\r\n// } catch (e) {\r\n// console.log(e);\r\n// }\r\n// }\r\n\r\n// export const logger = pino({\r\n// name: process.env.APP_NAME ?? 'iBoot',\r\n// level: process.env.NODE_ENV !== 'production' ? 'debug' : 'info',\r\n// nestedKey: 'payload',\r\n// transport: {\r\n// target: 'pino-pretty',\r\n// options: {\r\n// colorize: true,\r\n// translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n// ignore: 'pid,hostname',\r\n// messageFormat: '{msg}',\r\n// singleLine: true,\r\n// },\r\n// }\r\n// });\r\n\r\nconst stream = PinoPretty({\r\n colorize: true,\r\n destination: process.stdout,\r\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n ignore: 'pid,hostname',\r\n messageFormat: '{msg}',\r\n singleLine: true,\r\n});\r\n\r\nexport const logger = pino({\r\n name: process.env.APP_NAME ?? 'iBoot',\r\n level: process.env.APP_ENV === 'production' ? 'info' : 'debug',\r\n nestedKey: 'payload'\r\n}, stream);","export const isArray = (obj: unknown) => {\r\n return (\r\n Array.isArray(obj) ||\r\n (typeof obj === \"object\" &&\r\n Object.prototype.toString.call(obj) === \"[object Array]\")\r\n );\r\n};\r\n\r\n/**\r\n * 生成指定长度的随机串\r\n * @param {Object} len\r\n */\r\nexport const randomString = (len: number) => {\r\n const l = len || 32;\r\n const $chars = \"ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678\";\r\n const maxPos = $chars.length;\r\n let pwd = \"\";\r\n for (let i = 0; i < l; i++) {\r\n pwd += $chars.charAt(Math.floor(Math.random() * maxPos));\r\n }\r\n return pwd;\r\n};\r\n\r\nexport const urlParamToJson = (urlQueryParams: string, exclude?: string[]): Record<string, string> => {\r\n const result: Record<string, string> = {};\r\n const strs = urlQueryParams.split(\"&\");\r\n strs.forEach((item) => {\r\n const arr = item.split(\"=\");\r\n if (arr[1]) {\r\n if (!exclude || exclude.indexOf(arr[0]) == -1) {\r\n result[arr[0]] = arr[1];\r\n }\r\n }\r\n });\r\n return result;\r\n};\r\n\r\nexport const urlEncode = (value: string | null | undefined): string => {\r\n if (!value || value == \"\" || value.length == 0) {\r\n return \"\";\r\n }\r\n return (\r\n encodeURIComponent(value)\r\n // .replace(/%20/g, '+')\r\n // .replace(/%2B/g, '\\\\+')\r\n .replace(/\\(/g, \"%28\")\r\n .replace(/\\)/g, \"%29\")\r\n .replace(/\\'/g, \"%27\")\r\n .replace(/\\!/g, \"%21\")\r\n .replace(/\\~/g, \"%7E\")\r\n );\r\n};\r\n\r\nexport const dateFormat = (dt: Date, fmt: string) => {\r\n const o:Record<string, number> = {\r\n \"M+\": dt.getMonth() + 1, //月份\r\n \"d+\": dt.getDate(), //日\r\n \"h+\": dt.getHours(), //小时\r\n \"m+\": dt.getMinutes(), //分\r\n \"s+\": dt.getSeconds(), //秒\r\n \"q+\": Math.floor((dt.getMonth() + 3) / 3), //季度\r\n S: dt.getMilliseconds(), //毫秒\r\n };\r\n if (/(y+)/.test(fmt)){\r\n const regx = new RegExp(/(y+)/);\r\n const value = regx.exec(fmt);\r\n let len = 0;\r\n if(value && value.length > 0){\r\n len = value[0].length;\r\n }\r\n fmt = fmt.replace(/(y+)/, dt.getFullYear() + \"\").substring(4 - len);\r\n }\r\n\r\n for (const k in o){\r\n const s:string = \"(\" + k + \")\";\r\n const regx = new RegExp(s);\r\n if(regx.test(fmt)){\r\n const value = regx.exec(fmt);\r\n let len = 0;\r\n if(value && value.length > 0){\r\n len = value[0].length;\r\n }\r\n fmt = fmt.replace(regx, len == 1 ? o[k].toString() : (\"00\" + o[k]).substring(o[k].toString().length))\r\n }\r\n }\r\n return fmt;\r\n}","import md5 from \"js-md5\";\r\nimport CryptoJS from 'crypto-js';\r\nimport { isArray, randomString, urlEncode, urlParamToJson } from \"./utils\";\r\nimport {\r\n ClientGetParams,\r\n ClientPostParams,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaders,\r\n HttpToken,\r\n ResultModel,\r\n ServerRequestOptions,\r\n Cookies\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\r\n\r\n\r\nexport const DEFAULT_LOCALE = 'zh-CN';\r\nexport const DEVICE_ID_KEY = \"_device_id_key\";\r\nexport const CURRENT_WEBSITE_KEY = \"_current_website_key\"\r\n\r\nconst _GET_ERROR = \"Get request error!\"\r\nconst _POST_ERROR = \"Post request error!\";\r\n\r\nexport const COOKIE_NAMES = {\r\n \"IBOOT_DEVICE_ID\":\"did\",\r\n \"IBOOT_LANG\" :\"lang\",\r\n \"IBOOT_WEBSITE_ID\":\"web_id\",\r\n \"IBOOT_WEBSITE_NO\":\"web_no\",\r\n \"IBOOT_TOKEN\":\"_t\",\r\n \"IBOOT_USER\":\"_u\"\r\n}\r\n\r\nconst HEADER_NAMES = {\r\n \"DEVICE_ID\": \"Device-Id\",\r\n \"LANG\": \"Lang\",\r\n \"WEBSITE_ID\": \"Website-Id\",\r\n \"WEBSITE_NO\": \"Website-No\",\r\n}\r\n\r\n\r\nconst getDefaultRequestHeader = (): HttpHeaders => {\r\n const devideId = localStorage.getItem(DEVICE_ID_KEY) ?? ''\r\n const json = localStorage.getItem(CURRENT_WEBSITE_KEY);\r\n const curWebsite: CurWebsite | null = json != null ? JSON.parse(json) : null;\r\n const header: HttpHeaders = {}\r\n if (devideId.length > 0) {\r\n header['Device-Id'] = devideId\r\n }\r\n if (curWebsite) {\r\n header['Lang'] = curWebsite.language;\r\n if (curWebsite.websiteId) {\r\n header['Website-Id'] = curWebsite.websiteId;\r\n }\r\n if (curWebsite.websiteNo) {\r\n header['Website-No'] = curWebsite.websiteNo\r\n }\r\n }\r\n return header;\r\n};\r\n\r\n\r\nexport const setDefaultRequestHeader = (deviceId: string, website?: CurWebsite): void => {\r\n localStorage.setItem(DEVICE_ID_KEY, deviceId);\r\n if (website) {\r\n localStorage.setItem(CURRENT_WEBSITE_KEY, JSON.stringify(website));\r\n }\r\n}\r\n\r\nexport const get = async <T>(url: string, opts?: ClientGetParams): Promise<ResultModel<T>> => {\r\n if (opts?.data) {\r\n const params = new URLSearchParams(opts.data);\r\n if (url.indexOf(\"?\") != -1) {\r\n url += `&${params}`\r\n } else {\r\n url += `?${params}`\r\n }\r\n }\r\n const headers: Record<string, string> = getDefaultRequestHeader();\r\n const heads = opts?.headers;\r\n if (heads) {\r\n for (const field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n headers[field] = value;\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": headers,\r\n }, \"GET\")\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n cache: opts?.useCache ? 'force-cache' : 'default'\r\n });\r\n\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const post = async <T>(url: string, opts?: ClientPostParams): Promise<ResultModel<T>> => {\r\n const data = opts?.data ?? {};\r\n const heads = opts?.headers;\r\n let body: string | FormData;\r\n const proxyHeaders = new Headers(getDefaultRequestHeader());\r\n if (!(data instanceof FormData)) {\r\n body = JSON.stringify(data);\r\n proxyHeaders.set('Content-Type', 'application/json');\r\n } else {\r\n body = data;\r\n }\r\n if (heads) {\r\n for (let field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n proxyHeaders.set(field, value);\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": proxyHeaders,\r\n }, \"POST\")\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: proxyHeaders,\r\n body: body,\r\n });\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const iGet = async <T>(url: string, opts?: ClientGetParams): Promise<T | undefined> => {\r\n const res = await get<T>(url, opts);\r\n if (res.success) {\r\n return res.data as T;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _GET_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _GET_ERROR)\r\n}\r\n\r\nexport const iPost = async <T>(url: string, opts?: ClientPostParams): Promise<T | undefined> => {\r\n const res = await post<T>(url, opts);\r\n if (res.success) {\r\n return res.data;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _POST_ERROR)\r\n}\r\n\r\nexport const iPostSuccess = async (url: string, opts?: ClientPostParams): Promise<boolean> => {\r\n const res = await post(url, opts);\r\n if (res.success) {\r\n if (opts?.showSuccess) {\r\n opts.showSuccess(res.msg ?? 'SUCCESS')\r\n }\r\n return true;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n }\r\n return false;\r\n}\r\n\r\n\r\nexport const getHttpOpts = (request: Request): HttpClientOpts => {\r\n const deviceId = request.headers.get(HEADER_NAMES.DEVICE_ID);\r\n const lang = request.headers.get(HEADER_NAMES.LANG);\r\n const websiteId = request.headers.get(HEADER_NAMES.WEBSITE_ID);\r\n const websiteNo = request.headers.get(HEADER_NAMES.WEBSITE_NO);\r\n const result: HttpClientOpts = {}\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport const getHttpOptsByCookie = (cookies: Cookies): HttpClientOpts => {\r\n if(!cookies.get){\r\n throw new Error('cookies get function is undefined');\r\n }\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookies.get(COOKIE_NAMES.IBOOT_DEVICE_ID);\r\n const lang = cookies.get(COOKIE_NAMES.IBOOT_LANG);\r\n const websiteId = cookies.get(COOKIE_NAMES.IBOOT_WEBSITE_ID);\r\n const websiteNo = cookies.get(COOKIE_NAMES.IBOOT_WEBSITE_NO);\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\n\r\nexport const getLoginUser = (cookies: Cookies): User | null => {\r\n if (cookies.get) {\r\n const userjson = cookies.get(COOKIE_NAMES.IBOOT_USER)\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport const getToken = (cookies: Cookies): HttpToken | undefined => {\r\n if (cookies.get) {\r\n const userjson = cookies.get(COOKIE_NAMES.IBOOT_USER);\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n const username = user.username;\r\n const utype = user.userType.toString();\r\n const token = cookies.get(COOKIE_NAMES.IBOOT_TOKEN);\r\n if (token) {\r\n return {\r\n \"username\": username,\r\n \"utype\": utype,\r\n \"token\": token\r\n }\r\n }\r\n }\r\n }\r\n return undefined\r\n}\r\n\r\nexport const setToken = (data: User & { token: string }, cookies: Cookies): void => {\r\n const { id, name, username, nickname, headImg, token, lastLoginTime, deviceId, userType, mustChangePwd } = data;\r\n const loginUser: User = {\r\n id: id,\r\n name:name,\r\n username: username,\r\n nickname: nickname || name,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n deviceId: deviceId,\r\n userType: userType,\r\n accountType: 0,\r\n needToReview: false,\r\n socketOnline: false,\r\n mustChangePwd: mustChangePwd\r\n };\r\n if (!cookies.set) {\r\n throw new Error('cookies set function is undefined')\r\n }\r\n cookies.set(COOKIE_NAMES.IBOOT_TOKEN, token, {\r\n path: '/',\r\n secure: process.env.APP_ENV === 'production',\r\n httpOnly: true,\r\n sameSite: 'strict'\r\n });\r\n cookies.set(COOKIE_NAMES.IBOOT_USER, JSON.stringify(loginUser))\r\n}\r\n\r\nexport const cleanToken = (cookies: Cookies): void => {\r\n if (!cookies.set) {\r\n throw new Error('cookies set function is undefined')\r\n }\r\n cookies.set(COOKIE_NAMES.IBOOT_TOKEN, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n cookies.set(COOKIE_NAMES.IBOOT_USER, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n if(!cookies.delete){\r\n throw new Error('cookies delete function is undefined')\r\n }\r\n cookies.delete(COOKIE_NAMES.IBOOT_TOKEN);\r\n cookies.delete(COOKIE_NAMES.IBOOT_USER);\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly baseUrl: string;\r\n private readonly helloMethod: string;\r\n private readonly apiKey: string;\r\n private readonly userType: USER_TYPE;\r\n private readonly userFrom: string;\r\n private readonly deviceId: string;\r\n private readonly version: string = '1';\r\n private readonly lang: string;\r\n private readonly websiteId?: string;\r\n private readonly websiteNo?: string;\r\n constructor(opts: Readonly<HttpClientOpts>) {\r\n const isProduction = process.env.APP_ENV === 'production';\r\n if (!isProduction) {\r\n logger.warn(\"This is currently a development environment!\")\r\n }\r\n this.baseUrl = process.env.APP_BASEURL!;\r\n this.apiKey = process.env.APP_APIKEY!;\r\n this.userFrom = process.env.APP_USERFROM ?? '1';\r\n\r\n this.helloMethod = opts.helloURL ?? ''\r\n this.userType = opts.userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.deviceId = opts.deviceId ?? randomString(10);\r\n this.lang = opts.lang ?? DEFAULT_LOCALE;\r\n this.websiteId = opts.websiteId\r\n this.websiteNo = opts.websiteNo\r\n }\r\n\r\n encrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.encrypt(data, key).toString();\r\n }\r\n\r\n decrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.decrypt(data, key, {\r\n mode: CryptoJS.mode.ECB,\r\n }).toString(CryptoJS.enc.Utf8);\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private convertUrlParameter(data: Record<string, any>): string {\r\n const p: string[] = [];\r\n for (const o in data) {\r\n let v = data[o];\r\n if (v && typeof v === \"string\") {\r\n v = v.trim();\r\n } else if (v && typeof v === \"object\") {\r\n if (isArray(v)) {\r\n if (v.length === 0) {\r\n continue;\r\n }\r\n for (let i = 0; i < v.length; i++) {\r\n const arr_item = v[i];\r\n for (const item_field in arr_item) {\r\n const item_field_value = arr_item[item_field] ?? undefined;\r\n if (item_field_value) {\r\n if (typeof item_field_value === \"object\") {\r\n if (isArray(item_field_value)) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n item_field_value.forEach((item1: any, index: number) => {\r\n if (item1) {\r\n for (const f in item1) {\r\n const v = item1[f];\r\n if (v && v.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field + `[${index.toString()}].${f}`}=${urlEncode(v)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n } else if (item_field_value.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field}=${urlEncode(item_field_value.toString())}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n for (const obj in v) {\r\n const oValue = v[obj];\r\n if (oValue != null && oValue != \"\" && oValue.length != 0) {\r\n const s = `.${obj}=${urlEncode(oValue)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n continue;\r\n } else if (v && typeof v === \"function\") {\r\n v = null;\r\n }\r\n\r\n if (v != null && v != \"\" && v.length != 0) {\r\n p.push(o + \"=\" + urlEncode(v));\r\n }\r\n }\r\n return (p && p.join(\"&\"));\r\n }\r\n\r\n private async sign(data: Record<string, object | string>): Promise<string> {\r\n //由后台分配\r\n const _apiKey = \"&key=\" + (await this.helloIboot());\r\n const arr: string[] = [];\r\n for (const o in data) {\r\n arr.push(o);\r\n }\r\n arr.sort((a: string, b: string) => {\r\n return a.toLowerCase().localeCompare(b.toLowerCase());\r\n });\r\n const res: string[] = [];\r\n arr.forEach((v: string) => {\r\n let value: object | string = data[v];\r\n if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n res.push(v + \"=\" + value);\r\n });\r\n const paramsStr: string = res.join(\"&\");\r\n const str = md5.md5((paramsStr + _apiKey).toLocaleUpperCase());\r\n const logInfo = {\r\n params: paramsStr,\r\n md5: str\r\n }\r\n logger.debug(logInfo, \"API_SIGN\")\r\n return str;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private assemblyParameter(data?: Record<string, any>, username?: string): Record<string, any> {\r\n const params = data ?? {};\r\n params['timestamp'] = Date.now() + '';\r\n params['echostr'] = randomString(10);\r\n params['version'] = this.version;\r\n params['deviceId'] = this.deviceId;\r\n params['webid'] = this.websiteId;\r\n params['apiKey'] = this.apiKey;\r\n if (username && username.length > 0) {\r\n params['username'] = username;\r\n }\r\n return params;\r\n }\r\n\r\n private async assemblyHeader({ urlParams, token }: Readonly<{ urlParams: string, token?: Readonly<HttpToken> }>) {\r\n const h: Record<string, string> = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Device-Id': this.deviceId,\r\n 'User-Type': token?.utype.toString() ?? this.userType.toString(),\r\n 'User-From': this.userFrom,\r\n 'Api-Key': this.apiKey\r\n }\r\n if (this.lang && this.lang.length > 0) {\r\n h['Lang'] = this.lang\r\n }\r\n if (this.websiteId && this.websiteId.length > 0) {\r\n h['Web-Id'] = this.websiteId\r\n }\r\n if (this.websiteNo && this.websiteNo.length > 0) {\r\n h['Web-No'] = this.websiteNo\r\n }\r\n if (token) {\r\n if (token.token && token.token.length > 0 && token.username && token.username.length > 0) {\r\n h['Authorization'] = token.token;\r\n h['Username'] = token.username;\r\n }\r\n if (token.xcsrf) {\r\n h[token.xcsrf.csrfHeader] = token.xcsrf.csrfToken;\r\n }\r\n }\r\n const data = urlParamToJson(urlParams);\r\n const sign = await this.sign(data);\r\n h['Sign'] = sign\r\n return h;\r\n }\r\n\r\n private async helloIboot(): Promise<string> {\r\n if (this.helloMethod.length <= 0) {\r\n return this.apiKey;\r\n }\r\n const api = this.getApiUrl(this.helloMethod);\r\n const h = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Api-Key': this.apiKey\r\n }\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": h\r\n }\r\n logger.debug(logInfo, \"HELLO\");\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: h,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result.data, 'HELLO RESULT')\r\n return result.data;\r\n }\r\n throw new Error('hello iBoot error!')\r\n }\r\n\r\n private getApiUrl(url: string): string {\r\n return `${this.baseUrl}/${url}`;\r\n }\r\n\r\n async csrf(): Promise<string | undefined> {\r\n const res = await this.get<CSRFToken>({\r\n url: 'guest/csrf'\r\n });\r\n if (res.success) {\r\n const data = res.data;\r\n if (data) {\r\n return data[\"csrfToken\"].toString();\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async get<T>({ url, data, token, cache = 'default' }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n const api = `${this.getApiUrl(url)}?${urlParams.toString()}`\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers\r\n }\r\n logger.info(logInfo, \"GET\");\r\n const res = await fetch(api, {\r\n \"method\": 'GET',\r\n \"headers\": headers,\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token, cache = \"default\" }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n const api = this.getApiUrl(url);\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"POST\");\r\n const urls = buffer ? `${api}?${urlParams}` : api;\r\n const res = await fetch(urls, {\r\n \"method\": 'POST',\r\n \"headers\": headers,\r\n \"body\": buffer ? buffer : urlParams.toString(),\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<Omit<ServerRequestOptions, 'cache'>>): Promise<Response> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params); //new URLSearchParams(params);\r\n\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n headers['Connection'] = 'keep-alive';\r\n headers['X-Accel-Buffering'] = 'no'; //防止 Nginx 缓存\r\n headers['Cache-Control'] = 'no-cache';\r\n const api = this.getApiUrl(url)\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"STREAM\");\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: buffer ? buffer : urlParams.toString(),\r\n credentials: 'include'\r\n });\r\n\r\n if (!res.ok) {\r\n throw new Error(`HTTP error! status: ${res.status}`);\r\n }\r\n if (!res.body) {\r\n throw new Error('No response body');\r\n }\r\n return new Response(res.body, {\r\n headers: {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive'\r\n }\r\n });\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","stream","PinoPretty","logger","pino","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","dateFormat","dt","fmt","o","k","s","regx","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","COOKIE_NAMES","HEADER_NAMES","getDefaultRequestHeader","devideId","json","curWebsite","header","setDefaultRequestHeader","deviceId","website","get","url","opts","params","headers","heads","field","response","msg","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpOpts","request","lang","websiteId","websiteNo","getHttpOptsByCookie","cookies","getLoginUser","userjson","getToken","user","username","utype","token","setToken","id","name","nickname","headImg","lastLoginTime","userType","mustChangePwd","loginUser","cleanToken","HttpClient","key","CryptoJS","p","v","arr_item","item_field","item_field_value","item1","index","oValue","_apiKey","b","paramsStr","str","md5","logInfo","urlParams","h","sign","api","cache","buffer","boundary","urls","e"],"mappings":"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"}
1
+ {"version":3,"file":"iboot-http-client.cjs.js","sources":["../src/types/user.ts","../src/logger.ts","../src/utils.ts","../src/http-client.ts"],"sourcesContent":["export const ACCOUNT_TYPE_MAP = {\r\n GENERAL : 0,\r\n PHONE : 1,\r\n EMAIL : 2\r\n}\r\n\r\nexport const USER_TYPE_MAP = {\r\n TYPE_MGT : 0,\r\n TYPE_C : 1,\r\n TYPE_B : 2\r\n}\r\n\r\nexport const USER_FORM_MAP = {\r\n FROM_WEB : 1,\r\n FROM_PC : 2,\r\n FROM_WX_MINI_PRO : 3,\r\n FROM_WX_PLU : 4,\r\n FROM_WX_E : 5,\r\n FROM_APP : 6,\r\n FROM_DEVICE : 7\r\n}\r\n\r\nexport const USER_SEX_MAP = {\r\n unknown:0,\r\n male:1,\r\n female:2,\r\n}\r\n\r\nexport type ACCOUNT_TYPE = typeof ACCOUNT_TYPE_MAP[keyof typeof ACCOUNT_TYPE_MAP];\r\nexport type USER_TYPE = typeof USER_TYPE_MAP[keyof typeof USER_TYPE_MAP];\r\nexport type USER_FORM = typeof USER_FORM_MAP[keyof typeof USER_FORM_MAP];\r\nexport type USER_SEX = typeof USER_SEX_MAP[keyof typeof USER_SEX_MAP];\r\n\r\n// User interface\r\nexport interface User {\r\n id: string;\r\n name: string;\r\n userType: USER_TYPE;\r\n username?: string;\r\n nickname?: string;\r\n sex?: USER_SEX;\r\n headImg?: string;\r\n lastLoginTime?: string;\r\n tokenExpired?: string;\r\n deviceId?: string;\r\n status?: number;\r\n accountType?: number;\r\n enabled?: boolean;\r\n userFrom?: USER_FORM;\r\n needToReview?: boolean;\r\n socketOnline?: boolean;\r\n createTime?: string;\r\n mustChangePwd?: boolean;\r\n}","import pino from \"pino\";\r\nimport PinoPretty from \"pino-pretty\";\r\n// import koffi from 'koffi';\r\n\r\n// if (typeof window === 'undefined' && process.platform === 'win32') {\r\n// try {\r\n// const CP_UTF8 = 65001;\r\n// const kernel32 = koffi.load('Kernel32');\r\n// const setConsoleOutputCP = kernel32.func('SetConsoleOutputCP', 'bool', ['int']);\r\n// const setConsoleCP = kernel32.func('SetConsoleCP', 'bool', ['int']);\r\n// setConsoleOutputCP(CP_UTF8);\r\n// setConsoleCP(CP_UTF8);\r\n// } catch (e) {\r\n// console.log(e);\r\n// }\r\n// }\r\n\r\n// export const logger = pino({\r\n// name: process.env.APP_NAME ?? 'iBoot',\r\n// level: process.env.NODE_ENV !== 'production' ? 'debug' : 'info',\r\n// nestedKey: 'payload',\r\n// transport: {\r\n// target: 'pino-pretty',\r\n// options: {\r\n// colorize: true,\r\n// translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n// ignore: 'pid,hostname',\r\n// messageFormat: '{msg}',\r\n// singleLine: true,\r\n// },\r\n// }\r\n// });\r\n\r\nconst stream = PinoPretty({\r\n colorize: true,\r\n destination: process.stdout,\r\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n ignore: 'pid,hostname',\r\n messageFormat: '{msg}',\r\n singleLine: true,\r\n});\r\n\r\nexport const logger = pino({\r\n name: process.env.APP_NAME ?? 'iBoot',\r\n level: process.env.APP_ENV === 'production' ? 'info' : 'debug',\r\n nestedKey: 'payload'\r\n}, stream);","export const isArray = (obj: unknown) => {\r\n return (\r\n Array.isArray(obj) ||\r\n (typeof obj === \"object\" &&\r\n Object.prototype.toString.call(obj) === \"[object Array]\")\r\n );\r\n};\r\n\r\n/**\r\n * 生成指定长度的随机串\r\n * @param {Object} len\r\n */\r\nexport const randomString = (len: number) => {\r\n const l = len || 32;\r\n const $chars = \"ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678\";\r\n const maxPos = $chars.length;\r\n let pwd = \"\";\r\n for (let i = 0; i < l; i++) {\r\n pwd += $chars.charAt(Math.floor(Math.random() * maxPos));\r\n }\r\n return pwd;\r\n};\r\n\r\nexport const urlParamToJson = (urlQueryParams: string, exclude?: string[]): Record<string, string> => {\r\n const result: Record<string, string> = {};\r\n const strs = urlQueryParams.split(\"&\");\r\n strs.forEach((item) => {\r\n const arr = item.split(\"=\");\r\n if (arr[1]) {\r\n if (!exclude || exclude.indexOf(arr[0]) == -1) {\r\n result[arr[0]] = arr[1];\r\n }\r\n }\r\n });\r\n return result;\r\n};\r\n\r\nexport const urlEncode = (value: string | null | undefined): string => {\r\n if (!value || value == \"\" || value.length == 0) {\r\n return \"\";\r\n }\r\n return (\r\n encodeURIComponent(value)\r\n // .replace(/%20/g, '+')\r\n // .replace(/%2B/g, '\\\\+')\r\n .replace(/\\(/g, \"%28\")\r\n .replace(/\\)/g, \"%29\")\r\n .replace(/\\'/g, \"%27\")\r\n .replace(/\\!/g, \"%21\")\r\n .replace(/\\~/g, \"%7E\")\r\n );\r\n};\r\n\r\nexport const dateFormat = (dt: Date, fmt: string) => {\r\n const o:Record<string, number> = {\r\n \"M+\": dt.getMonth() + 1, //月份\r\n \"d+\": dt.getDate(), //日\r\n \"h+\": dt.getHours(), //小时\r\n \"m+\": dt.getMinutes(), //分\r\n \"s+\": dt.getSeconds(), //秒\r\n \"q+\": Math.floor((dt.getMonth() + 3) / 3), //季度\r\n S: dt.getMilliseconds(), //毫秒\r\n };\r\n if (/(y+)/.test(fmt)){\r\n const regx = new RegExp(/(y+)/);\r\n const value = regx.exec(fmt);\r\n let len = 0;\r\n if(value && value.length > 0){\r\n len = value[0].length;\r\n }\r\n fmt = fmt.replace(/(y+)/, dt.getFullYear() + \"\").substring(4 - len);\r\n }\r\n\r\n for (const k in o){\r\n const s:string = \"(\" + k + \")\";\r\n const regx = new RegExp(s);\r\n if(regx.test(fmt)){\r\n const value = regx.exec(fmt);\r\n let len = 0;\r\n if(value && value.length > 0){\r\n len = value[0].length;\r\n }\r\n fmt = fmt.replace(regx, len == 1 ? o[k].toString() : (\"00\" + o[k]).substring(o[k].toString().length))\r\n }\r\n }\r\n return fmt;\r\n}","import md5 from \"js-md5\";\r\nimport CryptoJS from 'crypto-js';\r\nimport { isArray, randomString, urlEncode, urlParamToJson } from \"./utils\";\r\nimport {\r\n ClientGetParams,\r\n ClientPostParams,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaders,\r\n HttpToken,\r\n ResultModel,\r\n ServerRequestOptions,\r\n Cookies\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\r\n\r\n\r\nexport const DEFAULT_LOCALE = 'zh-CN';\r\nexport const DEVICE_ID_KEY = \"_device_id_key\";\r\nexport const CURRENT_WEBSITE_KEY = \"_current_website_key\"\r\n\r\nconst _GET_ERROR = \"Get request error!\"\r\nconst _POST_ERROR = \"Post request error!\";\r\n\r\nexport const COOKIE_NAMES = {\r\n \"IBOOT_DEVICE_ID\":\"did\",\r\n \"IBOOT_LANG\" :\"lang\",\r\n \"IBOOT_WEBSITE_ID\":\"web_id\",\r\n \"IBOOT_WEBSITE_NO\":\"web_no\",\r\n \"IBOOT_TOKEN\":\"_t\",\r\n \"IBOOT_USER\":\"_u\"\r\n}\r\n\r\nconst HEADER_NAMES = {\r\n \"DEVICE_ID\": \"Device-Id\",\r\n \"LANG\": \"Lang\",\r\n \"WEBSITE_ID\": \"Website-Id\",\r\n \"WEBSITE_NO\": \"Website-No\",\r\n}\r\n\r\n\r\nconst getDefaultRequestHeader = (): HttpHeaders => {\r\n const devideId = localStorage.getItem(DEVICE_ID_KEY) ?? ''\r\n const json = localStorage.getItem(CURRENT_WEBSITE_KEY);\r\n const curWebsite: CurWebsite | null = json != null ? JSON.parse(json) : null;\r\n const header: HttpHeaders = {}\r\n if (devideId.length > 0) {\r\n header['Device-Id'] = devideId\r\n }\r\n if (curWebsite) {\r\n header['Lang'] = curWebsite.language;\r\n if (curWebsite.websiteId) {\r\n header['Website-Id'] = curWebsite.websiteId;\r\n }\r\n if (curWebsite.websiteNo) {\r\n header['Website-No'] = curWebsite.websiteNo\r\n }\r\n }\r\n return header;\r\n};\r\n\r\n\r\nexport const setDefaultRequestHeader = (deviceId: string, website?: CurWebsite): void => {\r\n localStorage.setItem(DEVICE_ID_KEY, deviceId);\r\n if (website) {\r\n localStorage.setItem(CURRENT_WEBSITE_KEY, JSON.stringify(website));\r\n }\r\n}\r\n\r\nexport const get = async <T>(url: string, opts?: ClientGetParams): Promise<ResultModel<T>> => {\r\n if (opts?.data) {\r\n const params = new URLSearchParams(opts.data);\r\n if (url.indexOf(\"?\") != -1) {\r\n url += `&${params}`\r\n } else {\r\n url += `?${params}`\r\n }\r\n }\r\n const headers: Record<string, string> = getDefaultRequestHeader();\r\n const heads = opts?.headers;\r\n if (heads) {\r\n for (const field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n headers[field] = value;\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": headers,\r\n }, \"GET\")\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n cache: opts?.useCache ? 'force-cache' : 'default'\r\n });\r\n\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const post = async <T>(url: string, opts?: ClientPostParams): Promise<ResultModel<T>> => {\r\n const data = opts?.data ?? {};\r\n const heads = opts?.headers;\r\n let body: string | FormData;\r\n const proxyHeaders = new Headers(getDefaultRequestHeader());\r\n if (!(data instanceof FormData)) {\r\n body = JSON.stringify(data);\r\n proxyHeaders.set('Content-Type', 'application/json');\r\n } else {\r\n body = data;\r\n }\r\n if (heads) {\r\n for (let field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n proxyHeaders.set(field, value);\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": proxyHeaders,\r\n }, \"POST\")\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: proxyHeaders,\r\n body: body,\r\n });\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const iGet = async <T>(url: string, opts?: ClientGetParams): Promise<T | undefined> => {\r\n const res = await get<T>(url, opts);\r\n if (res.success) {\r\n return res.data as T;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _GET_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _GET_ERROR)\r\n}\r\n\r\nexport const iPost = async <T>(url: string, opts?: ClientPostParams): Promise<T | undefined> => {\r\n const res = await post<T>(url, opts);\r\n if (res.success) {\r\n return res.data;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _POST_ERROR)\r\n}\r\n\r\nexport const iPostSuccess = async (url: string, opts?: ClientPostParams): Promise<boolean> => {\r\n const res = await post(url, opts);\r\n if (res.success) {\r\n if (opts?.showSuccess) {\r\n opts.showSuccess(res.msg ?? 'SUCCESS')\r\n }\r\n return true;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n }\r\n return false;\r\n}\r\n\r\n\r\nexport const getHttpOpts = (request: Request): HttpClientOpts => {\r\n const deviceId = request.headers.get(HEADER_NAMES.DEVICE_ID);\r\n const lang = request.headers.get(HEADER_NAMES.LANG);\r\n const websiteId = request.headers.get(HEADER_NAMES.WEBSITE_ID);\r\n const websiteNo = request.headers.get(HEADER_NAMES.WEBSITE_NO);\r\n const result: HttpClientOpts = {}\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport const getHttpOptsByCookie = (cookies: Cookies): HttpClientOpts => {\r\n if(!cookies.get){\r\n throw new Error('cookies get function is undefined');\r\n }\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookies.get(COOKIE_NAMES.IBOOT_DEVICE_ID);\r\n const lang = cookies.get(COOKIE_NAMES.IBOOT_LANG);\r\n const websiteId = cookies.get(COOKIE_NAMES.IBOOT_WEBSITE_ID);\r\n const websiteNo = cookies.get(COOKIE_NAMES.IBOOT_WEBSITE_NO);\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\n\r\nexport const getLoginUser = (cookies: Cookies): User | null => {\r\n if (cookies.get) {\r\n const userjson = cookies.get(COOKIE_NAMES.IBOOT_USER)\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport const getToken = (cookies: Cookies): HttpToken | undefined => {\r\n if (cookies.get) {\r\n const userjson = cookies.get(COOKIE_NAMES.IBOOT_USER);\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n const username = user.username;\r\n const utype = user.userType.toString();\r\n const token = cookies.get(COOKIE_NAMES.IBOOT_TOKEN);\r\n if (token) {\r\n return {\r\n \"username\": username,\r\n \"utype\": utype,\r\n \"token\": token\r\n }\r\n }\r\n }\r\n }\r\n return undefined\r\n}\r\n\r\nexport const setToken = (data: User & { token: string }, cookies: Cookies): void => {\r\n const { id, name, username, nickname, headImg, token, lastLoginTime, deviceId, userType, mustChangePwd } = data;\r\n const loginUser: User = {\r\n id: id,\r\n name:name,\r\n username: username,\r\n nickname: nickname || name,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n deviceId: deviceId,\r\n userType: userType,\r\n accountType: 0,\r\n needToReview: false,\r\n socketOnline: false,\r\n mustChangePwd: mustChangePwd\r\n };\r\n if (!cookies.set) {\r\n throw new Error('cookies set function is undefined')\r\n }\r\n cookies.set(COOKIE_NAMES.IBOOT_TOKEN, token, {\r\n path: '/',\r\n secure: process.env.APP_ENV === 'production',\r\n httpOnly: true,\r\n sameSite: 'strict'\r\n });\r\n cookies.set(COOKIE_NAMES.IBOOT_USER, JSON.stringify(loginUser))\r\n}\r\n\r\nexport const cleanToken = (cookies: Cookies): void => {\r\n if (!cookies.set) {\r\n throw new Error('cookies set function is undefined')\r\n }\r\n cookies.set(COOKIE_NAMES.IBOOT_TOKEN, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n cookies.set(COOKIE_NAMES.IBOOT_USER, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n if(!cookies.delete){\r\n throw new Error('cookies delete function is undefined')\r\n }\r\n cookies.delete(COOKIE_NAMES.IBOOT_TOKEN);\r\n cookies.delete(COOKIE_NAMES.IBOOT_USER);\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly baseUrl: string;\r\n private readonly helloMethod: string;\r\n private readonly apiKey: string;\r\n private readonly userType: USER_TYPE;\r\n private readonly userFrom: string;\r\n private readonly deviceId: string;\r\n private readonly version: string = '1';\r\n private readonly lang: string;\r\n private readonly websiteId?: string;\r\n private readonly websiteNo?: string;\r\n constructor(opts: Readonly<HttpClientOpts>) {\r\n const isProduction = process.env.APP_ENV === 'production';\r\n if (!isProduction) {\r\n logger.warn(\"This is currently a development environment!\")\r\n }\r\n this.baseUrl = process.env.APP_BASEURL!;\r\n this.apiKey = process.env.APP_APIKEY!;\r\n this.userFrom = process.env.APP_USERFROM ?? '1';\r\n\r\n this.helloMethod = opts.helloURL ?? ''\r\n this.userType = opts.userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.deviceId = opts.deviceId ?? randomString(10);\r\n this.lang = opts.lang ?? DEFAULT_LOCALE;\r\n this.websiteId = opts.websiteId\r\n this.websiteNo = opts.websiteNo\r\n }\r\n\r\n encrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.encrypt(data, key).toString();\r\n }\r\n\r\n decrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.decrypt(data, key, {\r\n mode: CryptoJS.mode.ECB,\r\n }).toString(CryptoJS.enc.Utf8);\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private convertUrlParameter(data: Record<string, any>): string {\r\n const p: string[] = [];\r\n for (const o in data) {\r\n let v = data[o];\r\n if (v && typeof v === \"string\") {\r\n v = v.trim();\r\n } else if (v && typeof v === \"object\") {\r\n if (isArray(v)) {\r\n if (v.length === 0) {\r\n continue;\r\n }\r\n for (let i = 0; i < v.length; i++) {\r\n const arr_item = v[i];\r\n for (const item_field in arr_item) {\r\n const item_field_value = arr_item[item_field] ?? undefined;\r\n if (item_field_value) {\r\n if (typeof item_field_value === \"object\") {\r\n if (isArray(item_field_value)) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n item_field_value.forEach((item1: any, index: number) => {\r\n if (item1) {\r\n for (const f in item1) {\r\n const v = item1[f];\r\n if (v && v.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field + `[${index.toString()}].${f}`}=${urlEncode(v)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n } else if (item_field_value.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field}=${urlEncode(item_field_value.toString())}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n for (const obj in v) {\r\n const oValue = v[obj];\r\n if (oValue != null && oValue != \"\" && oValue.length != 0) {\r\n const s = `.${obj}=${urlEncode(oValue)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n continue;\r\n } else if (v && typeof v === \"function\") {\r\n v = null;\r\n }\r\n\r\n if (v != null && v != \"\" && v.length != 0) {\r\n p.push(o + \"=\" + urlEncode(v));\r\n }\r\n }\r\n return (p && p.join(\"&\"));\r\n }\r\n\r\n private async sign(data: Record<string, object | string>): Promise<string> {\r\n //由后台分配\r\n const _apiKey = \"&key=\" + (await this.helloIboot());\r\n const arr: string[] = [];\r\n for (const o in data) {\r\n arr.push(o);\r\n }\r\n arr.sort((a: string, b: string) => {\r\n return a.toLowerCase().localeCompare(b.toLowerCase());\r\n });\r\n const res: string[] = [];\r\n arr.forEach((v: string) => {\r\n let value: object | string = data[v];\r\n if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n res.push(v + \"=\" + value);\r\n });\r\n const paramsStr: string = res.join(\"&\");\r\n const str = md5.md5((paramsStr + _apiKey).toLocaleUpperCase());\r\n const logInfo = {\r\n params: paramsStr,\r\n md5: str\r\n }\r\n logger.debug(logInfo, \"API_SIGN\")\r\n return str;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private assemblyParameter(data?: Record<string, any>, username?: string): Record<string, any> {\r\n const params = data ?? {};\r\n params['timestamp'] = Date.now() + '';\r\n params['echostr'] = randomString(10);\r\n params['version'] = this.version;\r\n params['deviceId'] = this.deviceId;\r\n params['webid'] = this.websiteId;\r\n params['apiKey'] = this.apiKey;\r\n if (username && username.length > 0) {\r\n params['username'] = username;\r\n }\r\n return params;\r\n }\r\n\r\n private async assemblyHeader({ urlParams, token }: Readonly<{ urlParams: string, token?: Readonly<HttpToken> }>) {\r\n const h: Record<string, string> = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Device-Id': this.deviceId,\r\n 'User-Type': token?.utype.toString() ?? this.userType.toString(),\r\n 'User-From': this.userFrom,\r\n 'Api-Key': this.apiKey\r\n }\r\n if (this.lang && this.lang.length > 0) {\r\n h['Lang'] = this.lang\r\n }\r\n if (this.websiteId && this.websiteId.length > 0) {\r\n h['Web-Id'] = this.websiteId\r\n }\r\n if (this.websiteNo && this.websiteNo.length > 0) {\r\n h['Web-No'] = this.websiteNo\r\n }\r\n if (token) {\r\n if (token.token && token.token.length > 0 && token.username && token.username.length > 0) {\r\n h['Authorization'] = token.token;\r\n h['Username'] = token.username;\r\n }\r\n if (token.xcsrf) {\r\n h[token.xcsrf.csrfHeader] = token.xcsrf.csrfToken;\r\n }\r\n }\r\n const data = urlParamToJson(urlParams);\r\n const sign = await this.sign(data);\r\n h['Sign'] = sign\r\n return h;\r\n }\r\n\r\n private async helloIboot(): Promise<string> {\r\n if (this.helloMethod.length <= 0) {\r\n return this.apiKey;\r\n }\r\n const api = this.getApiUrl(this.helloMethod);\r\n const h = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Api-Key': this.apiKey\r\n }\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": h\r\n }\r\n logger.debug(logInfo, \"HELLO\");\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: h,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result.data, 'HELLO RESULT')\r\n return result.data;\r\n }\r\n throw new Error('hello iBoot error!')\r\n }\r\n\r\n private getApiUrl(url: string): string {\r\n return `${this.baseUrl}/${url}`;\r\n }\r\n\r\n async csrf(): Promise<string | undefined> {\r\n const res = await this.get<CSRFToken>({\r\n url: 'guest/csrf'\r\n });\r\n if (res.success) {\r\n const data = res.data;\r\n if (data) {\r\n return data[\"csrfToken\"].toString();\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async get<T>({ url, data, token, cache = 'default' }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n const api = `${this.getApiUrl(url)}?${urlParams.toString()}`\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers\r\n }\r\n logger.info(logInfo, \"GET\");\r\n const res = await fetch(api, {\r\n \"method\": 'GET',\r\n \"headers\": headers,\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n logger.debug(res.headers, \"RES_HEADERS\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token, cache = \"default\" }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n const api = this.getApiUrl(url);\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"POST\");\r\n const urls = buffer ? `${api}?${urlParams}` : api;\r\n const res = await fetch(urls, {\r\n \"method\": 'POST',\r\n \"headers\": headers,\r\n \"body\": buffer ? buffer : urlParams.toString(),\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"POST_RESULT\");\r\n logger.debug(res.headers, \"RES_HEADERS\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<Omit<ServerRequestOptions, 'cache'>>): Promise<Response> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params); //new URLSearchParams(params);\r\n\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n headers['Connection'] = 'keep-alive';\r\n headers['X-Accel-Buffering'] = 'no'; //防止 Nginx 缓存\r\n headers['Cache-Control'] = 'no-cache';\r\n const api = this.getApiUrl(url)\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"STREAM\");\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: buffer ? buffer : urlParams.toString(),\r\n credentials: 'include'\r\n });\r\n\r\n if (!res.ok) {\r\n throw new Error(`HTTP error! status: ${res.status}`);\r\n }\r\n if (!res.body) {\r\n throw new Error('No response body');\r\n }\r\n return new Response(res.body, {\r\n headers: {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive'\r\n }\r\n });\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","stream","PinoPretty","logger","pino","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","dateFormat","dt","fmt","o","k","s","regx","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","COOKIE_NAMES","HEADER_NAMES","getDefaultRequestHeader","devideId","json","curWebsite","header","setDefaultRequestHeader","deviceId","website","get","url","opts","params","headers","heads","field","response","msg","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpOpts","request","lang","websiteId","websiteNo","getHttpOptsByCookie","cookies","getLoginUser","userjson","getToken","user","username","utype","token","setToken","id","name","nickname","headImg","lastLoginTime","userType","mustChangePwd","loginUser","cleanToken","HttpClient","key","CryptoJS","p","v","arr_item","item_field","item_field_value","item1","index","oValue","_apiKey","b","paramsStr","str","md5","logInfo","urlParams","h","sign","api","cache","buffer","boundary","urls","e"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import v from "pino";
2
- import A from "pino-pretty";
1
+ import N from "pino";
2
+ import v from "pino-pretty";
3
3
  import U from "js-md5";
4
- import E from "crypto-js";
4
+ import p from "crypto-js";
5
5
  const W = {
6
6
  GENERAL: 0,
7
7
  PHONE: 1,
@@ -22,18 +22,18 @@ const W = {
22
22
  unknown: 0,
23
23
  male: 1,
24
24
  female: 2
25
- }, B = A({
25
+ }, B = v({
26
26
  colorize: !0,
27
27
  destination: process.stdout,
28
28
  translateTime: "SYS:yyyy-mm-dd HH:MM:ss",
29
29
  ignore: "pid,hostname",
30
30
  messageFormat: "{msg}",
31
31
  singleLine: !0
32
- }), u = v({
32
+ }), u = N({
33
33
  name: process.env.APP_NAME ?? "iBoot",
34
34
  level: process.env.APP_ENV === "production" ? "info" : "debug",
35
35
  nestedKey: "payload"
36
- }, B), _ = (r) => Array.isArray(r) || typeof r == "object" && Object.prototype.toString.call(r) === "[object Array]", O = (r) => {
36
+ }, B), w = (r) => Array.isArray(r) || typeof r == "object" && Object.prototype.toString.call(r) === "[object Array]", O = (r) => {
37
37
  const t = r || 32, e = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678", s = e.length;
38
38
  let n = "";
39
39
  for (let o = 0; o < t; o++)
@@ -76,7 +76,7 @@ const W = {
76
76
  }
77
77
  }
78
78
  return t;
79
- }, L = "zh-CN", S = "_device_id_key", P = "_current_website_key", b = "Get request error!", T = "Post request error!", f = {
79
+ }, L = "zh-CN", b = "_device_id_key", P = "_current_website_key", S = "Get request error!", T = "Post request error!", f = {
80
80
  IBOOT_DEVICE_ID: "did",
81
81
  IBOOT_LANG: "lang",
82
82
  IBOOT_WEBSITE_ID: "web_id",
@@ -88,17 +88,17 @@ const W = {
88
88
  LANG: "Lang",
89
89
  WEBSITE_ID: "Website-Id",
90
90
  WEBSITE_NO: "Website-No"
91
- }, N = () => {
92
- const r = localStorage.getItem(S) ?? "", t = localStorage.getItem(P), e = t != null ? JSON.parse(t) : null, s = {};
91
+ }, R = () => {
92
+ const r = localStorage.getItem(b) ?? "", t = localStorage.getItem(P), e = t != null ? JSON.parse(t) : null, s = {};
93
93
  return r.length > 0 && (s["Device-Id"] = r), e && (s.Lang = e.language, e.websiteId && (s["Website-Id"] = e.websiteId), e.websiteNo && (s["Website-No"] = e.websiteNo)), s;
94
94
  }, k = (r, t) => {
95
- localStorage.setItem(S, r), t && localStorage.setItem(P, JSON.stringify(t));
95
+ localStorage.setItem(b, r), t && localStorage.setItem(P, JSON.stringify(t));
96
96
  }, D = async (r, t) => {
97
97
  if (t?.data) {
98
98
  const i = new URLSearchParams(t.data);
99
99
  r.indexOf("?") != -1 ? r += `&${i}` : r += `?${i}`;
100
100
  }
101
- const e = N(), s = t?.headers;
101
+ const e = R(), s = t?.headers;
102
102
  if (s)
103
103
  for (const i in s) {
104
104
  const c = s[i];
@@ -123,10 +123,10 @@ const W = {
123
123
  msg: n.statusText
124
124
  };
125
125
  return u.error(o), o;
126
- }, R = async (r, t) => {
126
+ }, A = async (r, t) => {
127
127
  const e = t?.data ?? {}, s = t?.headers;
128
128
  let n;
129
- const o = new Headers(N());
129
+ const o = new Headers(R());
130
130
  if (e instanceof FormData ? n = e : (n = JSON.stringify(e), o.set("Content-Type", "application/json")), s)
131
131
  for (let a in s) {
132
132
  const l = s[a];
@@ -156,12 +156,12 @@ const W = {
156
156
  if (e.success)
157
157
  return e.data;
158
158
  if (t?.showError) {
159
- t.showError(e.msg ?? b);
159
+ t.showError(e.msg ?? S);
160
160
  return;
161
161
  }
162
- throw Error(e.msg ?? b);
162
+ throw Error(e.msg ?? S);
163
163
  }, J = async (r, t) => {
164
- const e = await R(r, t);
164
+ const e = await A(r, t);
165
165
  if (e.success)
166
166
  return e.data;
167
167
  if (t?.showError) {
@@ -170,7 +170,7 @@ const W = {
170
170
  }
171
171
  throw Error(e.msg ?? T);
172
172
  }, V = async (r, t) => {
173
- const e = await R(r, t);
173
+ const e = await A(r, t);
174
174
  return e.success ? (t?.showSuccess && t.showSuccess(e.msg ?? "SUCCESS"), !0) : (t?.showError && t.showError(e.msg ?? T), !1);
175
175
  }, X = (r) => {
176
176
  const t = r.headers.get(y.DEVICE_ID), e = r.headers.get(y.LANG), s = r.headers.get(y.WEBSITE_ID), n = r.headers.get(y.WEBSITE_NO), o = {};
@@ -255,14 +255,14 @@ class te {
255
255
  process.env.APP_ENV === "production" || u.warn("This is currently a development environment!"), this.baseUrl = process.env.APP_BASEURL, this.apiKey = process.env.APP_APIKEY, this.userFrom = process.env.APP_USERFROM ?? "1", this.helloMethod = t.helloURL ?? "", this.userType = t.userType ?? C.TYPE_MGT, this.deviceId = t.deviceId ?? O(10), this.lang = t.lang ?? L, this.websiteId = t.websiteId, this.websiteNo = t.websiteNo;
256
256
  }
257
257
  encrypt(t) {
258
- const e = E.enc.Utf8.parse(this.apiKey);
259
- return E.AES.encrypt(t, e).toString();
258
+ const e = p.enc.Utf8.parse(this.apiKey);
259
+ return p.AES.encrypt(t, e).toString();
260
260
  }
261
261
  decrypt(t) {
262
- const e = E.enc.Utf8.parse(this.apiKey);
263
- return E.AES.decrypt(t, e, {
264
- mode: E.mode.ECB
265
- }).toString(E.enc.Utf8);
262
+ const e = p.enc.Utf8.parse(this.apiKey);
263
+ return p.AES.decrypt(t, e, {
264
+ mode: p.mode.ECB
265
+ }).toString(p.enc.Utf8);
266
266
  }
267
267
  //eslint-disable-next-line @typescript-eslint/no-explicit-any
268
268
  convertUrlParameter(t) {
@@ -272,7 +272,7 @@ class te {
272
272
  if (n && typeof n == "string")
273
273
  n = n.trim();
274
274
  else if (n && typeof n == "object") {
275
- if (_(n)) {
275
+ if (w(n)) {
276
276
  if (n.length === 0)
277
277
  continue;
278
278
  for (let o = 0; o < n.length; o++) {
@@ -281,13 +281,13 @@ class te {
281
281
  const a = i[c] ?? void 0;
282
282
  if (a) {
283
283
  if (typeof a == "object")
284
- _(a) && a.forEach((l, h) => {
284
+ w(a) && a.forEach((l, h) => {
285
285
  if (l)
286
286
  for (const g in l) {
287
287
  const d = l[g];
288
288
  if (d && d.toString().length > 0) {
289
- const p = `[${o.toString()}].${c + `[${h.toString()}].${g}`}=${m(d)}`;
290
- e.push(s + p);
289
+ const E = `[${o.toString()}].${c + `[${h.toString()}].${g}`}=${m(d)}`;
290
+ e.push(s + E);
291
291
  }
292
292
  }
293
293
  });
@@ -398,7 +398,7 @@ class te {
398
398
  });
399
399
  if (h.ok) {
400
400
  const d = await h.json();
401
- return u.debug(d, "GET_RESULT"), d;
401
+ return u.debug(d, "GET_RESULT"), u.debug(h.headers, "RES_HEADERS"), d;
402
402
  }
403
403
  const g = {
404
404
  code: h.status,
@@ -420,21 +420,21 @@ class te {
420
420
  params: c
421
421
  };
422
422
  u.info(g, "POST");
423
- const d = o ? `${h}?${a}` : h, p = await fetch(d, {
423
+ const d = o ? `${h}?${a}` : h, E = await fetch(d, {
424
424
  method: "POST",
425
425
  headers: l,
426
426
  body: o || a.toString(),
427
427
  credentials: "include",
428
428
  cache: n
429
429
  });
430
- if (p.ok) {
431
- const w = await p.json();
432
- return u.debug(w, "POST_RESULT"), w;
430
+ if (E.ok) {
431
+ const _ = await E.json();
432
+ return u.debug(_, "POST_RESULT"), u.debug(E.headers, "RES_HEADERS"), _;
433
433
  }
434
434
  const I = {
435
- code: p.status,
435
+ code: E.status,
436
436
  success: !1,
437
- msg: p.statusText
437
+ msg: E.statusText
438
438
  };
439
439
  return u.error(I), I;
440
440
  }
@@ -480,7 +480,7 @@ export {
480
480
  f as COOKIE_NAMES,
481
481
  P as CURRENT_WEBSITE_KEY,
482
482
  L as DEFAULT_LOCALE,
483
- S as DEVICE_ID_KEY,
483
+ b as DEVICE_ID_KEY,
484
484
  te as HttpClient,
485
485
  j as USER_FORM_MAP,
486
486
  F as USER_SEX_MAP,
@@ -495,9 +495,9 @@ export {
495
495
  Y as iGet,
496
496
  J as iPost,
497
497
  V as iPostSuccess,
498
- _ as isArray,
498
+ w as isArray,
499
499
  u as logger,
500
- R as post,
500
+ A as post,
501
501
  O as randomString,
502
502
  k as setDefaultRequestHeader,
503
503
  Z as setToken,
@@ -1 +1 @@
1
- {"version":3,"file":"iboot-http-client.es.js","sources":["../src/types/user.ts","../src/logger.ts","../src/utils.ts","../src/http-client.ts"],"sourcesContent":["export const ACCOUNT_TYPE_MAP = {\r\n GENERAL : 0,\r\n PHONE : 1,\r\n EMAIL : 2\r\n}\r\n\r\nexport const USER_TYPE_MAP = {\r\n TYPE_MGT : 0,\r\n TYPE_C : 1,\r\n TYPE_B : 2\r\n}\r\n\r\nexport const USER_FORM_MAP = {\r\n FROM_WEB : 1,\r\n FROM_PC : 2,\r\n FROM_WX_MINI_PRO : 3,\r\n FROM_WX_PLU : 4,\r\n FROM_WX_E : 5,\r\n FROM_APP : 6,\r\n FROM_DEVICE : 7\r\n}\r\n\r\nexport const USER_SEX_MAP = {\r\n unknown:0,\r\n male:1,\r\n female:2,\r\n}\r\n\r\nexport type ACCOUNT_TYPE = typeof ACCOUNT_TYPE_MAP[keyof typeof ACCOUNT_TYPE_MAP];\r\nexport type USER_TYPE = typeof USER_TYPE_MAP[keyof typeof USER_TYPE_MAP];\r\nexport type USER_FORM = typeof USER_FORM_MAP[keyof typeof USER_FORM_MAP];\r\nexport type USER_SEX = typeof USER_SEX_MAP[keyof typeof USER_SEX_MAP];\r\n\r\n// User interface\r\nexport interface User {\r\n id: string;\r\n name: string;\r\n userType: USER_TYPE;\r\n username?: string;\r\n nickname?: string;\r\n sex?: USER_SEX;\r\n headImg?: string;\r\n lastLoginTime?: string;\r\n tokenExpired?: string;\r\n deviceId?: string;\r\n status?: number;\r\n accountType?: number;\r\n enabled?: boolean;\r\n userFrom?: USER_FORM;\r\n needToReview?: boolean;\r\n socketOnline?: boolean;\r\n createTime?: string;\r\n mustChangePwd?: boolean;\r\n}","import pino from \"pino\";\r\nimport PinoPretty from \"pino-pretty\";\r\n// import koffi from 'koffi';\r\n\r\n// if (typeof window === 'undefined' && process.platform === 'win32') {\r\n// try {\r\n// const CP_UTF8 = 65001;\r\n// const kernel32 = koffi.load('Kernel32');\r\n// const setConsoleOutputCP = kernel32.func('SetConsoleOutputCP', 'bool', ['int']);\r\n// const setConsoleCP = kernel32.func('SetConsoleCP', 'bool', ['int']);\r\n// setConsoleOutputCP(CP_UTF8);\r\n// setConsoleCP(CP_UTF8);\r\n// } catch (e) {\r\n// console.log(e);\r\n// }\r\n// }\r\n\r\n// export const logger = pino({\r\n// name: process.env.APP_NAME ?? 'iBoot',\r\n// level: process.env.NODE_ENV !== 'production' ? 'debug' : 'info',\r\n// nestedKey: 'payload',\r\n// transport: {\r\n// target: 'pino-pretty',\r\n// options: {\r\n// colorize: true,\r\n// translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n// ignore: 'pid,hostname',\r\n// messageFormat: '{msg}',\r\n// singleLine: true,\r\n// },\r\n// }\r\n// });\r\n\r\nconst stream = PinoPretty({\r\n colorize: true,\r\n destination: process.stdout,\r\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n ignore: 'pid,hostname',\r\n messageFormat: '{msg}',\r\n singleLine: true,\r\n});\r\n\r\nexport const logger = pino({\r\n name: process.env.APP_NAME ?? 'iBoot',\r\n level: process.env.APP_ENV === 'production' ? 'info' : 'debug',\r\n nestedKey: 'payload'\r\n}, stream);","export const isArray = (obj: unknown) => {\r\n return (\r\n Array.isArray(obj) ||\r\n (typeof obj === \"object\" &&\r\n Object.prototype.toString.call(obj) === \"[object Array]\")\r\n );\r\n};\r\n\r\n/**\r\n * 生成指定长度的随机串\r\n * @param {Object} len\r\n */\r\nexport const randomString = (len: number) => {\r\n const l = len || 32;\r\n const $chars = \"ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678\";\r\n const maxPos = $chars.length;\r\n let pwd = \"\";\r\n for (let i = 0; i < l; i++) {\r\n pwd += $chars.charAt(Math.floor(Math.random() * maxPos));\r\n }\r\n return pwd;\r\n};\r\n\r\nexport const urlParamToJson = (urlQueryParams: string, exclude?: string[]): Record<string, string> => {\r\n const result: Record<string, string> = {};\r\n const strs = urlQueryParams.split(\"&\");\r\n strs.forEach((item) => {\r\n const arr = item.split(\"=\");\r\n if (arr[1]) {\r\n if (!exclude || exclude.indexOf(arr[0]) == -1) {\r\n result[arr[0]] = arr[1];\r\n }\r\n }\r\n });\r\n return result;\r\n};\r\n\r\nexport const urlEncode = (value: string | null | undefined): string => {\r\n if (!value || value == \"\" || value.length == 0) {\r\n return \"\";\r\n }\r\n return (\r\n encodeURIComponent(value)\r\n // .replace(/%20/g, '+')\r\n // .replace(/%2B/g, '\\\\+')\r\n .replace(/\\(/g, \"%28\")\r\n .replace(/\\)/g, \"%29\")\r\n .replace(/\\'/g, \"%27\")\r\n .replace(/\\!/g, \"%21\")\r\n .replace(/\\~/g, \"%7E\")\r\n );\r\n};\r\n\r\nexport const dateFormat = (dt: Date, fmt: string) => {\r\n const o:Record<string, number> = {\r\n \"M+\": dt.getMonth() + 1, //月份\r\n \"d+\": dt.getDate(), //日\r\n \"h+\": dt.getHours(), //小时\r\n \"m+\": dt.getMinutes(), //分\r\n \"s+\": dt.getSeconds(), //秒\r\n \"q+\": Math.floor((dt.getMonth() + 3) / 3), //季度\r\n S: dt.getMilliseconds(), //毫秒\r\n };\r\n if (/(y+)/.test(fmt)){\r\n const regx = new RegExp(/(y+)/);\r\n const value = regx.exec(fmt);\r\n let len = 0;\r\n if(value && value.length > 0){\r\n len = value[0].length;\r\n }\r\n fmt = fmt.replace(/(y+)/, dt.getFullYear() + \"\").substring(4 - len);\r\n }\r\n\r\n for (const k in o){\r\n const s:string = \"(\" + k + \")\";\r\n const regx = new RegExp(s);\r\n if(regx.test(fmt)){\r\n const value = regx.exec(fmt);\r\n let len = 0;\r\n if(value && value.length > 0){\r\n len = value[0].length;\r\n }\r\n fmt = fmt.replace(regx, len == 1 ? o[k].toString() : (\"00\" + o[k]).substring(o[k].toString().length))\r\n }\r\n }\r\n return fmt;\r\n}","import md5 from \"js-md5\";\r\nimport CryptoJS from 'crypto-js';\r\nimport { isArray, randomString, urlEncode, urlParamToJson } from \"./utils\";\r\nimport {\r\n ClientGetParams,\r\n ClientPostParams,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaders,\r\n HttpToken,\r\n ResultModel,\r\n ServerRequestOptions,\r\n Cookies\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\r\n\r\n\r\nexport const DEFAULT_LOCALE = 'zh-CN';\r\nexport const DEVICE_ID_KEY = \"_device_id_key\";\r\nexport const CURRENT_WEBSITE_KEY = \"_current_website_key\"\r\n\r\nconst _GET_ERROR = \"Get request error!\"\r\nconst _POST_ERROR = \"Post request error!\";\r\n\r\nexport const COOKIE_NAMES = {\r\n \"IBOOT_DEVICE_ID\":\"did\",\r\n \"IBOOT_LANG\" :\"lang\",\r\n \"IBOOT_WEBSITE_ID\":\"web_id\",\r\n \"IBOOT_WEBSITE_NO\":\"web_no\",\r\n \"IBOOT_TOKEN\":\"_t\",\r\n \"IBOOT_USER\":\"_u\"\r\n}\r\n\r\nconst HEADER_NAMES = {\r\n \"DEVICE_ID\": \"Device-Id\",\r\n \"LANG\": \"Lang\",\r\n \"WEBSITE_ID\": \"Website-Id\",\r\n \"WEBSITE_NO\": \"Website-No\",\r\n}\r\n\r\n\r\nconst getDefaultRequestHeader = (): HttpHeaders => {\r\n const devideId = localStorage.getItem(DEVICE_ID_KEY) ?? ''\r\n const json = localStorage.getItem(CURRENT_WEBSITE_KEY);\r\n const curWebsite: CurWebsite | null = json != null ? JSON.parse(json) : null;\r\n const header: HttpHeaders = {}\r\n if (devideId.length > 0) {\r\n header['Device-Id'] = devideId\r\n }\r\n if (curWebsite) {\r\n header['Lang'] = curWebsite.language;\r\n if (curWebsite.websiteId) {\r\n header['Website-Id'] = curWebsite.websiteId;\r\n }\r\n if (curWebsite.websiteNo) {\r\n header['Website-No'] = curWebsite.websiteNo\r\n }\r\n }\r\n return header;\r\n};\r\n\r\n\r\nexport const setDefaultRequestHeader = (deviceId: string, website?: CurWebsite): void => {\r\n localStorage.setItem(DEVICE_ID_KEY, deviceId);\r\n if (website) {\r\n localStorage.setItem(CURRENT_WEBSITE_KEY, JSON.stringify(website));\r\n }\r\n}\r\n\r\nexport const get = async <T>(url: string, opts?: ClientGetParams): Promise<ResultModel<T>> => {\r\n if (opts?.data) {\r\n const params = new URLSearchParams(opts.data);\r\n if (url.indexOf(\"?\") != -1) {\r\n url += `&${params}`\r\n } else {\r\n url += `?${params}`\r\n }\r\n }\r\n const headers: Record<string, string> = getDefaultRequestHeader();\r\n const heads = opts?.headers;\r\n if (heads) {\r\n for (const field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n headers[field] = value;\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": headers,\r\n }, \"GET\")\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n cache: opts?.useCache ? 'force-cache' : 'default'\r\n });\r\n\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const post = async <T>(url: string, opts?: ClientPostParams): Promise<ResultModel<T>> => {\r\n const data = opts?.data ?? {};\r\n const heads = opts?.headers;\r\n let body: string | FormData;\r\n const proxyHeaders = new Headers(getDefaultRequestHeader());\r\n if (!(data instanceof FormData)) {\r\n body = JSON.stringify(data);\r\n proxyHeaders.set('Content-Type', 'application/json');\r\n } else {\r\n body = data;\r\n }\r\n if (heads) {\r\n for (let field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n proxyHeaders.set(field, value);\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": proxyHeaders,\r\n }, \"POST\")\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: proxyHeaders,\r\n body: body,\r\n });\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const iGet = async <T>(url: string, opts?: ClientGetParams): Promise<T | undefined> => {\r\n const res = await get<T>(url, opts);\r\n if (res.success) {\r\n return res.data as T;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _GET_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _GET_ERROR)\r\n}\r\n\r\nexport const iPost = async <T>(url: string, opts?: ClientPostParams): Promise<T | undefined> => {\r\n const res = await post<T>(url, opts);\r\n if (res.success) {\r\n return res.data;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _POST_ERROR)\r\n}\r\n\r\nexport const iPostSuccess = async (url: string, opts?: ClientPostParams): Promise<boolean> => {\r\n const res = await post(url, opts);\r\n if (res.success) {\r\n if (opts?.showSuccess) {\r\n opts.showSuccess(res.msg ?? 'SUCCESS')\r\n }\r\n return true;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n }\r\n return false;\r\n}\r\n\r\n\r\nexport const getHttpOpts = (request: Request): HttpClientOpts => {\r\n const deviceId = request.headers.get(HEADER_NAMES.DEVICE_ID);\r\n const lang = request.headers.get(HEADER_NAMES.LANG);\r\n const websiteId = request.headers.get(HEADER_NAMES.WEBSITE_ID);\r\n const websiteNo = request.headers.get(HEADER_NAMES.WEBSITE_NO);\r\n const result: HttpClientOpts = {}\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport const getHttpOptsByCookie = (cookies: Cookies): HttpClientOpts => {\r\n if(!cookies.get){\r\n throw new Error('cookies get function is undefined');\r\n }\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookies.get(COOKIE_NAMES.IBOOT_DEVICE_ID);\r\n const lang = cookies.get(COOKIE_NAMES.IBOOT_LANG);\r\n const websiteId = cookies.get(COOKIE_NAMES.IBOOT_WEBSITE_ID);\r\n const websiteNo = cookies.get(COOKIE_NAMES.IBOOT_WEBSITE_NO);\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\n\r\nexport const getLoginUser = (cookies: Cookies): User | null => {\r\n if (cookies.get) {\r\n const userjson = cookies.get(COOKIE_NAMES.IBOOT_USER)\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport const getToken = (cookies: Cookies): HttpToken | undefined => {\r\n if (cookies.get) {\r\n const userjson = cookies.get(COOKIE_NAMES.IBOOT_USER);\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n const username = user.username;\r\n const utype = user.userType.toString();\r\n const token = cookies.get(COOKIE_NAMES.IBOOT_TOKEN);\r\n if (token) {\r\n return {\r\n \"username\": username,\r\n \"utype\": utype,\r\n \"token\": token\r\n }\r\n }\r\n }\r\n }\r\n return undefined\r\n}\r\n\r\nexport const setToken = (data: User & { token: string }, cookies: Cookies): void => {\r\n const { id, name, username, nickname, headImg, token, lastLoginTime, deviceId, userType, mustChangePwd } = data;\r\n const loginUser: User = {\r\n id: id,\r\n name:name,\r\n username: username,\r\n nickname: nickname || name,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n deviceId: deviceId,\r\n userType: userType,\r\n accountType: 0,\r\n needToReview: false,\r\n socketOnline: false,\r\n mustChangePwd: mustChangePwd\r\n };\r\n if (!cookies.set) {\r\n throw new Error('cookies set function is undefined')\r\n }\r\n cookies.set(COOKIE_NAMES.IBOOT_TOKEN, token, {\r\n path: '/',\r\n secure: process.env.APP_ENV === 'production',\r\n httpOnly: true,\r\n sameSite: 'strict'\r\n });\r\n cookies.set(COOKIE_NAMES.IBOOT_USER, JSON.stringify(loginUser))\r\n}\r\n\r\nexport const cleanToken = (cookies: Cookies): void => {\r\n if (!cookies.set) {\r\n throw new Error('cookies set function is undefined')\r\n }\r\n cookies.set(COOKIE_NAMES.IBOOT_TOKEN, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n cookies.set(COOKIE_NAMES.IBOOT_USER, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n if(!cookies.delete){\r\n throw new Error('cookies delete function is undefined')\r\n }\r\n cookies.delete(COOKIE_NAMES.IBOOT_TOKEN);\r\n cookies.delete(COOKIE_NAMES.IBOOT_USER);\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly baseUrl: string;\r\n private readonly helloMethod: string;\r\n private readonly apiKey: string;\r\n private readonly userType: USER_TYPE;\r\n private readonly userFrom: string;\r\n private readonly deviceId: string;\r\n private readonly version: string = '1';\r\n private readonly lang: string;\r\n private readonly websiteId?: string;\r\n private readonly websiteNo?: string;\r\n constructor(opts: Readonly<HttpClientOpts>) {\r\n const isProduction = process.env.APP_ENV === 'production';\r\n if (!isProduction) {\r\n logger.warn(\"This is currently a development environment!\")\r\n }\r\n this.baseUrl = process.env.APP_BASEURL!;\r\n this.apiKey = process.env.APP_APIKEY!;\r\n this.userFrom = process.env.APP_USERFROM ?? '1';\r\n\r\n this.helloMethod = opts.helloURL ?? ''\r\n this.userType = opts.userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.deviceId = opts.deviceId ?? randomString(10);\r\n this.lang = opts.lang ?? DEFAULT_LOCALE;\r\n this.websiteId = opts.websiteId\r\n this.websiteNo = opts.websiteNo\r\n }\r\n\r\n encrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.encrypt(data, key).toString();\r\n }\r\n\r\n decrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.decrypt(data, key, {\r\n mode: CryptoJS.mode.ECB,\r\n }).toString(CryptoJS.enc.Utf8);\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private convertUrlParameter(data: Record<string, any>): string {\r\n const p: string[] = [];\r\n for (const o in data) {\r\n let v = data[o];\r\n if (v && typeof v === \"string\") {\r\n v = v.trim();\r\n } else if (v && typeof v === \"object\") {\r\n if (isArray(v)) {\r\n if (v.length === 0) {\r\n continue;\r\n }\r\n for (let i = 0; i < v.length; i++) {\r\n const arr_item = v[i];\r\n for (const item_field in arr_item) {\r\n const item_field_value = arr_item[item_field] ?? undefined;\r\n if (item_field_value) {\r\n if (typeof item_field_value === \"object\") {\r\n if (isArray(item_field_value)) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n item_field_value.forEach((item1: any, index: number) => {\r\n if (item1) {\r\n for (const f in item1) {\r\n const v = item1[f];\r\n if (v && v.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field + `[${index.toString()}].${f}`}=${urlEncode(v)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n } else if (item_field_value.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field}=${urlEncode(item_field_value.toString())}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n for (const obj in v) {\r\n const oValue = v[obj];\r\n if (oValue != null && oValue != \"\" && oValue.length != 0) {\r\n const s = `.${obj}=${urlEncode(oValue)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n continue;\r\n } else if (v && typeof v === \"function\") {\r\n v = null;\r\n }\r\n\r\n if (v != null && v != \"\" && v.length != 0) {\r\n p.push(o + \"=\" + urlEncode(v));\r\n }\r\n }\r\n return (p && p.join(\"&\"));\r\n }\r\n\r\n private async sign(data: Record<string, object | string>): Promise<string> {\r\n //由后台分配\r\n const _apiKey = \"&key=\" + (await this.helloIboot());\r\n const arr: string[] = [];\r\n for (const o in data) {\r\n arr.push(o);\r\n }\r\n arr.sort((a: string, b: string) => {\r\n return a.toLowerCase().localeCompare(b.toLowerCase());\r\n });\r\n const res: string[] = [];\r\n arr.forEach((v: string) => {\r\n let value: object | string = data[v];\r\n if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n res.push(v + \"=\" + value);\r\n });\r\n const paramsStr: string = res.join(\"&\");\r\n const str = md5.md5((paramsStr + _apiKey).toLocaleUpperCase());\r\n const logInfo = {\r\n params: paramsStr,\r\n md5: str\r\n }\r\n logger.debug(logInfo, \"API_SIGN\")\r\n return str;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private assemblyParameter(data?: Record<string, any>, username?: string): Record<string, any> {\r\n const params = data ?? {};\r\n params['timestamp'] = Date.now() + '';\r\n params['echostr'] = randomString(10);\r\n params['version'] = this.version;\r\n params['deviceId'] = this.deviceId;\r\n params['webid'] = this.websiteId;\r\n params['apiKey'] = this.apiKey;\r\n if (username && username.length > 0) {\r\n params['username'] = username;\r\n }\r\n return params;\r\n }\r\n\r\n private async assemblyHeader({ urlParams, token }: Readonly<{ urlParams: string, token?: Readonly<HttpToken> }>) {\r\n const h: Record<string, string> = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Device-Id': this.deviceId,\r\n 'User-Type': token?.utype.toString() ?? this.userType.toString(),\r\n 'User-From': this.userFrom,\r\n 'Api-Key': this.apiKey\r\n }\r\n if (this.lang && this.lang.length > 0) {\r\n h['Lang'] = this.lang\r\n }\r\n if (this.websiteId && this.websiteId.length > 0) {\r\n h['Web-Id'] = this.websiteId\r\n }\r\n if (this.websiteNo && this.websiteNo.length > 0) {\r\n h['Web-No'] = this.websiteNo\r\n }\r\n if (token) {\r\n if (token.token && token.token.length > 0 && token.username && token.username.length > 0) {\r\n h['Authorization'] = token.token;\r\n h['Username'] = token.username;\r\n }\r\n if (token.xcsrf) {\r\n h[token.xcsrf.csrfHeader] = token.xcsrf.csrfToken;\r\n }\r\n }\r\n const data = urlParamToJson(urlParams);\r\n const sign = await this.sign(data);\r\n h['Sign'] = sign\r\n return h;\r\n }\r\n\r\n private async helloIboot(): Promise<string> {\r\n if (this.helloMethod.length <= 0) {\r\n return this.apiKey;\r\n }\r\n const api = this.getApiUrl(this.helloMethod);\r\n const h = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Api-Key': this.apiKey\r\n }\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": h\r\n }\r\n logger.debug(logInfo, \"HELLO\");\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: h,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result.data, 'HELLO RESULT')\r\n return result.data;\r\n }\r\n throw new Error('hello iBoot error!')\r\n }\r\n\r\n private getApiUrl(url: string): string {\r\n return `${this.baseUrl}/${url}`;\r\n }\r\n\r\n async csrf(): Promise<string | undefined> {\r\n const res = await this.get<CSRFToken>({\r\n url: 'guest/csrf'\r\n });\r\n if (res.success) {\r\n const data = res.data;\r\n if (data) {\r\n return data[\"csrfToken\"].toString();\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async get<T>({ url, data, token, cache = 'default' }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n const api = `${this.getApiUrl(url)}?${urlParams.toString()}`\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers\r\n }\r\n logger.info(logInfo, \"GET\");\r\n const res = await fetch(api, {\r\n \"method\": 'GET',\r\n \"headers\": headers,\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token, cache = \"default\" }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n const api = this.getApiUrl(url);\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"POST\");\r\n const urls = buffer ? `${api}?${urlParams}` : api;\r\n const res = await fetch(urls, {\r\n \"method\": 'POST',\r\n \"headers\": headers,\r\n \"body\": buffer ? buffer : urlParams.toString(),\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<Omit<ServerRequestOptions, 'cache'>>): Promise<Response> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params); //new URLSearchParams(params);\r\n\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n headers['Connection'] = 'keep-alive';\r\n headers['X-Accel-Buffering'] = 'no'; //防止 Nginx 缓存\r\n headers['Cache-Control'] = 'no-cache';\r\n const api = this.getApiUrl(url)\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"STREAM\");\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: buffer ? buffer : urlParams.toString(),\r\n credentials: 'include'\r\n });\r\n\r\n if (!res.ok) {\r\n throw new Error(`HTTP error! status: ${res.status}`);\r\n }\r\n if (!res.body) {\r\n throw new Error('No response body');\r\n }\r\n return new Response(res.body, {\r\n headers: {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive'\r\n }\r\n });\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","stream","PinoPretty","logger","pino","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","dateFormat","dt","fmt","o","k","s","regx","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","COOKIE_NAMES","HEADER_NAMES","getDefaultRequestHeader","devideId","json","curWebsite","header","setDefaultRequestHeader","deviceId","website","get","url","opts","params","headers","heads","field","response","msg","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpOpts","request","lang","websiteId","websiteNo","getHttpOptsByCookie","cookies","getLoginUser","userjson","getToken","user","username","utype","token","setToken","id","name","nickname","headImg","lastLoginTime","userType","mustChangePwd","loginUser","cleanToken","HttpClient","key","CryptoJS","p","v","arr_item","item_field","item_field_value","item1","index","f","oValue","_apiKey","b","paramsStr","str","md5","logInfo","urlParams","h","sign","api","cache","buffer","boundary","urls","e"],"mappings":"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"}
1
+ {"version":3,"file":"iboot-http-client.es.js","sources":["../src/types/user.ts","../src/logger.ts","../src/utils.ts","../src/http-client.ts"],"sourcesContent":["export const ACCOUNT_TYPE_MAP = {\r\n GENERAL : 0,\r\n PHONE : 1,\r\n EMAIL : 2\r\n}\r\n\r\nexport const USER_TYPE_MAP = {\r\n TYPE_MGT : 0,\r\n TYPE_C : 1,\r\n TYPE_B : 2\r\n}\r\n\r\nexport const USER_FORM_MAP = {\r\n FROM_WEB : 1,\r\n FROM_PC : 2,\r\n FROM_WX_MINI_PRO : 3,\r\n FROM_WX_PLU : 4,\r\n FROM_WX_E : 5,\r\n FROM_APP : 6,\r\n FROM_DEVICE : 7\r\n}\r\n\r\nexport const USER_SEX_MAP = {\r\n unknown:0,\r\n male:1,\r\n female:2,\r\n}\r\n\r\nexport type ACCOUNT_TYPE = typeof ACCOUNT_TYPE_MAP[keyof typeof ACCOUNT_TYPE_MAP];\r\nexport type USER_TYPE = typeof USER_TYPE_MAP[keyof typeof USER_TYPE_MAP];\r\nexport type USER_FORM = typeof USER_FORM_MAP[keyof typeof USER_FORM_MAP];\r\nexport type USER_SEX = typeof USER_SEX_MAP[keyof typeof USER_SEX_MAP];\r\n\r\n// User interface\r\nexport interface User {\r\n id: string;\r\n name: string;\r\n userType: USER_TYPE;\r\n username?: string;\r\n nickname?: string;\r\n sex?: USER_SEX;\r\n headImg?: string;\r\n lastLoginTime?: string;\r\n tokenExpired?: string;\r\n deviceId?: string;\r\n status?: number;\r\n accountType?: number;\r\n enabled?: boolean;\r\n userFrom?: USER_FORM;\r\n needToReview?: boolean;\r\n socketOnline?: boolean;\r\n createTime?: string;\r\n mustChangePwd?: boolean;\r\n}","import pino from \"pino\";\r\nimport PinoPretty from \"pino-pretty\";\r\n// import koffi from 'koffi';\r\n\r\n// if (typeof window === 'undefined' && process.platform === 'win32') {\r\n// try {\r\n// const CP_UTF8 = 65001;\r\n// const kernel32 = koffi.load('Kernel32');\r\n// const setConsoleOutputCP = kernel32.func('SetConsoleOutputCP', 'bool', ['int']);\r\n// const setConsoleCP = kernel32.func('SetConsoleCP', 'bool', ['int']);\r\n// setConsoleOutputCP(CP_UTF8);\r\n// setConsoleCP(CP_UTF8);\r\n// } catch (e) {\r\n// console.log(e);\r\n// }\r\n// }\r\n\r\n// export const logger = pino({\r\n// name: process.env.APP_NAME ?? 'iBoot',\r\n// level: process.env.NODE_ENV !== 'production' ? 'debug' : 'info',\r\n// nestedKey: 'payload',\r\n// transport: {\r\n// target: 'pino-pretty',\r\n// options: {\r\n// colorize: true,\r\n// translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n// ignore: 'pid,hostname',\r\n// messageFormat: '{msg}',\r\n// singleLine: true,\r\n// },\r\n// }\r\n// });\r\n\r\nconst stream = PinoPretty({\r\n colorize: true,\r\n destination: process.stdout,\r\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n ignore: 'pid,hostname',\r\n messageFormat: '{msg}',\r\n singleLine: true,\r\n});\r\n\r\nexport const logger = pino({\r\n name: process.env.APP_NAME ?? 'iBoot',\r\n level: process.env.APP_ENV === 'production' ? 'info' : 'debug',\r\n nestedKey: 'payload'\r\n}, stream);","export const isArray = (obj: unknown) => {\r\n return (\r\n Array.isArray(obj) ||\r\n (typeof obj === \"object\" &&\r\n Object.prototype.toString.call(obj) === \"[object Array]\")\r\n );\r\n};\r\n\r\n/**\r\n * 生成指定长度的随机串\r\n * @param {Object} len\r\n */\r\nexport const randomString = (len: number) => {\r\n const l = len || 32;\r\n const $chars = \"ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678\";\r\n const maxPos = $chars.length;\r\n let pwd = \"\";\r\n for (let i = 0; i < l; i++) {\r\n pwd += $chars.charAt(Math.floor(Math.random() * maxPos));\r\n }\r\n return pwd;\r\n};\r\n\r\nexport const urlParamToJson = (urlQueryParams: string, exclude?: string[]): Record<string, string> => {\r\n const result: Record<string, string> = {};\r\n const strs = urlQueryParams.split(\"&\");\r\n strs.forEach((item) => {\r\n const arr = item.split(\"=\");\r\n if (arr[1]) {\r\n if (!exclude || exclude.indexOf(arr[0]) == -1) {\r\n result[arr[0]] = arr[1];\r\n }\r\n }\r\n });\r\n return result;\r\n};\r\n\r\nexport const urlEncode = (value: string | null | undefined): string => {\r\n if (!value || value == \"\" || value.length == 0) {\r\n return \"\";\r\n }\r\n return (\r\n encodeURIComponent(value)\r\n // .replace(/%20/g, '+')\r\n // .replace(/%2B/g, '\\\\+')\r\n .replace(/\\(/g, \"%28\")\r\n .replace(/\\)/g, \"%29\")\r\n .replace(/\\'/g, \"%27\")\r\n .replace(/\\!/g, \"%21\")\r\n .replace(/\\~/g, \"%7E\")\r\n );\r\n};\r\n\r\nexport const dateFormat = (dt: Date, fmt: string) => {\r\n const o:Record<string, number> = {\r\n \"M+\": dt.getMonth() + 1, //月份\r\n \"d+\": dt.getDate(), //日\r\n \"h+\": dt.getHours(), //小时\r\n \"m+\": dt.getMinutes(), //分\r\n \"s+\": dt.getSeconds(), //秒\r\n \"q+\": Math.floor((dt.getMonth() + 3) / 3), //季度\r\n S: dt.getMilliseconds(), //毫秒\r\n };\r\n if (/(y+)/.test(fmt)){\r\n const regx = new RegExp(/(y+)/);\r\n const value = regx.exec(fmt);\r\n let len = 0;\r\n if(value && value.length > 0){\r\n len = value[0].length;\r\n }\r\n fmt = fmt.replace(/(y+)/, dt.getFullYear() + \"\").substring(4 - len);\r\n }\r\n\r\n for (const k in o){\r\n const s:string = \"(\" + k + \")\";\r\n const regx = new RegExp(s);\r\n if(regx.test(fmt)){\r\n const value = regx.exec(fmt);\r\n let len = 0;\r\n if(value && value.length > 0){\r\n len = value[0].length;\r\n }\r\n fmt = fmt.replace(regx, len == 1 ? o[k].toString() : (\"00\" + o[k]).substring(o[k].toString().length))\r\n }\r\n }\r\n return fmt;\r\n}","import md5 from \"js-md5\";\r\nimport CryptoJS from 'crypto-js';\r\nimport { isArray, randomString, urlEncode, urlParamToJson } from \"./utils\";\r\nimport {\r\n ClientGetParams,\r\n ClientPostParams,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaders,\r\n HttpToken,\r\n ResultModel,\r\n ServerRequestOptions,\r\n Cookies\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\r\n\r\n\r\nexport const DEFAULT_LOCALE = 'zh-CN';\r\nexport const DEVICE_ID_KEY = \"_device_id_key\";\r\nexport const CURRENT_WEBSITE_KEY = \"_current_website_key\"\r\n\r\nconst _GET_ERROR = \"Get request error!\"\r\nconst _POST_ERROR = \"Post request error!\";\r\n\r\nexport const COOKIE_NAMES = {\r\n \"IBOOT_DEVICE_ID\":\"did\",\r\n \"IBOOT_LANG\" :\"lang\",\r\n \"IBOOT_WEBSITE_ID\":\"web_id\",\r\n \"IBOOT_WEBSITE_NO\":\"web_no\",\r\n \"IBOOT_TOKEN\":\"_t\",\r\n \"IBOOT_USER\":\"_u\"\r\n}\r\n\r\nconst HEADER_NAMES = {\r\n \"DEVICE_ID\": \"Device-Id\",\r\n \"LANG\": \"Lang\",\r\n \"WEBSITE_ID\": \"Website-Id\",\r\n \"WEBSITE_NO\": \"Website-No\",\r\n}\r\n\r\n\r\nconst getDefaultRequestHeader = (): HttpHeaders => {\r\n const devideId = localStorage.getItem(DEVICE_ID_KEY) ?? ''\r\n const json = localStorage.getItem(CURRENT_WEBSITE_KEY);\r\n const curWebsite: CurWebsite | null = json != null ? JSON.parse(json) : null;\r\n const header: HttpHeaders = {}\r\n if (devideId.length > 0) {\r\n header['Device-Id'] = devideId\r\n }\r\n if (curWebsite) {\r\n header['Lang'] = curWebsite.language;\r\n if (curWebsite.websiteId) {\r\n header['Website-Id'] = curWebsite.websiteId;\r\n }\r\n if (curWebsite.websiteNo) {\r\n header['Website-No'] = curWebsite.websiteNo\r\n }\r\n }\r\n return header;\r\n};\r\n\r\n\r\nexport const setDefaultRequestHeader = (deviceId: string, website?: CurWebsite): void => {\r\n localStorage.setItem(DEVICE_ID_KEY, deviceId);\r\n if (website) {\r\n localStorage.setItem(CURRENT_WEBSITE_KEY, JSON.stringify(website));\r\n }\r\n}\r\n\r\nexport const get = async <T>(url: string, opts?: ClientGetParams): Promise<ResultModel<T>> => {\r\n if (opts?.data) {\r\n const params = new URLSearchParams(opts.data);\r\n if (url.indexOf(\"?\") != -1) {\r\n url += `&${params}`\r\n } else {\r\n url += `?${params}`\r\n }\r\n }\r\n const headers: Record<string, string> = getDefaultRequestHeader();\r\n const heads = opts?.headers;\r\n if (heads) {\r\n for (const field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n headers[field] = value;\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": headers,\r\n }, \"GET\")\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n cache: opts?.useCache ? 'force-cache' : 'default'\r\n });\r\n\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const post = async <T>(url: string, opts?: ClientPostParams): Promise<ResultModel<T>> => {\r\n const data = opts?.data ?? {};\r\n const heads = opts?.headers;\r\n let body: string | FormData;\r\n const proxyHeaders = new Headers(getDefaultRequestHeader());\r\n if (!(data instanceof FormData)) {\r\n body = JSON.stringify(data);\r\n proxyHeaders.set('Content-Type', 'application/json');\r\n } else {\r\n body = data;\r\n }\r\n if (heads) {\r\n for (let field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n proxyHeaders.set(field, value);\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": proxyHeaders,\r\n }, \"POST\")\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: proxyHeaders,\r\n body: body,\r\n });\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const iGet = async <T>(url: string, opts?: ClientGetParams): Promise<T | undefined> => {\r\n const res = await get<T>(url, opts);\r\n if (res.success) {\r\n return res.data as T;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _GET_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _GET_ERROR)\r\n}\r\n\r\nexport const iPost = async <T>(url: string, opts?: ClientPostParams): Promise<T | undefined> => {\r\n const res = await post<T>(url, opts);\r\n if (res.success) {\r\n return res.data;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _POST_ERROR)\r\n}\r\n\r\nexport const iPostSuccess = async (url: string, opts?: ClientPostParams): Promise<boolean> => {\r\n const res = await post(url, opts);\r\n if (res.success) {\r\n if (opts?.showSuccess) {\r\n opts.showSuccess(res.msg ?? 'SUCCESS')\r\n }\r\n return true;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n }\r\n return false;\r\n}\r\n\r\n\r\nexport const getHttpOpts = (request: Request): HttpClientOpts => {\r\n const deviceId = request.headers.get(HEADER_NAMES.DEVICE_ID);\r\n const lang = request.headers.get(HEADER_NAMES.LANG);\r\n const websiteId = request.headers.get(HEADER_NAMES.WEBSITE_ID);\r\n const websiteNo = request.headers.get(HEADER_NAMES.WEBSITE_NO);\r\n const result: HttpClientOpts = {}\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport const getHttpOptsByCookie = (cookies: Cookies): HttpClientOpts => {\r\n if(!cookies.get){\r\n throw new Error('cookies get function is undefined');\r\n }\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookies.get(COOKIE_NAMES.IBOOT_DEVICE_ID);\r\n const lang = cookies.get(COOKIE_NAMES.IBOOT_LANG);\r\n const websiteId = cookies.get(COOKIE_NAMES.IBOOT_WEBSITE_ID);\r\n const websiteNo = cookies.get(COOKIE_NAMES.IBOOT_WEBSITE_NO);\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\n\r\nexport const getLoginUser = (cookies: Cookies): User | null => {\r\n if (cookies.get) {\r\n const userjson = cookies.get(COOKIE_NAMES.IBOOT_USER)\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport const getToken = (cookies: Cookies): HttpToken | undefined => {\r\n if (cookies.get) {\r\n const userjson = cookies.get(COOKIE_NAMES.IBOOT_USER);\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n const username = user.username;\r\n const utype = user.userType.toString();\r\n const token = cookies.get(COOKIE_NAMES.IBOOT_TOKEN);\r\n if (token) {\r\n return {\r\n \"username\": username,\r\n \"utype\": utype,\r\n \"token\": token\r\n }\r\n }\r\n }\r\n }\r\n return undefined\r\n}\r\n\r\nexport const setToken = (data: User & { token: string }, cookies: Cookies): void => {\r\n const { id, name, username, nickname, headImg, token, lastLoginTime, deviceId, userType, mustChangePwd } = data;\r\n const loginUser: User = {\r\n id: id,\r\n name:name,\r\n username: username,\r\n nickname: nickname || name,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n deviceId: deviceId,\r\n userType: userType,\r\n accountType: 0,\r\n needToReview: false,\r\n socketOnline: false,\r\n mustChangePwd: mustChangePwd\r\n };\r\n if (!cookies.set) {\r\n throw new Error('cookies set function is undefined')\r\n }\r\n cookies.set(COOKIE_NAMES.IBOOT_TOKEN, token, {\r\n path: '/',\r\n secure: process.env.APP_ENV === 'production',\r\n httpOnly: true,\r\n sameSite: 'strict'\r\n });\r\n cookies.set(COOKIE_NAMES.IBOOT_USER, JSON.stringify(loginUser))\r\n}\r\n\r\nexport const cleanToken = (cookies: Cookies): void => {\r\n if (!cookies.set) {\r\n throw new Error('cookies set function is undefined')\r\n }\r\n cookies.set(COOKIE_NAMES.IBOOT_TOKEN, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n cookies.set(COOKIE_NAMES.IBOOT_USER, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n if(!cookies.delete){\r\n throw new Error('cookies delete function is undefined')\r\n }\r\n cookies.delete(COOKIE_NAMES.IBOOT_TOKEN);\r\n cookies.delete(COOKIE_NAMES.IBOOT_USER);\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly baseUrl: string;\r\n private readonly helloMethod: string;\r\n private readonly apiKey: string;\r\n private readonly userType: USER_TYPE;\r\n private readonly userFrom: string;\r\n private readonly deviceId: string;\r\n private readonly version: string = '1';\r\n private readonly lang: string;\r\n private readonly websiteId?: string;\r\n private readonly websiteNo?: string;\r\n constructor(opts: Readonly<HttpClientOpts>) {\r\n const isProduction = process.env.APP_ENV === 'production';\r\n if (!isProduction) {\r\n logger.warn(\"This is currently a development environment!\")\r\n }\r\n this.baseUrl = process.env.APP_BASEURL!;\r\n this.apiKey = process.env.APP_APIKEY!;\r\n this.userFrom = process.env.APP_USERFROM ?? '1';\r\n\r\n this.helloMethod = opts.helloURL ?? ''\r\n this.userType = opts.userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.deviceId = opts.deviceId ?? randomString(10);\r\n this.lang = opts.lang ?? DEFAULT_LOCALE;\r\n this.websiteId = opts.websiteId\r\n this.websiteNo = opts.websiteNo\r\n }\r\n\r\n encrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.encrypt(data, key).toString();\r\n }\r\n\r\n decrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.decrypt(data, key, {\r\n mode: CryptoJS.mode.ECB,\r\n }).toString(CryptoJS.enc.Utf8);\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private convertUrlParameter(data: Record<string, any>): string {\r\n const p: string[] = [];\r\n for (const o in data) {\r\n let v = data[o];\r\n if (v && typeof v === \"string\") {\r\n v = v.trim();\r\n } else if (v && typeof v === \"object\") {\r\n if (isArray(v)) {\r\n if (v.length === 0) {\r\n continue;\r\n }\r\n for (let i = 0; i < v.length; i++) {\r\n const arr_item = v[i];\r\n for (const item_field in arr_item) {\r\n const item_field_value = arr_item[item_field] ?? undefined;\r\n if (item_field_value) {\r\n if (typeof item_field_value === \"object\") {\r\n if (isArray(item_field_value)) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n item_field_value.forEach((item1: any, index: number) => {\r\n if (item1) {\r\n for (const f in item1) {\r\n const v = item1[f];\r\n if (v && v.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field + `[${index.toString()}].${f}`}=${urlEncode(v)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n } else if (item_field_value.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field}=${urlEncode(item_field_value.toString())}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n for (const obj in v) {\r\n const oValue = v[obj];\r\n if (oValue != null && oValue != \"\" && oValue.length != 0) {\r\n const s = `.${obj}=${urlEncode(oValue)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n continue;\r\n } else if (v && typeof v === \"function\") {\r\n v = null;\r\n }\r\n\r\n if (v != null && v != \"\" && v.length != 0) {\r\n p.push(o + \"=\" + urlEncode(v));\r\n }\r\n }\r\n return (p && p.join(\"&\"));\r\n }\r\n\r\n private async sign(data: Record<string, object | string>): Promise<string> {\r\n //由后台分配\r\n const _apiKey = \"&key=\" + (await this.helloIboot());\r\n const arr: string[] = [];\r\n for (const o in data) {\r\n arr.push(o);\r\n }\r\n arr.sort((a: string, b: string) => {\r\n return a.toLowerCase().localeCompare(b.toLowerCase());\r\n });\r\n const res: string[] = [];\r\n arr.forEach((v: string) => {\r\n let value: object | string = data[v];\r\n if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n res.push(v + \"=\" + value);\r\n });\r\n const paramsStr: string = res.join(\"&\");\r\n const str = md5.md5((paramsStr + _apiKey).toLocaleUpperCase());\r\n const logInfo = {\r\n params: paramsStr,\r\n md5: str\r\n }\r\n logger.debug(logInfo, \"API_SIGN\")\r\n return str;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private assemblyParameter(data?: Record<string, any>, username?: string): Record<string, any> {\r\n const params = data ?? {};\r\n params['timestamp'] = Date.now() + '';\r\n params['echostr'] = randomString(10);\r\n params['version'] = this.version;\r\n params['deviceId'] = this.deviceId;\r\n params['webid'] = this.websiteId;\r\n params['apiKey'] = this.apiKey;\r\n if (username && username.length > 0) {\r\n params['username'] = username;\r\n }\r\n return params;\r\n }\r\n\r\n private async assemblyHeader({ urlParams, token }: Readonly<{ urlParams: string, token?: Readonly<HttpToken> }>) {\r\n const h: Record<string, string> = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Device-Id': this.deviceId,\r\n 'User-Type': token?.utype.toString() ?? this.userType.toString(),\r\n 'User-From': this.userFrom,\r\n 'Api-Key': this.apiKey\r\n }\r\n if (this.lang && this.lang.length > 0) {\r\n h['Lang'] = this.lang\r\n }\r\n if (this.websiteId && this.websiteId.length > 0) {\r\n h['Web-Id'] = this.websiteId\r\n }\r\n if (this.websiteNo && this.websiteNo.length > 0) {\r\n h['Web-No'] = this.websiteNo\r\n }\r\n if (token) {\r\n if (token.token && token.token.length > 0 && token.username && token.username.length > 0) {\r\n h['Authorization'] = token.token;\r\n h['Username'] = token.username;\r\n }\r\n if (token.xcsrf) {\r\n h[token.xcsrf.csrfHeader] = token.xcsrf.csrfToken;\r\n }\r\n }\r\n const data = urlParamToJson(urlParams);\r\n const sign = await this.sign(data);\r\n h['Sign'] = sign\r\n return h;\r\n }\r\n\r\n private async helloIboot(): Promise<string> {\r\n if (this.helloMethod.length <= 0) {\r\n return this.apiKey;\r\n }\r\n const api = this.getApiUrl(this.helloMethod);\r\n const h = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Api-Key': this.apiKey\r\n }\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": h\r\n }\r\n logger.debug(logInfo, \"HELLO\");\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: h,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result.data, 'HELLO RESULT')\r\n return result.data;\r\n }\r\n throw new Error('hello iBoot error!')\r\n }\r\n\r\n private getApiUrl(url: string): string {\r\n return `${this.baseUrl}/${url}`;\r\n }\r\n\r\n async csrf(): Promise<string | undefined> {\r\n const res = await this.get<CSRFToken>({\r\n url: 'guest/csrf'\r\n });\r\n if (res.success) {\r\n const data = res.data;\r\n if (data) {\r\n return data[\"csrfToken\"].toString();\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async get<T>({ url, data, token, cache = 'default' }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n const api = `${this.getApiUrl(url)}?${urlParams.toString()}`\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers\r\n }\r\n logger.info(logInfo, \"GET\");\r\n const res = await fetch(api, {\r\n \"method\": 'GET',\r\n \"headers\": headers,\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n logger.debug(res.headers, \"RES_HEADERS\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token, cache = \"default\" }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n const api = this.getApiUrl(url);\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"POST\");\r\n const urls = buffer ? `${api}?${urlParams}` : api;\r\n const res = await fetch(urls, {\r\n \"method\": 'POST',\r\n \"headers\": headers,\r\n \"body\": buffer ? buffer : urlParams.toString(),\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"POST_RESULT\");\r\n logger.debug(res.headers, \"RES_HEADERS\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<Omit<ServerRequestOptions, 'cache'>>): Promise<Response> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params); //new URLSearchParams(params);\r\n\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n headers['Connection'] = 'keep-alive';\r\n headers['X-Accel-Buffering'] = 'no'; //防止 Nginx 缓存\r\n headers['Cache-Control'] = 'no-cache';\r\n const api = this.getApiUrl(url)\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"STREAM\");\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: buffer ? buffer : urlParams.toString(),\r\n credentials: 'include'\r\n });\r\n\r\n if (!res.ok) {\r\n throw new Error(`HTTP error! status: ${res.status}`);\r\n }\r\n if (!res.body) {\r\n throw new Error('No response body');\r\n }\r\n return new Response(res.body, {\r\n headers: {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive'\r\n }\r\n });\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","stream","PinoPretty","logger","pino","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","dateFormat","dt","fmt","o","k","s","regx","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","COOKIE_NAMES","HEADER_NAMES","getDefaultRequestHeader","devideId","json","curWebsite","header","setDefaultRequestHeader","deviceId","website","get","url","opts","params","headers","heads","field","response","msg","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpOpts","request","lang","websiteId","websiteNo","getHttpOptsByCookie","cookies","getLoginUser","userjson","getToken","user","username","utype","token","setToken","id","name","nickname","headImg","lastLoginTime","userType","mustChangePwd","loginUser","cleanToken","HttpClient","key","CryptoJS","p","v","arr_item","item_field","item_field_value","item1","index","f","oValue","_apiKey","b","paramsStr","str","md5","logInfo","urlParams","h","sign","api","cache","buffer","boundary","urls","e"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- (function(c,T){typeof exports=="object"&&typeof module<"u"?T(exports,require("pino"),require("pino-pretty"),require("js-md5"),require("crypto-js")):typeof define=="function"&&define.amd?define(["exports","pino","pino-pretty","js-md5","crypto-js"],T):(c=typeof globalThis<"u"?globalThis:c||self,T(c["iboot-http-client"]={},c.pino,c.PinoPretty,c.md5,c.CryptoJS))})(this,(function(c,T,L,D,m){"use strict";const K={GENERAL:0,PHONE:1,EMAIL:2},A={TYPE_MGT:0,TYPE_C:1,TYPE_B:2},j={FROM_WEB:1,FROM_PC:2,FROM_WX_MINI_PRO:3,FROM_WX_PLU:4,FROM_WX_E:5,FROM_APP:6,FROM_DEVICE:7},H={unknown:0,male:1,female:2},$=L({colorize:!0,destination:process.stdout,translateTime:"SYS:yyyy-mm-dd HH:MM:ss",ignore:"pid,hostname",messageFormat:"{msg}",singleLine:!0}),d=T({name:process.env.APP_NAME??"iBoot",level:process.env.APP_ENV==="production"?"info":"debug",nestedKey:"payload"},$),I=n=>Array.isArray(n)||typeof n=="object"&&Object.prototype.toString.call(n)==="[object Array]",O=n=>{const t=n||32,e="ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",s=e.length;let r="";for(let o=0;o<t;o++)r+=e.charAt(Math.floor(Math.random()*s));return r},R=(n,t)=>{const e={};return n.split("&").forEach(r=>{const o=r.split("=");o[1]&&(!t||t.indexOf(o[0])==-1)&&(e[o[0]]=o[1])}),e},p=n=>!n||n==""||n.length==0?"":encodeURIComponent(n).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\'/g,"%27").replace(/\!/g,"%21").replace(/\~/g,"%7E"),F=(n,t)=>{const e={"M+":n.getMonth()+1,"d+":n.getDate(),"h+":n.getHours(),"m+":n.getMinutes(),"s+":n.getSeconds(),"q+":Math.floor((n.getMonth()+3)/3),S:n.getMilliseconds()};if(/(y+)/.test(t)){const r=new RegExp(/(y+)/).exec(t);let o=0;r&&r.length>0&&(o=r[0].length),t=t.replace(/(y+)/,n.getFullYear()+"").substring(4-o)}for(const s in e){const r="("+s+")",o=new RegExp(r);if(o.test(t)){const i=o.exec(t);let l=0;i&&i.length>0&&(l=i[0].length),t=t.replace(o,l==1?e[s].toString():("00"+e[s]).substring(e[s].toString().length))}}return t},N="zh-CN",w="_device_id_key",S="_current_website_key",U="Get request error!",b="Post request error!",g={IBOOT_DEVICE_ID:"did",IBOOT_LANG:"lang",IBOOT_WEBSITE_ID:"web_id",IBOOT_WEBSITE_NO:"web_no",IBOOT_TOKEN:"_t",IBOOT_USER:"_u"},_={DEVICE_ID:"Device-Id",LANG:"Lang",WEBSITE_ID:"Website-Id",WEBSITE_NO:"Website-No"},v=()=>{const n=localStorage.getItem(w)??"",t=localStorage.getItem(S),e=t!=null?JSON.parse(t):null,s={};return n.length>0&&(s["Device-Id"]=n),e&&(s.Lang=e.language,e.websiteId&&(s["Website-Id"]=e.websiteId),e.websiteNo&&(s["Website-No"]=e.websiteNo)),s},W=(n,t)=>{localStorage.setItem(w,n),t&&localStorage.setItem(S,JSON.stringify(t))},C=async(n,t)=>{if(t?.data){const i=new URLSearchParams(t.data);n.indexOf("?")!=-1?n+=`&${i}`:n+=`?${i}`}const e=v(),s=t?.headers;if(s)for(const i in s){const l=s[i];l&&(e[i]=l)}d.debug({url:n,headers:e},"GET");const r=await fetch(n,{method:"GET",headers:e,cache:t?.useCache?"force-cache":"default"});if(r.ok){const i=await r.json();return d.debug(i,"GET_RESULT"),i}const o={code:r.status,success:!1,msg:r.statusText};return d.error(o),o},P=async(n,t)=>{const e=t?.data??{},s=t?.headers;let r;const o=new Headers(v());if(e instanceof FormData?r=e:(r=JSON.stringify(e),o.set("Content-Type","application/json")),s)for(let a in s){const u=s[a];u&&o.set(a,u)}d.debug({url:n,headers:o},"POST");const i=await fetch(n,{method:"POST",headers:o,body:r});if(i.ok){const a=await i.json();return d.debug(a,"POST_RESULT"),a}const l={code:i.status,success:!1,msg:i.statusText};return d.error(l),l},G=async(n,t)=>{const e=await C(n,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??U);return}throw Error(e.msg??U)},k=async(n,t)=>{const e=await P(n,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??b);return}throw Error(e.msg??b)},Y=async(n,t)=>{const e=await P(n,t);return e.success?(t?.showSuccess&&t.showSuccess(e.msg??"SUCCESS"),!0):(t?.showError&&t.showError(e.msg??b),!1)},V=n=>{const t=n.headers.get(_.DEVICE_ID),e=n.headers.get(_.LANG),s=n.headers.get(_.WEBSITE_ID),r=n.headers.get(_.WEBSITE_NO),o={};return t&&t.length>0&&(o.deviceId=t),e&&e.length>0&&(o.lang=e),s&&s.length>0&&(o.websiteId=s),r&&r.length>0&&(o.websiteNo=r),o},q=n=>{if(!n.get)throw new Error("cookies get function is undefined");const t={},e=n.get(g.IBOOT_DEVICE_ID),s=n.get(g.IBOOT_LANG),r=n.get(g.IBOOT_WEBSITE_ID),o=n.get(g.IBOOT_WEBSITE_NO);return e&&e.length>0&&(t.deviceId=e),s&&s.length>0&&(t.lang=s),r&&r.length>0&&(t.websiteId=r),o&&o.length>0&&(t.websiteNo=o),t},X=n=>{if(n.get){const t=n.get(g.IBOOT_USER);if(t&&t.length>0)return JSON.parse(t)}return null},J=n=>{if(n.get){const t=n.get(g.IBOOT_USER);if(t&&t.length>0){const e=JSON.parse(t),s=e.username,r=e.userType.toString(),o=n.get(g.IBOOT_TOKEN);if(o)return{username:s,utype:r,token:o}}}},z=(n,t)=>{const{id:e,name:s,username:r,nickname:o,headImg:i,token:l,lastLoginTime:a,deviceId:u,userType:h,mustChangePwd:E}=n,f={id:e,name:s,username:r,nickname:o||s,headImg:i,lastLoginTime:a,deviceId:u,userType:h,accountType:0,needToReview:!1,socketOnline:!1,mustChangePwd:E};if(!t.set)throw new Error("cookies set function is undefined");t.set(g.IBOOT_TOKEN,l,{path:"/",secure:process.env.APP_ENV==="production",httpOnly:!0,sameSite:"strict"}),t.set(g.IBOOT_USER,JSON.stringify(f))},Q=n=>{if(!n.set)throw new Error("cookies set function is undefined");if(n.set(g.IBOOT_TOKEN,"",{maxAge:-1,httpOnly:!0,path:"/"}),n.set(g.IBOOT_USER,"",{maxAge:-1,httpOnly:!0,path:"/"}),!n.delete)throw new Error("cookies delete function is undefined");n.delete(g.IBOOT_TOKEN),n.delete(g.IBOOT_USER)};class Z{baseUrl;helloMethod;apiKey;userType;userFrom;deviceId;version="1";lang;websiteId;websiteNo;constructor(t){process.env.APP_ENV==="production"||d.warn("This is currently a development environment!"),this.baseUrl=process.env.APP_BASEURL,this.apiKey=process.env.APP_APIKEY,this.userFrom=process.env.APP_USERFROM??"1",this.helloMethod=t.helloURL??"",this.userType=t.userType??A.TYPE_MGT,this.deviceId=t.deviceId??O(10),this.lang=t.lang??N,this.websiteId=t.websiteId,this.websiteNo=t.websiteNo}encrypt(t){const e=m.enc.Utf8.parse(this.apiKey);return m.AES.encrypt(t,e).toString()}decrypt(t){const e=m.enc.Utf8.parse(this.apiKey);return m.AES.decrypt(t,e,{mode:m.mode.ECB}).toString(m.enc.Utf8)}convertUrlParameter(t){const e=[];for(const s in t){let r=t[s];if(r&&typeof r=="string")r=r.trim();else if(r&&typeof r=="object"){if(I(r)){if(r.length===0)continue;for(let o=0;o<r.length;o++){const i=r[o];for(const l in i){const a=i[l]??void 0;if(a){if(typeof a=="object")I(a)&&a.forEach((u,h)=>{if(u)for(const E in u){const f=u[E];if(f&&f.toString().length>0){const y=`[${o.toString()}].${l+`[${h.toString()}].${E}`}=${p(f)}`;e.push(s+y)}}});else if(a.toString().length>0){const u=`[${o.toString()}].${l}=${p(a.toString())}`;e.push(s+u)}}}}}else for(const o in r){const i=r[o];if(i!=null&&i!=""&&i.length!=0){const l=`.${o}=${p(i)}`;e.push(s+l)}}continue}else r&&typeof r=="function"&&(r=null);r!=null&&r!=""&&r.length!=0&&e.push(s+"="+p(r))}return e&&e.join("&")}async sign(t){const e="&key="+await this.helloIboot(),s=[];for(const a in t)s.push(a);s.sort((a,u)=>a.toLowerCase().localeCompare(u.toLowerCase()));const r=[];s.forEach(a=>{let u=t[a];typeof u=="object"&&(u=JSON.stringify(u)),r.push(a+"="+u)});const o=r.join("&"),i=D.md5((o+e).toLocaleUpperCase()),l={params:o,md5:i};return d.debug(l,"API_SIGN"),i}assemblyParameter(t,e){const s=t??{};return s.timestamp=Date.now()+"",s.echostr=O(10),s.version=this.version,s.deviceId=this.deviceId,s.webid=this.websiteId,s.apiKey=this.apiKey,e&&e.length>0&&(s.username=e),s}async assemblyHeader({urlParams:t,token:e}){const s={"Content-Type":"application/x-www-form-urlencoded","Res-Type":"json","Device-Id":this.deviceId,"User-Type":e?.utype.toString()??this.userType.toString(),"User-From":this.userFrom,"Api-Key":this.apiKey};this.lang&&this.lang.length>0&&(s.Lang=this.lang),this.websiteId&&this.websiteId.length>0&&(s["Web-Id"]=this.websiteId),this.websiteNo&&this.websiteNo.length>0&&(s["Web-No"]=this.websiteNo),e&&(e.token&&e.token.length>0&&e.username&&e.username.length>0&&(s.Authorization=e.token,s.Username=e.username),e.xcsrf&&(s[e.xcsrf.csrfHeader]=e.xcsrf.csrfToken));const r=R(t),o=await this.sign(r);return s.Sign=o,s}async helloIboot(){if(this.helloMethod.length<=0)return this.apiKey;const t=this.getApiUrl(this.helloMethod),e={"Content-Type":"application/x-www-form-urlencoded","Res-Type":"json","Api-Key":this.apiKey},s={url:t,headers:e};d.debug(s,"HELLO");const r=await fetch(t,{method:"GET",headers:e,credentials:"include",cache:"force-cache"});if(r.ok){const o=await r.json();return d.debug(o.data,"HELLO RESULT"),o.data}throw new Error("hello iBoot error!")}getApiUrl(t){return`${this.baseUrl}/${t}`}async csrf(){const t=await this.get({url:"guest/csrf"});if(t.success){const e=t.data;if(e)return e.csrfToken.toString()}}async get({url:t,data:e,token:s,cache:r="default"}){const o=this.assemblyParameter(e),i=this.convertUrlParameter(o),l=await this.assemblyHeader({urlParams:i,token:s}),a=`${this.getApiUrl(t)}?${i.toString()}`,u={url:a,headers:l};d.info(u,"GET");const h=await fetch(a,{method:"GET",headers:l,credentials:"include",cache:r});if(h.ok){const f=await h.json();return d.debug(f,"GET_RESULT"),f}const E={code:h.status,success:!1,msg:h.statusText};return d.error(E),E}async post({url:t,data:e,token:s,cache:r="default"}){e=e?{...e}:{};const o=e.buffer??void 0,i=e.boundary??void 0;o&&delete e.buffer,i&&delete e.boundary;const l=this.assemblyParameter(e),a=this.convertUrlParameter(l),u=await this.assemblyHeader({urlParams:a,token:s});o&&i&&(u["Content-Type"]=`multipart/form-data; boundary=${i}`);const h=this.getApiUrl(t),E={url:h,headers:u,params:l};d.info(E,"POST");const f=o?`${h}?${a}`:h,y=await fetch(f,{method:"POST",headers:u,body:o||a.toString(),credentials:"include",cache:r});if(y.ok){const B=await y.json();return d.debug(B,"POST_RESULT"),B}const M={code:y.status,success:!1,msg:y.statusText};return d.error(M),M}async stream({url:t,data:e,token:s}){e=e?{...e}:{};const r=e.buffer??void 0,o=e.boundary??void 0;r&&delete e.buffer,o&&delete e.boundary;const i=this.assemblyParameter(e),l=this.convertUrlParameter(i),a=await this.assemblyHeader({urlParams:l,token:s});r&&o&&(a["Content-Type"]=`multipart/form-data; boundary=${o}`),a.Connection="keep-alive",a["X-Accel-Buffering"]="no",a["Cache-Control"]="no-cache";const u=this.getApiUrl(t);try{const h=r?`${u}?${l}`:u,E={url:u,headers:a,params:i};d.info(E,"STREAM");const f=await fetch(h,{method:"POST",headers:a,body:r||l.toString(),credentials:"include"});if(!f.ok)throw new Error(`HTTP error! status: ${f.status}`);if(!f.body)throw new Error("No response body");return new Response(f.body,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}catch(h){throw h}}}c.ACCOUNT_TYPE_MAP=K,c.COOKIE_NAMES=g,c.CURRENT_WEBSITE_KEY=S,c.DEFAULT_LOCALE=N,c.DEVICE_ID_KEY=w,c.HttpClient=Z,c.USER_FORM_MAP=j,c.USER_SEX_MAP=H,c.USER_TYPE_MAP=A,c.cleanToken=Q,c.dateFormat=F,c.get=C,c.getHttpOpts=V,c.getHttpOptsByCookie=q,c.getLoginUser=X,c.getToken=J,c.iGet=G,c.iPost=k,c.iPostSuccess=Y,c.isArray=I,c.logger=d,c.post=P,c.randomString=O,c.setDefaultRequestHeader=W,c.setToken=z,c.urlEncode=p,c.urlParamToJson=R,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(a,T){typeof exports=="object"&&typeof module<"u"?T(exports,require("pino"),require("pino-pretty"),require("js-md5"),require("crypto-js")):typeof define=="function"&&define.amd?define(["exports","pino","pino-pretty","js-md5","crypto-js"],T):(a=typeof globalThis<"u"?globalThis:a||self,T(a["iboot-http-client"]={},a.pino,a.PinoPretty,a.md5,a.CryptoJS))})(this,(function(a,T,L,D,y){"use strict";const H={GENERAL:0,PHONE:1,EMAIL:2},R={TYPE_MGT:0,TYPE_C:1,TYPE_B:2},K={FROM_WEB:1,FROM_PC:2,FROM_WX_MINI_PRO:3,FROM_WX_PLU:4,FROM_WX_E:5,FROM_APP:6,FROM_DEVICE:7},j={unknown:0,male:1,female:2},$=L({colorize:!0,destination:process.stdout,translateTime:"SYS:yyyy-mm-dd HH:MM:ss",ignore:"pid,hostname",messageFormat:"{msg}",singleLine:!0}),d=T({name:process.env.APP_NAME??"iBoot",level:process.env.APP_ENV==="production"?"info":"debug",nestedKey:"payload"},$),I=n=>Array.isArray(n)||typeof n=="object"&&Object.prototype.toString.call(n)==="[object Array]",O=n=>{const t=n||32,e="ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",s=e.length;let r="";for(let o=0;o<t;o++)r+=e.charAt(Math.floor(Math.random()*s));return r},A=(n,t)=>{const e={};return n.split("&").forEach(r=>{const o=r.split("=");o[1]&&(!t||t.indexOf(o[0])==-1)&&(e[o[0]]=o[1])}),e},p=n=>!n||n==""||n.length==0?"":encodeURIComponent(n).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\'/g,"%27").replace(/\!/g,"%21").replace(/\~/g,"%7E"),F=(n,t)=>{const e={"M+":n.getMonth()+1,"d+":n.getDate(),"h+":n.getHours(),"m+":n.getMinutes(),"s+":n.getSeconds(),"q+":Math.floor((n.getMonth()+3)/3),S:n.getMilliseconds()};if(/(y+)/.test(t)){const r=new RegExp(/(y+)/).exec(t);let o=0;r&&r.length>0&&(o=r[0].length),t=t.replace(/(y+)/,n.getFullYear()+"").substring(4-o)}for(const s in e){const r="("+s+")",o=new RegExp(r);if(o.test(t)){const i=o.exec(t);let l=0;i&&i.length>0&&(l=i[0].length),t=t.replace(o,l==1?e[s].toString():("00"+e[s]).substring(e[s].toString().length))}}return t},N="zh-CN",S="_device_id_key",w="_current_website_key",U="Get request error!",b="Post request error!",g={IBOOT_DEVICE_ID:"did",IBOOT_LANG:"lang",IBOOT_WEBSITE_ID:"web_id",IBOOT_WEBSITE_NO:"web_no",IBOOT_TOKEN:"_t",IBOOT_USER:"_u"},_={DEVICE_ID:"Device-Id",LANG:"Lang",WEBSITE_ID:"Website-Id",WEBSITE_NO:"Website-No"},v=()=>{const n=localStorage.getItem(S)??"",t=localStorage.getItem(w),e=t!=null?JSON.parse(t):null,s={};return n.length>0&&(s["Device-Id"]=n),e&&(s.Lang=e.language,e.websiteId&&(s["Website-Id"]=e.websiteId),e.websiteNo&&(s["Website-No"]=e.websiteNo)),s},W=(n,t)=>{localStorage.setItem(S,n),t&&localStorage.setItem(w,JSON.stringify(t))},C=async(n,t)=>{if(t?.data){const i=new URLSearchParams(t.data);n.indexOf("?")!=-1?n+=`&${i}`:n+=`?${i}`}const e=v(),s=t?.headers;if(s)for(const i in s){const l=s[i];l&&(e[i]=l)}d.debug({url:n,headers:e},"GET");const r=await fetch(n,{method:"GET",headers:e,cache:t?.useCache?"force-cache":"default"});if(r.ok){const i=await r.json();return d.debug(i,"GET_RESULT"),i}const o={code:r.status,success:!1,msg:r.statusText};return d.error(o),o},P=async(n,t)=>{const e=t?.data??{},s=t?.headers;let r;const o=new Headers(v());if(e instanceof FormData?r=e:(r=JSON.stringify(e),o.set("Content-Type","application/json")),s)for(let c in s){const u=s[c];u&&o.set(c,u)}d.debug({url:n,headers:o},"POST");const i=await fetch(n,{method:"POST",headers:o,body:r});if(i.ok){const c=await i.json();return d.debug(c,"POST_RESULT"),c}const l={code:i.status,success:!1,msg:i.statusText};return d.error(l),l},G=async(n,t)=>{const e=await C(n,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??U);return}throw Error(e.msg??U)},k=async(n,t)=>{const e=await P(n,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??b);return}throw Error(e.msg??b)},Y=async(n,t)=>{const e=await P(n,t);return e.success?(t?.showSuccess&&t.showSuccess(e.msg??"SUCCESS"),!0):(t?.showError&&t.showError(e.msg??b),!1)},V=n=>{const t=n.headers.get(_.DEVICE_ID),e=n.headers.get(_.LANG),s=n.headers.get(_.WEBSITE_ID),r=n.headers.get(_.WEBSITE_NO),o={};return t&&t.length>0&&(o.deviceId=t),e&&e.length>0&&(o.lang=e),s&&s.length>0&&(o.websiteId=s),r&&r.length>0&&(o.websiteNo=r),o},q=n=>{if(!n.get)throw new Error("cookies get function is undefined");const t={},e=n.get(g.IBOOT_DEVICE_ID),s=n.get(g.IBOOT_LANG),r=n.get(g.IBOOT_WEBSITE_ID),o=n.get(g.IBOOT_WEBSITE_NO);return e&&e.length>0&&(t.deviceId=e),s&&s.length>0&&(t.lang=s),r&&r.length>0&&(t.websiteId=r),o&&o.length>0&&(t.websiteNo=o),t},X=n=>{if(n.get){const t=n.get(g.IBOOT_USER);if(t&&t.length>0)return JSON.parse(t)}return null},J=n=>{if(n.get){const t=n.get(g.IBOOT_USER);if(t&&t.length>0){const e=JSON.parse(t),s=e.username,r=e.userType.toString(),o=n.get(g.IBOOT_TOKEN);if(o)return{username:s,utype:r,token:o}}}},z=(n,t)=>{const{id:e,name:s,username:r,nickname:o,headImg:i,token:l,lastLoginTime:c,deviceId:u,userType:h,mustChangePwd:E}=n,f={id:e,name:s,username:r,nickname:o||s,headImg:i,lastLoginTime:c,deviceId:u,userType:h,accountType:0,needToReview:!1,socketOnline:!1,mustChangePwd:E};if(!t.set)throw new Error("cookies set function is undefined");t.set(g.IBOOT_TOKEN,l,{path:"/",secure:process.env.APP_ENV==="production",httpOnly:!0,sameSite:"strict"}),t.set(g.IBOOT_USER,JSON.stringify(f))},Q=n=>{if(!n.set)throw new Error("cookies set function is undefined");if(n.set(g.IBOOT_TOKEN,"",{maxAge:-1,httpOnly:!0,path:"/"}),n.set(g.IBOOT_USER,"",{maxAge:-1,httpOnly:!0,path:"/"}),!n.delete)throw new Error("cookies delete function is undefined");n.delete(g.IBOOT_TOKEN),n.delete(g.IBOOT_USER)};class Z{baseUrl;helloMethod;apiKey;userType;userFrom;deviceId;version="1";lang;websiteId;websiteNo;constructor(t){process.env.APP_ENV==="production"||d.warn("This is currently a development environment!"),this.baseUrl=process.env.APP_BASEURL,this.apiKey=process.env.APP_APIKEY,this.userFrom=process.env.APP_USERFROM??"1",this.helloMethod=t.helloURL??"",this.userType=t.userType??R.TYPE_MGT,this.deviceId=t.deviceId??O(10),this.lang=t.lang??N,this.websiteId=t.websiteId,this.websiteNo=t.websiteNo}encrypt(t){const e=y.enc.Utf8.parse(this.apiKey);return y.AES.encrypt(t,e).toString()}decrypt(t){const e=y.enc.Utf8.parse(this.apiKey);return y.AES.decrypt(t,e,{mode:y.mode.ECB}).toString(y.enc.Utf8)}convertUrlParameter(t){const e=[];for(const s in t){let r=t[s];if(r&&typeof r=="string")r=r.trim();else if(r&&typeof r=="object"){if(I(r)){if(r.length===0)continue;for(let o=0;o<r.length;o++){const i=r[o];for(const l in i){const c=i[l]??void 0;if(c){if(typeof c=="object")I(c)&&c.forEach((u,h)=>{if(u)for(const E in u){const f=u[E];if(f&&f.toString().length>0){const m=`[${o.toString()}].${l+`[${h.toString()}].${E}`}=${p(f)}`;e.push(s+m)}}});else if(c.toString().length>0){const u=`[${o.toString()}].${l}=${p(c.toString())}`;e.push(s+u)}}}}}else for(const o in r){const i=r[o];if(i!=null&&i!=""&&i.length!=0){const l=`.${o}=${p(i)}`;e.push(s+l)}}continue}else r&&typeof r=="function"&&(r=null);r!=null&&r!=""&&r.length!=0&&e.push(s+"="+p(r))}return e&&e.join("&")}async sign(t){const e="&key="+await this.helloIboot(),s=[];for(const c in t)s.push(c);s.sort((c,u)=>c.toLowerCase().localeCompare(u.toLowerCase()));const r=[];s.forEach(c=>{let u=t[c];typeof u=="object"&&(u=JSON.stringify(u)),r.push(c+"="+u)});const o=r.join("&"),i=D.md5((o+e).toLocaleUpperCase()),l={params:o,md5:i};return d.debug(l,"API_SIGN"),i}assemblyParameter(t,e){const s=t??{};return s.timestamp=Date.now()+"",s.echostr=O(10),s.version=this.version,s.deviceId=this.deviceId,s.webid=this.websiteId,s.apiKey=this.apiKey,e&&e.length>0&&(s.username=e),s}async assemblyHeader({urlParams:t,token:e}){const s={"Content-Type":"application/x-www-form-urlencoded","Res-Type":"json","Device-Id":this.deviceId,"User-Type":e?.utype.toString()??this.userType.toString(),"User-From":this.userFrom,"Api-Key":this.apiKey};this.lang&&this.lang.length>0&&(s.Lang=this.lang),this.websiteId&&this.websiteId.length>0&&(s["Web-Id"]=this.websiteId),this.websiteNo&&this.websiteNo.length>0&&(s["Web-No"]=this.websiteNo),e&&(e.token&&e.token.length>0&&e.username&&e.username.length>0&&(s.Authorization=e.token,s.Username=e.username),e.xcsrf&&(s[e.xcsrf.csrfHeader]=e.xcsrf.csrfToken));const r=A(t),o=await this.sign(r);return s.Sign=o,s}async helloIboot(){if(this.helloMethod.length<=0)return this.apiKey;const t=this.getApiUrl(this.helloMethod),e={"Content-Type":"application/x-www-form-urlencoded","Res-Type":"json","Api-Key":this.apiKey},s={url:t,headers:e};d.debug(s,"HELLO");const r=await fetch(t,{method:"GET",headers:e,credentials:"include",cache:"force-cache"});if(r.ok){const o=await r.json();return d.debug(o.data,"HELLO RESULT"),o.data}throw new Error("hello iBoot error!")}getApiUrl(t){return`${this.baseUrl}/${t}`}async csrf(){const t=await this.get({url:"guest/csrf"});if(t.success){const e=t.data;if(e)return e.csrfToken.toString()}}async get({url:t,data:e,token:s,cache:r="default"}){const o=this.assemblyParameter(e),i=this.convertUrlParameter(o),l=await this.assemblyHeader({urlParams:i,token:s}),c=`${this.getApiUrl(t)}?${i.toString()}`,u={url:c,headers:l};d.info(u,"GET");const h=await fetch(c,{method:"GET",headers:l,credentials:"include",cache:r});if(h.ok){const f=await h.json();return d.debug(f,"GET_RESULT"),d.debug(h.headers,"RES_HEADERS"),f}const E={code:h.status,success:!1,msg:h.statusText};return d.error(E),E}async post({url:t,data:e,token:s,cache:r="default"}){e=e?{...e}:{};const o=e.buffer??void 0,i=e.boundary??void 0;o&&delete e.buffer,i&&delete e.boundary;const l=this.assemblyParameter(e),c=this.convertUrlParameter(l),u=await this.assemblyHeader({urlParams:c,token:s});o&&i&&(u["Content-Type"]=`multipart/form-data; boundary=${i}`);const h=this.getApiUrl(t),E={url:h,headers:u,params:l};d.info(E,"POST");const f=o?`${h}?${c}`:h,m=await fetch(f,{method:"POST",headers:u,body:o||c.toString(),credentials:"include",cache:r});if(m.ok){const B=await m.json();return d.debug(B,"POST_RESULT"),d.debug(m.headers,"RES_HEADERS"),B}const M={code:m.status,success:!1,msg:m.statusText};return d.error(M),M}async stream({url:t,data:e,token:s}){e=e?{...e}:{};const r=e.buffer??void 0,o=e.boundary??void 0;r&&delete e.buffer,o&&delete e.boundary;const i=this.assemblyParameter(e),l=this.convertUrlParameter(i),c=await this.assemblyHeader({urlParams:l,token:s});r&&o&&(c["Content-Type"]=`multipart/form-data; boundary=${o}`),c.Connection="keep-alive",c["X-Accel-Buffering"]="no",c["Cache-Control"]="no-cache";const u=this.getApiUrl(t);try{const h=r?`${u}?${l}`:u,E={url:u,headers:c,params:i};d.info(E,"STREAM");const f=await fetch(h,{method:"POST",headers:c,body:r||l.toString(),credentials:"include"});if(!f.ok)throw new Error(`HTTP error! status: ${f.status}`);if(!f.body)throw new Error("No response body");return new Response(f.body,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}catch(h){throw h}}}a.ACCOUNT_TYPE_MAP=H,a.COOKIE_NAMES=g,a.CURRENT_WEBSITE_KEY=w,a.DEFAULT_LOCALE=N,a.DEVICE_ID_KEY=S,a.HttpClient=Z,a.USER_FORM_MAP=K,a.USER_SEX_MAP=j,a.USER_TYPE_MAP=R,a.cleanToken=Q,a.dateFormat=F,a.get=C,a.getHttpOpts=V,a.getHttpOptsByCookie=q,a.getLoginUser=X,a.getToken=J,a.iGet=G,a.iPost=k,a.iPostSuccess=Y,a.isArray=I,a.logger=d,a.post=P,a.randomString=O,a.setDefaultRequestHeader=W,a.setToken=z,a.urlEncode=p,a.urlParamToJson=A,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})}));
2
2
  //# sourceMappingURL=iboot-http-client.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"iboot-http-client.umd.js","sources":["../src/types/user.ts","../src/logger.ts","../src/utils.ts","../src/http-client.ts"],"sourcesContent":["export const ACCOUNT_TYPE_MAP = {\r\n GENERAL : 0,\r\n PHONE : 1,\r\n EMAIL : 2\r\n}\r\n\r\nexport const USER_TYPE_MAP = {\r\n TYPE_MGT : 0,\r\n TYPE_C : 1,\r\n TYPE_B : 2\r\n}\r\n\r\nexport const USER_FORM_MAP = {\r\n FROM_WEB : 1,\r\n FROM_PC : 2,\r\n FROM_WX_MINI_PRO : 3,\r\n FROM_WX_PLU : 4,\r\n FROM_WX_E : 5,\r\n FROM_APP : 6,\r\n FROM_DEVICE : 7\r\n}\r\n\r\nexport const USER_SEX_MAP = {\r\n unknown:0,\r\n male:1,\r\n female:2,\r\n}\r\n\r\nexport type ACCOUNT_TYPE = typeof ACCOUNT_TYPE_MAP[keyof typeof ACCOUNT_TYPE_MAP];\r\nexport type USER_TYPE = typeof USER_TYPE_MAP[keyof typeof USER_TYPE_MAP];\r\nexport type USER_FORM = typeof USER_FORM_MAP[keyof typeof USER_FORM_MAP];\r\nexport type USER_SEX = typeof USER_SEX_MAP[keyof typeof USER_SEX_MAP];\r\n\r\n// User interface\r\nexport interface User {\r\n id: string;\r\n name: string;\r\n userType: USER_TYPE;\r\n username?: string;\r\n nickname?: string;\r\n sex?: USER_SEX;\r\n headImg?: string;\r\n lastLoginTime?: string;\r\n tokenExpired?: string;\r\n deviceId?: string;\r\n status?: number;\r\n accountType?: number;\r\n enabled?: boolean;\r\n userFrom?: USER_FORM;\r\n needToReview?: boolean;\r\n socketOnline?: boolean;\r\n createTime?: string;\r\n mustChangePwd?: boolean;\r\n}","import pino from \"pino\";\r\nimport PinoPretty from \"pino-pretty\";\r\n// import koffi from 'koffi';\r\n\r\n// if (typeof window === 'undefined' && process.platform === 'win32') {\r\n// try {\r\n// const CP_UTF8 = 65001;\r\n// const kernel32 = koffi.load('Kernel32');\r\n// const setConsoleOutputCP = kernel32.func('SetConsoleOutputCP', 'bool', ['int']);\r\n// const setConsoleCP = kernel32.func('SetConsoleCP', 'bool', ['int']);\r\n// setConsoleOutputCP(CP_UTF8);\r\n// setConsoleCP(CP_UTF8);\r\n// } catch (e) {\r\n// console.log(e);\r\n// }\r\n// }\r\n\r\n// export const logger = pino({\r\n// name: process.env.APP_NAME ?? 'iBoot',\r\n// level: process.env.NODE_ENV !== 'production' ? 'debug' : 'info',\r\n// nestedKey: 'payload',\r\n// transport: {\r\n// target: 'pino-pretty',\r\n// options: {\r\n// colorize: true,\r\n// translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n// ignore: 'pid,hostname',\r\n// messageFormat: '{msg}',\r\n// singleLine: true,\r\n// },\r\n// }\r\n// });\r\n\r\nconst stream = PinoPretty({\r\n colorize: true,\r\n destination: process.stdout,\r\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n ignore: 'pid,hostname',\r\n messageFormat: '{msg}',\r\n singleLine: true,\r\n});\r\n\r\nexport const logger = pino({\r\n name: process.env.APP_NAME ?? 'iBoot',\r\n level: process.env.APP_ENV === 'production' ? 'info' : 'debug',\r\n nestedKey: 'payload'\r\n}, stream);","export const isArray = (obj: unknown) => {\r\n return (\r\n Array.isArray(obj) ||\r\n (typeof obj === \"object\" &&\r\n Object.prototype.toString.call(obj) === \"[object Array]\")\r\n );\r\n};\r\n\r\n/**\r\n * 生成指定长度的随机串\r\n * @param {Object} len\r\n */\r\nexport const randomString = (len: number) => {\r\n const l = len || 32;\r\n const $chars = \"ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678\";\r\n const maxPos = $chars.length;\r\n let pwd = \"\";\r\n for (let i = 0; i < l; i++) {\r\n pwd += $chars.charAt(Math.floor(Math.random() * maxPos));\r\n }\r\n return pwd;\r\n};\r\n\r\nexport const urlParamToJson = (urlQueryParams: string, exclude?: string[]): Record<string, string> => {\r\n const result: Record<string, string> = {};\r\n const strs = urlQueryParams.split(\"&\");\r\n strs.forEach((item) => {\r\n const arr = item.split(\"=\");\r\n if (arr[1]) {\r\n if (!exclude || exclude.indexOf(arr[0]) == -1) {\r\n result[arr[0]] = arr[1];\r\n }\r\n }\r\n });\r\n return result;\r\n};\r\n\r\nexport const urlEncode = (value: string | null | undefined): string => {\r\n if (!value || value == \"\" || value.length == 0) {\r\n return \"\";\r\n }\r\n return (\r\n encodeURIComponent(value)\r\n // .replace(/%20/g, '+')\r\n // .replace(/%2B/g, '\\\\+')\r\n .replace(/\\(/g, \"%28\")\r\n .replace(/\\)/g, \"%29\")\r\n .replace(/\\'/g, \"%27\")\r\n .replace(/\\!/g, \"%21\")\r\n .replace(/\\~/g, \"%7E\")\r\n );\r\n};\r\n\r\nexport const dateFormat = (dt: Date, fmt: string) => {\r\n const o:Record<string, number> = {\r\n \"M+\": dt.getMonth() + 1, //月份\r\n \"d+\": dt.getDate(), //日\r\n \"h+\": dt.getHours(), //小时\r\n \"m+\": dt.getMinutes(), //分\r\n \"s+\": dt.getSeconds(), //秒\r\n \"q+\": Math.floor((dt.getMonth() + 3) / 3), //季度\r\n S: dt.getMilliseconds(), //毫秒\r\n };\r\n if (/(y+)/.test(fmt)){\r\n const regx = new RegExp(/(y+)/);\r\n const value = regx.exec(fmt);\r\n let len = 0;\r\n if(value && value.length > 0){\r\n len = value[0].length;\r\n }\r\n fmt = fmt.replace(/(y+)/, dt.getFullYear() + \"\").substring(4 - len);\r\n }\r\n\r\n for (const k in o){\r\n const s:string = \"(\" + k + \")\";\r\n const regx = new RegExp(s);\r\n if(regx.test(fmt)){\r\n const value = regx.exec(fmt);\r\n let len = 0;\r\n if(value && value.length > 0){\r\n len = value[0].length;\r\n }\r\n fmt = fmt.replace(regx, len == 1 ? o[k].toString() : (\"00\" + o[k]).substring(o[k].toString().length))\r\n }\r\n }\r\n return fmt;\r\n}","import md5 from \"js-md5\";\r\nimport CryptoJS from 'crypto-js';\r\nimport { isArray, randomString, urlEncode, urlParamToJson } from \"./utils\";\r\nimport {\r\n ClientGetParams,\r\n ClientPostParams,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaders,\r\n HttpToken,\r\n ResultModel,\r\n ServerRequestOptions,\r\n Cookies\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\r\n\r\n\r\nexport const DEFAULT_LOCALE = 'zh-CN';\r\nexport const DEVICE_ID_KEY = \"_device_id_key\";\r\nexport const CURRENT_WEBSITE_KEY = \"_current_website_key\"\r\n\r\nconst _GET_ERROR = \"Get request error!\"\r\nconst _POST_ERROR = \"Post request error!\";\r\n\r\nexport const COOKIE_NAMES = {\r\n \"IBOOT_DEVICE_ID\":\"did\",\r\n \"IBOOT_LANG\" :\"lang\",\r\n \"IBOOT_WEBSITE_ID\":\"web_id\",\r\n \"IBOOT_WEBSITE_NO\":\"web_no\",\r\n \"IBOOT_TOKEN\":\"_t\",\r\n \"IBOOT_USER\":\"_u\"\r\n}\r\n\r\nconst HEADER_NAMES = {\r\n \"DEVICE_ID\": \"Device-Id\",\r\n \"LANG\": \"Lang\",\r\n \"WEBSITE_ID\": \"Website-Id\",\r\n \"WEBSITE_NO\": \"Website-No\",\r\n}\r\n\r\n\r\nconst getDefaultRequestHeader = (): HttpHeaders => {\r\n const devideId = localStorage.getItem(DEVICE_ID_KEY) ?? ''\r\n const json = localStorage.getItem(CURRENT_WEBSITE_KEY);\r\n const curWebsite: CurWebsite | null = json != null ? JSON.parse(json) : null;\r\n const header: HttpHeaders = {}\r\n if (devideId.length > 0) {\r\n header['Device-Id'] = devideId\r\n }\r\n if (curWebsite) {\r\n header['Lang'] = curWebsite.language;\r\n if (curWebsite.websiteId) {\r\n header['Website-Id'] = curWebsite.websiteId;\r\n }\r\n if (curWebsite.websiteNo) {\r\n header['Website-No'] = curWebsite.websiteNo\r\n }\r\n }\r\n return header;\r\n};\r\n\r\n\r\nexport const setDefaultRequestHeader = (deviceId: string, website?: CurWebsite): void => {\r\n localStorage.setItem(DEVICE_ID_KEY, deviceId);\r\n if (website) {\r\n localStorage.setItem(CURRENT_WEBSITE_KEY, JSON.stringify(website));\r\n }\r\n}\r\n\r\nexport const get = async <T>(url: string, opts?: ClientGetParams): Promise<ResultModel<T>> => {\r\n if (opts?.data) {\r\n const params = new URLSearchParams(opts.data);\r\n if (url.indexOf(\"?\") != -1) {\r\n url += `&${params}`\r\n } else {\r\n url += `?${params}`\r\n }\r\n }\r\n const headers: Record<string, string> = getDefaultRequestHeader();\r\n const heads = opts?.headers;\r\n if (heads) {\r\n for (const field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n headers[field] = value;\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": headers,\r\n }, \"GET\")\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n cache: opts?.useCache ? 'force-cache' : 'default'\r\n });\r\n\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const post = async <T>(url: string, opts?: ClientPostParams): Promise<ResultModel<T>> => {\r\n const data = opts?.data ?? {};\r\n const heads = opts?.headers;\r\n let body: string | FormData;\r\n const proxyHeaders = new Headers(getDefaultRequestHeader());\r\n if (!(data instanceof FormData)) {\r\n body = JSON.stringify(data);\r\n proxyHeaders.set('Content-Type', 'application/json');\r\n } else {\r\n body = data;\r\n }\r\n if (heads) {\r\n for (let field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n proxyHeaders.set(field, value);\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": proxyHeaders,\r\n }, \"POST\")\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: proxyHeaders,\r\n body: body,\r\n });\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const iGet = async <T>(url: string, opts?: ClientGetParams): Promise<T | undefined> => {\r\n const res = await get<T>(url, opts);\r\n if (res.success) {\r\n return res.data as T;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _GET_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _GET_ERROR)\r\n}\r\n\r\nexport const iPost = async <T>(url: string, opts?: ClientPostParams): Promise<T | undefined> => {\r\n const res = await post<T>(url, opts);\r\n if (res.success) {\r\n return res.data;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _POST_ERROR)\r\n}\r\n\r\nexport const iPostSuccess = async (url: string, opts?: ClientPostParams): Promise<boolean> => {\r\n const res = await post(url, opts);\r\n if (res.success) {\r\n if (opts?.showSuccess) {\r\n opts.showSuccess(res.msg ?? 'SUCCESS')\r\n }\r\n return true;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n }\r\n return false;\r\n}\r\n\r\n\r\nexport const getHttpOpts = (request: Request): HttpClientOpts => {\r\n const deviceId = request.headers.get(HEADER_NAMES.DEVICE_ID);\r\n const lang = request.headers.get(HEADER_NAMES.LANG);\r\n const websiteId = request.headers.get(HEADER_NAMES.WEBSITE_ID);\r\n const websiteNo = request.headers.get(HEADER_NAMES.WEBSITE_NO);\r\n const result: HttpClientOpts = {}\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport const getHttpOptsByCookie = (cookies: Cookies): HttpClientOpts => {\r\n if(!cookies.get){\r\n throw new Error('cookies get function is undefined');\r\n }\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookies.get(COOKIE_NAMES.IBOOT_DEVICE_ID);\r\n const lang = cookies.get(COOKIE_NAMES.IBOOT_LANG);\r\n const websiteId = cookies.get(COOKIE_NAMES.IBOOT_WEBSITE_ID);\r\n const websiteNo = cookies.get(COOKIE_NAMES.IBOOT_WEBSITE_NO);\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\n\r\nexport const getLoginUser = (cookies: Cookies): User | null => {\r\n if (cookies.get) {\r\n const userjson = cookies.get(COOKIE_NAMES.IBOOT_USER)\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport const getToken = (cookies: Cookies): HttpToken | undefined => {\r\n if (cookies.get) {\r\n const userjson = cookies.get(COOKIE_NAMES.IBOOT_USER);\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n const username = user.username;\r\n const utype = user.userType.toString();\r\n const token = cookies.get(COOKIE_NAMES.IBOOT_TOKEN);\r\n if (token) {\r\n return {\r\n \"username\": username,\r\n \"utype\": utype,\r\n \"token\": token\r\n }\r\n }\r\n }\r\n }\r\n return undefined\r\n}\r\n\r\nexport const setToken = (data: User & { token: string }, cookies: Cookies): void => {\r\n const { id, name, username, nickname, headImg, token, lastLoginTime, deviceId, userType, mustChangePwd } = data;\r\n const loginUser: User = {\r\n id: id,\r\n name:name,\r\n username: username,\r\n nickname: nickname || name,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n deviceId: deviceId,\r\n userType: userType,\r\n accountType: 0,\r\n needToReview: false,\r\n socketOnline: false,\r\n mustChangePwd: mustChangePwd\r\n };\r\n if (!cookies.set) {\r\n throw new Error('cookies set function is undefined')\r\n }\r\n cookies.set(COOKIE_NAMES.IBOOT_TOKEN, token, {\r\n path: '/',\r\n secure: process.env.APP_ENV === 'production',\r\n httpOnly: true,\r\n sameSite: 'strict'\r\n });\r\n cookies.set(COOKIE_NAMES.IBOOT_USER, JSON.stringify(loginUser))\r\n}\r\n\r\nexport const cleanToken = (cookies: Cookies): void => {\r\n if (!cookies.set) {\r\n throw new Error('cookies set function is undefined')\r\n }\r\n cookies.set(COOKIE_NAMES.IBOOT_TOKEN, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n cookies.set(COOKIE_NAMES.IBOOT_USER, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n if(!cookies.delete){\r\n throw new Error('cookies delete function is undefined')\r\n }\r\n cookies.delete(COOKIE_NAMES.IBOOT_TOKEN);\r\n cookies.delete(COOKIE_NAMES.IBOOT_USER);\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly baseUrl: string;\r\n private readonly helloMethod: string;\r\n private readonly apiKey: string;\r\n private readonly userType: USER_TYPE;\r\n private readonly userFrom: string;\r\n private readonly deviceId: string;\r\n private readonly version: string = '1';\r\n private readonly lang: string;\r\n private readonly websiteId?: string;\r\n private readonly websiteNo?: string;\r\n constructor(opts: Readonly<HttpClientOpts>) {\r\n const isProduction = process.env.APP_ENV === 'production';\r\n if (!isProduction) {\r\n logger.warn(\"This is currently a development environment!\")\r\n }\r\n this.baseUrl = process.env.APP_BASEURL!;\r\n this.apiKey = process.env.APP_APIKEY!;\r\n this.userFrom = process.env.APP_USERFROM ?? '1';\r\n\r\n this.helloMethod = opts.helloURL ?? ''\r\n this.userType = opts.userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.deviceId = opts.deviceId ?? randomString(10);\r\n this.lang = opts.lang ?? DEFAULT_LOCALE;\r\n this.websiteId = opts.websiteId\r\n this.websiteNo = opts.websiteNo\r\n }\r\n\r\n encrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.encrypt(data, key).toString();\r\n }\r\n\r\n decrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.decrypt(data, key, {\r\n mode: CryptoJS.mode.ECB,\r\n }).toString(CryptoJS.enc.Utf8);\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private convertUrlParameter(data: Record<string, any>): string {\r\n const p: string[] = [];\r\n for (const o in data) {\r\n let v = data[o];\r\n if (v && typeof v === \"string\") {\r\n v = v.trim();\r\n } else if (v && typeof v === \"object\") {\r\n if (isArray(v)) {\r\n if (v.length === 0) {\r\n continue;\r\n }\r\n for (let i = 0; i < v.length; i++) {\r\n const arr_item = v[i];\r\n for (const item_field in arr_item) {\r\n const item_field_value = arr_item[item_field] ?? undefined;\r\n if (item_field_value) {\r\n if (typeof item_field_value === \"object\") {\r\n if (isArray(item_field_value)) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n item_field_value.forEach((item1: any, index: number) => {\r\n if (item1) {\r\n for (const f in item1) {\r\n const v = item1[f];\r\n if (v && v.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field + `[${index.toString()}].${f}`}=${urlEncode(v)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n } else if (item_field_value.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field}=${urlEncode(item_field_value.toString())}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n for (const obj in v) {\r\n const oValue = v[obj];\r\n if (oValue != null && oValue != \"\" && oValue.length != 0) {\r\n const s = `.${obj}=${urlEncode(oValue)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n continue;\r\n } else if (v && typeof v === \"function\") {\r\n v = null;\r\n }\r\n\r\n if (v != null && v != \"\" && v.length != 0) {\r\n p.push(o + \"=\" + urlEncode(v));\r\n }\r\n }\r\n return (p && p.join(\"&\"));\r\n }\r\n\r\n private async sign(data: Record<string, object | string>): Promise<string> {\r\n //由后台分配\r\n const _apiKey = \"&key=\" + (await this.helloIboot());\r\n const arr: string[] = [];\r\n for (const o in data) {\r\n arr.push(o);\r\n }\r\n arr.sort((a: string, b: string) => {\r\n return a.toLowerCase().localeCompare(b.toLowerCase());\r\n });\r\n const res: string[] = [];\r\n arr.forEach((v: string) => {\r\n let value: object | string = data[v];\r\n if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n res.push(v + \"=\" + value);\r\n });\r\n const paramsStr: string = res.join(\"&\");\r\n const str = md5.md5((paramsStr + _apiKey).toLocaleUpperCase());\r\n const logInfo = {\r\n params: paramsStr,\r\n md5: str\r\n }\r\n logger.debug(logInfo, \"API_SIGN\")\r\n return str;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private assemblyParameter(data?: Record<string, any>, username?: string): Record<string, any> {\r\n const params = data ?? {};\r\n params['timestamp'] = Date.now() + '';\r\n params['echostr'] = randomString(10);\r\n params['version'] = this.version;\r\n params['deviceId'] = this.deviceId;\r\n params['webid'] = this.websiteId;\r\n params['apiKey'] = this.apiKey;\r\n if (username && username.length > 0) {\r\n params['username'] = username;\r\n }\r\n return params;\r\n }\r\n\r\n private async assemblyHeader({ urlParams, token }: Readonly<{ urlParams: string, token?: Readonly<HttpToken> }>) {\r\n const h: Record<string, string> = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Device-Id': this.deviceId,\r\n 'User-Type': token?.utype.toString() ?? this.userType.toString(),\r\n 'User-From': this.userFrom,\r\n 'Api-Key': this.apiKey\r\n }\r\n if (this.lang && this.lang.length > 0) {\r\n h['Lang'] = this.lang\r\n }\r\n if (this.websiteId && this.websiteId.length > 0) {\r\n h['Web-Id'] = this.websiteId\r\n }\r\n if (this.websiteNo && this.websiteNo.length > 0) {\r\n h['Web-No'] = this.websiteNo\r\n }\r\n if (token) {\r\n if (token.token && token.token.length > 0 && token.username && token.username.length > 0) {\r\n h['Authorization'] = token.token;\r\n h['Username'] = token.username;\r\n }\r\n if (token.xcsrf) {\r\n h[token.xcsrf.csrfHeader] = token.xcsrf.csrfToken;\r\n }\r\n }\r\n const data = urlParamToJson(urlParams);\r\n const sign = await this.sign(data);\r\n h['Sign'] = sign\r\n return h;\r\n }\r\n\r\n private async helloIboot(): Promise<string> {\r\n if (this.helloMethod.length <= 0) {\r\n return this.apiKey;\r\n }\r\n const api = this.getApiUrl(this.helloMethod);\r\n const h = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Api-Key': this.apiKey\r\n }\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": h\r\n }\r\n logger.debug(logInfo, \"HELLO\");\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: h,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result.data, 'HELLO RESULT')\r\n return result.data;\r\n }\r\n throw new Error('hello iBoot error!')\r\n }\r\n\r\n private getApiUrl(url: string): string {\r\n return `${this.baseUrl}/${url}`;\r\n }\r\n\r\n async csrf(): Promise<string | undefined> {\r\n const res = await this.get<CSRFToken>({\r\n url: 'guest/csrf'\r\n });\r\n if (res.success) {\r\n const data = res.data;\r\n if (data) {\r\n return data[\"csrfToken\"].toString();\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async get<T>({ url, data, token, cache = 'default' }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n const api = `${this.getApiUrl(url)}?${urlParams.toString()}`\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers\r\n }\r\n logger.info(logInfo, \"GET\");\r\n const res = await fetch(api, {\r\n \"method\": 'GET',\r\n \"headers\": headers,\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token, cache = \"default\" }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n const api = this.getApiUrl(url);\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"POST\");\r\n const urls = buffer ? `${api}?${urlParams}` : api;\r\n const res = await fetch(urls, {\r\n \"method\": 'POST',\r\n \"headers\": headers,\r\n \"body\": buffer ? buffer : urlParams.toString(),\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<Omit<ServerRequestOptions, 'cache'>>): Promise<Response> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params); //new URLSearchParams(params);\r\n\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n headers['Connection'] = 'keep-alive';\r\n headers['X-Accel-Buffering'] = 'no'; //防止 Nginx 缓存\r\n headers['Cache-Control'] = 'no-cache';\r\n const api = this.getApiUrl(url)\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"STREAM\");\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: buffer ? buffer : urlParams.toString(),\r\n credentials: 'include'\r\n });\r\n\r\n if (!res.ok) {\r\n throw new Error(`HTTP error! status: ${res.status}`);\r\n }\r\n if (!res.body) {\r\n throw new Error('No response body');\r\n }\r\n return new Response(res.body, {\r\n headers: {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive'\r\n }\r\n });\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","stream","PinoPretty","logger","pino","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","dateFormat","dt","fmt","o","k","s","regx","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","COOKIE_NAMES","HEADER_NAMES","getDefaultRequestHeader","devideId","json","curWebsite","header","setDefaultRequestHeader","deviceId","website","get","url","opts","params","headers","heads","field","response","msg","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpOpts","request","lang","websiteId","websiteNo","getHttpOptsByCookie","cookies","getLoginUser","userjson","getToken","user","username","utype","token","setToken","id","name","nickname","headImg","lastLoginTime","userType","mustChangePwd","loginUser","cleanToken","HttpClient","key","CryptoJS","p","v","arr_item","item_field","item_field_value","item1","index","f","oValue","_apiKey","b","paramsStr","str","md5","logInfo","urlParams","h","sign","api","cache","buffer","boundary","urls","e"],"mappings":"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"}
1
+ {"version":3,"file":"iboot-http-client.umd.js","sources":["../src/types/user.ts","../src/logger.ts","../src/utils.ts","../src/http-client.ts"],"sourcesContent":["export const ACCOUNT_TYPE_MAP = {\r\n GENERAL : 0,\r\n PHONE : 1,\r\n EMAIL : 2\r\n}\r\n\r\nexport const USER_TYPE_MAP = {\r\n TYPE_MGT : 0,\r\n TYPE_C : 1,\r\n TYPE_B : 2\r\n}\r\n\r\nexport const USER_FORM_MAP = {\r\n FROM_WEB : 1,\r\n FROM_PC : 2,\r\n FROM_WX_MINI_PRO : 3,\r\n FROM_WX_PLU : 4,\r\n FROM_WX_E : 5,\r\n FROM_APP : 6,\r\n FROM_DEVICE : 7\r\n}\r\n\r\nexport const USER_SEX_MAP = {\r\n unknown:0,\r\n male:1,\r\n female:2,\r\n}\r\n\r\nexport type ACCOUNT_TYPE = typeof ACCOUNT_TYPE_MAP[keyof typeof ACCOUNT_TYPE_MAP];\r\nexport type USER_TYPE = typeof USER_TYPE_MAP[keyof typeof USER_TYPE_MAP];\r\nexport type USER_FORM = typeof USER_FORM_MAP[keyof typeof USER_FORM_MAP];\r\nexport type USER_SEX = typeof USER_SEX_MAP[keyof typeof USER_SEX_MAP];\r\n\r\n// User interface\r\nexport interface User {\r\n id: string;\r\n name: string;\r\n userType: USER_TYPE;\r\n username?: string;\r\n nickname?: string;\r\n sex?: USER_SEX;\r\n headImg?: string;\r\n lastLoginTime?: string;\r\n tokenExpired?: string;\r\n deviceId?: string;\r\n status?: number;\r\n accountType?: number;\r\n enabled?: boolean;\r\n userFrom?: USER_FORM;\r\n needToReview?: boolean;\r\n socketOnline?: boolean;\r\n createTime?: string;\r\n mustChangePwd?: boolean;\r\n}","import pino from \"pino\";\r\nimport PinoPretty from \"pino-pretty\";\r\n// import koffi from 'koffi';\r\n\r\n// if (typeof window === 'undefined' && process.platform === 'win32') {\r\n// try {\r\n// const CP_UTF8 = 65001;\r\n// const kernel32 = koffi.load('Kernel32');\r\n// const setConsoleOutputCP = kernel32.func('SetConsoleOutputCP', 'bool', ['int']);\r\n// const setConsoleCP = kernel32.func('SetConsoleCP', 'bool', ['int']);\r\n// setConsoleOutputCP(CP_UTF8);\r\n// setConsoleCP(CP_UTF8);\r\n// } catch (e) {\r\n// console.log(e);\r\n// }\r\n// }\r\n\r\n// export const logger = pino({\r\n// name: process.env.APP_NAME ?? 'iBoot',\r\n// level: process.env.NODE_ENV !== 'production' ? 'debug' : 'info',\r\n// nestedKey: 'payload',\r\n// transport: {\r\n// target: 'pino-pretty',\r\n// options: {\r\n// colorize: true,\r\n// translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n// ignore: 'pid,hostname',\r\n// messageFormat: '{msg}',\r\n// singleLine: true,\r\n// },\r\n// }\r\n// });\r\n\r\nconst stream = PinoPretty({\r\n colorize: true,\r\n destination: process.stdout,\r\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n ignore: 'pid,hostname',\r\n messageFormat: '{msg}',\r\n singleLine: true,\r\n});\r\n\r\nexport const logger = pino({\r\n name: process.env.APP_NAME ?? 'iBoot',\r\n level: process.env.APP_ENV === 'production' ? 'info' : 'debug',\r\n nestedKey: 'payload'\r\n}, stream);","export const isArray = (obj: unknown) => {\r\n return (\r\n Array.isArray(obj) ||\r\n (typeof obj === \"object\" &&\r\n Object.prototype.toString.call(obj) === \"[object Array]\")\r\n );\r\n};\r\n\r\n/**\r\n * 生成指定长度的随机串\r\n * @param {Object} len\r\n */\r\nexport const randomString = (len: number) => {\r\n const l = len || 32;\r\n const $chars = \"ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678\";\r\n const maxPos = $chars.length;\r\n let pwd = \"\";\r\n for (let i = 0; i < l; i++) {\r\n pwd += $chars.charAt(Math.floor(Math.random() * maxPos));\r\n }\r\n return pwd;\r\n};\r\n\r\nexport const urlParamToJson = (urlQueryParams: string, exclude?: string[]): Record<string, string> => {\r\n const result: Record<string, string> = {};\r\n const strs = urlQueryParams.split(\"&\");\r\n strs.forEach((item) => {\r\n const arr = item.split(\"=\");\r\n if (arr[1]) {\r\n if (!exclude || exclude.indexOf(arr[0]) == -1) {\r\n result[arr[0]] = arr[1];\r\n }\r\n }\r\n });\r\n return result;\r\n};\r\n\r\nexport const urlEncode = (value: string | null | undefined): string => {\r\n if (!value || value == \"\" || value.length == 0) {\r\n return \"\";\r\n }\r\n return (\r\n encodeURIComponent(value)\r\n // .replace(/%20/g, '+')\r\n // .replace(/%2B/g, '\\\\+')\r\n .replace(/\\(/g, \"%28\")\r\n .replace(/\\)/g, \"%29\")\r\n .replace(/\\'/g, \"%27\")\r\n .replace(/\\!/g, \"%21\")\r\n .replace(/\\~/g, \"%7E\")\r\n );\r\n};\r\n\r\nexport const dateFormat = (dt: Date, fmt: string) => {\r\n const o:Record<string, number> = {\r\n \"M+\": dt.getMonth() + 1, //月份\r\n \"d+\": dt.getDate(), //日\r\n \"h+\": dt.getHours(), //小时\r\n \"m+\": dt.getMinutes(), //分\r\n \"s+\": dt.getSeconds(), //秒\r\n \"q+\": Math.floor((dt.getMonth() + 3) / 3), //季度\r\n S: dt.getMilliseconds(), //毫秒\r\n };\r\n if (/(y+)/.test(fmt)){\r\n const regx = new RegExp(/(y+)/);\r\n const value = regx.exec(fmt);\r\n let len = 0;\r\n if(value && value.length > 0){\r\n len = value[0].length;\r\n }\r\n fmt = fmt.replace(/(y+)/, dt.getFullYear() + \"\").substring(4 - len);\r\n }\r\n\r\n for (const k in o){\r\n const s:string = \"(\" + k + \")\";\r\n const regx = new RegExp(s);\r\n if(regx.test(fmt)){\r\n const value = regx.exec(fmt);\r\n let len = 0;\r\n if(value && value.length > 0){\r\n len = value[0].length;\r\n }\r\n fmt = fmt.replace(regx, len == 1 ? o[k].toString() : (\"00\" + o[k]).substring(o[k].toString().length))\r\n }\r\n }\r\n return fmt;\r\n}","import md5 from \"js-md5\";\r\nimport CryptoJS from 'crypto-js';\r\nimport { isArray, randomString, urlEncode, urlParamToJson } from \"./utils\";\r\nimport {\r\n ClientGetParams,\r\n ClientPostParams,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaders,\r\n HttpToken,\r\n ResultModel,\r\n ServerRequestOptions,\r\n Cookies\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\r\n\r\n\r\nexport const DEFAULT_LOCALE = 'zh-CN';\r\nexport const DEVICE_ID_KEY = \"_device_id_key\";\r\nexport const CURRENT_WEBSITE_KEY = \"_current_website_key\"\r\n\r\nconst _GET_ERROR = \"Get request error!\"\r\nconst _POST_ERROR = \"Post request error!\";\r\n\r\nexport const COOKIE_NAMES = {\r\n \"IBOOT_DEVICE_ID\":\"did\",\r\n \"IBOOT_LANG\" :\"lang\",\r\n \"IBOOT_WEBSITE_ID\":\"web_id\",\r\n \"IBOOT_WEBSITE_NO\":\"web_no\",\r\n \"IBOOT_TOKEN\":\"_t\",\r\n \"IBOOT_USER\":\"_u\"\r\n}\r\n\r\nconst HEADER_NAMES = {\r\n \"DEVICE_ID\": \"Device-Id\",\r\n \"LANG\": \"Lang\",\r\n \"WEBSITE_ID\": \"Website-Id\",\r\n \"WEBSITE_NO\": \"Website-No\",\r\n}\r\n\r\n\r\nconst getDefaultRequestHeader = (): HttpHeaders => {\r\n const devideId = localStorage.getItem(DEVICE_ID_KEY) ?? ''\r\n const json = localStorage.getItem(CURRENT_WEBSITE_KEY);\r\n const curWebsite: CurWebsite | null = json != null ? JSON.parse(json) : null;\r\n const header: HttpHeaders = {}\r\n if (devideId.length > 0) {\r\n header['Device-Id'] = devideId\r\n }\r\n if (curWebsite) {\r\n header['Lang'] = curWebsite.language;\r\n if (curWebsite.websiteId) {\r\n header['Website-Id'] = curWebsite.websiteId;\r\n }\r\n if (curWebsite.websiteNo) {\r\n header['Website-No'] = curWebsite.websiteNo\r\n }\r\n }\r\n return header;\r\n};\r\n\r\n\r\nexport const setDefaultRequestHeader = (deviceId: string, website?: CurWebsite): void => {\r\n localStorage.setItem(DEVICE_ID_KEY, deviceId);\r\n if (website) {\r\n localStorage.setItem(CURRENT_WEBSITE_KEY, JSON.stringify(website));\r\n }\r\n}\r\n\r\nexport const get = async <T>(url: string, opts?: ClientGetParams): Promise<ResultModel<T>> => {\r\n if (opts?.data) {\r\n const params = new URLSearchParams(opts.data);\r\n if (url.indexOf(\"?\") != -1) {\r\n url += `&${params}`\r\n } else {\r\n url += `?${params}`\r\n }\r\n }\r\n const headers: Record<string, string> = getDefaultRequestHeader();\r\n const heads = opts?.headers;\r\n if (heads) {\r\n for (const field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n headers[field] = value;\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": headers,\r\n }, \"GET\")\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n cache: opts?.useCache ? 'force-cache' : 'default'\r\n });\r\n\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const post = async <T>(url: string, opts?: ClientPostParams): Promise<ResultModel<T>> => {\r\n const data = opts?.data ?? {};\r\n const heads = opts?.headers;\r\n let body: string | FormData;\r\n const proxyHeaders = new Headers(getDefaultRequestHeader());\r\n if (!(data instanceof FormData)) {\r\n body = JSON.stringify(data);\r\n proxyHeaders.set('Content-Type', 'application/json');\r\n } else {\r\n body = data;\r\n }\r\n if (heads) {\r\n for (let field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n proxyHeaders.set(field, value);\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": proxyHeaders,\r\n }, \"POST\")\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: proxyHeaders,\r\n body: body,\r\n });\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const iGet = async <T>(url: string, opts?: ClientGetParams): Promise<T | undefined> => {\r\n const res = await get<T>(url, opts);\r\n if (res.success) {\r\n return res.data as T;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _GET_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _GET_ERROR)\r\n}\r\n\r\nexport const iPost = async <T>(url: string, opts?: ClientPostParams): Promise<T | undefined> => {\r\n const res = await post<T>(url, opts);\r\n if (res.success) {\r\n return res.data;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _POST_ERROR)\r\n}\r\n\r\nexport const iPostSuccess = async (url: string, opts?: ClientPostParams): Promise<boolean> => {\r\n const res = await post(url, opts);\r\n if (res.success) {\r\n if (opts?.showSuccess) {\r\n opts.showSuccess(res.msg ?? 'SUCCESS')\r\n }\r\n return true;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n }\r\n return false;\r\n}\r\n\r\n\r\nexport const getHttpOpts = (request: Request): HttpClientOpts => {\r\n const deviceId = request.headers.get(HEADER_NAMES.DEVICE_ID);\r\n const lang = request.headers.get(HEADER_NAMES.LANG);\r\n const websiteId = request.headers.get(HEADER_NAMES.WEBSITE_ID);\r\n const websiteNo = request.headers.get(HEADER_NAMES.WEBSITE_NO);\r\n const result: HttpClientOpts = {}\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport const getHttpOptsByCookie = (cookies: Cookies): HttpClientOpts => {\r\n if(!cookies.get){\r\n throw new Error('cookies get function is undefined');\r\n }\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookies.get(COOKIE_NAMES.IBOOT_DEVICE_ID);\r\n const lang = cookies.get(COOKIE_NAMES.IBOOT_LANG);\r\n const websiteId = cookies.get(COOKIE_NAMES.IBOOT_WEBSITE_ID);\r\n const websiteNo = cookies.get(COOKIE_NAMES.IBOOT_WEBSITE_NO);\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\n\r\nexport const getLoginUser = (cookies: Cookies): User | null => {\r\n if (cookies.get) {\r\n const userjson = cookies.get(COOKIE_NAMES.IBOOT_USER)\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport const getToken = (cookies: Cookies): HttpToken | undefined => {\r\n if (cookies.get) {\r\n const userjson = cookies.get(COOKIE_NAMES.IBOOT_USER);\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n const username = user.username;\r\n const utype = user.userType.toString();\r\n const token = cookies.get(COOKIE_NAMES.IBOOT_TOKEN);\r\n if (token) {\r\n return {\r\n \"username\": username,\r\n \"utype\": utype,\r\n \"token\": token\r\n }\r\n }\r\n }\r\n }\r\n return undefined\r\n}\r\n\r\nexport const setToken = (data: User & { token: string }, cookies: Cookies): void => {\r\n const { id, name, username, nickname, headImg, token, lastLoginTime, deviceId, userType, mustChangePwd } = data;\r\n const loginUser: User = {\r\n id: id,\r\n name:name,\r\n username: username,\r\n nickname: nickname || name,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n deviceId: deviceId,\r\n userType: userType,\r\n accountType: 0,\r\n needToReview: false,\r\n socketOnline: false,\r\n mustChangePwd: mustChangePwd\r\n };\r\n if (!cookies.set) {\r\n throw new Error('cookies set function is undefined')\r\n }\r\n cookies.set(COOKIE_NAMES.IBOOT_TOKEN, token, {\r\n path: '/',\r\n secure: process.env.APP_ENV === 'production',\r\n httpOnly: true,\r\n sameSite: 'strict'\r\n });\r\n cookies.set(COOKIE_NAMES.IBOOT_USER, JSON.stringify(loginUser))\r\n}\r\n\r\nexport const cleanToken = (cookies: Cookies): void => {\r\n if (!cookies.set) {\r\n throw new Error('cookies set function is undefined')\r\n }\r\n cookies.set(COOKIE_NAMES.IBOOT_TOKEN, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n cookies.set(COOKIE_NAMES.IBOOT_USER, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n if(!cookies.delete){\r\n throw new Error('cookies delete function is undefined')\r\n }\r\n cookies.delete(COOKIE_NAMES.IBOOT_TOKEN);\r\n cookies.delete(COOKIE_NAMES.IBOOT_USER);\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly baseUrl: string;\r\n private readonly helloMethod: string;\r\n private readonly apiKey: string;\r\n private readonly userType: USER_TYPE;\r\n private readonly userFrom: string;\r\n private readonly deviceId: string;\r\n private readonly version: string = '1';\r\n private readonly lang: string;\r\n private readonly websiteId?: string;\r\n private readonly websiteNo?: string;\r\n constructor(opts: Readonly<HttpClientOpts>) {\r\n const isProduction = process.env.APP_ENV === 'production';\r\n if (!isProduction) {\r\n logger.warn(\"This is currently a development environment!\")\r\n }\r\n this.baseUrl = process.env.APP_BASEURL!;\r\n this.apiKey = process.env.APP_APIKEY!;\r\n this.userFrom = process.env.APP_USERFROM ?? '1';\r\n\r\n this.helloMethod = opts.helloURL ?? ''\r\n this.userType = opts.userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.deviceId = opts.deviceId ?? randomString(10);\r\n this.lang = opts.lang ?? DEFAULT_LOCALE;\r\n this.websiteId = opts.websiteId\r\n this.websiteNo = opts.websiteNo\r\n }\r\n\r\n encrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.encrypt(data, key).toString();\r\n }\r\n\r\n decrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.decrypt(data, key, {\r\n mode: CryptoJS.mode.ECB,\r\n }).toString(CryptoJS.enc.Utf8);\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private convertUrlParameter(data: Record<string, any>): string {\r\n const p: string[] = [];\r\n for (const o in data) {\r\n let v = data[o];\r\n if (v && typeof v === \"string\") {\r\n v = v.trim();\r\n } else if (v && typeof v === \"object\") {\r\n if (isArray(v)) {\r\n if (v.length === 0) {\r\n continue;\r\n }\r\n for (let i = 0; i < v.length; i++) {\r\n const arr_item = v[i];\r\n for (const item_field in arr_item) {\r\n const item_field_value = arr_item[item_field] ?? undefined;\r\n if (item_field_value) {\r\n if (typeof item_field_value === \"object\") {\r\n if (isArray(item_field_value)) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n item_field_value.forEach((item1: any, index: number) => {\r\n if (item1) {\r\n for (const f in item1) {\r\n const v = item1[f];\r\n if (v && v.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field + `[${index.toString()}].${f}`}=${urlEncode(v)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n } else if (item_field_value.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field}=${urlEncode(item_field_value.toString())}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n for (const obj in v) {\r\n const oValue = v[obj];\r\n if (oValue != null && oValue != \"\" && oValue.length != 0) {\r\n const s = `.${obj}=${urlEncode(oValue)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n continue;\r\n } else if (v && typeof v === \"function\") {\r\n v = null;\r\n }\r\n\r\n if (v != null && v != \"\" && v.length != 0) {\r\n p.push(o + \"=\" + urlEncode(v));\r\n }\r\n }\r\n return (p && p.join(\"&\"));\r\n }\r\n\r\n private async sign(data: Record<string, object | string>): Promise<string> {\r\n //由后台分配\r\n const _apiKey = \"&key=\" + (await this.helloIboot());\r\n const arr: string[] = [];\r\n for (const o in data) {\r\n arr.push(o);\r\n }\r\n arr.sort((a: string, b: string) => {\r\n return a.toLowerCase().localeCompare(b.toLowerCase());\r\n });\r\n const res: string[] = [];\r\n arr.forEach((v: string) => {\r\n let value: object | string = data[v];\r\n if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n res.push(v + \"=\" + value);\r\n });\r\n const paramsStr: string = res.join(\"&\");\r\n const str = md5.md5((paramsStr + _apiKey).toLocaleUpperCase());\r\n const logInfo = {\r\n params: paramsStr,\r\n md5: str\r\n }\r\n logger.debug(logInfo, \"API_SIGN\")\r\n return str;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private assemblyParameter(data?: Record<string, any>, username?: string): Record<string, any> {\r\n const params = data ?? {};\r\n params['timestamp'] = Date.now() + '';\r\n params['echostr'] = randomString(10);\r\n params['version'] = this.version;\r\n params['deviceId'] = this.deviceId;\r\n params['webid'] = this.websiteId;\r\n params['apiKey'] = this.apiKey;\r\n if (username && username.length > 0) {\r\n params['username'] = username;\r\n }\r\n return params;\r\n }\r\n\r\n private async assemblyHeader({ urlParams, token }: Readonly<{ urlParams: string, token?: Readonly<HttpToken> }>) {\r\n const h: Record<string, string> = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Device-Id': this.deviceId,\r\n 'User-Type': token?.utype.toString() ?? this.userType.toString(),\r\n 'User-From': this.userFrom,\r\n 'Api-Key': this.apiKey\r\n }\r\n if (this.lang && this.lang.length > 0) {\r\n h['Lang'] = this.lang\r\n }\r\n if (this.websiteId && this.websiteId.length > 0) {\r\n h['Web-Id'] = this.websiteId\r\n }\r\n if (this.websiteNo && this.websiteNo.length > 0) {\r\n h['Web-No'] = this.websiteNo\r\n }\r\n if (token) {\r\n if (token.token && token.token.length > 0 && token.username && token.username.length > 0) {\r\n h['Authorization'] = token.token;\r\n h['Username'] = token.username;\r\n }\r\n if (token.xcsrf) {\r\n h[token.xcsrf.csrfHeader] = token.xcsrf.csrfToken;\r\n }\r\n }\r\n const data = urlParamToJson(urlParams);\r\n const sign = await this.sign(data);\r\n h['Sign'] = sign\r\n return h;\r\n }\r\n\r\n private async helloIboot(): Promise<string> {\r\n if (this.helloMethod.length <= 0) {\r\n return this.apiKey;\r\n }\r\n const api = this.getApiUrl(this.helloMethod);\r\n const h = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Api-Key': this.apiKey\r\n }\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": h\r\n }\r\n logger.debug(logInfo, \"HELLO\");\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: h,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result.data, 'HELLO RESULT')\r\n return result.data;\r\n }\r\n throw new Error('hello iBoot error!')\r\n }\r\n\r\n private getApiUrl(url: string): string {\r\n return `${this.baseUrl}/${url}`;\r\n }\r\n\r\n async csrf(): Promise<string | undefined> {\r\n const res = await this.get<CSRFToken>({\r\n url: 'guest/csrf'\r\n });\r\n if (res.success) {\r\n const data = res.data;\r\n if (data) {\r\n return data[\"csrfToken\"].toString();\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async get<T>({ url, data, token, cache = 'default' }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n const api = `${this.getApiUrl(url)}?${urlParams.toString()}`\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers\r\n }\r\n logger.info(logInfo, \"GET\");\r\n const res = await fetch(api, {\r\n \"method\": 'GET',\r\n \"headers\": headers,\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n logger.debug(res.headers, \"RES_HEADERS\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token, cache = \"default\" }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n const api = this.getApiUrl(url);\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"POST\");\r\n const urls = buffer ? `${api}?${urlParams}` : api;\r\n const res = await fetch(urls, {\r\n \"method\": 'POST',\r\n \"headers\": headers,\r\n \"body\": buffer ? buffer : urlParams.toString(),\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"POST_RESULT\");\r\n logger.debug(res.headers, \"RES_HEADERS\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<Omit<ServerRequestOptions, 'cache'>>): Promise<Response> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params); //new URLSearchParams(params);\r\n\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n headers['Connection'] = 'keep-alive';\r\n headers['X-Accel-Buffering'] = 'no'; //防止 Nginx 缓存\r\n headers['Cache-Control'] = 'no-cache';\r\n const api = this.getApiUrl(url)\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"STREAM\");\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: buffer ? buffer : urlParams.toString(),\r\n credentials: 'include'\r\n });\r\n\r\n if (!res.ok) {\r\n throw new Error(`HTTP error! status: ${res.status}`);\r\n }\r\n if (!res.body) {\r\n throw new Error('No response body');\r\n }\r\n return new Response(res.body, {\r\n headers: {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive'\r\n }\r\n });\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","stream","PinoPretty","logger","pino","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","dateFormat","dt","fmt","o","k","s","regx","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","COOKIE_NAMES","HEADER_NAMES","getDefaultRequestHeader","devideId","json","curWebsite","header","setDefaultRequestHeader","deviceId","website","get","url","opts","params","headers","heads","field","response","msg","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpOpts","request","lang","websiteId","websiteNo","getHttpOptsByCookie","cookies","getLoginUser","userjson","getToken","user","username","utype","token","setToken","id","name","nickname","headImg","lastLoginTime","userType","mustChangePwd","loginUser","cleanToken","HttpClient","key","CryptoJS","p","v","arr_item","item_field","item_field_value","item1","index","f","oValue","_apiKey","a","b","paramsStr","str","md5","logInfo","urlParams","h","sign","api","cache","buffer","boundary","urls","e"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "iboot-http-client",
3
3
  "private": false,
4
- "version": "1.1.7",
4
+ "version": "1.1.8",
5
5
  "description": "iBoot.xin 相关应用的客户端Http封装",
6
6
  "type": "module",
7
7
  "main": "./dist/iboot-http-client.cjs.js",