iboot-http-client 1.0.9 → 1.1.0

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 D=require("pino"),M=require("js-md5"),m=require("crypto-js"),k={GENERAL:0,PHONE:1,EMAIL:2},C={TYPE_MGT:0,TYPE_C:1,TYPE_B:2},B={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},L={unknown:0,male:1,female:2};process.platform==="win32"&&(process.stdout.setEncoding("utf8"),process.stderr.setEncoding("utf8"));const u=D({name:process.env.APP_NAME??"iBoot",level:process.env.NODE_ENV!="production"?"debug":"info",nestedKey:"payload",formatters:{level:n=>({level:n})},transport:{target:"pino-pretty",options:{colorize:!0,translateTime:"SYS:yyyy-mm-dd HH:MM:ss",ignore:"pid,hostname",messageFormat:"{msg}",singleLine:!0}}}),b=n=>Array.isArray(n)||typeof n=="object"&&Object.prototype.toString.call(n)==="[object Array]",I=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},E=n=>!n||n==""||n.length==0?"":encodeURIComponent(n).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\'/g,"%27").replace(/\!/g,"%21").replace(/\~/g,"%7E"),R="zh-CN",w="_device_id_key",O="_current_website_key",v="Get request error!",S="Post request error!",_={"Device-Id":"Device-Id",Lang:"Lang","Website-Id":"Website-Id","Website-No":"Website-No"},f={IBOOT_DEVICE_ID:"IBOOT_DEVICE_ID",IBOOT_LOCALE:"IBOOT_LOCALE",IBOOT_WEBSITE_ID:"IBOOT_WEBSITE_ID",IBOOT_WEBSITE_NO:"IBOOT_WEBSITE_NO",token:"token",user:"user"},N=()=>{const n=localStorage.getItem(w)??"",t=localStorage.getItem(O),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(O,JSON.stringify(t))},U=async(n,t)=>{if(t?.data){const i=new URLSearchParams(t.data);n.indexOf("?")!=-1?n+=`&${i}`:n+=`?${i}`}const e=N(),s=t?.headers;if(s)for(const i in s){const l=s[i];l&&(e[i]=l)}u.debug({method:"GET",url:n,headers:e});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({GET_RESULT:i}),i}const o={code:r.status,success:!1,msg:r.statusText};return u.error(o),o},P=async(n,t)=>{const e=t?.data??{},s=t?.headers;let r;const o=new Headers(N());if(e instanceof FormData?r=e:(r=JSON.stringify(e),o.set("Content-Type","application/json")),s)for(let a in s){const c=s[a];c&&o.set(a,c)}u.debug({method:"GET",url:n,headers:o});const i=await fetch(n,{method:"POST",headers:o,body:r});if(i.ok){const a=await i.json();return u.debug({POST_RESULT:a}),a}const l={code:i.status,success:!1,msg:i.statusText};return u.error(l),l},$=async(n,t)=>{const e=await U(n,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??v);return}throw Error(e.msg??v)},H=async(n,t)=>{const e=await P(n,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??S);return}throw Error(e.msg??S)},j=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??S),!1)},F=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},K=n=>{const t={},e=n.get(f.IBOOT_DEVICE_ID)?.value,s=n.get(f.IBOOT_LOCALE)?.value,r=n.get(f.IBOOT_WEBSITE_ID)?.value,o=n.get(f.IBOOT_WEBSITE_NO)?.value;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};class x{baseUrl;helloMethod;apiKey;userType;userFrom;deviceId;version="1";lang;websiteId;websiteNo;_isDebug;constructor({deviceId:t,lang:e,websiteId:s,websiteNo:r,userType:o,helloURL:i}){this.baseUrl=process.env.BASE_URL??"",this.helloMethod=i??"",this.apiKey=process.env.API_KEY??"",this.userType=o??C.TYPE_MGT,this.userFrom=process.env.USER_FROM||"1",this.deviceId=t??I(10),this.lang=e??R,this.websiteId=s,this.websiteNo=r,this._isDebug=process.env.NODE_ENV!="production"}isDebug(){return this._isDebug}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)}getDeviceId(){return this.deviceId}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(b(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")b(a)&&a.forEach((c,d)=>{if(c)for(const g in c){const h=c[g];if(h&&h.toString().length>0){const p=`[${o.toString()}].${l+`[${d.toString()}].${g}`}=${E(h)}`;e.push(s+p)}}});else if(a.toString().length>0){const c=`[${o.toString()}].${l}=${E(a.toString())}`;e.push(s+c)}}}}}else for(const o in r){const i=r[o];if(i!=null&&i!=""&&i.length!=0){const l=`.${o}=${E(i)}`;e.push(s+l)}}continue}else r&&typeof r=="function"&&(r=null);r!=null&&r!=""&&r.length!=0&&e.push(s+"="+E(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,c)=>a.toLowerCase().localeCompare(c.toLowerCase()));const r=[];s.forEach(a=>{let c=t[a];typeof c=="object"&&(c=JSON.stringify(c)),r.push(a+"="+c)});const o=r.join("&"),i=M.md5((o+e).toLocaleUpperCase()),l={name:"sort",params:o,md5:i};return u.debug(l),i}assemblyParameter(t,e){const s=t??{};return s.timestamp=Date.now()+"",s.echostr=I(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};u.debug(s);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({result:o.data}),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()}`,c={method:"GET",url:a,headers:l};u.info(c);const d=await fetch(a,{method:"GET",headers:l,credentials:"include",cache:r});if(d.ok){const h=await d.json();return u.debug({GET_RESULT:h}),h}const g={code:d.status,success:!1,msg:d.statusText};return u.error(g),g}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),c=await this.assemblyHeader({urlParams:a,token:s});o&&i&&(c["Content-Type"]=`multipart/form-data; boundary=${i}`);const d=this.getApiUrl(t),g={method:"POST",url:d,headers:c,params:l};u.info(g);const h=o?`${d}?${a}`:d,p=await fetch(h,{method:"POST",headers:c,body:o||a.toString(),credentials:"include",cache:r});if(p.ok){const T=await p.json();return u.debug({POST_RESULT:T}),T}const y={code:p.status,success:!1,msg:p.statusText};return u.error(y),y}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 c=this.getApiUrl(t);try{const d=r?`${c}?${l}`:c,g={method:"STREAM",url:c,headers:a,params:i};u.info(g);const h=await fetch(d,{method:"POST",headers:a,body:r||l.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}}getUserInfo(t){const e=t.get(f.user)?.value;return e&&e.length>0?JSON.parse(e):null}getToken(t){const e=t.get("user")?.value;let s="",r=this.userType;if(e&&e.length>0){const o=JSON.parse(e);s=o.username,r=o.userType.toString()}return{username:s,utype:r,token:t.get(f.token)?.value??""}}getTokenByCookies=t=>{const e=t.get("user")?.value;let s="",r=this.userType;if(e&&e.length>0){const o=JSON.parse(e);s=o.username,r=o.userType.toString()}return{username:s,utype:r,token:t.get(f.token)?.value??""}};setToken(t,e){const{id:s,name:r,username:o,nickname:i,sex:l,headImg:a,token:c,lastLoginTime:d,tokenExpired:g,deviceId:h,userType:p,mustChangePwd:y}=t,T={id:s,name:r,username:o,nickname:i,sex:l,headImg:a,lastLoginTime:d,tokenExpired:g,deviceId:h,userType:p,status:0,accountType:0,enabled:!1,userFrom:1,needToReview:!1,socketOnline:!1,createTime:"",mustChangePwd:y};return e.cookies.set(f.token,c,{httpOnly:!0,secure:!this._isDebug,sameSite:"strict",path:"/"}),e.cookies.set(f.user,JSON.stringify(T)),e}cleanToken(t){return t.cookies.set(f.token,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.set(f.user,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.delete(f.token),t.cookies.delete(f.user),t}}exports.ACCOUNT_TYPE_MAP=k;exports.CURRENT_WEBSITE_KEY=O;exports.DEFAULT_LOCALE=R;exports.DEVICE_ID_KEY=w;exports.HttpClient=x;exports.USER_FORM_MAP=B;exports.USER_SEX_MAP=L;exports.USER_TYPE_MAP=C;exports.get=U;exports.getHttpClientOpts=F;exports.getHttpClientOptsByCookie=K;exports.iGet=$;exports.iPost=H;exports.iPostSuccess=j;exports.isArray=b;exports.logger=u;exports.post=P;exports.randomString=I;exports.setDefaultRequestHeader=W;exports.urlEncode=E;exports.urlParamToJson=A;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const k=require("pino"),D=require("koffi"),L=require("js-md5"),m=require("crypto-js"),M={GENERAL:0,PHONE:1,EMAIL:2},v={TYPE_MGT:0,TYPE_C:1,TYPE_B:2},B={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};if(typeof window>"u"&&process.platform==="win32")try{const t=D.load("Kernel32"),e=t.func("SetConsoleOutputCP","bool",["int"]),s=t.func("SetConsoleCP","bool",["int"]);e(65001),s(65001)}catch(n){console.log(n)}const u=k({name:process.env.APP_NAME??"iBoot",level:process.env.NODE_ENV!=="production"?"debug":"info",nestedKey:"payload",transport:{target:"pino-pretty",options:{colorize:!0,translateTime:"SYS:yyyy-mm-dd HH:MM:ss",ignore:"pid,hostname",messageFormat:"{msg}",singleLine:!0}}}),b=n=>Array.isArray(n)||typeof n=="object"&&Object.prototype.toString.call(n)==="[object Array]",I=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},E=n=>!n||n==""||n.length==0?"":encodeURIComponent(n).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\'/g,"%27").replace(/\!/g,"%21").replace(/\~/g,"%7E"),R="zh-CN",O="_device_id_key",w="_current_website_key",C="Get request error!",S="Post request error!",_={"Device-Id":"Device-Id",Lang:"Lang","Website-Id":"Website-Id","Website-No":"Website-No"},f={IBOOT_DEVICE_ID:"IBOOT_DEVICE_ID",IBOOT_LOCALE:"IBOOT_LOCALE",IBOOT_WEBSITE_ID:"IBOOT_WEBSITE_ID",IBOOT_WEBSITE_NO:"IBOOT_WEBSITE_NO",token:"token",user:"user"},U=()=>{const n=localStorage.getItem(O)??"",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(O,n),t&&localStorage.setItem(w,JSON.stringify(t))},N=async(n,t)=>{if(t?.data){const i=new URLSearchParams(t.data);n.indexOf("?")!=-1?n+=`&${i}`:n+=`?${i}`}const e=U(),s=t?.headers;if(s)for(const i in s){const l=s[i];l&&(e[i]=l)}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},P=async(n,t)=>{const e=t?.data??{},s=t?.headers;let r;const o=new Headers(U());if(e instanceof FormData?r=e:(r=JSON.stringify(e),o.set("Content-Type","application/json")),s)for(let a in s){const c=s[a];c&&o.set(a,c)}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 l={code:i.status,success:!1,msg:i.statusText};return u.error(l),l},$=async(n,t)=>{const e=await N(n,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??C);return}throw Error(e.msg??C)},F=async(n,t)=>{const e=await P(n,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??S);return}throw Error(e.msg??S)},j=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??S),!1)},K=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},x=n=>{const t={},e=n.get(f.IBOOT_DEVICE_ID)?.value,s=n.get(f.IBOOT_LOCALE)?.value,r=n.get(f.IBOOT_WEBSITE_ID)?.value,o=n.get(f.IBOOT_WEBSITE_NO)?.value;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};class G{baseUrl;helloMethod;apiKey;userType;userFrom;deviceId;version="1";lang;websiteId;websiteNo;_isDebug;constructor({deviceId:t,lang:e,websiteId:s,websiteNo:r,userType:o,helloURL:i}){this.baseUrl=process.env.BASE_URL??"",this.helloMethod=i??"",this.apiKey=process.env.API_KEY??"",this.userType=o??v.TYPE_MGT,this.userFrom=process.env.USER_FROM||"1",this.deviceId=t??I(10),this.lang=e??R,this.websiteId=s,this.websiteNo=r,this._isDebug=process.env.NODE_ENV!="production"}isDebug(){return this._isDebug}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)}getDeviceId(){return this.deviceId}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(b(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")b(a)&&a.forEach((c,d)=>{if(c)for(const g in c){const h=c[g];if(h&&h.toString().length>0){const p=`[${o.toString()}].${l+`[${d.toString()}].${g}`}=${E(h)}`;e.push(s+p)}}});else if(a.toString().length>0){const c=`[${o.toString()}].${l}=${E(a.toString())}`;e.push(s+c)}}}}}else for(const o in r){const i=r[o];if(i!=null&&i!=""&&i.length!=0){const l=`.${o}=${E(i)}`;e.push(s+l)}}continue}else r&&typeof r=="function"&&(r=null);r!=null&&r!=""&&r.length!=0&&e.push(s+"="+E(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,c)=>a.toLowerCase().localeCompare(c.toLowerCase()));const r=[];s.forEach(a=>{let c=t[a];typeof c=="object"&&(c=JSON.stringify(c)),r.push(a+"="+c)});const o=r.join("&"),i=L.md5((o+e).toLocaleUpperCase()),l={params:o,md5:i};return u.debug(l,"API_SIGN"),i}assemblyParameter(t,e){const s=t??{};return s.timestamp=Date.now()+"",s.echostr=I(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};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),l=await this.assemblyHeader({urlParams:i,token:s}),a=`${this.getApiUrl(t)}?${i.toString()}`,c={url:a,headers:l};u.info(c,"GET");const d=await fetch(a,{method:"GET",headers:l,credentials:"include",cache:r});if(d.ok){const h=await d.json();return u.debug(h,"GET_RESULT"),h}const g={code:d.status,success:!1,msg:d.statusText};return u.error(g),g}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),c=await this.assemblyHeader({urlParams:a,token:s});o&&i&&(c["Content-Type"]=`multipart/form-data; boundary=${i}`);const d=this.getApiUrl(t),g={url:d,headers:c,params:l};u.info(g,"POST");const h=o?`${d}?${a}`:d,p=await fetch(h,{method:"POST",headers:c,body:o||a.toString(),credentials:"include",cache:r});if(p.ok){const T=await p.json();return u.debug(T,"POST_RESULT"),T}const y={code:p.status,success:!1,msg:p.statusText};return u.error(y),y}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 c=this.getApiUrl(t);try{const d=r?`${c}?${l}`:c,g={url:c,headers:a,params:i};u.info(g,"STREAM");const h=await fetch(d,{method:"POST",headers:a,body:r||l.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}}getUserInfo(t){const e=t.get(f.user)?.value;return e&&e.length>0?JSON.parse(e):null}getToken(t){const e=t.get("user")?.value;let s="",r=this.userType;if(e&&e.length>0){const o=JSON.parse(e);s=o.username,r=o.userType.toString()}return{username:s,utype:r,token:t.get(f.token)?.value??""}}getTokenByCookies=t=>{const e=t.get("user")?.value;let s="",r=this.userType;if(e&&e.length>0){const o=JSON.parse(e);s=o.username,r=o.userType.toString()}return{username:s,utype:r,token:t.get(f.token)?.value??""}};setToken(t,e){const{id:s,name:r,username:o,nickname:i,sex:l,headImg:a,token:c,lastLoginTime:d,tokenExpired:g,deviceId:h,userType:p,mustChangePwd:y}=t,T={id:s,name:r,username:o,nickname:i,sex:l,headImg:a,lastLoginTime:d,tokenExpired:g,deviceId:h,userType:p,status:0,accountType:0,enabled:!1,userFrom:1,needToReview:!1,socketOnline:!1,createTime:"",mustChangePwd:y};return e.cookies.set(f.token,c,{httpOnly:!0,secure:!this._isDebug,sameSite:"strict",path:"/"}),e.cookies.set(f.user,JSON.stringify(T)),e}cleanToken(t){return t.cookies.set(f.token,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.set(f.user,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.delete(f.token),t.cookies.delete(f.user),t}}exports.ACCOUNT_TYPE_MAP=M;exports.CURRENT_WEBSITE_KEY=w;exports.DEFAULT_LOCALE=R;exports.DEVICE_ID_KEY=O;exports.HttpClient=G;exports.USER_FORM_MAP=B;exports.USER_SEX_MAP=H;exports.USER_TYPE_MAP=v;exports.get=N;exports.getHttpClientOpts=K;exports.getHttpClientOptsByCookie=x;exports.iGet=$;exports.iPost=F;exports.iPostSuccess=j;exports.isArray=b;exports.logger=u;exports.post=P;exports.randomString=I;exports.setDefaultRequestHeader=W;exports.urlEncode=E;exports.urlParamToJson=A;
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 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 userType: USER_TYPE;\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\n\r\n// 在 Windows 系统上确保中文字符正确显示\r\nif (process.platform === 'win32') {\r\n // 设置 stdout 和 stderr 的编码为 utf8\r\n process.stdout.setEncoding('utf8');\r\n process.stderr.setEncoding('utf8');\r\n}\r\n\r\nexport 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 formatters: {\r\n level: (label) => {\r\n return { level: label };\r\n }\r\n },\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});","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","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 CookieNames,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaderNames,\r\n HttpHeaders,\r\n HttpToken,\r\n IbootCookieStore,\r\n IbootReadonlyCookies,\r\n IbootWritableCookie,\r\n ResultModel,\r\n ServerRequestOptions\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\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\nconst HEADER_NAMES: Record<HttpHeaderNames, HttpHeaderNames> = {\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\nconst COOKIE_NAMES: Record<CookieNames, CookieNames> = {\r\n \"IBOOT_DEVICE_ID\": \"IBOOT_DEVICE_ID\",\r\n \"IBOOT_LOCALE\": \"IBOOT_LOCALE\",\r\n \"IBOOT_WEBSITE_ID\": \"IBOOT_WEBSITE_ID\",\r\n \"IBOOT_WEBSITE_NO\": \"IBOOT_WEBSITE_NO\",\r\n \"token\": \"token\",\r\n \"user\": \"user\"\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 \"method\": \"GET\",\r\n \"url\": url,\r\n \"headers\": headers,\r\n })\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({\r\n \"GET_RESULT\": result,\r\n })\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 \"method\": \"GET\",\r\n \"url\": url,\r\n \"headers\": proxyHeaders,\r\n })\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({\r\n \"POST_RESULT\": result,\r\n })\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 getHttpClientOpts = (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 getHttpClientOptsByCookie = (cookie: IbootReadonlyCookies): HttpClientOpts => {\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookie.get(COOKIE_NAMES.IBOOT_DEVICE_ID)?.value;\r\n const lang = cookie.get(COOKIE_NAMES.IBOOT_LOCALE)?.value;\r\n const websiteId = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_ID)?.value;\r\n const websiteNo = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_NO)?.value;\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 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 private readonly _isDebug: boolean;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType, helloURL }: Readonly<HttpClientOpts>) {\r\n this.baseUrl = process.env.BASE_URL ?? '';\r\n this.helloMethod = helloURL ?? ''\r\n this.apiKey = process.env.API_KEY ?? '';\r\n this.userType = userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.userFrom = process.env.USER_FROM || '1';\r\n this.deviceId = deviceId ?? randomString(10);\r\n this.lang = lang ?? DEFAULT_LOCALE;\r\n this.websiteId = websiteId\r\n this.websiteNo = websiteNo\r\n this._isDebug = process.env.NODE_ENV != 'production';\r\n }\r\n\r\n isDebug() {\r\n return this._isDebug;\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 getDeviceId() {\r\n return this.deviceId;\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 name: \"sort\",\r\n params: paramsStr,\r\n md5: str\r\n }\r\n logger.debug(logInfo)\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);\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: result.data })\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 \"method\": \"GET\",\r\n \"url\": api,\r\n \"headers\": headers\r\n }\r\n logger.info(logInfo);\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({ \"GET_RESULT\": 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 \"method\": \"POST\",\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo);\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({ \"POST_RESULT\": 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 \"method\": \"STREAM\",\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo);\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\r\n getUserInfo(cookies: IbootCookieStore): User | null {\r\n const userjson = cookies.get(COOKIE_NAMES.user)?.value;\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n return null;\r\n }\r\n\r\n getToken(cookies: IbootCookieStore): HttpToken {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n getTokenByCookies = (cookies: IbootReadonlyCookies): HttpToken => {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setToken(data: User & { token: string, extFields: Record<string, any> }, response: { cookies: IbootWritableCookie }) {\r\n const { id, name, username, nickname, sex, headImg, token, lastLoginTime, tokenExpired, 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,\r\n sex: sex,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n tokenExpired: tokenExpired,\r\n deviceId: deviceId,\r\n userType: userType,\r\n status: 0,\r\n accountType: 0,\r\n enabled: false,\r\n userFrom: 1,\r\n needToReview: false,\r\n socketOnline: false,\r\n createTime: \"\",\r\n mustChangePwd: mustChangePwd\r\n };\r\n response.cookies.set(COOKIE_NAMES.token, token, {\r\n httpOnly: true,\r\n secure: !this._isDebug, // 在生产环境中启用Secure\r\n sameSite: 'strict', // 防止 CSRF 攻击\r\n path: '/', // Cookie 的路径\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, JSON.stringify(loginUser));\r\n return response;\r\n }\r\n\r\n cleanToken(response: { cookies: IbootWritableCookie }) {\r\n response.cookies.set(COOKIE_NAMES.token, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.delete(COOKIE_NAMES.token);\r\n response.cookies.delete(COOKIE_NAMES.user)\r\n return response;\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","logger","pino","label","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","HEADER_NAMES","COOKIE_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","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","helloURL","key","CryptoJS","p","o","v","arr_item","item_field","item_field_value","item1","index","f","s","oValue","_apiKey","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","cache","buffer","boundary","urls","e","cookies","userjson","utype","user","id","name","nickname","sex","headImg","lastLoginTime","tokenExpired","mustChangePwd","loginUser"],"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 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 userType: USER_TYPE;\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 koffi from 'koffi';\r\n\r\nif (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\nexport 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});","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","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 CookieNames,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaderNames,\r\n HttpHeaders,\r\n HttpToken,\r\n IbootCookieStore,\r\n IbootReadonlyCookies,\r\n IbootWritableCookie,\r\n ResultModel,\r\n ServerRequestOptions\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\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\nconst HEADER_NAMES: Record<HttpHeaderNames, HttpHeaderNames> = {\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\nconst COOKIE_NAMES: Record<CookieNames, CookieNames> = {\r\n \"IBOOT_DEVICE_ID\": \"IBOOT_DEVICE_ID\",\r\n \"IBOOT_LOCALE\": \"IBOOT_LOCALE\",\r\n \"IBOOT_WEBSITE_ID\": \"IBOOT_WEBSITE_ID\",\r\n \"IBOOT_WEBSITE_NO\": \"IBOOT_WEBSITE_NO\",\r\n \"token\": \"token\",\r\n \"user\": \"user\"\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 getHttpClientOpts = (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 getHttpClientOptsByCookie = (cookie: IbootReadonlyCookies): HttpClientOpts => {\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookie.get(COOKIE_NAMES.IBOOT_DEVICE_ID)?.value;\r\n const lang = cookie.get(COOKIE_NAMES.IBOOT_LOCALE)?.value;\r\n const websiteId = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_ID)?.value;\r\n const websiteNo = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_NO)?.value;\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 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 private readonly _isDebug: boolean;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType, helloURL }: Readonly<HttpClientOpts>) {\r\n this.baseUrl = process.env.BASE_URL ?? '';\r\n this.helloMethod = helloURL ?? ''\r\n this.apiKey = process.env.API_KEY ?? '';\r\n this.userType = userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.userFrom = process.env.USER_FROM || '1';\r\n this.deviceId = deviceId ?? randomString(10);\r\n this.lang = lang ?? DEFAULT_LOCALE;\r\n this.websiteId = websiteId\r\n this.websiteNo = websiteNo\r\n this._isDebug = process.env.NODE_ENV != 'production';\r\n }\r\n\r\n isDebug() {\r\n return this._isDebug;\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 getDeviceId() {\r\n return this.deviceId;\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\r\n getUserInfo(cookies: IbootCookieStore): User | null {\r\n const userjson = cookies.get(COOKIE_NAMES.user)?.value;\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n return null;\r\n }\r\n\r\n getToken(cookies: IbootCookieStore): HttpToken {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n getTokenByCookies = (cookies: IbootReadonlyCookies): HttpToken => {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setToken(data: User & { token: string, extFields: Record<string, any> }, response: { cookies: IbootWritableCookie }) {\r\n const { id, name, username, nickname, sex, headImg, token, lastLoginTime, tokenExpired, 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,\r\n sex: sex,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n tokenExpired: tokenExpired,\r\n deviceId: deviceId,\r\n userType: userType,\r\n status: 0,\r\n accountType: 0,\r\n enabled: false,\r\n userFrom: 1,\r\n needToReview: false,\r\n socketOnline: false,\r\n createTime: \"\",\r\n mustChangePwd: mustChangePwd\r\n };\r\n response.cookies.set(COOKIE_NAMES.token, token, {\r\n httpOnly: true,\r\n secure: !this._isDebug, // 在生产环境中启用Secure\r\n sameSite: 'strict', // 防止 CSRF 攻击\r\n path: '/', // Cookie 的路径\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, JSON.stringify(loginUser));\r\n return response;\r\n }\r\n\r\n cleanToken(response: { cookies: IbootWritableCookie }) {\r\n response.cookies.set(COOKIE_NAMES.token, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.delete(COOKIE_NAMES.token);\r\n response.cookies.delete(COOKIE_NAMES.user)\r\n return response;\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","kernel32","koffi","setConsoleOutputCP","setConsoleCP","e","logger","pino","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","HEADER_NAMES","COOKIE_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","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","helloURL","key","CryptoJS","p","o","v","arr_item","item_field","item_field_value","item1","index","f","s","oValue","_apiKey","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","cache","buffer","boundary","urls","cookies","userjson","utype","user","id","name","nickname","sex","headImg","lastLoginTime","tokenExpired","mustChangePwd","loginUser"],"mappings":"sKAAaA,EAAmB,CAC5B,QAAU,EACV,MAAQ,EACR,MAAQ,CACZ,EAEaC,EAAgB,CACzB,SAAW,EACX,OAAS,EACT,OAAS,CACb,EAEaC,EAAgB,CACzB,SAAW,EACX,QAAU,EACV,iBAAmB,EACnB,YAAc,EACd,UAAY,EACZ,SAAW,EACX,YAAc,CAClB,EAEaC,EAAe,CACxB,QAAQ,EACR,KAAK,EACL,OAAO,CACX,ECvBA,GAAI,OAAO,OAAW,KAAe,QAAQ,WAAa,QACtD,GAAI,CAEA,MAAMC,EAAWC,EAAM,KAAK,UAAU,EAChCC,EAAqBF,EAAS,KAAK,qBAAsB,OAAQ,CAAC,KAAK,CAAC,EACxEG,EAAeH,EAAS,KAAK,eAAgB,OAAQ,CAAC,KAAK,CAAC,EAClEE,EAAmB,KAAO,EAC1BC,EAAa,KAAO,CACxB,OAASC,EAAG,CACR,QAAQ,IAAIA,CAAC,CACjB,CAGG,MAAMC,EAASC,EAAK,CACvB,KAAM,QAAQ,IAAI,UAAY,QAC9B,MAAO,QAAQ,IAAI,WAAa,aAAe,QAAU,OACzD,UAAW,UACX,UAAW,CACP,OAAQ,cACR,QAAS,CACL,SAAU,GACV,cAAe,0BACf,OAAQ,eACR,cAAe,QACf,WAAY,EAAA,CAChB,CAER,CAAC,EC9BYC,EAAWC,GAEpB,MAAM,QAAQA,CAAG,GAChB,OAAOA,GAAQ,UACd,OAAO,UAAU,SAAS,KAAKA,CAAG,IAAM,iBAQjCC,EAAgBC,GAAgB,CAC3C,MAAMC,EAAID,GAAO,GACXE,EAAS,mDACTC,EAASD,EAAO,OACtB,IAAIE,EAAM,GACV,QAASC,EAAI,EAAGA,EAAIJ,EAAGI,IACrBD,GAAOF,EAAO,OAAO,KAAK,MAAM,KAAK,SAAWC,CAAM,CAAC,EAEzD,OAAOC,CACT,EAEaE,EAAiB,CAACC,EAAwBC,IAA+C,CACpG,MAAMC,EAAiC,CAAA,EAEvC,OADaF,EAAe,MAAM,GAAG,EAChC,QAASG,GAAS,CACrB,MAAMC,EAAMD,EAAK,MAAM,GAAG,EACtBC,EAAI,CAAC,IACH,CAACH,GAAWA,EAAQ,QAAQG,EAAI,CAAC,CAAC,GAAK,MACzCF,EAAOE,EAAI,CAAC,CAAC,EAAIA,EAAI,CAAC,EAG5B,CAAC,EACMF,CACT,EAEaG,EAAaC,GACpB,CAACA,GAASA,GAAS,IAAMA,EAAM,QAAU,EACpC,GAGP,mBAAmBA,CAAK,EAGrB,QAAQ,MAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EC3BdC,EAAiB,QACjBC,EAAgB,iBAChBC,EAAsB,uBAE7BC,EAAa,qBACbC,EAAc,sBAEdC,EAAyD,CAC3D,YAAa,YACb,KAAQ,OACR,aAAc,aACd,aAAc,YAClB,EAEMC,EAAiD,CACnD,gBAAmB,kBACnB,aAAgB,eAChB,iBAAoB,mBACpB,iBAAoB,mBACpB,MAAS,QACT,KAAQ,MACZ,EAEMC,EAA0B,IAAmB,CAC/C,MAAMC,EAAW,aAAa,QAAQP,CAAa,GAAK,GAClDQ,EAAO,aAAa,QAAQP,CAAmB,EAC/CQ,EAAgCD,GAAQ,KAAO,KAAK,MAAMA,CAAI,EAAI,KAClEE,EAAsB,CAAA,EAC5B,OAAIH,EAAS,OAAS,IAClBG,EAAO,WAAW,EAAIH,GAEtBE,IACAC,EAAO,KAAUD,EAAW,SACxBA,EAAW,YACXC,EAAO,YAAY,EAAID,EAAW,WAElCA,EAAW,YACXC,EAAO,YAAY,EAAID,EAAW,YAGnCC,CACX,EAGaC,EAA0B,CAACC,EAAkBC,IAA+B,CACrF,aAAa,QAAQb,EAAeY,CAAQ,EACxCC,GACA,aAAa,QAAQZ,EAAqB,KAAK,UAAUY,CAAO,CAAC,CAEzE,EAEaC,EAAM,MAAUC,EAAaC,IAAoD,CAC1F,GAAIA,GAAM,KAAM,CACZ,MAAMC,EAAS,IAAI,gBAAgBD,EAAK,IAAI,EACxCD,EAAI,QAAQ,GAAG,GAAK,GACpBA,GAAO,IAAIE,CAAM,GAEjBF,GAAO,IAAIE,CAAM,EAEzB,CACA,MAAMC,EAAkCZ,EAAA,EAClCa,EAAQH,GAAM,QACpB,GAAIG,EACA,UAAWC,KAASD,EAAO,CACvB,MAAMrB,EAAQqB,EAAMC,CAAK,EACrBtB,IACAoB,EAAQE,CAAK,EAAItB,EAEzB,CAEJlB,EAAO,MAAM,CACT,IAAOmC,EACP,QAAWG,CAAA,EACZ,KAAK,EACR,MAAMG,EAAW,MAAM,MAAMN,EAAK,CAC9B,OAAQ,MACR,QAAAG,EACA,MAAOF,GAAM,SAAW,cAAgB,SAAA,CAC3C,EAED,GAAIK,EAAS,GAAI,CACb,MAAM3B,EAAS,MAAM2B,EAAS,KAAA,EAC9B,OAAAzC,EAAO,MAAMc,EAAQ,YAAY,EAC1BA,CACX,CACA,MAAM4B,EAAM,CACR,KAAMD,EAAS,OACf,QAAS,GACT,IAAKA,EAAS,UAAA,EAElB,OAAAzC,EAAO,MAAM0C,CAAG,EACTA,CACX,EAEaC,EAAO,MAAUR,EAAaC,IAAqD,CAC5F,MAAMQ,EAAOR,GAAM,MAAQ,CAAA,EACrBG,EAAQH,GAAM,QACpB,IAAIS,EACJ,MAAMC,EAAe,IAAI,QAAQpB,GAAyB,EAO1D,GANMkB,aAAgB,SAIlBC,EAAOD,GAHPC,EAAO,KAAK,UAAUD,CAAI,EAC1BE,EAAa,IAAI,eAAgB,kBAAkB,GAInDP,EACA,QAASC,KAASD,EAAO,CACrB,MAAMrB,EAAQqB,EAAMC,CAAK,EACrBtB,GACA4B,EAAa,IAAIN,EAAOtB,CAAK,CAErC,CAEJlB,EAAO,MAAM,CACT,IAAOmC,EACP,QAAWW,CAAA,EACZ,MAAM,EACT,MAAML,EAAW,MAAM,MAAMN,EAAK,CAC9B,OAAQ,OACR,QAASW,EACT,KAAAD,CAAA,CACH,EACD,GAAIJ,EAAS,GAAI,CACb,MAAM3B,EAAS,MAAM2B,EAAS,KAAA,EAC9B,OAAAzC,EAAO,MAAMc,EAAQ,aAAa,EAC3BA,CACX,CACA,MAAM4B,EAAM,CACR,KAAMD,EAAS,OACf,QAAS,GACT,IAAKA,EAAS,UAAA,EAElB,OAAAzC,EAAO,MAAM0C,CAAG,EACTA,CACX,EAEaK,EAAO,MAAUZ,EAAaC,IAAmD,CAC1F,MAAMY,EAAM,MAAMd,EAAOC,EAAKC,CAAI,EAClC,GAAIY,EAAI,QACJ,OAAOA,EAAI,KAEf,GAAIZ,GAAM,UAAW,CACjBA,EAAK,UAAUY,EAAI,KAAO1B,CAAU,EACpC,MACJ,CACA,MAAM,MAAM0B,EAAI,KAAO1B,CAAU,CACrC,EAEa2B,EAAQ,MAAUd,EAAaC,IAAoD,CAC5F,MAAMY,EAAM,MAAML,EAAQR,EAAKC,CAAI,EACnC,GAAIY,EAAI,QACJ,OAAOA,EAAI,KAEf,GAAIZ,GAAM,UAAW,CACjBA,EAAK,UAAUY,EAAI,KAAOzB,CAAW,EACrC,MACJ,CACA,MAAM,MAAMyB,EAAI,KAAOzB,CAAW,CACtC,EAEa2B,EAAe,MAAOf,EAAaC,IAA8C,CAC1F,MAAMY,EAAM,MAAML,EAAKR,EAAKC,CAAI,EAChC,OAAIY,EAAI,SACAZ,GAAM,aACNA,EAAK,YAAYY,EAAI,KAAO,SAAS,EAElC,KAEPZ,GAAM,WACNA,EAAK,UAAUY,EAAI,KAAOzB,CAAW,EAElC,GACX,EAGa4B,EAAqBC,GAAqC,CACnE,MAAMpB,EAAWoB,EAAQ,QAAQ,IAAI5B,EAAa,WAAW,CAAC,EACxD6B,EAAOD,EAAQ,QAAQ,IAAI5B,EAAa,IAAI,EAC5C8B,EAAYF,EAAQ,QAAQ,IAAI5B,EAAa,YAAY,CAAC,EAC1D+B,EAAYH,EAAQ,QAAQ,IAAI5B,EAAa,YAAY,CAAC,EAC1DV,EAAyB,CAAA,EAC/B,OAAIkB,GAAYA,EAAS,OAAS,IAC9BlB,EAAO,SAAWkB,GAElBqB,GAAQA,EAAK,OAAS,IACtBvC,EAAO,KAAOuC,GAEdC,GAAaA,EAAU,OAAS,IAChCxC,EAAO,UAAYwC,GAEnBC,GAAaA,EAAU,OAAS,IAChCzC,EAAO,UAAYyC,GAEhBzC,CACX,EAEa0C,EAA6BC,GAAiD,CACvF,MAAM3C,EAAyB,CAAA,EACzBkB,EAAWyB,EAAO,IAAIhC,EAAa,eAAe,GAAG,MACrD4B,EAAOI,EAAO,IAAIhC,EAAa,YAAY,GAAG,MAC9C6B,EAAYG,EAAO,IAAIhC,EAAa,gBAAgB,GAAG,MACvD8B,EAAYE,EAAO,IAAIhC,EAAa,gBAAgB,GAAG,MAC7D,OAAIO,GAAYA,EAAS,OAAS,IAC9BlB,EAAO,SAAWkB,GAElBqB,GAAQA,EAAK,OAAS,IACtBvC,EAAO,KAAOuC,GAEdC,GAAaA,EAAU,OAAS,IAChCxC,EAAO,UAAYwC,GAEnBC,GAAaA,EAAU,OAAS,IAChCzC,EAAO,UAAYyC,GAEhBzC,CACX,EAEO,MAAM4C,CAAW,CACH,QACA,YACA,OACA,SACA,SACA,SACA,QAAkB,IAClB,KACA,UACA,UACA,SACjB,YAAY,CAAE,SAAA1B,EAAU,KAAAqB,EAAM,UAAAC,EAAW,UAAAC,EAAW,SAAAI,EAAU,SAAAC,GAAsC,CAChG,KAAK,QAAU,QAAQ,IAAI,UAAY,GACvC,KAAK,YAAcA,GAAY,GAC/B,KAAK,OAAS,QAAQ,IAAI,SAAW,GACrC,KAAK,SAAWD,GAAYnE,EAAc,SAC1C,KAAK,SAAW,QAAQ,IAAI,WAAa,IACzC,KAAK,SAAWwC,GAAY5B,EAAa,EAAE,EAC3C,KAAK,KAAOiD,GAAQlC,EACpB,KAAK,UAAYmC,EACjB,KAAK,UAAYC,EACjB,KAAK,SAAW,QAAQ,IAAI,UAAY,YAC5C,CAEA,SAAU,CACN,OAAO,KAAK,QAChB,CAEA,QAAQX,EAAc,CAClB,MAAMiB,EAAMC,EAAS,IAAI,KAAK,MAAM,KAAK,MAAM,EAC/C,OAAOA,EAAS,IAAI,QAAQlB,EAAMiB,CAAG,EAAE,SAAA,CAC3C,CAEA,QAAQjB,EAAc,CAClB,MAAMiB,EAAMC,EAAS,IAAI,KAAK,MAAM,KAAK,MAAM,EAC/C,OAAOA,EAAS,IAAI,QAAQlB,EAAMiB,EAAK,CACnC,KAAMC,EAAS,KAAK,GAAA,CACvB,EAAE,SAASA,EAAS,IAAI,IAAI,CACjC,CAEA,aAAc,CACV,OAAO,KAAK,QAChB,CAGQ,oBAAoBlB,EAAmC,CAC3D,MAAMmB,EAAc,CAAA,EACpB,UAAWC,KAAKpB,EAAM,CAClB,IAAIqB,EAAIrB,EAAKoB,CAAC,EACd,GAAIC,GAAK,OAAOA,GAAM,SAClBA,EAAIA,EAAE,KAAA,UACCA,GAAK,OAAOA,GAAM,SAAU,CACnC,GAAI/D,EAAQ+D,CAAC,EAAG,CACZ,GAAIA,EAAE,SAAW,EACb,SAEJ,QAASvD,EAAI,EAAGA,EAAIuD,EAAE,OAAQvD,IAAK,CAC/B,MAAMwD,EAAWD,EAAEvD,CAAC,EACpB,UAAWyD,KAAcD,EAAU,CAC/B,MAAME,EAAmBF,EAASC,CAAU,GAAK,OACjD,GAAIC,GACA,GAAI,OAAOA,GAAqB,SACxBlE,EAAQkE,CAAgB,GAExBA,EAAiB,QAAQ,CAACC,EAAYC,IAAkB,CACpD,GAAID,EACA,UAAWE,KAAKF,EAAO,CACnB,MAAMJ,EAAII,EAAME,CAAC,EACjB,GAAIN,GAAKA,EAAE,SAAA,EAAW,OAAS,EAAG,CAC9B,MAAMO,EAAI,IAAI9D,EAAE,SAAA,CAAU,KAAKyD,EAAa,IAAIG,EAAM,SAAA,CAAU,KAAKC,CAAC,EAAE,IAAItD,EAAUgD,CAAC,CAAC,GACxFF,EAAE,KAAKC,EAAIQ,CAAC,CAChB,CACJ,CAER,CAAC,UAEEJ,EAAiB,SAAA,EAAW,OAAS,EAAG,CAC/C,MAAMI,EAAI,IAAI9D,EAAE,SAAA,CAAU,KAAKyD,CAAU,IAAIlD,EAAUmD,EAAiB,SAAA,CAAU,CAAC,GACnFL,EAAE,KAAKC,EAAIQ,CAAC,CAChB,EAER,CACJ,CACJ,KACI,WAAWrE,KAAO8D,EAAG,CACjB,MAAMQ,EAASR,EAAE9D,CAAG,EACpB,GAAIsE,GAAU,MAAQA,GAAU,IAAMA,EAAO,QAAU,EAAG,CACtD,MAAMD,EAAI,IAAIrE,CAAG,IAAIc,EAAUwD,CAAM,CAAC,GACtCV,EAAE,KAAKC,EAAIQ,CAAC,CAChB,CACJ,CAEJ,QACJ,MAAWP,GAAK,OAAOA,GAAM,aACzBA,EAAI,MAGJA,GAAK,MAAQA,GAAK,IAAMA,EAAE,QAAU,GACpCF,EAAE,KAAKC,EAAI,IAAM/C,EAAUgD,CAAC,CAAC,CAErC,CACA,OAAQF,GAAKA,EAAE,KAAK,GAAG,CAC3B,CAEA,MAAc,KAAKnB,EAAwD,CAEvE,MAAM8B,EAAU,QAAW,MAAM,KAAK,WAAA,EAChC1D,EAAgB,CAAA,EACtB,UAAWgD,KAAKpB,EACZ5B,EAAI,KAAKgD,CAAC,EAEdhD,EAAI,KAAK,CAAC,EAAW2D,IACV,EAAE,YAAA,EAAc,cAAcA,EAAE,aAAa,CACvD,EACD,MAAM3B,EAAgB,CAAA,EACtBhC,EAAI,QAASiD,GAAc,CACvB,IAAI/C,EAAyB0B,EAAKqB,CAAC,EAC/B,OAAO/C,GAAU,WACjBA,EAAQ,KAAK,UAAUA,CAAK,GAEhC8B,EAAI,KAAKiB,EAAI,IAAM/C,CAAK,CAC5B,CAAC,EACD,MAAM0D,EAAoB5B,EAAI,KAAK,GAAG,EAChC6B,EAAMC,EAAI,KAAKF,EAAYF,GAAS,mBAAmB,EACvDK,EAAU,CACZ,OAAQH,EACR,IAAKC,CAAA,EAET,OAAA7E,EAAO,MAAM+E,EAAS,UAAU,EACzBF,CACX,CAGQ,kBAAkBjC,EAA4BoC,EAAwC,CAC1F,MAAM3C,EAASO,GAAQ,CAAA,EACvB,OAAAP,EAAO,UAAe,KAAK,IAAA,EAAQ,GACnCA,EAAO,QAAajC,EAAa,EAAE,EACnCiC,EAAO,QAAa,KAAK,QACzBA,EAAO,SAAc,KAAK,SAC1BA,EAAO,MAAW,KAAK,UACvBA,EAAO,OAAY,KAAK,OACpB2C,GAAYA,EAAS,OAAS,IAC9B3C,EAAO,SAAc2C,GAElB3C,CACX,CAEA,MAAc,eAAe,CAAE,UAAA4C,EAAW,MAAAC,GAAuE,CAC7G,MAAMC,EAA4B,CAC9B,eAAgB,oCAChB,WAAY,OACZ,YAAa,KAAK,SAClB,YAAaD,GAAO,MAAM,YAAc,KAAK,SAAS,SAAA,EACtD,YAAa,KAAK,SAClB,UAAW,KAAK,MAAA,EAEhB,KAAK,MAAQ,KAAK,KAAK,OAAS,IAChCC,EAAE,KAAU,KAAK,MAEjB,KAAK,WAAa,KAAK,UAAU,OAAS,IAC1CA,EAAE,QAAQ,EAAI,KAAK,WAEnB,KAAK,WAAa,KAAK,UAAU,OAAS,IAC1CA,EAAE,QAAQ,EAAI,KAAK,WAEnBD,IACIA,EAAM,OAASA,EAAM,MAAM,OAAS,GAAKA,EAAM,UAAYA,EAAM,SAAS,OAAS,IACnFC,EAAE,cAAmBD,EAAM,MAC3BC,EAAE,SAAcD,EAAM,UAEtBA,EAAM,QACNC,EAAED,EAAM,MAAM,UAAU,EAAIA,EAAM,MAAM,YAGhD,MAAMtC,EAAOjC,EAAesE,CAAS,EAC/BG,EAAO,MAAM,KAAK,KAAKxC,CAAI,EACjC,OAAAuC,EAAE,KAAUC,EACLD,CACX,CAEA,MAAc,YAA8B,CACxC,GAAI,KAAK,YAAY,QAAU,EAC3B,OAAO,KAAK,OAEhB,MAAME,EAAM,KAAK,UAAU,KAAK,WAAW,EACrCF,EAAI,CACN,eAAgB,oCAChB,WAAY,OACZ,UAAW,KAAK,MAAA,EAEdJ,EAAU,CACZ,IAAOM,EACP,QAAWF,CAAA,EAEfnF,EAAO,MAAM+E,EAAS,OAAO,EAC7B,MAAM/B,EAAM,MAAM,MAAMqC,EAAK,CACzB,OAAQ,MACR,QAASF,EACT,YAAa,UACb,MAAO,aAAA,CACV,EACD,GAAInC,EAAI,GAAI,CACR,MAAMlC,EAAS,MAAMkC,EAAI,KAAA,EACzB,OAAAhD,EAAO,MAAMc,EAAO,KAAM,cAAc,EACjCA,EAAO,IAClB,CACA,MAAM,IAAI,MAAM,oBAAoB,CACxC,CAEQ,UAAUqB,EAAqB,CACnC,MAAO,GAAG,KAAK,OAAO,IAAIA,CAAG,EACjC,CAEA,MAAM,MAAoC,CACtC,MAAMa,EAAM,MAAM,KAAK,IAAe,CAClC,IAAK,YAAA,CACR,EACD,GAAIA,EAAI,QAAS,CACb,MAAMJ,EAAOI,EAAI,KACjB,GAAIJ,EACA,OAAOA,EAAK,UAAa,SAAA,CAEjC,CAEJ,CAGA,MAAM,IAAO,CAAE,IAAAT,EAAK,KAAAS,EAAM,MAAAsC,EAAO,MAAAI,EAAQ,WAAsE,CAC3G,MAAMjD,EAAS,KAAK,kBAAkBO,CAAI,EACpCqC,EAAY,KAAK,oBAAoB5C,CAAM,EAC3CC,EAAU,MAAM,KAAK,eAAe,CAAE,UAAa2C,EAAW,MAASC,EAAO,EAC9EG,EAAM,GAAG,KAAK,UAAUlD,CAAG,CAAC,IAAI8C,EAAU,SAAA,CAAU,GACpDF,EAAU,CACZ,IAAOM,EACP,QAAW/C,CAAA,EAEftC,EAAO,KAAK+E,EAAS,KAAK,EAC1B,MAAM/B,EAAM,MAAM,MAAMqC,EAAK,CACzB,OAAU,MACV,QAAW/C,EACX,YAAe,UACf,MAASgD,CAAA,CACZ,EACD,GAAItC,EAAI,GAAI,CACR,MAAMlC,EAAS,MAAMkC,EAAI,KAAA,EACzB,OAAAhD,EAAO,MAAMc,EAAQ,YAAY,EAC1BA,CACX,CACA,MAAM4B,EAAM,CACR,KAAMM,EAAI,OACV,QAAS,GACT,IAAKA,EAAI,UAAA,EAEb,OAAAhD,EAAO,MAAM0C,CAAG,EACTA,CACX,CAGA,MAAM,KAAQ,CAAE,IAAAP,EAAK,KAAAS,EAAM,MAAAsC,EAAO,MAAAI,EAAQ,WAAsE,CAC5G1C,EAAOA,EAAO,CAAE,GAAGA,CAAA,EAAS,CAAA,EAC5B,MAAM2C,EAAS3C,EAAK,QAAU,OACxB4C,EAAW5C,EAAK,UAAY,OAC9B2C,GACA,OAAO3C,EAAK,OAEZ4C,GACA,OAAO5C,EAAK,SAEhB,MAAMP,EAAS,KAAK,kBAAkBO,CAAI,EACpCqC,EAAY,KAAK,oBAAoB5C,CAAM,EAC3CC,EAAU,MAAM,KAAK,eAAe,CAAE,UAAa2C,EAAW,MAASC,EAAO,EAChFK,GAAUC,IACVlD,EAAQ,cAAc,EAAI,iCAAiCkD,CAAQ,IAEvE,MAAMH,EAAM,KAAK,UAAUlD,CAAG,EACxB4C,EAAU,CACZ,IAAOM,EACP,QAAW/C,EACX,OAAUD,CAAA,EAEdrC,EAAO,KAAK+E,EAAS,MAAM,EAC3B,MAAMU,EAAOF,EAAS,GAAGF,CAAG,IAAIJ,CAAS,GAAKI,EACxCrC,EAAM,MAAM,MAAMyC,EAAM,CAC1B,OAAU,OACV,QAAWnD,EACX,KAAQiD,GAAkBN,EAAU,SAAA,EACpC,YAAe,UACf,MAASK,CAAA,CACZ,EACD,GAAItC,EAAI,GAAI,CACR,MAAMlC,EAAS,MAAMkC,EAAI,KAAA,EACzB,OAAAhD,EAAO,MAAMc,EAAQ,aAAa,EAC3BA,CACX,CACA,MAAM4B,EAAM,CACR,KAAMM,EAAI,OACV,QAAS,GACT,IAAKA,EAAI,UAAA,EAEb,OAAAhD,EAAO,MAAM0C,CAAG,EACTA,CACX,CAGA,MAAM,OAAO,CAAE,IAAAP,EAAK,KAAAS,EAAM,MAAAsC,GAA2E,CACjGtC,EAAOA,EAAO,CAAE,GAAGA,CAAA,EAAS,CAAA,EAC5B,MAAM2C,EAAS3C,EAAK,QAAU,OACxB4C,EAAW5C,EAAK,UAAY,OAC9B2C,GACA,OAAO3C,EAAK,OAEZ4C,GACA,OAAO5C,EAAK,SAEhB,MAAMP,EAAS,KAAK,kBAAkBO,CAAI,EACpCqC,EAAY,KAAK,oBAAoB5C,CAAM,EAE3CC,EAAU,MAAM,KAAK,eAAe,CAAE,UAAa2C,EAAW,MAASC,EAAO,EAChFK,GAAUC,IACVlD,EAAQ,cAAc,EAAI,iCAAiCkD,CAAQ,IAEvElD,EAAQ,WAAgB,aACxBA,EAAQ,mBAAmB,EAAI,KAC/BA,EAAQ,eAAe,EAAI,WAC3B,MAAM+C,EAAM,KAAK,UAAUlD,CAAG,EAC9B,GAAI,CACA,MAAMA,EAAMoD,EAAS,GAAGF,CAAG,IAAIJ,CAAS,GAAKI,EACvCN,EAAU,CACZ,IAAOM,EACP,QAAW/C,EACX,OAAUD,CAAA,EAEdrC,EAAO,KAAK+E,EAAS,QAAQ,EAC7B,MAAM/B,EAAM,MAAM,MAAMb,EAAK,CACzB,OAAQ,OACR,QAAAG,EACA,KAAMiD,GAAkBN,EAAU,SAAA,EAClC,YAAa,SAAA,CAChB,EAED,GAAI,CAACjC,EAAI,GACL,MAAM,IAAI,MAAM,uBAAuBA,EAAI,MAAM,EAAE,EAEvD,GAAI,CAACA,EAAI,KACL,MAAM,IAAI,MAAM,kBAAkB,EAEtC,OAAO,IAAI,SAASA,EAAI,KAAM,CAC1B,QAAS,CACL,eAAgB,oBAChB,gBAAiB,WACjB,WAAc,YAAA,CAClB,CACH,CACL,OAASjD,EAAG,CACR,MAAMA,CACV,CACJ,CAEA,YAAY2F,EAAwC,CAChD,MAAMC,EAAWD,EAAQ,IAAIjE,EAAa,IAAI,GAAG,MACjD,OAAIkE,GAAYA,EAAS,OAAS,EACvB,KAAK,MAAMA,CAAQ,EAEvB,IACX,CAEA,SAASD,EAAsC,CAC3C,MAAMC,EAAWD,EAAQ,IAAI,MAAM,GAAG,MACtC,IAAIV,EAAW,GACXY,EAAQ,KAAK,SACjB,GAAID,GAAYA,EAAS,OAAS,EAAG,CACjC,MAAME,EAAO,KAAK,MAAMF,CAAQ,EAChCX,EAAWa,EAAK,SAChBD,EAAQC,EAAK,SAAS,SAAA,CAC1B,CACA,MAAO,CACH,SAAAb,EACA,MAAAY,EACA,MAAOF,EAAQ,IAAIjE,EAAa,KAAK,GAAG,OAAS,EAAA,CAEzD,CAEA,kBAAqBiE,GAA6C,CAC9D,MAAMC,EAAWD,EAAQ,IAAI,MAAM,GAAG,MACtC,IAAIV,EAAW,GACXY,EAAQ,KAAK,SACjB,GAAID,GAAYA,EAAS,OAAS,EAAG,CACjC,MAAME,EAAO,KAAK,MAAMF,CAAQ,EAChCX,EAAWa,EAAK,SAChBD,EAAQC,EAAK,SAAS,SAAA,CAC1B,CACA,MAAO,CACH,SAAAb,EACA,MAAAY,EACA,MAAOF,EAAQ,IAAIjE,EAAa,KAAK,GAAG,OAAS,EAAA,CAEzD,EAGA,SAASmB,EAAgEH,EAA4C,CACjH,KAAM,CAAE,GAAAqD,EAAI,KAAAC,EAAM,SAAAf,EAAU,SAAAgB,EAAU,IAAAC,EAAK,QAAAC,EAAS,MAAAhB,EAAO,cAAAiB,EAAe,aAAAC,EAAc,SAAApE,EAAU,SAAA2B,EAAU,cAAA0C,GAAkBzD,EACxH0D,EAAkB,CACpB,GAAAR,EACA,KAAAC,EACA,SAAAf,EACA,SAAAgB,EACA,IAAAC,EACA,QAAAC,EACA,cAAAC,EACA,aAAAC,EACA,SAAApE,EACA,SAAA2B,EACA,OAAQ,EACR,YAAa,EACb,QAAS,GACT,SAAU,EACV,aAAc,GACd,aAAc,GACd,WAAY,GACZ,cAAA0C,CAAA,EAEJ,OAAA5D,EAAS,QAAQ,IAAIhB,EAAa,MAAOyD,EAAO,CAC5C,SAAU,GACV,OAAQ,CAAC,KAAK,SACd,SAAU,SACV,KAAM,GAAA,CACT,EACDzC,EAAS,QAAQ,IAAIhB,EAAa,KAAM,KAAK,UAAU6E,CAAS,CAAC,EAC1D7D,CACX,CAEA,WAAWA,EAA4C,CACnD,OAAAA,EAAS,QAAQ,IAAIhB,EAAa,MAAO,GAAI,CACzC,OAAQ,GACR,SAAU,GACV,KAAM,GAAA,CACT,EACDgB,EAAS,QAAQ,IAAIhB,EAAa,KAAM,GAAI,CACxC,OAAQ,GACR,SAAU,GACV,KAAM,GAAA,CACT,EACDgB,EAAS,QAAQ,OAAOhB,EAAa,KAAK,EAC1CgB,EAAS,QAAQ,OAAOhB,EAAa,IAAI,EAClCgB,CACX,CACJ"}
@@ -1,7 +1,8 @@
1
1
  import N from "pino";
2
- import A from "js-md5";
3
- import p from "crypto-js";
4
- const $ = {
2
+ import A from "koffi";
3
+ import U from "js-md5";
4
+ import m from "crypto-js";
5
+ const F = {
5
6
  GENERAL: 0,
6
7
  PHONE: 1,
7
8
  EMAIL: 2
@@ -9,7 +10,7 @@ const $ = {
9
10
  TYPE_MGT: 0,
10
11
  TYPE_C: 1,
11
12
  TYPE_B: 2
12
- }, W = {
13
+ }, j = {
13
14
  FROM_WEB: 1,
14
15
  FROM_PC: 2,
15
16
  FROM_WX_MINI_PRO: 3,
@@ -17,19 +18,22 @@ const $ = {
17
18
  FROM_WX_E: 5,
18
19
  FROM_APP: 6,
19
20
  FROM_DEVICE: 7
20
- }, j = {
21
+ }, H = {
21
22
  unknown: 0,
22
23
  male: 1,
23
24
  female: 2
24
25
  };
25
- process.platform === "win32" && (process.stdout.setEncoding("utf8"), process.stderr.setEncoding("utf8"));
26
+ if (typeof window > "u" && process.platform === "win32")
27
+ try {
28
+ const t = A.load("Kernel32"), e = t.func("SetConsoleOutputCP", "bool", ["int"]), s = t.func("SetConsoleCP", "bool", ["int"]);
29
+ e(65001), s(65001);
30
+ } catch (n) {
31
+ console.log(n);
32
+ }
26
33
  const h = N({
27
34
  name: process.env.APP_NAME ?? "iBoot",
28
- level: process.env.NODE_ENV != "production" ? "debug" : "info",
35
+ level: process.env.NODE_ENV !== "production" ? "debug" : "info",
29
36
  nestedKey: "payload",
30
- formatters: {
31
- level: (n) => ({ level: n })
32
- },
33
37
  transport: {
34
38
  target: "pino-pretty",
35
39
  options: {
@@ -46,13 +50,13 @@ const h = N({
46
50
  for (let o = 0; o < t; o++)
47
51
  r += e.charAt(Math.floor(Math.random() * s));
48
52
  return r;
49
- }, U = (n, t) => {
53
+ }, k = (n, t) => {
50
54
  const e = {};
51
55
  return n.split("&").forEach((r) => {
52
56
  const o = r.split("=");
53
57
  o[1] && (!t || t.indexOf(o[0]) == -1) && (e[o[0]] = o[1]);
54
58
  }), e;
55
- }, b = (n) => !n || n == "" || n.length == 0 ? "" : encodeURIComponent(n).replace(/\(/g, "%28").replace(/\)/g, "%29").replace(/\'/g, "%27").replace(/\!/g, "%21").replace(/\~/g, "%7E"), k = "zh-CN", S = "_device_id_key", v = "_current_website_key", O = "Get request error!", I = "Post request error!", T = {
59
+ }, b = (n) => !n || n == "" || n.length == 0 ? "" : encodeURIComponent(n).replace(/\(/g, "%28").replace(/\)/g, "%29").replace(/\'/g, "%27").replace(/\!/g, "%21").replace(/\~/g, "%7E"), L = "zh-CN", S = "_device_id_key", P = "_current_website_key", O = "Get request error!", I = "Post request error!", T = {
56
60
  "Device-Id": "Device-Id",
57
61
  Lang: "Lang",
58
62
  "Website-Id": "Website-Id",
@@ -64,27 +68,26 @@ const h = N({
64
68
  IBOOT_WEBSITE_NO: "IBOOT_WEBSITE_NO",
65
69
  token: "token",
66
70
  user: "user"
67
- }, P = () => {
68
- const n = localStorage.getItem(S) ?? "", t = localStorage.getItem(v), e = t != null ? JSON.parse(t) : null, s = {};
71
+ }, C = () => {
72
+ const n = localStorage.getItem(S) ?? "", t = localStorage.getItem(P), e = t != null ? JSON.parse(t) : null, s = {};
69
73
  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;
70
74
  }, x = (n, t) => {
71
- localStorage.setItem(S, n), t && localStorage.setItem(v, JSON.stringify(t));
75
+ localStorage.setItem(S, n), t && localStorage.setItem(P, JSON.stringify(t));
72
76
  }, D = async (n, t) => {
73
77
  if (t?.data) {
74
78
  const i = new URLSearchParams(t.data);
75
79
  n.indexOf("?") != -1 ? n += `&${i}` : n += `?${i}`;
76
80
  }
77
- const e = P(), s = t?.headers;
81
+ const e = C(), s = t?.headers;
78
82
  if (s)
79
83
  for (const i in s) {
80
84
  const l = s[i];
81
85
  l && (e[i] = l);
82
86
  }
83
87
  h.debug({
84
- method: "GET",
85
88
  url: n,
86
89
  headers: e
87
- });
90
+ }, "GET");
88
91
  const r = await fetch(n, {
89
92
  method: "GET",
90
93
  headers: e,
@@ -92,9 +95,7 @@ const h = N({
92
95
  });
93
96
  if (r.ok) {
94
97
  const i = await r.json();
95
- return h.debug({
96
- GET_RESULT: i
97
- }), i;
98
+ return h.debug(i, "GET_RESULT"), i;
98
99
  }
99
100
  const o = {
100
101
  code: r.status,
@@ -102,20 +103,19 @@ const h = N({
102
103
  msg: r.statusText
103
104
  };
104
105
  return h.error(o), o;
105
- }, C = async (n, t) => {
106
+ }, v = async (n, t) => {
106
107
  const e = t?.data ?? {}, s = t?.headers;
107
108
  let r;
108
- const o = new Headers(P());
109
+ const o = new Headers(C());
109
110
  if (e instanceof FormData ? r = e : (r = JSON.stringify(e), o.set("Content-Type", "application/json")), s)
110
111
  for (let a in s) {
111
112
  const c = s[a];
112
113
  c && o.set(a, c);
113
114
  }
114
115
  h.debug({
115
- method: "GET",
116
116
  url: n,
117
117
  headers: o
118
- });
118
+ }, "POST");
119
119
  const i = await fetch(n, {
120
120
  method: "POST",
121
121
  headers: o,
@@ -123,9 +123,7 @@ const h = N({
123
123
  });
124
124
  if (i.ok) {
125
125
  const a = await i.json();
126
- return h.debug({
127
- POST_RESULT: a
128
- }), a;
126
+ return h.debug(a, "POST_RESULT"), a;
129
127
  }
130
128
  const l = {
131
129
  code: i.status,
@@ -133,7 +131,7 @@ const h = N({
133
131
  msg: i.statusText
134
132
  };
135
133
  return h.error(l), l;
136
- }, F = async (n, t) => {
134
+ }, K = async (n, t) => {
137
135
  const e = await D(n, t);
138
136
  if (e.success)
139
137
  return e.data;
@@ -142,8 +140,8 @@ const h = N({
142
140
  return;
143
141
  }
144
142
  throw Error(e.msg ?? O);
145
- }, H = async (n, t) => {
146
- const e = await C(n, t);
143
+ }, G = async (n, t) => {
144
+ const e = await v(n, t);
147
145
  if (e.success)
148
146
  return e.data;
149
147
  if (t?.showError) {
@@ -151,17 +149,17 @@ const h = N({
151
149
  return;
152
150
  }
153
151
  throw Error(e.msg ?? I);
154
- }, K = async (n, t) => {
155
- const e = await C(n, t);
152
+ }, J = async (n, t) => {
153
+ const e = await v(n, t);
156
154
  return e.success ? (t?.showSuccess && t.showSuccess(e.msg ?? "SUCCESS"), !0) : (t?.showError && t.showError(e.msg ?? I), !1);
157
- }, G = (n) => {
155
+ }, Y = (n) => {
158
156
  const t = n.headers.get(T["Device-Id"]), e = n.headers.get(T.Lang), s = n.headers.get(T["Website-Id"]), r = n.headers.get(T["Website-No"]), o = {};
159
157
  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;
160
- }, J = (n) => {
158
+ }, V = (n) => {
161
159
  const t = {}, e = n.get(f.IBOOT_DEVICE_ID)?.value, s = n.get(f.IBOOT_LOCALE)?.value, r = n.get(f.IBOOT_WEBSITE_ID)?.value, o = n.get(f.IBOOT_WEBSITE_NO)?.value;
162
160
  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;
163
161
  };
164
- class Y {
162
+ class X {
165
163
  baseUrl;
166
164
  helloMethod;
167
165
  apiKey;
@@ -174,20 +172,20 @@ class Y {
174
172
  websiteNo;
175
173
  _isDebug;
176
174
  constructor({ deviceId: t, lang: e, websiteId: s, websiteNo: r, userType: o, helloURL: i }) {
177
- this.baseUrl = process.env.BASE_URL ?? "", this.helloMethod = i ?? "", this.apiKey = process.env.API_KEY ?? "", this.userType = o ?? R.TYPE_MGT, this.userFrom = process.env.USER_FROM || "1", this.deviceId = t ?? w(10), this.lang = e ?? k, this.websiteId = s, this.websiteNo = r, this._isDebug = process.env.NODE_ENV != "production";
175
+ this.baseUrl = process.env.BASE_URL ?? "", this.helloMethod = i ?? "", this.apiKey = process.env.API_KEY ?? "", this.userType = o ?? R.TYPE_MGT, this.userFrom = process.env.USER_FROM || "1", this.deviceId = t ?? w(10), this.lang = e ?? L, this.websiteId = s, this.websiteNo = r, this._isDebug = process.env.NODE_ENV != "production";
178
176
  }
179
177
  isDebug() {
180
178
  return this._isDebug;
181
179
  }
182
180
  encrypt(t) {
183
- const e = p.enc.Utf8.parse(this.apiKey);
184
- return p.AES.encrypt(t, e).toString();
181
+ const e = m.enc.Utf8.parse(this.apiKey);
182
+ return m.AES.encrypt(t, e).toString();
185
183
  }
186
184
  decrypt(t) {
187
- const e = p.enc.Utf8.parse(this.apiKey);
188
- return p.AES.decrypt(t, e, {
189
- mode: p.mode.ECB
190
- }).toString(p.enc.Utf8);
185
+ const e = m.enc.Utf8.parse(this.apiKey);
186
+ return m.AES.decrypt(t, e, {
187
+ mode: m.mode.ECB
188
+ }).toString(m.enc.Utf8);
191
189
  }
192
190
  getDeviceId() {
193
191
  return this.deviceId;
@@ -214,8 +212,8 @@ class Y {
214
212
  for (const g in c) {
215
213
  const d = c[g];
216
214
  if (d && d.toString().length > 0) {
217
- const m = `[${o.toString()}].${l + `[${u.toString()}].${g}`}=${b(d)}`;
218
- e.push(s + m);
215
+ const p = `[${o.toString()}].${l + `[${u.toString()}].${g}`}=${b(d)}`;
216
+ e.push(s + p);
219
217
  }
220
218
  }
221
219
  });
@@ -250,12 +248,11 @@ class Y {
250
248
  let c = t[a];
251
249
  typeof c == "object" && (c = JSON.stringify(c)), r.push(a + "=" + c);
252
250
  });
253
- const o = r.join("&"), i = A.md5((o + e).toLocaleUpperCase()), l = {
254
- name: "sort",
251
+ const o = r.join("&"), i = U.md5((o + e).toLocaleUpperCase()), l = {
255
252
  params: o,
256
253
  md5: i
257
254
  };
258
- return h.debug(l), i;
255
+ return h.debug(l, "API_SIGN"), i;
259
256
  }
260
257
  //eslint-disable-next-line @typescript-eslint/no-explicit-any
261
258
  assemblyParameter(t, e) {
@@ -272,7 +269,7 @@ class Y {
272
269
  "Api-Key": this.apiKey
273
270
  };
274
271
  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));
275
- const r = U(t), o = await this.sign(r);
272
+ const r = k(t), o = await this.sign(r);
276
273
  return s.Sign = o, s;
277
274
  }
278
275
  async helloIboot() {
@@ -286,7 +283,7 @@ class Y {
286
283
  url: t,
287
284
  headers: e
288
285
  };
289
- h.debug(s);
286
+ h.debug(s, "HELLO");
290
287
  const r = await fetch(t, {
291
288
  method: "GET",
292
289
  headers: e,
@@ -295,7 +292,7 @@ class Y {
295
292
  });
296
293
  if (r.ok) {
297
294
  const o = await r.json();
298
- return h.debug({ result: o.data }), o.data;
295
+ return h.debug(o.data, "HELLO RESULT"), o.data;
299
296
  }
300
297
  throw new Error("hello iBoot error!");
301
298
  }
@@ -315,11 +312,10 @@ class Y {
315
312
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
316
313
  async get({ url: t, data: e, token: s, cache: r = "default" }) {
317
314
  const o = this.assemblyParameter(e), i = this.convertUrlParameter(o), l = await this.assemblyHeader({ urlParams: i, token: s }), a = `${this.getApiUrl(t)}?${i.toString()}`, c = {
318
- method: "GET",
319
315
  url: a,
320
316
  headers: l
321
317
  };
322
- h.info(c);
318
+ h.info(c, "GET");
323
319
  const u = await fetch(a, {
324
320
  method: "GET",
325
321
  headers: l,
@@ -328,7 +324,7 @@ class Y {
328
324
  });
329
325
  if (u.ok) {
330
326
  const d = await u.json();
331
- return h.debug({ GET_RESULT: d }), d;
327
+ return h.debug(d, "GET_RESULT"), d;
332
328
  }
333
329
  const g = {
334
330
  code: u.status,
@@ -345,27 +341,26 @@ class Y {
345
341
  const l = this.assemblyParameter(e), a = this.convertUrlParameter(l), c = await this.assemblyHeader({ urlParams: a, token: s });
346
342
  o && i && (c["Content-Type"] = `multipart/form-data; boundary=${i}`);
347
343
  const u = this.getApiUrl(t), g = {
348
- method: "POST",
349
344
  url: u,
350
345
  headers: c,
351
346
  params: l
352
347
  };
353
- h.info(g);
354
- const d = o ? `${u}?${a}` : u, m = await fetch(d, {
348
+ h.info(g, "POST");
349
+ const d = o ? `${u}?${a}` : u, p = await fetch(d, {
355
350
  method: "POST",
356
351
  headers: c,
357
352
  body: o || a.toString(),
358
353
  credentials: "include",
359
354
  cache: r
360
355
  });
361
- if (m.ok) {
362
- const E = await m.json();
363
- return h.debug({ POST_RESULT: E }), E;
356
+ if (p.ok) {
357
+ const E = await p.json();
358
+ return h.debug(E, "POST_RESULT"), E;
364
359
  }
365
360
  const y = {
366
- code: m.status,
361
+ code: p.status,
367
362
  success: !1,
368
- msg: m.statusText
363
+ msg: p.statusText
369
364
  };
370
365
  return h.error(y), y;
371
366
  }
@@ -379,12 +374,11 @@ class Y {
379
374
  const c = this.getApiUrl(t);
380
375
  try {
381
376
  const u = r ? `${c}?${l}` : c, g = {
382
- method: "STREAM",
383
377
  url: c,
384
378
  headers: a,
385
379
  params: i
386
380
  };
387
- h.info(g);
381
+ h.info(g, "STREAM");
388
382
  const d = await fetch(u, {
389
383
  method: "POST",
390
384
  headers: a,
@@ -438,7 +432,7 @@ class Y {
438
432
  };
439
433
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
440
434
  setToken(t, e) {
441
- const { id: s, name: r, username: o, nickname: i, sex: l, headImg: a, token: c, lastLoginTime: u, tokenExpired: g, deviceId: d, userType: m, mustChangePwd: y } = t, E = {
435
+ const { id: s, name: r, username: o, nickname: i, sex: l, headImg: a, token: c, lastLoginTime: u, tokenExpired: g, deviceId: d, userType: p, mustChangePwd: y } = t, E = {
442
436
  id: s,
443
437
  name: r,
444
438
  username: o,
@@ -448,7 +442,7 @@ class Y {
448
442
  lastLoginTime: u,
449
443
  tokenExpired: g,
450
444
  deviceId: d,
451
- userType: m,
445
+ userType: p,
452
446
  status: 0,
453
447
  accountType: 0,
454
448
  enabled: !1,
@@ -483,26 +477,26 @@ class Y {
483
477
  }
484
478
  }
485
479
  export {
486
- $ as ACCOUNT_TYPE_MAP,
487
- v as CURRENT_WEBSITE_KEY,
488
- k as DEFAULT_LOCALE,
480
+ F as ACCOUNT_TYPE_MAP,
481
+ P as CURRENT_WEBSITE_KEY,
482
+ L as DEFAULT_LOCALE,
489
483
  S as DEVICE_ID_KEY,
490
- Y as HttpClient,
491
- W as USER_FORM_MAP,
492
- j as USER_SEX_MAP,
484
+ X as HttpClient,
485
+ j as USER_FORM_MAP,
486
+ H as USER_SEX_MAP,
493
487
  R as USER_TYPE_MAP,
494
488
  D as get,
495
- G as getHttpClientOpts,
496
- J as getHttpClientOptsByCookie,
497
- F as iGet,
498
- H as iPost,
499
- K as iPostSuccess,
489
+ Y as getHttpClientOpts,
490
+ V as getHttpClientOptsByCookie,
491
+ K as iGet,
492
+ G as iPost,
493
+ J as iPostSuccess,
500
494
  _ as isArray,
501
495
  h as logger,
502
- C as post,
496
+ v as post,
503
497
  w as randomString,
504
498
  x as setDefaultRequestHeader,
505
499
  b as urlEncode,
506
- U as urlParamToJson
500
+ k as urlParamToJson
507
501
  };
508
502
  //# sourceMappingURL=iboot-http-client.es.js.map
@@ -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 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 userType: USER_TYPE;\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\n\r\n// 在 Windows 系统上确保中文字符正确显示\r\nif (process.platform === 'win32') {\r\n // 设置 stdout 和 stderr 的编码为 utf8\r\n process.stdout.setEncoding('utf8');\r\n process.stderr.setEncoding('utf8');\r\n}\r\n\r\nexport 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 formatters: {\r\n level: (label) => {\r\n return { level: label };\r\n }\r\n },\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});","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","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 CookieNames,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaderNames,\r\n HttpHeaders,\r\n HttpToken,\r\n IbootCookieStore,\r\n IbootReadonlyCookies,\r\n IbootWritableCookie,\r\n ResultModel,\r\n ServerRequestOptions\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\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\nconst HEADER_NAMES: Record<HttpHeaderNames, HttpHeaderNames> = {\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\nconst COOKIE_NAMES: Record<CookieNames, CookieNames> = {\r\n \"IBOOT_DEVICE_ID\": \"IBOOT_DEVICE_ID\",\r\n \"IBOOT_LOCALE\": \"IBOOT_LOCALE\",\r\n \"IBOOT_WEBSITE_ID\": \"IBOOT_WEBSITE_ID\",\r\n \"IBOOT_WEBSITE_NO\": \"IBOOT_WEBSITE_NO\",\r\n \"token\": \"token\",\r\n \"user\": \"user\"\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 \"method\": \"GET\",\r\n \"url\": url,\r\n \"headers\": headers,\r\n })\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({\r\n \"GET_RESULT\": result,\r\n })\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 \"method\": \"GET\",\r\n \"url\": url,\r\n \"headers\": proxyHeaders,\r\n })\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({\r\n \"POST_RESULT\": result,\r\n })\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 getHttpClientOpts = (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 getHttpClientOptsByCookie = (cookie: IbootReadonlyCookies): HttpClientOpts => {\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookie.get(COOKIE_NAMES.IBOOT_DEVICE_ID)?.value;\r\n const lang = cookie.get(COOKIE_NAMES.IBOOT_LOCALE)?.value;\r\n const websiteId = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_ID)?.value;\r\n const websiteNo = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_NO)?.value;\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 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 private readonly _isDebug: boolean;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType, helloURL }: Readonly<HttpClientOpts>) {\r\n this.baseUrl = process.env.BASE_URL ?? '';\r\n this.helloMethod = helloURL ?? ''\r\n this.apiKey = process.env.API_KEY ?? '';\r\n this.userType = userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.userFrom = process.env.USER_FROM || '1';\r\n this.deviceId = deviceId ?? randomString(10);\r\n this.lang = lang ?? DEFAULT_LOCALE;\r\n this.websiteId = websiteId\r\n this.websiteNo = websiteNo\r\n this._isDebug = process.env.NODE_ENV != 'production';\r\n }\r\n\r\n isDebug() {\r\n return this._isDebug;\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 getDeviceId() {\r\n return this.deviceId;\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 name: \"sort\",\r\n params: paramsStr,\r\n md5: str\r\n }\r\n logger.debug(logInfo)\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);\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: result.data })\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 \"method\": \"GET\",\r\n \"url\": api,\r\n \"headers\": headers\r\n }\r\n logger.info(logInfo);\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({ \"GET_RESULT\": 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 \"method\": \"POST\",\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo);\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({ \"POST_RESULT\": 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 \"method\": \"STREAM\",\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo);\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\r\n getUserInfo(cookies: IbootCookieStore): User | null {\r\n const userjson = cookies.get(COOKIE_NAMES.user)?.value;\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n return null;\r\n }\r\n\r\n getToken(cookies: IbootCookieStore): HttpToken {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n getTokenByCookies = (cookies: IbootReadonlyCookies): HttpToken => {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setToken(data: User & { token: string, extFields: Record<string, any> }, response: { cookies: IbootWritableCookie }) {\r\n const { id, name, username, nickname, sex, headImg, token, lastLoginTime, tokenExpired, 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,\r\n sex: sex,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n tokenExpired: tokenExpired,\r\n deviceId: deviceId,\r\n userType: userType,\r\n status: 0,\r\n accountType: 0,\r\n enabled: false,\r\n userFrom: 1,\r\n needToReview: false,\r\n socketOnline: false,\r\n createTime: \"\",\r\n mustChangePwd: mustChangePwd\r\n };\r\n response.cookies.set(COOKIE_NAMES.token, token, {\r\n httpOnly: true,\r\n secure: !this._isDebug, // 在生产环境中启用Secure\r\n sameSite: 'strict', // 防止 CSRF 攻击\r\n path: '/', // Cookie 的路径\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, JSON.stringify(loginUser));\r\n return response;\r\n }\r\n\r\n cleanToken(response: { cookies: IbootWritableCookie }) {\r\n response.cookies.set(COOKIE_NAMES.token, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.delete(COOKIE_NAMES.token);\r\n response.cookies.delete(COOKIE_NAMES.user)\r\n return response;\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","logger","pino","label","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","HEADER_NAMES","COOKIE_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","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","helloURL","key","CryptoJS","p","o","v","arr_item","item_field","item_field_value","item1","index","f","s","oValue","_apiKey","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","cache","buffer","boundary","urls","e","cookies","userjson","utype","user","id","name","nickname","sex","headImg","lastLoginTime","tokenExpired","mustChangePwd","loginUser"],"mappings":";;;AAAO,MAAMA,IAAmB;AAAA,EAC5B,SAAU;AAAA,EACV,OAAQ;AAAA,EACR,OAAQ;AACZ,GAEaC,IAAgB;AAAA,EACzB,UAAW;AAAA,EACX,QAAS;AAAA,EACT,QAAS;AACb,GAEaC,IAAgB;AAAA,EACzB,UAAW;AAAA,EACX,SAAU;AAAA,EACV,kBAAmB;AAAA,EACnB,aAAc;AAAA,EACd,WAAY;AAAA,EACZ,UAAW;AAAA,EACX,aAAc;AAClB,GAEaC,IAAe;AAAA,EACxB,SAAQ;AAAA,EACR,MAAK;AAAA,EACL,QAAO;AACX;ACvBI,QAAQ,aAAa,YAErB,QAAQ,OAAO,YAAY,MAAM,GACjC,QAAQ,OAAO,YAAY,MAAM;AAG9B,MAAMC,IAASC,EAAK;AAAA,EACvB,MAAM,QAAQ,IAAI,YAAY;AAAA,EAC9B,OAAO,QAAQ,IAAI,YAAY,eAAe,UAAU;AAAA,EACxD,WAAW;AAAA,EACX,YAAY;AAAA,IACR,OAAO,CAACC,OACG,EAAE,OAAOA,EAAA;AAAA,EACpB;AAAA,EAEJ,WAAW;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,UAAU;AAAA,MACV,eAAe;AAAA,MACf,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,YAAY;AAAA,IAAA;AAAA,EAChB;AAER,CAAC,GC5BYC,IAAU,CAACC,MAEpB,MAAM,QAAQA,CAAG,KAChB,OAAOA,KAAQ,YACd,OAAO,UAAU,SAAS,KAAKA,CAAG,MAAM,kBAQjCC,IAAe,CAACC,MAAgB;AAC3C,QAAMC,IAAID,KAAO,IACXE,IAAS,oDACTC,IAASD,EAAO;AACtB,MAAIE,IAAM;AACV,WAASC,IAAI,GAAGA,IAAIJ,GAAGI;AACrB,IAAAD,KAAOF,EAAO,OAAO,KAAK,MAAM,KAAK,WAAWC,CAAM,CAAC;AAEzD,SAAOC;AACT,GAEaE,IAAiB,CAACC,GAAwBC,MAA+C;AACpG,QAAMC,IAAiC,CAAA;AAEvC,SADaF,EAAe,MAAM,GAAG,EAChC,QAAQ,CAACG,MAAS;AACrB,UAAMC,IAAMD,EAAK,MAAM,GAAG;AAC1B,IAAIC,EAAI,CAAC,MACH,CAACH,KAAWA,EAAQ,QAAQG,EAAI,CAAC,CAAC,KAAK,QACzCF,EAAOE,EAAI,CAAC,CAAC,IAAIA,EAAI,CAAC;AAAA,EAG5B,CAAC,GACMF;AACT,GAEaG,IAAY,CAACC,MACpB,CAACA,KAASA,KAAS,MAAMA,EAAM,UAAU,IACpC,KAGP,mBAAmBA,CAAK,EAGrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,GC3BdC,IAAiB,SACjBC,IAAgB,kBAChBC,IAAsB,wBAE7BC,IAAa,sBACbC,IAAc,uBAEdC,IAAyD;AAAA,EAC3D,aAAa;AAAA,EACb,MAAQ;AAAA,EACR,cAAc;AAAA,EACd,cAAc;AAClB,GAEMC,IAAiD;AAAA,EACnD,iBAAmB;AAAA,EACnB,cAAgB;AAAA,EAChB,kBAAoB;AAAA,EACpB,kBAAoB;AAAA,EACpB,OAAS;AAAA,EACT,MAAQ;AACZ,GAEMC,IAA0B,MAAmB;AAC/C,QAAMC,IAAW,aAAa,QAAQP,CAAa,KAAK,IAClDQ,IAAO,aAAa,QAAQP,CAAmB,GAC/CQ,IAAgCD,KAAQ,OAAO,KAAK,MAAMA,CAAI,IAAI,MAClEE,IAAsB,CAAA;AAC5B,SAAIH,EAAS,SAAS,MAClBG,EAAO,WAAW,IAAIH,IAEtBE,MACAC,EAAO,OAAUD,EAAW,UACxBA,EAAW,cACXC,EAAO,YAAY,IAAID,EAAW,YAElCA,EAAW,cACXC,EAAO,YAAY,IAAID,EAAW,aAGnCC;AACX,GAGaC,IAA0B,CAACC,GAAkBC,MAA+B;AACrF,eAAa,QAAQb,GAAeY,CAAQ,GACxCC,KACA,aAAa,QAAQZ,GAAqB,KAAK,UAAUY,CAAO,CAAC;AAEzE,GAEaC,IAAM,OAAUC,GAAaC,MAAoD;AAC1F,MAAIA,GAAM,MAAM;AACZ,UAAMC,IAAS,IAAI,gBAAgBD,EAAK,IAAI;AAC5C,IAAID,EAAI,QAAQ,GAAG,KAAK,KACpBA,KAAO,IAAIE,CAAM,KAEjBF,KAAO,IAAIE,CAAM;AAAA,EAEzB;AACA,QAAMC,IAAkCZ,EAAA,GAClCa,IAAQH,GAAM;AACpB,MAAIG;AACA,eAAWC,KAASD,GAAO;AACvB,YAAMrB,IAAQqB,EAAMC,CAAK;AACzB,MAAItB,MACAoB,EAAQE,CAAK,IAAItB;AAAA,IAEzB;AAEJ,EAAAnB,EAAO,MAAM;AAAA,IACT,QAAU;AAAA,IACV,KAAOoC;AAAA,IACP,SAAWG;AAAA,EAAA,CACd;AACD,QAAMG,IAAW,MAAM,MAAMN,GAAK;AAAA,IAC9B,QAAQ;AAAA,IACR,SAAAG;AAAA,IACA,OAAOF,GAAM,WAAW,gBAAgB;AAAA,EAAA,CAC3C;AAED,MAAIK,EAAS,IAAI;AACb,UAAM3B,IAAS,MAAM2B,EAAS,KAAA;AAC9B,WAAA1C,EAAO,MAAM;AAAA,MACT,YAAce;AAAA,IAAA,CACjB,GACMA;AAAA,EACX;AACA,QAAM4B,IAAM;AAAA,IACR,MAAMD,EAAS;AAAA,IACf,SAAS;AAAA,IACT,KAAKA,EAAS;AAAA,EAAA;AAElB,SAAA1C,EAAO,MAAM2C,CAAG,GACTA;AACX,GAEaC,IAAO,OAAUR,GAAaC,MAAqD;AAC5F,QAAMQ,IAAOR,GAAM,QAAQ,CAAA,GACrBG,IAAQH,GAAM;AACpB,MAAIS;AACJ,QAAMC,IAAe,IAAI,QAAQpB,GAAyB;AAO1D,MANMkB,aAAgB,WAIlBC,IAAOD,KAHPC,IAAO,KAAK,UAAUD,CAAI,GAC1BE,EAAa,IAAI,gBAAgB,kBAAkB,IAInDP;AACA,aAASC,KAASD,GAAO;AACrB,YAAMrB,IAAQqB,EAAMC,CAAK;AACzB,MAAItB,KACA4B,EAAa,IAAIN,GAAOtB,CAAK;AAAA,IAErC;AAEJ,EAAAnB,EAAO,MAAM;AAAA,IACT,QAAU;AAAA,IACV,KAAOoC;AAAA,IACP,SAAWW;AAAA,EAAA,CACd;AACD,QAAML,IAAW,MAAM,MAAMN,GAAK;AAAA,IAC9B,QAAQ;AAAA,IACR,SAASW;AAAA,IACT,MAAAD;AAAA,EAAA,CACH;AACD,MAAIJ,EAAS,IAAI;AACb,UAAM3B,IAAS,MAAM2B,EAAS,KAAA;AAC9B,WAAA1C,EAAO,MAAM;AAAA,MACT,aAAee;AAAA,IAAA,CAClB,GACMA;AAAA,EACX;AACA,QAAM4B,IAAM;AAAA,IACR,MAAMD,EAAS;AAAA,IACf,SAAS;AAAA,IACT,KAAKA,EAAS;AAAA,EAAA;AAElB,SAAA1C,EAAO,MAAM2C,CAAG,GACTA;AACX,GAEaK,IAAO,OAAUZ,GAAaC,MAAmD;AAC1F,QAAMY,IAAM,MAAMd,EAAOC,GAAKC,CAAI;AAClC,MAAIY,EAAI;AACJ,WAAOA,EAAI;AAEf,MAAIZ,GAAM,WAAW;AACjB,IAAAA,EAAK,UAAUY,EAAI,OAAO1B,CAAU;AACpC;AAAA,EACJ;AACA,QAAM,MAAM0B,EAAI,OAAO1B,CAAU;AACrC,GAEa2B,IAAQ,OAAUd,GAAaC,MAAoD;AAC5F,QAAMY,IAAM,MAAML,EAAQR,GAAKC,CAAI;AACnC,MAAIY,EAAI;AACJ,WAAOA,EAAI;AAEf,MAAIZ,GAAM,WAAW;AACjB,IAAAA,EAAK,UAAUY,EAAI,OAAOzB,CAAW;AACrC;AAAA,EACJ;AACA,QAAM,MAAMyB,EAAI,OAAOzB,CAAW;AACtC,GAEa2B,IAAe,OAAOf,GAAaC,MAA8C;AAC1F,QAAMY,IAAM,MAAML,EAAKR,GAAKC,CAAI;AAChC,SAAIY,EAAI,WACAZ,GAAM,eACNA,EAAK,YAAYY,EAAI,OAAO,SAAS,GAElC,OAEPZ,GAAM,aACNA,EAAK,UAAUY,EAAI,OAAOzB,CAAW,GAElC;AACX,GAGa4B,IAAoB,CAACC,MAAqC;AACnE,QAAMpB,IAAWoB,EAAQ,QAAQ,IAAI5B,EAAa,WAAW,CAAC,GACxD6B,IAAOD,EAAQ,QAAQ,IAAI5B,EAAa,IAAI,GAC5C8B,IAAYF,EAAQ,QAAQ,IAAI5B,EAAa,YAAY,CAAC,GAC1D+B,IAAYH,EAAQ,QAAQ,IAAI5B,EAAa,YAAY,CAAC,GAC1DV,IAAyB,CAAA;AAC/B,SAAIkB,KAAYA,EAAS,SAAS,MAC9BlB,EAAO,WAAWkB,IAElBqB,KAAQA,EAAK,SAAS,MACtBvC,EAAO,OAAOuC,IAEdC,KAAaA,EAAU,SAAS,MAChCxC,EAAO,YAAYwC,IAEnBC,KAAaA,EAAU,SAAS,MAChCzC,EAAO,YAAYyC,IAEhBzC;AACX,GAEa0C,IAA4B,CAACC,MAAiD;AACvF,QAAM3C,IAAyB,CAAA,GACzBkB,IAAWyB,EAAO,IAAIhC,EAAa,eAAe,GAAG,OACrD4B,IAAOI,EAAO,IAAIhC,EAAa,YAAY,GAAG,OAC9C6B,IAAYG,EAAO,IAAIhC,EAAa,gBAAgB,GAAG,OACvD8B,IAAYE,EAAO,IAAIhC,EAAa,gBAAgB,GAAG;AAC7D,SAAIO,KAAYA,EAAS,SAAS,MAC9BlB,EAAO,WAAWkB,IAElBqB,KAAQA,EAAK,SAAS,MACtBvC,EAAO,OAAOuC,IAEdC,KAAaA,EAAU,SAAS,MAChCxC,EAAO,YAAYwC,IAEnBC,KAAaA,EAAU,SAAS,MAChCzC,EAAO,YAAYyC,IAEhBzC;AACX;AAEO,MAAM4C,EAAW;AAAA,EACH;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACjB,YAAY,EAAE,UAAA1B,GAAU,MAAAqB,GAAM,WAAAC,GAAW,WAAAC,GAAW,UAAAI,GAAU,UAAAC,KAAsC;AAChG,SAAK,UAAU,QAAQ,IAAI,YAAY,IACvC,KAAK,cAAcA,KAAY,IAC/B,KAAK,SAAS,QAAQ,IAAI,WAAW,IACrC,KAAK,WAAWD,KAAY/D,EAAc,UAC1C,KAAK,WAAW,QAAQ,IAAI,aAAa,KACzC,KAAK,WAAWoC,KAAY5B,EAAa,EAAE,GAC3C,KAAK,OAAOiD,KAAQlC,GACpB,KAAK,YAAYmC,GACjB,KAAK,YAAYC,GACjB,KAAK,WAAW,QAAQ,IAAI,YAAY;AAAA,EAC5C;AAAA,EAEA,UAAU;AACN,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,QAAQX,GAAc;AAClB,UAAMiB,IAAMC,EAAS,IAAI,KAAK,MAAM,KAAK,MAAM;AAC/C,WAAOA,EAAS,IAAI,QAAQlB,GAAMiB,CAAG,EAAE,SAAA;AAAA,EAC3C;AAAA,EAEA,QAAQjB,GAAc;AAClB,UAAMiB,IAAMC,EAAS,IAAI,KAAK,MAAM,KAAK,MAAM;AAC/C,WAAOA,EAAS,IAAI,QAAQlB,GAAMiB,GAAK;AAAA,MACnC,MAAMC,EAAS,KAAK;AAAA,IAAA,CACvB,EAAE,SAASA,EAAS,IAAI,IAAI;AAAA,EACjC;AAAA,EAEA,cAAc;AACV,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGQ,oBAAoBlB,GAAmC;AAC3D,UAAMmB,IAAc,CAAA;AACpB,eAAWC,KAAKpB,GAAM;AAClB,UAAIqB,IAAIrB,EAAKoB,CAAC;AACd,UAAIC,KAAK,OAAOA,KAAM;AAClB,QAAAA,IAAIA,EAAE,KAAA;AAAA,eACCA,KAAK,OAAOA,KAAM,UAAU;AACnC,YAAI/D,EAAQ+D,CAAC,GAAG;AACZ,cAAIA,EAAE,WAAW;AACb;AAEJ,mBAASvD,IAAI,GAAGA,IAAIuD,EAAE,QAAQvD,KAAK;AAC/B,kBAAMwD,IAAWD,EAAEvD,CAAC;AACpB,uBAAWyD,KAAcD,GAAU;AAC/B,oBAAME,IAAmBF,EAASC,CAAU,KAAK;AACjD,kBAAIC;AACA,oBAAI,OAAOA,KAAqB;AAC5B,kBAAIlE,EAAQkE,CAAgB,KAExBA,EAAiB,QAAQ,CAACC,GAAYC,MAAkB;AACpD,wBAAID;AACA,iCAAWE,KAAKF,GAAO;AACnB,8BAAMJ,IAAII,EAAME,CAAC;AACjB,4BAAIN,KAAKA,EAAE,SAAA,EAAW,SAAS,GAAG;AAC9B,gCAAMO,IAAI,IAAI9D,EAAE,SAAA,CAAU,KAAKyD,IAAa,IAAIG,EAAM,SAAA,CAAU,KAAKC,CAAC,EAAE,IAAItD,EAAUgD,CAAC,CAAC;AACxF,0BAAAF,EAAE,KAAKC,IAAIQ,CAAC;AAAA,wBAChB;AAAA,sBACJ;AAAA,kBAER,CAAC;AAAA,yBAEEJ,EAAiB,SAAA,EAAW,SAAS,GAAG;AAC/C,wBAAMI,IAAI,IAAI9D,EAAE,SAAA,CAAU,KAAKyD,CAAU,IAAIlD,EAAUmD,EAAiB,SAAA,CAAU,CAAC;AACnF,kBAAAL,EAAE,KAAKC,IAAIQ,CAAC;AAAA,gBAChB;AAAA;AAAA,YAER;AAAA,UACJ;AAAA,QACJ;AACI,qBAAWrE,KAAO8D,GAAG;AACjB,kBAAMQ,IAASR,EAAE9D,CAAG;AACpB,gBAAIsE,KAAU,QAAQA,KAAU,MAAMA,EAAO,UAAU,GAAG;AACtD,oBAAMD,IAAI,IAAIrE,CAAG,IAAIc,EAAUwD,CAAM,CAAC;AACtC,cAAAV,EAAE,KAAKC,IAAIQ,CAAC;AAAA,YAChB;AAAA,UACJ;AAEJ;AAAA,MACJ,MAAA,CAAWP,KAAK,OAAOA,KAAM,eACzBA,IAAI;AAGR,MAAIA,KAAK,QAAQA,KAAK,MAAMA,EAAE,UAAU,KACpCF,EAAE,KAAKC,IAAI,MAAM/C,EAAUgD,CAAC,CAAC;AAAA,IAErC;AACA,WAAQF,KAAKA,EAAE,KAAK,GAAG;AAAA,EAC3B;AAAA,EAEA,MAAc,KAAKnB,GAAwD;AAEvE,UAAM8B,IAAU,UAAW,MAAM,KAAK,WAAA,GAChC1D,IAAgB,CAAA;AACtB,eAAWgD,KAAKpB;AACZ,MAAA5B,EAAI,KAAKgD,CAAC;AAEd,IAAAhD,EAAI,KAAK,CAAC,GAAW2D,MACV,EAAE,YAAA,EAAc,cAAcA,EAAE,aAAa,CACvD;AACD,UAAM3B,IAAgB,CAAA;AACtB,IAAAhC,EAAI,QAAQ,CAACiD,MAAc;AACvB,UAAI/C,IAAyB0B,EAAKqB,CAAC;AACnC,MAAI,OAAO/C,KAAU,aACjBA,IAAQ,KAAK,UAAUA,CAAK,IAEhC8B,EAAI,KAAKiB,IAAI,MAAM/C,CAAK;AAAA,IAC5B,CAAC;AACD,UAAM0D,IAAoB5B,EAAI,KAAK,GAAG,GAChC6B,IAAMC,EAAI,KAAKF,IAAYF,GAAS,mBAAmB,GACvDK,IAAU;AAAA,MACZ,MAAM;AAAA,MACN,QAAQH;AAAA,MACR,KAAKC;AAAA,IAAA;AAET,WAAA9E,EAAO,MAAMgF,CAAO,GACbF;AAAA,EACX;AAAA;AAAA,EAGQ,kBAAkBjC,GAA4BoC,GAAwC;AAC1F,UAAM3C,IAASO,KAAQ,CAAA;AACvB,WAAAP,EAAO,YAAe,KAAK,IAAA,IAAQ,IACnCA,EAAO,UAAajC,EAAa,EAAE,GACnCiC,EAAO,UAAa,KAAK,SACzBA,EAAO,WAAc,KAAK,UAC1BA,EAAO,QAAW,KAAK,WACvBA,EAAO,SAAY,KAAK,QACpB2C,KAAYA,EAAS,SAAS,MAC9B3C,EAAO,WAAc2C,IAElB3C;AAAA,EACX;AAAA,EAEA,MAAc,eAAe,EAAE,WAAA4C,GAAW,OAAAC,KAAuE;AAC7G,UAAMC,IAA4B;AAAA,MAC9B,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,aAAaD,GAAO,MAAM,cAAc,KAAK,SAAS,SAAA;AAAA,MACtD,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,IAAA;AAEpB,IAAI,KAAK,QAAQ,KAAK,KAAK,SAAS,MAChCC,EAAE,OAAU,KAAK,OAEjB,KAAK,aAAa,KAAK,UAAU,SAAS,MAC1CA,EAAE,QAAQ,IAAI,KAAK,YAEnB,KAAK,aAAa,KAAK,UAAU,SAAS,MAC1CA,EAAE,QAAQ,IAAI,KAAK,YAEnBD,MACIA,EAAM,SAASA,EAAM,MAAM,SAAS,KAAKA,EAAM,YAAYA,EAAM,SAAS,SAAS,MACnFC,EAAE,gBAAmBD,EAAM,OAC3BC,EAAE,WAAcD,EAAM,WAEtBA,EAAM,UACNC,EAAED,EAAM,MAAM,UAAU,IAAIA,EAAM,MAAM;AAGhD,UAAMtC,IAAOjC,EAAesE,CAAS,GAC/BG,IAAO,MAAM,KAAK,KAAKxC,CAAI;AACjC,WAAAuC,EAAE,OAAUC,GACLD;AAAA,EACX;AAAA,EAEA,MAAc,aAA8B;AACxC,QAAI,KAAK,YAAY,UAAU;AAC3B,aAAO,KAAK;AAEhB,UAAME,IAAM,KAAK,UAAU,KAAK,WAAW,GACrCF,IAAI;AAAA,MACN,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,WAAW,KAAK;AAAA,IAAA,GAEdJ,IAAU;AAAA,MACZ,KAAOM;AAAA,MACP,SAAWF;AAAA,IAAA;AAEf,IAAApF,EAAO,MAAMgF,CAAO;AACpB,UAAM/B,IAAM,MAAM,MAAMqC,GAAK;AAAA,MACzB,QAAQ;AAAA,MACR,SAASF;AAAA,MACT,aAAa;AAAA,MACb,OAAO;AAAA,IAAA,CACV;AACD,QAAInC,EAAI,IAAI;AACR,YAAMlC,IAAS,MAAMkC,EAAI,KAAA;AACzB,aAAAjD,EAAO,MAAM,EAAE,QAAQe,EAAO,MAAM,GAC7BA,EAAO;AAAA,IAClB;AACA,UAAM,IAAI,MAAM,oBAAoB;AAAA,EACxC;AAAA,EAEQ,UAAUqB,GAAqB;AACnC,WAAO,GAAG,KAAK,OAAO,IAAIA,CAAG;AAAA,EACjC;AAAA,EAEA,MAAM,OAAoC;AACtC,UAAMa,IAAM,MAAM,KAAK,IAAe;AAAA,MAClC,KAAK;AAAA,IAAA,CACR;AACD,QAAIA,EAAI,SAAS;AACb,YAAMJ,IAAOI,EAAI;AACjB,UAAIJ;AACA,eAAOA,EAAK,UAAa,SAAA;AAAA,IAEjC;AAAA,EAEJ;AAAA;AAAA,EAGA,MAAM,IAAO,EAAE,KAAAT,GAAK,MAAAS,GAAM,OAAAsC,GAAO,OAAAI,IAAQ,aAAsE;AAC3G,UAAMjD,IAAS,KAAK,kBAAkBO,CAAI,GACpCqC,IAAY,KAAK,oBAAoB5C,CAAM,GAC3CC,IAAU,MAAM,KAAK,eAAe,EAAE,WAAa2C,GAAW,OAASC,GAAO,GAC9EG,IAAM,GAAG,KAAK,UAAUlD,CAAG,CAAC,IAAI8C,EAAU,SAAA,CAAU,IACpDF,IAAU;AAAA,MACZ,QAAU;AAAA,MACV,KAAOM;AAAA,MACP,SAAW/C;AAAA,IAAA;AAEf,IAAAvC,EAAO,KAAKgF,CAAO;AACnB,UAAM/B,IAAM,MAAM,MAAMqC,GAAK;AAAA,MACzB,QAAU;AAAA,MACV,SAAW/C;AAAA,MACX,aAAe;AAAA,MACf,OAASgD;AAAA,IAAA,CACZ;AACD,QAAItC,EAAI,IAAI;AACR,YAAMlC,IAAS,MAAMkC,EAAI,KAAA;AACzB,aAAAjD,EAAO,MAAM,EAAE,YAAce,EAAA,CAAQ,GAC9BA;AAAA,IACX;AACA,UAAM4B,IAAM;AAAA,MACR,MAAMM,EAAI;AAAA,MACV,SAAS;AAAA,MACT,KAAKA,EAAI;AAAA,IAAA;AAEb,WAAAjD,EAAO,MAAM2C,CAAG,GACTA;AAAA,EACX;AAAA;AAAA,EAGA,MAAM,KAAQ,EAAE,KAAAP,GAAK,MAAAS,GAAM,OAAAsC,GAAO,OAAAI,IAAQ,aAAsE;AAC5G,IAAA1C,IAAOA,IAAO,EAAE,GAAGA,EAAA,IAAS,CAAA;AAC5B,UAAM2C,IAAS3C,EAAK,UAAU,QACxB4C,IAAW5C,EAAK,YAAY;AAClC,IAAI2C,KACA,OAAO3C,EAAK,QAEZ4C,KACA,OAAO5C,EAAK;AAEhB,UAAMP,IAAS,KAAK,kBAAkBO,CAAI,GACpCqC,IAAY,KAAK,oBAAoB5C,CAAM,GAC3CC,IAAU,MAAM,KAAK,eAAe,EAAE,WAAa2C,GAAW,OAASC,GAAO;AACpF,IAAIK,KAAUC,MACVlD,EAAQ,cAAc,IAAI,iCAAiCkD,CAAQ;AAEvE,UAAMH,IAAM,KAAK,UAAUlD,CAAG,GACxB4C,IAAU;AAAA,MACZ,QAAU;AAAA,MACV,KAAOM;AAAA,MACP,SAAW/C;AAAA,MACX,QAAUD;AAAA,IAAA;AAEd,IAAAtC,EAAO,KAAKgF,CAAO;AACnB,UAAMU,IAAOF,IAAS,GAAGF,CAAG,IAAIJ,CAAS,KAAKI,GACxCrC,IAAM,MAAM,MAAMyC,GAAM;AAAA,MAC1B,QAAU;AAAA,MACV,SAAWnD;AAAA,MACX,MAAQiD,KAAkBN,EAAU,SAAA;AAAA,MACpC,aAAe;AAAA,MACf,OAASK;AAAA,IAAA,CACZ;AACD,QAAItC,EAAI,IAAI;AACR,YAAMlC,IAAS,MAAMkC,EAAI,KAAA;AACzB,aAAAjD,EAAO,MAAM,EAAE,aAAee,EAAA,CAAQ,GAC/BA;AAAA,IACX;AACA,UAAM4B,IAAM;AAAA,MACR,MAAMM,EAAI;AAAA,MACV,SAAS;AAAA,MACT,KAAKA,EAAI;AAAA,IAAA;AAEb,WAAAjD,EAAO,MAAM2C,CAAG,GACTA;AAAA,EACX;AAAA;AAAA,EAGA,MAAM,OAAO,EAAE,KAAAP,GAAK,MAAAS,GAAM,OAAAsC,KAA2E;AACjG,IAAAtC,IAAOA,IAAO,EAAE,GAAGA,EAAA,IAAS,CAAA;AAC5B,UAAM2C,IAAS3C,EAAK,UAAU,QACxB4C,IAAW5C,EAAK,YAAY;AAClC,IAAI2C,KACA,OAAO3C,EAAK,QAEZ4C,KACA,OAAO5C,EAAK;AAEhB,UAAMP,IAAS,KAAK,kBAAkBO,CAAI,GACpCqC,IAAY,KAAK,oBAAoB5C,CAAM,GAE3CC,IAAU,MAAM,KAAK,eAAe,EAAE,WAAa2C,GAAW,OAASC,GAAO;AACpF,IAAIK,KAAUC,MACVlD,EAAQ,cAAc,IAAI,iCAAiCkD,CAAQ,KAEvElD,EAAQ,aAAgB,cACxBA,EAAQ,mBAAmB,IAAI,MAC/BA,EAAQ,eAAe,IAAI;AAC3B,UAAM+C,IAAM,KAAK,UAAUlD,CAAG;AAC9B,QAAI;AACA,YAAMA,IAAMoD,IAAS,GAAGF,CAAG,IAAIJ,CAAS,KAAKI,GACvCN,IAAU;AAAA,QACZ,QAAU;AAAA,QACV,KAAOM;AAAA,QACP,SAAW/C;AAAA,QACX,QAAUD;AAAA,MAAA;AAEd,MAAAtC,EAAO,KAAKgF,CAAO;AACnB,YAAM/B,IAAM,MAAM,MAAMb,GAAK;AAAA,QACzB,QAAQ;AAAA,QACR,SAAAG;AAAA,QACA,MAAMiD,KAAkBN,EAAU,SAAA;AAAA,QAClC,aAAa;AAAA,MAAA,CAChB;AAED,UAAI,CAACjC,EAAI;AACL,cAAM,IAAI,MAAM,uBAAuBA,EAAI,MAAM,EAAE;AAEvD,UAAI,CAACA,EAAI;AACL,cAAM,IAAI,MAAM,kBAAkB;AAEtC,aAAO,IAAI,SAASA,EAAI,MAAM;AAAA,QAC1B,SAAS;AAAA,UACL,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,YAAc;AAAA,QAAA;AAAA,MAClB,CACH;AAAA,IACL,SAAS0C,GAAG;AACR,YAAMA;AAAA,IACV;AAAA,EACJ;AAAA,EAEA,YAAYC,GAAwC;AAChD,UAAMC,IAAWD,EAAQ,IAAIlE,EAAa,IAAI,GAAG;AACjD,WAAImE,KAAYA,EAAS,SAAS,IACvB,KAAK,MAAMA,CAAQ,IAEvB;AAAA,EACX;AAAA,EAEA,SAASD,GAAsC;AAC3C,UAAMC,IAAWD,EAAQ,IAAI,MAAM,GAAG;AACtC,QAAIX,IAAW,IACXa,IAAQ,KAAK;AACjB,QAAID,KAAYA,EAAS,SAAS,GAAG;AACjC,YAAME,IAAO,KAAK,MAAMF,CAAQ;AAChC,MAAAZ,IAAWc,EAAK,UAChBD,IAAQC,EAAK,SAAS,SAAA;AAAA,IAC1B;AACA,WAAO;AAAA,MACH,UAAAd;AAAA,MACA,OAAAa;AAAA,MACA,OAAOF,EAAQ,IAAIlE,EAAa,KAAK,GAAG,SAAS;AAAA,IAAA;AAAA,EAEzD;AAAA,EAEA,oBAAoB,CAACkE,MAA6C;AAC9D,UAAMC,IAAWD,EAAQ,IAAI,MAAM,GAAG;AACtC,QAAIX,IAAW,IACXa,IAAQ,KAAK;AACjB,QAAID,KAAYA,EAAS,SAAS,GAAG;AACjC,YAAME,IAAO,KAAK,MAAMF,CAAQ;AAChC,MAAAZ,IAAWc,EAAK,UAChBD,IAAQC,EAAK,SAAS,SAAA;AAAA,IAC1B;AACA,WAAO;AAAA,MACH,UAAAd;AAAA,MACA,OAAAa;AAAA,MACA,OAAOF,EAAQ,IAAIlE,EAAa,KAAK,GAAG,SAAS;AAAA,IAAA;AAAA,EAEzD;AAAA;AAAA,EAGA,SAASmB,GAAgEH,GAA4C;AACjH,UAAM,EAAE,IAAAsD,GAAI,MAAAC,GAAM,UAAAhB,GAAU,UAAAiB,GAAU,KAAAC,GAAK,SAAAC,GAAS,OAAAjB,GAAO,eAAAkB,GAAe,cAAAC,GAAc,UAAArE,GAAU,UAAA2B,GAAU,eAAA2C,MAAkB1D,GACxH2D,IAAkB;AAAA,MACpB,IAAAR;AAAA,MACA,MAAAC;AAAA,MACA,UAAAhB;AAAA,MACA,UAAAiB;AAAA,MACA,KAAAC;AAAA,MACA,SAAAC;AAAA,MACA,eAAAC;AAAA,MACA,cAAAC;AAAA,MACA,UAAArE;AAAA,MACA,UAAA2B;AAAA,MACA,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,SAAS;AAAA,MACT,UAAU;AAAA,MACV,cAAc;AAAA,MACd,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,eAAA2C;AAAA,IAAA;AAEJ,WAAA7D,EAAS,QAAQ,IAAIhB,EAAa,OAAOyD,GAAO;AAAA,MAC5C,UAAU;AAAA,MACV,QAAQ,CAAC,KAAK;AAAA;AAAA,MACd,UAAU;AAAA;AAAA,MACV,MAAM;AAAA;AAAA,IAAA,CACT,GACDzC,EAAS,QAAQ,IAAIhB,EAAa,MAAM,KAAK,UAAU8E,CAAS,CAAC,GAC1D9D;AAAA,EACX;AAAA,EAEA,WAAWA,GAA4C;AACnD,WAAAA,EAAS,QAAQ,IAAIhB,EAAa,OAAO,IAAI;AAAA,MACzC,QAAQ;AAAA;AAAA,MACR,UAAU;AAAA,MACV,MAAM;AAAA,IAAA,CACT,GACDgB,EAAS,QAAQ,IAAIhB,EAAa,MAAM,IAAI;AAAA,MACxC,QAAQ;AAAA;AAAA,MACR,UAAU;AAAA,MACV,MAAM;AAAA,IAAA,CACT,GACDgB,EAAS,QAAQ,OAAOhB,EAAa,KAAK,GAC1CgB,EAAS,QAAQ,OAAOhB,EAAa,IAAI,GAClCgB;AAAA,EACX;AACJ;"}
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 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 userType: USER_TYPE;\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 koffi from 'koffi';\r\n\r\nif (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\nexport 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});","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","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 CookieNames,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaderNames,\r\n HttpHeaders,\r\n HttpToken,\r\n IbootCookieStore,\r\n IbootReadonlyCookies,\r\n IbootWritableCookie,\r\n ResultModel,\r\n ServerRequestOptions\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\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\nconst HEADER_NAMES: Record<HttpHeaderNames, HttpHeaderNames> = {\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\nconst COOKIE_NAMES: Record<CookieNames, CookieNames> = {\r\n \"IBOOT_DEVICE_ID\": \"IBOOT_DEVICE_ID\",\r\n \"IBOOT_LOCALE\": \"IBOOT_LOCALE\",\r\n \"IBOOT_WEBSITE_ID\": \"IBOOT_WEBSITE_ID\",\r\n \"IBOOT_WEBSITE_NO\": \"IBOOT_WEBSITE_NO\",\r\n \"token\": \"token\",\r\n \"user\": \"user\"\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 getHttpClientOpts = (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 getHttpClientOptsByCookie = (cookie: IbootReadonlyCookies): HttpClientOpts => {\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookie.get(COOKIE_NAMES.IBOOT_DEVICE_ID)?.value;\r\n const lang = cookie.get(COOKIE_NAMES.IBOOT_LOCALE)?.value;\r\n const websiteId = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_ID)?.value;\r\n const websiteNo = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_NO)?.value;\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 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 private readonly _isDebug: boolean;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType, helloURL }: Readonly<HttpClientOpts>) {\r\n this.baseUrl = process.env.BASE_URL ?? '';\r\n this.helloMethod = helloURL ?? ''\r\n this.apiKey = process.env.API_KEY ?? '';\r\n this.userType = userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.userFrom = process.env.USER_FROM || '1';\r\n this.deviceId = deviceId ?? randomString(10);\r\n this.lang = lang ?? DEFAULT_LOCALE;\r\n this.websiteId = websiteId\r\n this.websiteNo = websiteNo\r\n this._isDebug = process.env.NODE_ENV != 'production';\r\n }\r\n\r\n isDebug() {\r\n return this._isDebug;\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 getDeviceId() {\r\n return this.deviceId;\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\r\n getUserInfo(cookies: IbootCookieStore): User | null {\r\n const userjson = cookies.get(COOKIE_NAMES.user)?.value;\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n return null;\r\n }\r\n\r\n getToken(cookies: IbootCookieStore): HttpToken {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n getTokenByCookies = (cookies: IbootReadonlyCookies): HttpToken => {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setToken(data: User & { token: string, extFields: Record<string, any> }, response: { cookies: IbootWritableCookie }) {\r\n const { id, name, username, nickname, sex, headImg, token, lastLoginTime, tokenExpired, 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,\r\n sex: sex,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n tokenExpired: tokenExpired,\r\n deviceId: deviceId,\r\n userType: userType,\r\n status: 0,\r\n accountType: 0,\r\n enabled: false,\r\n userFrom: 1,\r\n needToReview: false,\r\n socketOnline: false,\r\n createTime: \"\",\r\n mustChangePwd: mustChangePwd\r\n };\r\n response.cookies.set(COOKIE_NAMES.token, token, {\r\n httpOnly: true,\r\n secure: !this._isDebug, // 在生产环境中启用Secure\r\n sameSite: 'strict', // 防止 CSRF 攻击\r\n path: '/', // Cookie 的路径\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, JSON.stringify(loginUser));\r\n return response;\r\n }\r\n\r\n cleanToken(response: { cookies: IbootWritableCookie }) {\r\n response.cookies.set(COOKIE_NAMES.token, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.delete(COOKIE_NAMES.token);\r\n response.cookies.delete(COOKIE_NAMES.user)\r\n return response;\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","kernel32","koffi","setConsoleOutputCP","setConsoleCP","e","logger","pino","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","HEADER_NAMES","COOKIE_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","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","helloURL","key","CryptoJS","p","o","v","arr_item","item_field","item_field_value","item1","index","f","s","oValue","_apiKey","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","cache","buffer","boundary","urls","cookies","userjson","utype","user","id","name","nickname","sex","headImg","lastLoginTime","tokenExpired","mustChangePwd","loginUser"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- (function(c,y){typeof exports=="object"&&typeof module<"u"?y(exports,require("pino"),require("js-md5"),require("crypto-js")):typeof define=="function"&&define.amd?define(["exports","pino","js-md5","crypto-js"],y):(c=typeof globalThis<"u"?globalThis:c||self,y(c["iboot-http-client"]={},c.pino,c.md5,c.CryptoJS))})(this,(function(c,y,k,p){"use strict";const B={GENERAL:0,PHONE:1,EMAIL:2},A={TYPE_MGT:0,TYPE_C:1,TYPE_B:2},L={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};process.platform==="win32"&&(process.stdout.setEncoding("utf8"),process.stderr.setEncoding("utf8"));const d=y({name:process.env.APP_NAME??"iBoot",level:process.env.NODE_ENV!="production"?"debug":"info",nestedKey:"payload",formatters:{level:o=>({level:o})},transport:{target:"pino-pretty",options:{colorize:!0,translateTime:"SYS:yyyy-mm-dd HH:MM:ss",ignore:"pid,hostname",messageFormat:"{msg}",singleLine:!0}}}),w=o=>Array.isArray(o)||typeof o=="object"&&Object.prototype.toString.call(o)==="[object Array]",O=o=>{const t=o||32,e="ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",s=e.length;let r="";for(let n=0;n<t;n++)r+=e.charAt(Math.floor(Math.random()*s));return r},R=(o,t)=>{const e={};return o.split("&").forEach(r=>{const n=r.split("=");n[1]&&(!t||t.indexOf(n[0])==-1)&&(e[n[0]]=n[1])}),e},T=o=>!o||o==""||o.length==0?"":encodeURIComponent(o).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\'/g,"%27").replace(/\!/g,"%21").replace(/\~/g,"%7E"),N="zh-CN",S="_device_id_key",P="_current_website_key",U="Get request error!",v="Post request error!",_={"Device-Id":"Device-Id",Lang:"Lang","Website-Id":"Website-Id","Website-No":"Website-No"},g={IBOOT_DEVICE_ID:"IBOOT_DEVICE_ID",IBOOT_LOCALE:"IBOOT_LOCALE",IBOOT_WEBSITE_ID:"IBOOT_WEBSITE_ID",IBOOT_WEBSITE_NO:"IBOOT_WEBSITE_NO",token:"token",user:"user"},D=()=>{const o=localStorage.getItem(S)??"",t=localStorage.getItem(P),e=t!=null?JSON.parse(t):null,s={};return o.length>0&&(s["Device-Id"]=o),e&&(s.Lang=e.language,e.websiteId&&(s["Website-Id"]=e.websiteId),e.websiteNo&&(s["Website-No"]=e.websiteNo)),s},W=(o,t)=>{localStorage.setItem(S,o),t&&localStorage.setItem(P,JSON.stringify(t))},M=async(o,t)=>{if(t?.data){const i=new URLSearchParams(t.data);o.indexOf("?")!=-1?o+=`&${i}`:o+=`?${i}`}const e=D(),s=t?.headers;if(s)for(const i in s){const u=s[i];u&&(e[i]=u)}d.debug({method:"GET",url:o,headers:e});const r=await fetch(o,{method:"GET",headers:e,cache:t?.useCache?"force-cache":"default"});if(r.ok){const i=await r.json();return d.debug({GET_RESULT:i}),i}const n={code:r.status,success:!1,msg:r.statusText};return d.error(n),n},C=async(o,t)=>{const e=t?.data??{},s=t?.headers;let r;const n=new Headers(D());if(e instanceof FormData?r=e:(r=JSON.stringify(e),n.set("Content-Type","application/json")),s)for(let a in s){const l=s[a];l&&n.set(a,l)}d.debug({method:"GET",url:o,headers:n});const i=await fetch(o,{method:"POST",headers:n,body:r});if(i.ok){const a=await i.json();return d.debug({POST_RESULT:a}),a}const u={code:i.status,success:!1,msg:i.statusText};return d.error(u),u},$=async(o,t)=>{const e=await M(o,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??U);return}throw Error(e.msg??U)},H=async(o,t)=>{const e=await C(o,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??v);return}throw Error(e.msg??v)},F=async(o,t)=>{const e=await C(o,t);return e.success?(t?.showSuccess&&t.showSuccess(e.msg??"SUCCESS"),!0):(t?.showError&&t.showError(e.msg??v),!1)},K=o=>{const t=o.headers.get(_["Device-Id"]),e=o.headers.get(_.Lang),s=o.headers.get(_["Website-Id"]),r=o.headers.get(_["Website-No"]),n={};return t&&t.length>0&&(n.deviceId=t),e&&e.length>0&&(n.lang=e),s&&s.length>0&&(n.websiteId=s),r&&r.length>0&&(n.websiteNo=r),n},G=o=>{const t={},e=o.get(g.IBOOT_DEVICE_ID)?.value,s=o.get(g.IBOOT_LOCALE)?.value,r=o.get(g.IBOOT_WEBSITE_ID)?.value,n=o.get(g.IBOOT_WEBSITE_NO)?.value;return e&&e.length>0&&(t.deviceId=e),s&&s.length>0&&(t.lang=s),r&&r.length>0&&(t.websiteId=r),n&&n.length>0&&(t.websiteNo=n),t};class Y{baseUrl;helloMethod;apiKey;userType;userFrom;deviceId;version="1";lang;websiteId;websiteNo;_isDebug;constructor({deviceId:t,lang:e,websiteId:s,websiteNo:r,userType:n,helloURL:i}){this.baseUrl=process.env.BASE_URL??"",this.helloMethod=i??"",this.apiKey=process.env.API_KEY??"",this.userType=n??A.TYPE_MGT,this.userFrom=process.env.USER_FROM||"1",this.deviceId=t??O(10),this.lang=e??N,this.websiteId=s,this.websiteNo=r,this._isDebug=process.env.NODE_ENV!="production"}isDebug(){return this._isDebug}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)}getDeviceId(){return this.deviceId}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(w(r)){if(r.length===0)continue;for(let n=0;n<r.length;n++){const i=r[n];for(const u in i){const a=i[u]??void 0;if(a){if(typeof a=="object")w(a)&&a.forEach((l,h)=>{if(l)for(const m in l){const f=l[m];if(f&&f.toString().length>0){const E=`[${n.toString()}].${u+`[${h.toString()}].${m}`}=${T(f)}`;e.push(s+E)}}});else if(a.toString().length>0){const l=`[${n.toString()}].${u}=${T(a.toString())}`;e.push(s+l)}}}}}else for(const n in r){const i=r[n];if(i!=null&&i!=""&&i.length!=0){const u=`.${n}=${T(i)}`;e.push(s+u)}}continue}else r&&typeof r=="function"&&(r=null);r!=null&&r!=""&&r.length!=0&&e.push(s+"="+T(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 n=r.join("&"),i=k.md5((n+e).toLocaleUpperCase()),u={name:"sort",params:n,md5:i};return d.debug(u),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),n=await this.sign(r);return s.Sign=n,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);const r=await fetch(t,{method:"GET",headers:e,credentials:"include",cache:"force-cache"});if(r.ok){const n=await r.json();return d.debug({result:n.data}),n.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 n=this.assemblyParameter(e),i=this.convertUrlParameter(n),u=await this.assemblyHeader({urlParams:i,token:s}),a=`${this.getApiUrl(t)}?${i.toString()}`,l={method:"GET",url:a,headers:u};d.info(l);const h=await fetch(a,{method:"GET",headers:u,credentials:"include",cache:r});if(h.ok){const f=await h.json();return d.debug({GET_RESULT:f}),f}const m={code:h.status,success:!1,msg:h.statusText};return d.error(m),m}async post({url:t,data:e,token:s,cache:r="default"}){e=e?{...e}:{};const n=e.buffer??void 0,i=e.boundary??void 0;n&&delete e.buffer,i&&delete e.boundary;const u=this.assemblyParameter(e),a=this.convertUrlParameter(u),l=await this.assemblyHeader({urlParams:a,token:s});n&&i&&(l["Content-Type"]=`multipart/form-data; boundary=${i}`);const h=this.getApiUrl(t),m={method:"POST",url:h,headers:l,params:u};d.info(m);const f=n?`${h}?${a}`:h,E=await fetch(f,{method:"POST",headers:l,body:n||a.toString(),credentials:"include",cache:r});if(E.ok){const I=await E.json();return d.debug({POST_RESULT:I}),I}const b={code:E.status,success:!1,msg:E.statusText};return d.error(b),b}async stream({url:t,data:e,token:s}){e=e?{...e}:{};const r=e.buffer??void 0,n=e.boundary??void 0;r&&delete e.buffer,n&&delete e.boundary;const i=this.assemblyParameter(e),u=this.convertUrlParameter(i),a=await this.assemblyHeader({urlParams:u,token:s});r&&n&&(a["Content-Type"]=`multipart/form-data; boundary=${n}`),a.Connection="keep-alive",a["X-Accel-Buffering"]="no",a["Cache-Control"]="no-cache";const l=this.getApiUrl(t);try{const h=r?`${l}?${u}`:l,m={method:"STREAM",url:l,headers:a,params:i};d.info(m);const f=await fetch(h,{method:"POST",headers:a,body:r||u.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}}getUserInfo(t){const e=t.get(g.user)?.value;return e&&e.length>0?JSON.parse(e):null}getToken(t){const e=t.get("user")?.value;let s="",r=this.userType;if(e&&e.length>0){const n=JSON.parse(e);s=n.username,r=n.userType.toString()}return{username:s,utype:r,token:t.get(g.token)?.value??""}}getTokenByCookies=t=>{const e=t.get("user")?.value;let s="",r=this.userType;if(e&&e.length>0){const n=JSON.parse(e);s=n.username,r=n.userType.toString()}return{username:s,utype:r,token:t.get(g.token)?.value??""}};setToken(t,e){const{id:s,name:r,username:n,nickname:i,sex:u,headImg:a,token:l,lastLoginTime:h,tokenExpired:m,deviceId:f,userType:E,mustChangePwd:b}=t,I={id:s,name:r,username:n,nickname:i,sex:u,headImg:a,lastLoginTime:h,tokenExpired:m,deviceId:f,userType:E,status:0,accountType:0,enabled:!1,userFrom:1,needToReview:!1,socketOnline:!1,createTime:"",mustChangePwd:b};return e.cookies.set(g.token,l,{httpOnly:!0,secure:!this._isDebug,sameSite:"strict",path:"/"}),e.cookies.set(g.user,JSON.stringify(I)),e}cleanToken(t){return t.cookies.set(g.token,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.set(g.user,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.delete(g.token),t.cookies.delete(g.user),t}}c.ACCOUNT_TYPE_MAP=B,c.CURRENT_WEBSITE_KEY=P,c.DEFAULT_LOCALE=N,c.DEVICE_ID_KEY=S,c.HttpClient=Y,c.USER_FORM_MAP=L,c.USER_SEX_MAP=j,c.USER_TYPE_MAP=A,c.get=M,c.getHttpClientOpts=K,c.getHttpClientOptsByCookie=G,c.iGet=$,c.iPost=H,c.iPostSuccess=F,c.isArray=w,c.logger=d,c.post=C,c.randomString=O,c.setDefaultRequestHeader=W,c.urlEncode=T,c.urlParamToJson=R,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(c,y){typeof exports=="object"&&typeof module<"u"?y(exports,require("pino"),require("koffi"),require("js-md5"),require("crypto-js")):typeof define=="function"&&define.amd?define(["exports","pino","koffi","js-md5","crypto-js"],y):(c=typeof globalThis<"u"?globalThis:c||self,y(c["iboot-http-client"]={},c.pino,c.koffi,c.md5,c.CryptoJS))})(this,(function(c,y,L,M,p){"use strict";const B={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};if(typeof window>"u"&&process.platform==="win32")try{const t=L.load("Kernel32"),e=t.func("SetConsoleOutputCP","bool",["int"]),s=t.func("SetConsoleCP","bool",["int"]);e(65001),s(65001)}catch(o){console.log(o)}const d=y({name:process.env.APP_NAME??"iBoot",level:process.env.NODE_ENV!=="production"?"debug":"info",nestedKey:"payload",transport:{target:"pino-pretty",options:{colorize:!0,translateTime:"SYS:yyyy-mm-dd HH:MM:ss",ignore:"pid,hostname",messageFormat:"{msg}",singleLine:!0}}}),O=o=>Array.isArray(o)||typeof o=="object"&&Object.prototype.toString.call(o)==="[object Array]",S=o=>{const t=o||32,e="ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",s=e.length;let n="";for(let r=0;r<t;r++)n+=e.charAt(Math.floor(Math.random()*s));return n},R=(o,t)=>{const e={};return o.split("&").forEach(n=>{const r=n.split("=");r[1]&&(!t||t.indexOf(r[0])==-1)&&(e[r[0]]=r[1])}),e},T=o=>!o||o==""||o.length==0?"":encodeURIComponent(o).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\'/g,"%27").replace(/\!/g,"%21").replace(/\~/g,"%7E"),U="zh-CN",w="_device_id_key",P="_current_website_key",N="Get request error!",C="Post request error!",_={"Device-Id":"Device-Id",Lang:"Lang","Website-Id":"Website-Id","Website-No":"Website-No"},g={IBOOT_DEVICE_ID:"IBOOT_DEVICE_ID",IBOOT_LOCALE:"IBOOT_LOCALE",IBOOT_WEBSITE_ID:"IBOOT_WEBSITE_ID",IBOOT_WEBSITE_NO:"IBOOT_WEBSITE_NO",token:"token",user:"user"},k=()=>{const o=localStorage.getItem(w)??"",t=localStorage.getItem(P),e=t!=null?JSON.parse(t):null,s={};return o.length>0&&(s["Device-Id"]=o),e&&(s.Lang=e.language,e.websiteId&&(s["Website-Id"]=e.websiteId),e.websiteNo&&(s["Website-No"]=e.websiteNo)),s},W=(o,t)=>{localStorage.setItem(w,o),t&&localStorage.setItem(P,JSON.stringify(t))},D=async(o,t)=>{if(t?.data){const i=new URLSearchParams(t.data);o.indexOf("?")!=-1?o+=`&${i}`:o+=`?${i}`}const e=k(),s=t?.headers;if(s)for(const i in s){const u=s[i];u&&(e[i]=u)}d.debug({url:o,headers:e},"GET");const n=await fetch(o,{method:"GET",headers:e,cache:t?.useCache?"force-cache":"default"});if(n.ok){const i=await n.json();return d.debug(i,"GET_RESULT"),i}const r={code:n.status,success:!1,msg:n.statusText};return d.error(r),r},v=async(o,t)=>{const e=t?.data??{},s=t?.headers;let n;const r=new Headers(k());if(e instanceof FormData?n=e:(n=JSON.stringify(e),r.set("Content-Type","application/json")),s)for(let a in s){const l=s[a];l&&r.set(a,l)}d.debug({url:o,headers:r},"POST");const i=await fetch(o,{method:"POST",headers:r,body:n});if(i.ok){const a=await i.json();return d.debug(a,"POST_RESULT"),a}const u={code:i.status,success:!1,msg:i.statusText};return d.error(u),u},$=async(o,t)=>{const e=await D(o,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??N);return}throw Error(e.msg??N)},F=async(o,t)=>{const e=await v(o,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??C);return}throw Error(e.msg??C)},K=async(o,t)=>{const e=await v(o,t);return e.success?(t?.showSuccess&&t.showSuccess(e.msg??"SUCCESS"),!0):(t?.showError&&t.showError(e.msg??C),!1)},G=o=>{const t=o.headers.get(_["Device-Id"]),e=o.headers.get(_.Lang),s=o.headers.get(_["Website-Id"]),n=o.headers.get(_["Website-No"]),r={};return t&&t.length>0&&(r.deviceId=t),e&&e.length>0&&(r.lang=e),s&&s.length>0&&(r.websiteId=s),n&&n.length>0&&(r.websiteNo=n),r},Y=o=>{const t={},e=o.get(g.IBOOT_DEVICE_ID)?.value,s=o.get(g.IBOOT_LOCALE)?.value,n=o.get(g.IBOOT_WEBSITE_ID)?.value,r=o.get(g.IBOOT_WEBSITE_NO)?.value;return e&&e.length>0&&(t.deviceId=e),s&&s.length>0&&(t.lang=s),n&&n.length>0&&(t.websiteId=n),r&&r.length>0&&(t.websiteNo=r),t};class V{baseUrl;helloMethod;apiKey;userType;userFrom;deviceId;version="1";lang;websiteId;websiteNo;_isDebug;constructor({deviceId:t,lang:e,websiteId:s,websiteNo:n,userType:r,helloURL:i}){this.baseUrl=process.env.BASE_URL??"",this.helloMethod=i??"",this.apiKey=process.env.API_KEY??"",this.userType=r??A.TYPE_MGT,this.userFrom=process.env.USER_FROM||"1",this.deviceId=t??S(10),this.lang=e??U,this.websiteId=s,this.websiteNo=n,this._isDebug=process.env.NODE_ENV!="production"}isDebug(){return this._isDebug}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)}getDeviceId(){return this.deviceId}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(O(n)){if(n.length===0)continue;for(let r=0;r<n.length;r++){const i=n[r];for(const u in i){const a=i[u]??void 0;if(a){if(typeof a=="object")O(a)&&a.forEach((l,f)=>{if(l)for(const m in l){const h=l[m];if(h&&h.toString().length>0){const E=`[${r.toString()}].${u+`[${f.toString()}].${m}`}=${T(h)}`;e.push(s+E)}}});else if(a.toString().length>0){const l=`[${r.toString()}].${u}=${T(a.toString())}`;e.push(s+l)}}}}}else for(const r in n){const i=n[r];if(i!=null&&i!=""&&i.length!=0){const u=`.${r}=${T(i)}`;e.push(s+u)}}continue}else n&&typeof n=="function"&&(n=null);n!=null&&n!=""&&n.length!=0&&e.push(s+"="+T(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 r=n.join("&"),i=M.md5((r+e).toLocaleUpperCase()),u={params:r,md5:i};return d.debug(u,"API_SIGN"),i}assemblyParameter(t,e){const s=t??{};return s.timestamp=Date.now()+"",s.echostr=S(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=R(t),r=await this.sign(n);return s.Sign=r,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 n=await fetch(t,{method:"GET",headers:e,credentials:"include",cache:"force-cache"});if(n.ok){const r=await n.json();return d.debug(r.data,"HELLO RESULT"),r.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 r=this.assemblyParameter(e),i=this.convertUrlParameter(r),u=await this.assemblyHeader({urlParams:i,token:s}),a=`${this.getApiUrl(t)}?${i.toString()}`,l={url:a,headers:u};d.info(l,"GET");const f=await fetch(a,{method:"GET",headers:u,credentials:"include",cache:n});if(f.ok){const h=await f.json();return d.debug(h,"GET_RESULT"),h}const m={code:f.status,success:!1,msg:f.statusText};return d.error(m),m}async post({url:t,data:e,token:s,cache:n="default"}){e=e?{...e}:{};const r=e.buffer??void 0,i=e.boundary??void 0;r&&delete e.buffer,i&&delete e.boundary;const u=this.assemblyParameter(e),a=this.convertUrlParameter(u),l=await this.assemblyHeader({urlParams:a,token:s});r&&i&&(l["Content-Type"]=`multipart/form-data; boundary=${i}`);const f=this.getApiUrl(t),m={url:f,headers:l,params:u};d.info(m,"POST");const h=r?`${f}?${a}`:f,E=await fetch(h,{method:"POST",headers:l,body:r||a.toString(),credentials:"include",cache:n});if(E.ok){const I=await E.json();return d.debug(I,"POST_RESULT"),I}const b={code:E.status,success:!1,msg:E.statusText};return d.error(b),b}async stream({url:t,data:e,token:s}){e=e?{...e}:{};const n=e.buffer??void 0,r=e.boundary??void 0;n&&delete e.buffer,r&&delete e.boundary;const i=this.assemblyParameter(e),u=this.convertUrlParameter(i),a=await this.assemblyHeader({urlParams:u,token:s});n&&r&&(a["Content-Type"]=`multipart/form-data; boundary=${r}`),a.Connection="keep-alive",a["X-Accel-Buffering"]="no",a["Cache-Control"]="no-cache";const l=this.getApiUrl(t);try{const f=n?`${l}?${u}`:l,m={url:l,headers:a,params:i};d.info(m,"STREAM");const h=await fetch(f,{method:"POST",headers:a,body:n||u.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(f){throw f}}getUserInfo(t){const e=t.get(g.user)?.value;return e&&e.length>0?JSON.parse(e):null}getToken(t){const e=t.get("user")?.value;let s="",n=this.userType;if(e&&e.length>0){const r=JSON.parse(e);s=r.username,n=r.userType.toString()}return{username:s,utype:n,token:t.get(g.token)?.value??""}}getTokenByCookies=t=>{const e=t.get("user")?.value;let s="",n=this.userType;if(e&&e.length>0){const r=JSON.parse(e);s=r.username,n=r.userType.toString()}return{username:s,utype:n,token:t.get(g.token)?.value??""}};setToken(t,e){const{id:s,name:n,username:r,nickname:i,sex:u,headImg:a,token:l,lastLoginTime:f,tokenExpired:m,deviceId:h,userType:E,mustChangePwd:b}=t,I={id:s,name:n,username:r,nickname:i,sex:u,headImg:a,lastLoginTime:f,tokenExpired:m,deviceId:h,userType:E,status:0,accountType:0,enabled:!1,userFrom:1,needToReview:!1,socketOnline:!1,createTime:"",mustChangePwd:b};return e.cookies.set(g.token,l,{httpOnly:!0,secure:!this._isDebug,sameSite:"strict",path:"/"}),e.cookies.set(g.user,JSON.stringify(I)),e}cleanToken(t){return t.cookies.set(g.token,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.set(g.user,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.delete(g.token),t.cookies.delete(g.user),t}}c.ACCOUNT_TYPE_MAP=B,c.CURRENT_WEBSITE_KEY=P,c.DEFAULT_LOCALE=U,c.DEVICE_ID_KEY=w,c.HttpClient=V,c.USER_FORM_MAP=j,c.USER_SEX_MAP=H,c.USER_TYPE_MAP=A,c.get=D,c.getHttpClientOpts=G,c.getHttpClientOptsByCookie=Y,c.iGet=$,c.iPost=F,c.iPostSuccess=K,c.isArray=O,c.logger=d,c.post=v,c.randomString=S,c.setDefaultRequestHeader=W,c.urlEncode=T,c.urlParamToJson=R,Object.defineProperty(c,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 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 userType: USER_TYPE;\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\n\r\n// 在 Windows 系统上确保中文字符正确显示\r\nif (process.platform === 'win32') {\r\n // 设置 stdout 和 stderr 的编码为 utf8\r\n process.stdout.setEncoding('utf8');\r\n process.stderr.setEncoding('utf8');\r\n}\r\n\r\nexport 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 formatters: {\r\n level: (label) => {\r\n return { level: label };\r\n }\r\n },\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});","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","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 CookieNames,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaderNames,\r\n HttpHeaders,\r\n HttpToken,\r\n IbootCookieStore,\r\n IbootReadonlyCookies,\r\n IbootWritableCookie,\r\n ResultModel,\r\n ServerRequestOptions\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\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\nconst HEADER_NAMES: Record<HttpHeaderNames, HttpHeaderNames> = {\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\nconst COOKIE_NAMES: Record<CookieNames, CookieNames> = {\r\n \"IBOOT_DEVICE_ID\": \"IBOOT_DEVICE_ID\",\r\n \"IBOOT_LOCALE\": \"IBOOT_LOCALE\",\r\n \"IBOOT_WEBSITE_ID\": \"IBOOT_WEBSITE_ID\",\r\n \"IBOOT_WEBSITE_NO\": \"IBOOT_WEBSITE_NO\",\r\n \"token\": \"token\",\r\n \"user\": \"user\"\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 \"method\": \"GET\",\r\n \"url\": url,\r\n \"headers\": headers,\r\n })\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({\r\n \"GET_RESULT\": result,\r\n })\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 \"method\": \"GET\",\r\n \"url\": url,\r\n \"headers\": proxyHeaders,\r\n })\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({\r\n \"POST_RESULT\": result,\r\n })\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 getHttpClientOpts = (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 getHttpClientOptsByCookie = (cookie: IbootReadonlyCookies): HttpClientOpts => {\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookie.get(COOKIE_NAMES.IBOOT_DEVICE_ID)?.value;\r\n const lang = cookie.get(COOKIE_NAMES.IBOOT_LOCALE)?.value;\r\n const websiteId = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_ID)?.value;\r\n const websiteNo = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_NO)?.value;\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 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 private readonly _isDebug: boolean;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType, helloURL }: Readonly<HttpClientOpts>) {\r\n this.baseUrl = process.env.BASE_URL ?? '';\r\n this.helloMethod = helloURL ?? ''\r\n this.apiKey = process.env.API_KEY ?? '';\r\n this.userType = userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.userFrom = process.env.USER_FROM || '1';\r\n this.deviceId = deviceId ?? randomString(10);\r\n this.lang = lang ?? DEFAULT_LOCALE;\r\n this.websiteId = websiteId\r\n this.websiteNo = websiteNo\r\n this._isDebug = process.env.NODE_ENV != 'production';\r\n }\r\n\r\n isDebug() {\r\n return this._isDebug;\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 getDeviceId() {\r\n return this.deviceId;\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 name: \"sort\",\r\n params: paramsStr,\r\n md5: str\r\n }\r\n logger.debug(logInfo)\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);\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: result.data })\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 \"method\": \"GET\",\r\n \"url\": api,\r\n \"headers\": headers\r\n }\r\n logger.info(logInfo);\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({ \"GET_RESULT\": 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 \"method\": \"POST\",\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo);\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({ \"POST_RESULT\": 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 \"method\": \"STREAM\",\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo);\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\r\n getUserInfo(cookies: IbootCookieStore): User | null {\r\n const userjson = cookies.get(COOKIE_NAMES.user)?.value;\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n return null;\r\n }\r\n\r\n getToken(cookies: IbootCookieStore): HttpToken {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n getTokenByCookies = (cookies: IbootReadonlyCookies): HttpToken => {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setToken(data: User & { token: string, extFields: Record<string, any> }, response: { cookies: IbootWritableCookie }) {\r\n const { id, name, username, nickname, sex, headImg, token, lastLoginTime, tokenExpired, 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,\r\n sex: sex,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n tokenExpired: tokenExpired,\r\n deviceId: deviceId,\r\n userType: userType,\r\n status: 0,\r\n accountType: 0,\r\n enabled: false,\r\n userFrom: 1,\r\n needToReview: false,\r\n socketOnline: false,\r\n createTime: \"\",\r\n mustChangePwd: mustChangePwd\r\n };\r\n response.cookies.set(COOKIE_NAMES.token, token, {\r\n httpOnly: true,\r\n secure: !this._isDebug, // 在生产环境中启用Secure\r\n sameSite: 'strict', // 防止 CSRF 攻击\r\n path: '/', // Cookie 的路径\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, JSON.stringify(loginUser));\r\n return response;\r\n }\r\n\r\n cleanToken(response: { cookies: IbootWritableCookie }) {\r\n response.cookies.set(COOKIE_NAMES.token, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.delete(COOKIE_NAMES.token);\r\n response.cookies.delete(COOKIE_NAMES.user)\r\n return response;\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","logger","pino","label","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","HEADER_NAMES","COOKIE_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","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","helloURL","key","CryptoJS","p","o","v","arr_item","item_field","item_field_value","item1","index","f","s","oValue","_apiKey","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","cache","buffer","boundary","urls","e","cookies","userjson","utype","user","id","name","nickname","sex","headImg","lastLoginTime","tokenExpired","mustChangePwd","loginUser"],"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 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 userType: USER_TYPE;\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 koffi from 'koffi';\r\n\r\nif (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\nexport 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});","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","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 CookieNames,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaderNames,\r\n HttpHeaders,\r\n HttpToken,\r\n IbootCookieStore,\r\n IbootReadonlyCookies,\r\n IbootWritableCookie,\r\n ResultModel,\r\n ServerRequestOptions\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\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\nconst HEADER_NAMES: Record<HttpHeaderNames, HttpHeaderNames> = {\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\nconst COOKIE_NAMES: Record<CookieNames, CookieNames> = {\r\n \"IBOOT_DEVICE_ID\": \"IBOOT_DEVICE_ID\",\r\n \"IBOOT_LOCALE\": \"IBOOT_LOCALE\",\r\n \"IBOOT_WEBSITE_ID\": \"IBOOT_WEBSITE_ID\",\r\n \"IBOOT_WEBSITE_NO\": \"IBOOT_WEBSITE_NO\",\r\n \"token\": \"token\",\r\n \"user\": \"user\"\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 getHttpClientOpts = (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 getHttpClientOptsByCookie = (cookie: IbootReadonlyCookies): HttpClientOpts => {\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookie.get(COOKIE_NAMES.IBOOT_DEVICE_ID)?.value;\r\n const lang = cookie.get(COOKIE_NAMES.IBOOT_LOCALE)?.value;\r\n const websiteId = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_ID)?.value;\r\n const websiteNo = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_NO)?.value;\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 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 private readonly _isDebug: boolean;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType, helloURL }: Readonly<HttpClientOpts>) {\r\n this.baseUrl = process.env.BASE_URL ?? '';\r\n this.helloMethod = helloURL ?? ''\r\n this.apiKey = process.env.API_KEY ?? '';\r\n this.userType = userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.userFrom = process.env.USER_FROM || '1';\r\n this.deviceId = deviceId ?? randomString(10);\r\n this.lang = lang ?? DEFAULT_LOCALE;\r\n this.websiteId = websiteId\r\n this.websiteNo = websiteNo\r\n this._isDebug = process.env.NODE_ENV != 'production';\r\n }\r\n\r\n isDebug() {\r\n return this._isDebug;\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 getDeviceId() {\r\n return this.deviceId;\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\r\n getUserInfo(cookies: IbootCookieStore): User | null {\r\n const userjson = cookies.get(COOKIE_NAMES.user)?.value;\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n return null;\r\n }\r\n\r\n getToken(cookies: IbootCookieStore): HttpToken {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n getTokenByCookies = (cookies: IbootReadonlyCookies): HttpToken => {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setToken(data: User & { token: string, extFields: Record<string, any> }, response: { cookies: IbootWritableCookie }) {\r\n const { id, name, username, nickname, sex, headImg, token, lastLoginTime, tokenExpired, 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,\r\n sex: sex,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n tokenExpired: tokenExpired,\r\n deviceId: deviceId,\r\n userType: userType,\r\n status: 0,\r\n accountType: 0,\r\n enabled: false,\r\n userFrom: 1,\r\n needToReview: false,\r\n socketOnline: false,\r\n createTime: \"\",\r\n mustChangePwd: mustChangePwd\r\n };\r\n response.cookies.set(COOKIE_NAMES.token, token, {\r\n httpOnly: true,\r\n secure: !this._isDebug, // 在生产环境中启用Secure\r\n sameSite: 'strict', // 防止 CSRF 攻击\r\n path: '/', // Cookie 的路径\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, JSON.stringify(loginUser));\r\n return response;\r\n }\r\n\r\n cleanToken(response: { cookies: IbootWritableCookie }) {\r\n response.cookies.set(COOKIE_NAMES.token, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.delete(COOKIE_NAMES.token);\r\n response.cookies.delete(COOKIE_NAMES.user)\r\n return response;\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","kernel32","koffi","setConsoleOutputCP","setConsoleCP","e","logger","pino","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","HEADER_NAMES","COOKIE_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","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","helloURL","key","CryptoJS","p","o","v","arr_item","item_field","item_field_value","item1","index","f","s","oValue","_apiKey","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","cache","buffer","boundary","urls","cookies","userjson","utype","user","id","name","nickname","sex","headImg","lastLoginTime","tokenExpired","mustChangePwd","loginUser"],"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.0.9",
4
+ "version": "1.1.0",
5
5
  "description": "iBoot.xin 相关应用的客户端Http封装",
6
6
  "type": "module",
7
7
  "main": "./dist/iboot-http-client.cjs.js",
@@ -40,6 +40,7 @@
40
40
  "devDependencies": {
41
41
  "@types/crypto-js": "^4.2.2",
42
42
  "@types/node": "^25.0.3",
43
+ "koffi": "^2.15.0",
43
44
  "typescript": "~5.9.3",
44
45
  "vite": "^7.2.4",
45
46
  "vite-plugin-dts": "^4.5.4",
@@ -58,5 +59,16 @@
58
59
  "js-md5": "^0.8.3",
59
60
  "pino": "^10.1.0",
60
61
  "pino-pretty": "^13.1.3"
62
+ },
63
+ "peerDependencies": {
64
+ "crypto-js": "^4.2.0",
65
+ "js-md5": "^0.8.3",
66
+ "pino": "^10.1.0",
67
+ "pino-pretty": "^13.1.3"
68
+ },
69
+ "peerDependenciesMeta": {
70
+ "pino-pretty": {
71
+ "optional": true
72
+ }
61
73
  }
62
74
  }