iboot-http-client 1.0.5 → 1.0.6

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 N=require("js-md5"),p=require("crypto-js"),U=require("pino"),D={GENERAL:0,PHONE:1,EMAIL:2},S={TYPE_MGT:0,TYPE_C:1,TYPE_B:2},k={FROM_WEB:1,FROM_PC:2,FROM_WX_MINI_PRO:3,FROM_WX_PLU:4,FROM_WX_E:5,FROM_APP:6,FROM_DEVICE:7},M={unknown:0,male:1,female:2},T=n=>Array.isArray(n)||typeof n=="object"&&Object.prototype.toString.call(n)==="[object Array]",w=n=>{const t=n,e="ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",r=e.length;let s="";for(let o=0;o<t;o++)s+=e.charAt(Math.floor(Math.random()*r));return s},B=(n,t)=>{const e={};return n.split("&").forEach(s=>{const o=s.split("=");o[1]&&(e[o[0]]=o[1])}),e},y=n=>n==null||n==""||n.length==0?"":encodeURIComponent(n).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\'/g,"%27").replace(/\!/g,"%21").replace(/\~/g,"%7E"),v="zh-CN",b="_device_id_key",_="_current_website_key",O="Get request error!",E="Post request error!",m={"Device-Id":"Device-Id",Lang:"Lang","Website-Id":"Website-Id","Website-No":"Website-No"},h={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"},P=()=>{const n=localStorage.getItem(b)??"",t=localStorage.getItem(_),e=t!=null?JSON.parse(t):null,r={};return n.length>0&&(r["Device-Id"]=n),e&&(r.Lang=e.language,e.websiteId&&(r["Website-Id"]=e.websiteId),e.websiteNo&&(r["Website-No"]=e.websiteNo)),r},L=(n,t)=>{localStorage.setItem(b,n),t&&localStorage.setItem(_,JSON.stringify(t))},C=async(n,t)=>{if(t?.data){const o=new URLSearchParams(t.data);n.indexOf("?")!=-1?n+=`&${o}`:n+=`?${o}`}const e=P(),r=t?.heads;if(r)for(const o in r){const c=r[o];c&&(e[o]=c)}const s=await fetch(n,{method:"GET",headers:e,cache:t?.useCache?"force-cache":"default"});return s.ok?await s.json():{code:s.status,success:!1,msg:s.statusText}},I=async(n,t)=>{const e=t?.data??{},r=t?.heads;let s;const o=new Headers(P());if(e instanceof FormData?s=e:(s=JSON.stringify(e),o.set("Content-Type","application/json")),r)for(let l in r){const i=r[l];i&&o.set(l,i)}const c=await fetch(n,{method:"POST",headers:o,body:s});return c.ok?await c.json():{code:c.status,success:!1,msg:c.statusText}},W=async(n,t)=>{const e=await C(n,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??O);return}throw Error(e.msg??O)},$=async(n,t)=>{const e=await I(n,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??E);return}throw Error(e.msg??E)},j=async(n,t)=>{const e=await I(n,t);return e.success?(t?.showSuccess&&t.showSuccess(e.msg??"SUCCESS"),!0):(t?.showError&&t.showError(e.msg??E),!1)},x=n=>{const t=n.headers.get(m["Device-Id"]),e=n.headers.get(m.Lang),r=n.headers.get(m["Website-Id"]),s=n.headers.get(m["Website-No"]),o={};return t&&t.length>0&&(o.deviceId=t),e&&e.length>0&&(o.lang=e),r&&r.length>0&&(o.websiteId=r),s&&s.length>0&&(o.websiteNo=s),o},H=n=>{const t={},e=n.get(h.IBOOT_DEVICE_ID)?.value,r=n.get(h.IBOOT_LOCALE)?.value,s=n.get(h.IBOOT_WEBSITE_ID)?.value,o=n.get(h.IBOOT_WEBSITE_NO)?.value;return e&&e.length>0&&(t.deviceId=e),r&&r.length>0&&(t.lang=r),s&&s.length>0&&(t.websiteId=s),o&&o.length>0&&(t.websiteNo=o),t};class K{baseUrl;helloMethod;apiKey;userType;userFrom;deviceId;version="1";lang;websiteId;websiteNo;_isDebug;logger;constructor({deviceId:t,lang:e,websiteId:r,websiteNo:s,userType:o}){this.baseUrl=process.env.BASE_URL??"",this.helloMethod=process.env.HELLO_URL??"",this.apiKey=process.env.API_KEY??"",this.userType=o??S.TYPE_MGT,this.userFrom=process.env.USER_FROM||"1",this.deviceId=t??w(10),this.lang=e??v,this.websiteId=r,this.websiteNo=s,this._isDebug=process.env.NODE_ENV!="production",this.logger=U({name:"iboot",level:this._isDebug?"debug":"info",nestedKey:"payload"})}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 r in t){let s=t[r];if(s&&typeof s=="string")s=s.trim();else if(s&&typeof s=="object"){if(T(s)){if(s.length===0)continue;for(let o=0;o<s.length;o++){const c=s[o];for(const l in c){const i=c[l]??void 0;if(i){if(typeof i=="object")T(i)&&i.forEach((a,d)=>{if(a)for(const g in a){const u=a[g];if(u&&u.toString().length>0){const f=`[${o.toString()}].${l+`[${d.toString()}].${g}`}=${y(u)}`;e.push(r+f)}}});else if(i.toString().length>0){const a=`[${o.toString()}].${l}=${y(i.toString())}`;e.push(r+a)}}}}}else for(const o in s){const c=s[o];if(c!=null&&c!=""&&c.length!=0){const l=`.${o}=${y(c)}`;e.push(r+l)}}continue}else s&&typeof s=="function"&&(s=null);s!=null&&s!=""&&s.length!=0&&e.push(r+"="+y(s))}return e&&e.join("&")}async sign(t){const e="&key="+await this.helloIboot(),r=[];for(const i in t)r.push(i);r.sort((i,a)=>i.toLowerCase().localeCompare(a.toLowerCase()));const s=[];r.forEach(i=>{let a=t[i];typeof a=="object"&&(a=JSON.stringify(a)),s.push(i+"="+a)});const o=s.join("&"),c=N.md5((o+e).toLocaleUpperCase()),l={params:o,md5:c};return this.logger.debug(l),c}assemblyParameter(t,e){const r=t??{};return r.timestamp=Date.now()+"",r.echostr=w(10),r.version=this.version,r.deviceId=this.deviceId,r.webid=this.websiteId,r.apiKey=this.apiKey,e&&e.length>0&&(r.username=e),r}async assemblyHeader({urlParams:t,token:e}){const r={"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&&(r.Lang=this.lang),this.websiteId&&this.websiteId.length>0&&(r["Web-Id"]=this.websiteId),this.websiteNo&&this.websiteNo.length>0&&(r["Web-No"]=this.websiteNo),e&&(e.token&&e.token.length>0&&e.username&&e.username.length>0&&(r.Authorization=e.token,r.Username=e.username),e.xcsrf&&(r[e.xcsrf.csrfHeader]=e.xcsrf.csrfToken));const s=B(t),o=await this.sign(s);return r.Sign=o,r}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},r={url:t,headers:e};this.logger.debug(r);const s=await fetch(t,{method:"GET",headers:e,credentials:"include",cache:"force-cache"});if(s.ok){const o=await s.json();return this.logger.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:r}){const s=this.assemblyParameter(e),o=this.convertUrlParameter(s),c=await this.assemblyHeader({urlParams:o,token:r}),l=`${this.getApiUrl(t)}?${o.toString()}`,i={method:"GET",url:l,headers:c};this.logger.info(i);try{const a=await fetch(l,{method:"GET",headers:c,credentials:"include",cache:"force-cache"});if(a.ok){const d=await a.json();return this.logger.debug({result:d.data}),d}return{code:a.status,success:!1,msg:a.statusText}}catch(a){return{code:500,success:!1,msg:a?.toString()??"Server exception!"}}}async post({url:t,data:e,token:r}){e=e?{...e}:{};const s=e.buffer??void 0,o=e.boundary??void 0;s&&delete e.buffer,o&&delete e.boundary;const c=this.assemblyParameter(e),l=this.convertUrlParameter(c),i=await this.assemblyHeader({urlParams:l,token:r});s&&o&&(i["Content-Type"]=`multipart/form-data; boundary=${o}`);const a=this.getApiUrl(t),d={method:"POST",url:a,headers:i};this.logger.info(d);try{const g=s?`${a}?${l}`:a,u=await fetch(g,{method:"POST",headers:i,body:s||l.toString(),credentials:"include"});if(u.ok){const f=await u.json();return this.logger.debug({result:f.data}),f}return{code:u.status,success:!1,msg:u.statusText}}catch(g){return{code:500,success:!1,msg:g?.toString()??"Server exception!"}}}async stream({url:t,data:e,token:r}){e=e?{...e}:{};const s=e.buffer??void 0,o=e.boundary??void 0;s&&delete e.buffer,o&&delete e.boundary;const c=this.assemblyParameter(e),l=this.convertUrlParameter(c),i=await this.assemblyHeader({urlParams:l,token:r});s&&o&&(i["Content-Type"]=`multipart/form-data; boundary=${o}`),i.Connection="keep-alive",i["X-Accel-Buffering"]="no",i["Cache-Control"]="no-cache";const a=this.getApiUrl(t);try{const d=s?`${a}?${l}`:a,g={method:"POST",url:a,headers:i};this.logger.info(g);const u=await fetch(d,{method:"POST",headers:i,body:s||l.toString(),credentials:"include"});if(!u.ok)throw new Error(`HTTP error! status: ${u.status}`);if(!u.body)throw new Error("No response body");return new Response(u.body,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}catch(d){throw d}}getUserInfo(t){const e=t.get(h.user)?.value;return e&&e.length>0?JSON.parse(e):null}getToken(t){const e=t.get("user")?.value;let r="",s=this.userType;if(e&&e.length>0){const o=JSON.parse(e);r=o.username,s=o.userType.toString()}return{username:r,utype:s,token:t.get(h.token)?.value??""}}getTokenByCookies=t=>{const e=t.get("user")?.value;let r="",s=this.userType;if(e&&e.length>0){const o=JSON.parse(e);r=o.username,s=o.userType.toString()}return{username:r,utype:s,token:t.get(h.token)?.value??""}};setToken(t,e){const{id:r,name:s,username:o,nickname:c,sex:l,headImg:i,token:a,lastLoginTime:d,tokenExpired:g,deviceId:u,userType:f,mustChangePwd:A}=t,R={id:r,name:s,username:o,nickname:c,sex:l,headImg:i,lastLoginTime:d,tokenExpired:g,deviceId:u,userType:f,status:0,accountType:0,enabled:!1,userFrom:1,needToReview:!1,socketOnline:!1,createTime:"",mustChangePwd:A};return e.cookies.set(h.token,a,{httpOnly:!0,secure:!this._isDebug,sameSite:"strict",path:"/"}),e.cookies.set(h.user,JSON.stringify(R)),e}cleanToken(t){return t.cookies.set(h.token,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.set(h.user,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.delete(h.token),t.cookies.delete(h.user),t}}exports.ACCOUNT_TYPE_MAP=D;exports.CURRENT_WEBSITE_KEY=_;exports.DEFAULT_LOCALE=v;exports.DEVICE_ID_KEY=b;exports.HttpClient=K;exports.USER_FORM_MAP=k;exports.USER_SEX_MAP=M;exports.USER_TYPE_MAP=S;exports.get=C;exports.getHttpClientOpts=x;exports.getHttpClientOptsByCookie=H;exports.iGet=W;exports.iPost=$;exports.iPostSuccess=j;exports.post=I;exports.setDefaultRequestHeader=L;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const N=require("js-md5"),p=require("crypto-js"),U=require("pino"),D={GENERAL:0,PHONE:1,EMAIL:2},O={TYPE_MGT:0,TYPE_C:1,TYPE_B:2},k={FROM_WEB:1,FROM_PC:2,FROM_WX_MINI_PRO:3,FROM_WX_PLU:4,FROM_WX_E:5,FROM_APP:6,FROM_DEVICE:7},M={unknown:0,male:1,female:2},T=n=>Array.isArray(n)||typeof n=="object"&&Object.prototype.toString.call(n)==="[object Array]",S=n=>{const t=n,e="ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",r=e.length;let s="";for(let o=0;o<t;o++)s+=e.charAt(Math.floor(Math.random()*r));return s},B=(n,t)=>{const e={};return n.split("&").forEach(s=>{const o=s.split("=");o[1]&&(e[o[0]]=o[1])}),e},m=n=>n==null||n==""||n.length==0?"":encodeURIComponent(n).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\'/g,"%27").replace(/\!/g,"%21").replace(/\~/g,"%7E"),v="zh-CN",_="_device_id_key",b="_current_website_key",w="Get request error!",E="Post request error!",y={"Device-Id":"Device-Id",Lang:"Lang","Website-Id":"Website-Id","Website-No":"Website-No"},h={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"},P=()=>{const n=localStorage.getItem(_)??"",t=localStorage.getItem(b),e=t!=null?JSON.parse(t):null,r={};return n.length>0&&(r["Device-Id"]=n),e&&(r.Lang=e.language,e.websiteId&&(r["Website-Id"]=e.websiteId),e.websiteNo&&(r["Website-No"]=e.websiteNo)),r},L=(n,t)=>{localStorage.setItem(_,n),t&&localStorage.setItem(b,JSON.stringify(t))},C=async(n,t)=>{if(t?.data){const o=new URLSearchParams(t.data);n.indexOf("?")!=-1?n+=`&${o}`:n+=`?${o}`}const e=P(),r=t?.heads;if(r)for(const o in r){const a=r[o];a&&(e[o]=a)}const s=await fetch(n,{method:"GET",headers:e,cache:t?.useCache?"force-cache":"default"});return s.ok?await s.json():{code:s.status,success:!1,msg:s.statusText}},I=async(n,t)=>{const e=t?.data??{},r=t?.heads;let s;const o=new Headers(P());if(e instanceof FormData?s=e:(s=JSON.stringify(e),o.set("Content-Type","application/json")),r)for(let l in r){const i=r[l];i&&o.set(l,i)}const a=await fetch(n,{method:"POST",headers:o,body:s});return a.ok?await a.json():{code:a.status,success:!1,msg:a.statusText}},W=async(n,t)=>{const e=await C(n,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??w);return}throw Error(e.msg??w)},$=async(n,t)=>{const e=await I(n,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??E);return}throw Error(e.msg??E)},j=async(n,t)=>{const e=await I(n,t);return e.success?(t?.showSuccess&&t.showSuccess(e.msg??"SUCCESS"),!0):(t?.showError&&t.showError(e.msg??E),!1)},x=n=>{const t=n.headers.get(y["Device-Id"]),e=n.headers.get(y.Lang),r=n.headers.get(y["Website-Id"]),s=n.headers.get(y["Website-No"]),o={};return t&&t.length>0&&(o.deviceId=t),e&&e.length>0&&(o.lang=e),r&&r.length>0&&(o.websiteId=r),s&&s.length>0&&(o.websiteNo=s),o},K=n=>{const t={},e=n.get(h.IBOOT_DEVICE_ID)?.value,r=n.get(h.IBOOT_LOCALE)?.value,s=n.get(h.IBOOT_WEBSITE_ID)?.value,o=n.get(h.IBOOT_WEBSITE_NO)?.value;return e&&e.length>0&&(t.deviceId=e),r&&r.length>0&&(t.lang=r),s&&s.length>0&&(t.websiteId=s),o&&o.length>0&&(t.websiteNo=o),t};class H{baseUrl;helloMethod;apiKey;userType;userFrom;deviceId;version="1";lang;websiteId;websiteNo;_isDebug;logger;constructor({deviceId:t,lang:e,websiteId:r,websiteNo:s,userType:o,helloURL:a,appName:l}){this.baseUrl=process.env.BASE_URL??"",this.helloMethod=a??"",this.apiKey=process.env.API_KEY??"",this.userType=o??O.TYPE_MGT,this.userFrom=process.env.USER_FROM||"1",this.deviceId=t??S(10),this.lang=e??v,this.websiteId=r,this.websiteNo=s,this._isDebug=process.env.NODE_ENV!="production",this.logger=U({name:l,level:this._isDebug?"debug":"info",nestedKey:"payload",messageKey:"msg",formatters:{level:i=>({level:i})}})}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 r in t){let s=t[r];if(s&&typeof s=="string")s=s.trim();else if(s&&typeof s=="object"){if(T(s)){if(s.length===0)continue;for(let o=0;o<s.length;o++){const a=s[o];for(const l in a){const i=a[l]??void 0;if(i){if(typeof i=="object")T(i)&&i.forEach((c,g)=>{if(c)for(const d in c){const u=c[d];if(u&&u.toString().length>0){const f=`[${o.toString()}].${l+`[${g.toString()}].${d}`}=${m(u)}`;e.push(r+f)}}});else if(i.toString().length>0){const c=`[${o.toString()}].${l}=${m(i.toString())}`;e.push(r+c)}}}}}else for(const o in s){const a=s[o];if(a!=null&&a!=""&&a.length!=0){const l=`.${o}=${m(a)}`;e.push(r+l)}}continue}else s&&typeof s=="function"&&(s=null);s!=null&&s!=""&&s.length!=0&&e.push(r+"="+m(s))}return e&&e.join("&")}async sign(t){const e="&key="+await this.helloIboot(),r=[];for(const i in t)r.push(i);r.sort((i,c)=>i.toLowerCase().localeCompare(c.toLowerCase()));const s=[];r.forEach(i=>{let c=t[i];typeof c=="object"&&(c=JSON.stringify(c)),s.push(i+"="+c)});const o=s.join("&"),a=N.md5((o+e).toLocaleUpperCase()),l={name:"sort",params:o,md5:a};return this.logger.debug(l),a}assemblyParameter(t,e){const r=t??{};return r.timestamp=Date.now()+"",r.echostr=S(10),r.version=this.version,r.deviceId=this.deviceId,r.webid=this.websiteId,r.apiKey=this.apiKey,e&&e.length>0&&(r.username=e),r}async assemblyHeader({urlParams:t,token:e}){const r={"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&&(r.Lang=this.lang),this.websiteId&&this.websiteId.length>0&&(r["Web-Id"]=this.websiteId),this.websiteNo&&this.websiteNo.length>0&&(r["Web-No"]=this.websiteNo),e&&(e.token&&e.token.length>0&&e.username&&e.username.length>0&&(r.Authorization=e.token,r.Username=e.username),e.xcsrf&&(r[e.xcsrf.csrfHeader]=e.xcsrf.csrfToken));const s=B(t),o=await this.sign(s);return r.Sign=o,r}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},r={url:t,headers:e};this.logger.debug(r);const s=await fetch(t,{method:"GET",headers:e,credentials:"include",cache:"force-cache"});if(s.ok){const o=await s.json();return this.logger.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:r}){const s=this.assemblyParameter(e),o=this.convertUrlParameter(s),a=await this.assemblyHeader({urlParams:o,token:r}),l=`${this.getApiUrl(t)}?${o.toString()}`,i={method:"GET",url:l,headers:a};this.logger.info(i);try{const c=await fetch(l,{method:"GET",headers:a,credentials:"include",cache:"force-cache"});if(c.ok){const g=await c.json();return this.logger.debug({GET_RESULT:g}),g}return{code:c.status,success:!1,msg:c.statusText}}catch(c){return{code:500,success:!1,msg:c?.toString()??"Server exception!"}}}async post({url:t,data:e,token:r}){e=e?{...e}:{};const s=e.buffer??void 0,o=e.boundary??void 0;s&&delete e.buffer,o&&delete e.boundary;const a=this.assemblyParameter(e),l=this.convertUrlParameter(a),i=await this.assemblyHeader({urlParams:l,token:r});s&&o&&(i["Content-Type"]=`multipart/form-data; boundary=${o}`);const c=this.getApiUrl(t),g={method:"POST",url:c,headers:i,params:a};this.logger.info(g);try{const d=s?`${c}?${l}`:c,u=await fetch(d,{method:"POST",headers:i,body:s||l.toString(),credentials:"include"});if(u.ok){const f=await u.json();return this.logger.debug({POST_RESULT:f}),f}return{code:u.status,success:!1,msg:u.statusText}}catch(d){return{code:500,success:!1,msg:d?.toString()??"Server exception!"}}}async stream({url:t,data:e,token:r}){e=e?{...e}:{};const s=e.buffer??void 0,o=e.boundary??void 0;s&&delete e.buffer,o&&delete e.boundary;const a=this.assemblyParameter(e),l=this.convertUrlParameter(a),i=await this.assemblyHeader({urlParams:l,token:r});s&&o&&(i["Content-Type"]=`multipart/form-data; boundary=${o}`),i.Connection="keep-alive",i["X-Accel-Buffering"]="no",i["Cache-Control"]="no-cache";const c=this.getApiUrl(t);try{const g=s?`${c}?${l}`:c,d={method:"STREAM",url:c,headers:i,params:a};this.logger.info(d);const u=await fetch(g,{method:"POST",headers:i,body:s||l.toString(),credentials:"include"});if(!u.ok)throw new Error(`HTTP error! status: ${u.status}`);if(!u.body)throw new Error("No response body");return new Response(u.body,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}catch(g){throw g}}getUserInfo(t){const e=t.get(h.user)?.value;return e&&e.length>0?JSON.parse(e):null}getToken(t){const e=t.get("user")?.value;let r="",s=this.userType;if(e&&e.length>0){const o=JSON.parse(e);r=o.username,s=o.userType.toString()}return{username:r,utype:s,token:t.get(h.token)?.value??""}}getTokenByCookies=t=>{const e=t.get("user")?.value;let r="",s=this.userType;if(e&&e.length>0){const o=JSON.parse(e);r=o.username,s=o.userType.toString()}return{username:r,utype:s,token:t.get(h.token)?.value??""}};setToken(t,e){const{id:r,name:s,username:o,nickname:a,sex:l,headImg:i,token:c,lastLoginTime:g,tokenExpired:d,deviceId:u,userType:f,mustChangePwd:A}=t,R={id:r,name:s,username:o,nickname:a,sex:l,headImg:i,lastLoginTime:g,tokenExpired:d,deviceId:u,userType:f,status:0,accountType:0,enabled:!1,userFrom:1,needToReview:!1,socketOnline:!1,createTime:"",mustChangePwd:A};return e.cookies.set(h.token,c,{httpOnly:!0,secure:!this._isDebug,sameSite:"strict",path:"/"}),e.cookies.set(h.user,JSON.stringify(R)),e}cleanToken(t){return t.cookies.set(h.token,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.set(h.user,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.delete(h.token),t.cookies.delete(h.user),t}}exports.ACCOUNT_TYPE_MAP=D;exports.CURRENT_WEBSITE_KEY=b;exports.DEFAULT_LOCALE=v;exports.DEVICE_ID_KEY=_;exports.HttpClient=H;exports.USER_FORM_MAP=k;exports.USER_SEX_MAP=M;exports.USER_TYPE_MAP=O;exports.get=C;exports.getHttpClientOpts=x;exports.getHttpClientOptsByCookie=K;exports.iGet=W;exports.iPost=$;exports.iPostSuccess=j;exports.post=I;exports.setDefaultRequestHeader=L;
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/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}","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 == null || 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 pino from \"pino\";\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} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\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\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?.heads;\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\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 return await response.json();\r\n }\r\n return {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\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?.heads;\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 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 return await response.json();\r\n }\r\n return {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\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 private readonly logger: pino.Logger;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType }: Readonly<HttpClientOpts>) {\r\n this.baseUrl = process.env.BASE_URL ?? '';\r\n this.helloMethod = process.env.HELLO_URL ?? ''\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 this.logger = pino({\r\n name: 'iboot',\r\n level: this._isDebug ? 'debug' : 'info',\r\n nestedKey: 'payload'\r\n })\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 this.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 this.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 this.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 }: Readonly<{ url: string, data?: Record<string, any>, token?: Readonly<HttpToken> }>): 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 this.logger.info(logInfo);\r\n try {\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: headers,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n\r\n if (res.ok) {\r\n const result = await res.json();\r\n this.logger.debug({ result: result.data })\r\n return result;\r\n }\r\n return {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n } catch (e) {\r\n return {\r\n code: 500,\r\n success: false,\r\n msg: e?.toString() ?? 'Server exception!'\r\n }\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token }: Readonly<{ url: string, data?: Record<string, any>, token?: Readonly<HttpToken> }>): 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 }\r\n this.logger.info(logInfo);\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\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 if (res.ok) {\r\n const result = await res.json();\r\n this.logger.debug({ result: result.data })\r\n return result;\r\n }\r\n return {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n } catch (e) {\r\n return {\r\n code: 500,\r\n success: false,\r\n msg: e?.toString() ?? 'Server exception!'\r\n }\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<{ url: string, data?: Record<string, any>, token?: Readonly<HttpToken> }>): 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\": \"POST\",\r\n \"url\": api,\r\n \"headers\": headers,\r\n\r\n }\r\n this.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","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","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","pino","key","CryptoJS","p","o","v","arr_item","item_field","item_field_value","item1","index","f","s","oValue","_apiKey","a","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","e","buffer","boundary","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/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}","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 == null || 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 pino from \"pino\";\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} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\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?.heads;\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\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 return await response.json();\r\n }\r\n return {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\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?.heads;\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 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 return await response.json();\r\n }\r\n return {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\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 private readonly logger: pino.Logger;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType, helloURL, appName }: 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 this.logger = pino({\r\n name: appName,\r\n level: this._isDebug ? 'debug' : 'info',\r\n nestedKey: 'payload',\r\n messageKey: 'msg', //明确指定消息键,可解决乱码问题\r\n formatters: {\r\n level: (label) => {\r\n return { level: label };\r\n }\r\n }\r\n })\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 this.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 this.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 this.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 }: Readonly<{ url: string, data?: Record<string, any>, token?: Readonly<HttpToken> }>): 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 this.logger.info(logInfo);\r\n try {\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: headers,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n\r\n if (res.ok) {\r\n const result = await res.json();\r\n this.logger.debug({ \"GET_RESULT\": result })\r\n return result;\r\n }\r\n return {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n } catch (e) {\r\n return {\r\n code: 500,\r\n success: false,\r\n msg: e?.toString() ?? 'Server exception!'\r\n }\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token }: Readonly<{ url: string, data?: Record<string, any>, token?: Readonly<HttpToken> }>): 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 this.logger.info(logInfo);\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\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 if (res.ok) {\r\n const result = await res.json();\r\n this.logger.debug({ \"POST_RESULT\": result })\r\n return result;\r\n }\r\n return {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n } catch (e) {\r\n return {\r\n code: 500,\r\n success: false,\r\n msg: e?.toString() ?? 'Server exception!'\r\n }\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<{ url: string, data?: Record<string, any>, token?: Readonly<HttpToken> }>): 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 }\r\n this.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","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","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","helloURL","appName","pino","label","key","CryptoJS","p","o","v","arr_item","item_field","item_field_value","item1","index","f","s","oValue","_apiKey","a","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","e","buffer","boundary","cookies","userjson","utype","user","id","name","nickname","sex","headImg","lastLoginTime","tokenExpired","mustChangePwd","loginUser"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import C from "js-md5";
2
- import p from "crypto-js";
2
+ import m from "crypto-js";
3
3
  import N from "pino";
4
- const M = {
4
+ const L = {
5
5
  GENERAL: 0,
6
6
  PHONE: 1,
7
7
  EMAIL: 2
@@ -21,7 +21,7 @@ const M = {
21
21
  unknown: 0,
22
22
  male: 1,
23
23
  female: 2
24
- }, E = (n) => Array.isArray(n) || typeof n == "object" && Object.prototype.toString.call(n) === "[object Array]", I = (n) => {
24
+ }, b = (n) => Array.isArray(n) || typeof n == "object" && Object.prototype.toString.call(n) === "[object Array]", I = (n) => {
25
25
  const t = n, e = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678", r = e.length;
26
26
  let s = "";
27
27
  for (let o = 0; o < t; o++)
@@ -33,7 +33,7 @@ const M = {
33
33
  const o = s.split("=");
34
34
  o[1] && (e[o[0]] = o[1]);
35
35
  }), e;
36
- }, m = (n) => n == null || n == "" || n.length == 0 ? "" : encodeURIComponent(n).replace(/\(/g, "%28").replace(/\)/g, "%29").replace(/\'/g, "%27").replace(/\!/g, "%21").replace(/\~/g, "%7E"), U = "zh-CN", T = "_device_id_key", _ = "_current_website_key", w = "Get request error!", b = "Post request error!", y = {
36
+ }, p = (n) => n == null || n == "" || n.length == 0 ? "" : encodeURIComponent(n).replace(/\(/g, "%28").replace(/\)/g, "%29").replace(/\'/g, "%27").replace(/\!/g, "%21").replace(/\~/g, "%7E"), U = "zh-CN", w = "_device_id_key", _ = "_current_website_key", T = "Get request error!", E = "Post request error!", y = {
37
37
  "Device-Id": "Device-Id",
38
38
  Lang: "Lang",
39
39
  "Website-Id": "Website-Id",
@@ -45,21 +45,21 @@ const M = {
45
45
  IBOOT_WEBSITE_NO: "IBOOT_WEBSITE_NO",
46
46
  token: "token",
47
47
  user: "user"
48
- }, O = () => {
49
- const n = localStorage.getItem(T) ?? "", t = localStorage.getItem(_), e = t != null ? JSON.parse(t) : null, r = {};
48
+ }, S = () => {
49
+ const n = localStorage.getItem(w) ?? "", t = localStorage.getItem(_), e = t != null ? JSON.parse(t) : null, r = {};
50
50
  return n.length > 0 && (r["Device-Id"] = n), e && (r.Lang = e.language, e.websiteId && (r["Website-Id"] = e.websiteId), e.websiteNo && (r["Website-No"] = e.websiteNo)), r;
51
51
  }, x = (n, t) => {
52
- localStorage.setItem(T, n), t && localStorage.setItem(_, JSON.stringify(t));
52
+ localStorage.setItem(w, n), t && localStorage.setItem(_, JSON.stringify(t));
53
53
  }, k = async (n, t) => {
54
54
  if (t?.data) {
55
55
  const o = new URLSearchParams(t.data);
56
56
  n.indexOf("?") != -1 ? n += `&${o}` : n += `?${o}`;
57
57
  }
58
- const e = O(), r = t?.heads;
58
+ const e = S(), r = t?.heads;
59
59
  if (r)
60
60
  for (const o in r) {
61
- const c = r[o];
62
- c && (e[o] = c);
61
+ const a = r[o];
62
+ a && (e[o] = a);
63
63
  }
64
64
  const s = await fetch(n, {
65
65
  method: "GET",
@@ -71,46 +71,46 @@ const M = {
71
71
  success: !1,
72
72
  msg: s.statusText
73
73
  };
74
- }, S = async (n, t) => {
74
+ }, O = async (n, t) => {
75
75
  const e = t?.data ?? {}, r = t?.heads;
76
76
  let s;
77
- const o = new Headers(O());
77
+ const o = new Headers(S());
78
78
  if (e instanceof FormData ? s = e : (s = JSON.stringify(e), o.set("Content-Type", "application/json")), r)
79
79
  for (let l in r) {
80
80
  const i = r[l];
81
81
  i && o.set(l, i);
82
82
  }
83
- const c = await fetch(n, {
83
+ const a = await fetch(n, {
84
84
  method: "POST",
85
85
  headers: o,
86
86
  body: s
87
87
  });
88
- return c.ok ? await c.json() : {
89
- code: c.status,
88
+ return a.ok ? await a.json() : {
89
+ code: a.status,
90
90
  success: !1,
91
- msg: c.statusText
91
+ msg: a.statusText
92
92
  };
93
93
  }, j = async (n, t) => {
94
94
  const e = await k(n, t);
95
95
  if (e.success)
96
96
  return e.data;
97
97
  if (t?.showError) {
98
- t.showError(e.msg ?? w);
98
+ t.showError(e.msg ?? T);
99
99
  return;
100
100
  }
101
- throw Error(e.msg ?? w);
101
+ throw Error(e.msg ?? T);
102
102
  }, K = async (n, t) => {
103
- const e = await S(n, t);
103
+ const e = await O(n, t);
104
104
  if (e.success)
105
105
  return e.data;
106
106
  if (t?.showError) {
107
- t.showError(e.msg ?? b);
107
+ t.showError(e.msg ?? E);
108
108
  return;
109
109
  }
110
- throw Error(e.msg ?? b);
110
+ throw Error(e.msg ?? E);
111
111
  }, F = async (n, t) => {
112
- const e = await S(n, t);
113
- return e.success ? (t?.showSuccess && t.showSuccess(e.msg ?? "SUCCESS"), !0) : (t?.showError && t.showError(e.msg ?? b), !1);
112
+ const e = await O(n, t);
113
+ return e.success ? (t?.showSuccess && t.showSuccess(e.msg ?? "SUCCESS"), !0) : (t?.showError && t.showError(e.msg ?? E), !1);
114
114
  }, H = (n) => {
115
115
  const t = n.headers.get(y["Device-Id"]), e = n.headers.get(y.Lang), r = n.headers.get(y["Website-Id"]), s = n.headers.get(y["Website-No"]), o = {};
116
116
  return t && t.length > 0 && (o.deviceId = t), e && e.length > 0 && (o.lang = e), r && r.length > 0 && (o.websiteId = r), s && s.length > 0 && (o.websiteNo = s), o;
@@ -131,25 +131,30 @@ class J {
131
131
  websiteNo;
132
132
  _isDebug;
133
133
  logger;
134
- constructor({ deviceId: t, lang: e, websiteId: r, websiteNo: s, userType: o }) {
135
- this.baseUrl = process.env.BASE_URL ?? "", this.helloMethod = process.env.HELLO_URL ?? "", this.apiKey = process.env.API_KEY ?? "", this.userType = o ?? A.TYPE_MGT, this.userFrom = process.env.USER_FROM || "1", this.deviceId = t ?? I(10), this.lang = e ?? U, this.websiteId = r, this.websiteNo = s, this._isDebug = process.env.NODE_ENV != "production", this.logger = N({
136
- name: "iboot",
134
+ constructor({ deviceId: t, lang: e, websiteId: r, websiteNo: s, userType: o, helloURL: a, appName: l }) {
135
+ this.baseUrl = process.env.BASE_URL ?? "", this.helloMethod = a ?? "", this.apiKey = process.env.API_KEY ?? "", this.userType = o ?? A.TYPE_MGT, this.userFrom = process.env.USER_FROM || "1", this.deviceId = t ?? I(10), this.lang = e ?? U, this.websiteId = r, this.websiteNo = s, this._isDebug = process.env.NODE_ENV != "production", this.logger = N({
136
+ name: l,
137
137
  level: this._isDebug ? "debug" : "info",
138
- nestedKey: "payload"
138
+ nestedKey: "payload",
139
+ messageKey: "msg",
140
+ //明确指定消息键,可解决乱码问题
141
+ formatters: {
142
+ level: (i) => ({ level: i })
143
+ }
139
144
  });
140
145
  }
141
146
  isDebug() {
142
147
  return this._isDebug;
143
148
  }
144
149
  encrypt(t) {
145
- const e = p.enc.Utf8.parse(this.apiKey);
146
- return p.AES.encrypt(t, e).toString();
150
+ const e = m.enc.Utf8.parse(this.apiKey);
151
+ return m.AES.encrypt(t, e).toString();
147
152
  }
148
153
  decrypt(t) {
149
- const e = p.enc.Utf8.parse(this.apiKey);
150
- return p.AES.decrypt(t, e, {
151
- mode: p.mode.ECB
152
- }).toString(p.enc.Utf8);
154
+ const e = m.enc.Utf8.parse(this.apiKey);
155
+ return m.AES.decrypt(t, e, {
156
+ mode: m.mode.ECB
157
+ }).toString(m.enc.Utf8);
153
158
  }
154
159
  getDeviceId() {
155
160
  return this.deviceId;
@@ -162,43 +167,43 @@ class J {
162
167
  if (s && typeof s == "string")
163
168
  s = s.trim();
164
169
  else if (s && typeof s == "object") {
165
- if (E(s)) {
170
+ if (b(s)) {
166
171
  if (s.length === 0)
167
172
  continue;
168
173
  for (let o = 0; o < s.length; o++) {
169
- const c = s[o];
170
- for (const l in c) {
171
- const i = c[l] ?? void 0;
174
+ const a = s[o];
175
+ for (const l in a) {
176
+ const i = a[l] ?? void 0;
172
177
  if (i) {
173
178
  if (typeof i == "object")
174
- E(i) && i.forEach((a, d) => {
175
- if (a)
176
- for (const g in a) {
177
- const u = a[g];
179
+ b(i) && i.forEach((c, g) => {
180
+ if (c)
181
+ for (const d in c) {
182
+ const u = c[d];
178
183
  if (u && u.toString().length > 0) {
179
- const f = `[${o.toString()}].${l + `[${d.toString()}].${g}`}=${m(u)}`;
184
+ const f = `[${o.toString()}].${l + `[${g.toString()}].${d}`}=${p(u)}`;
180
185
  e.push(r + f);
181
186
  }
182
187
  }
183
188
  });
184
189
  else if (i.toString().length > 0) {
185
- const a = `[${o.toString()}].${l}=${m(i.toString())}`;
186
- e.push(r + a);
190
+ const c = `[${o.toString()}].${l}=${p(i.toString())}`;
191
+ e.push(r + c);
187
192
  }
188
193
  }
189
194
  }
190
195
  }
191
196
  } else
192
197
  for (const o in s) {
193
- const c = s[o];
194
- if (c != null && c != "" && c.length != 0) {
195
- const l = `.${o}=${m(c)}`;
198
+ const a = s[o];
199
+ if (a != null && a != "" && a.length != 0) {
200
+ const l = `.${o}=${p(a)}`;
196
201
  e.push(r + l);
197
202
  }
198
203
  }
199
204
  continue;
200
205
  } else s && typeof s == "function" && (s = null);
201
- s != null && s != "" && s.length != 0 && e.push(r + "=" + m(s));
206
+ s != null && s != "" && s.length != 0 && e.push(r + "=" + p(s));
202
207
  }
203
208
  return e && e.join("&");
204
209
  }
@@ -206,17 +211,18 @@ class J {
206
211
  const e = "&key=" + await this.helloIboot(), r = [];
207
212
  for (const i in t)
208
213
  r.push(i);
209
- r.sort((i, a) => i.toLowerCase().localeCompare(a.toLowerCase()));
214
+ r.sort((i, c) => i.toLowerCase().localeCompare(c.toLowerCase()));
210
215
  const s = [];
211
216
  r.forEach((i) => {
212
- let a = t[i];
213
- typeof a == "object" && (a = JSON.stringify(a)), s.push(i + "=" + a);
217
+ let c = t[i];
218
+ typeof c == "object" && (c = JSON.stringify(c)), s.push(i + "=" + c);
214
219
  });
215
- const o = s.join("&"), c = C.md5((o + e).toLocaleUpperCase()), l = {
220
+ const o = s.join("&"), a = C.md5((o + e).toLocaleUpperCase()), l = {
221
+ name: "sort",
216
222
  params: o,
217
- md5: c
223
+ md5: a
218
224
  };
219
- return this.logger.debug(l), c;
225
+ return this.logger.debug(l), a;
220
226
  }
221
227
  //eslint-disable-next-line @typescript-eslint/no-explicit-any
222
228
  assemblyParameter(t, e) {
@@ -275,33 +281,33 @@ class J {
275
281
  }
276
282
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
277
283
  async get({ url: t, data: e, token: r }) {
278
- const s = this.assemblyParameter(e), o = this.convertUrlParameter(s), c = await this.assemblyHeader({ urlParams: o, token: r }), l = `${this.getApiUrl(t)}?${o.toString()}`, i = {
284
+ const s = this.assemblyParameter(e), o = this.convertUrlParameter(s), a = await this.assemblyHeader({ urlParams: o, token: r }), l = `${this.getApiUrl(t)}?${o.toString()}`, i = {
279
285
  method: "GET",
280
286
  url: l,
281
- headers: c
287
+ headers: a
282
288
  };
283
289
  this.logger.info(i);
284
290
  try {
285
- const a = await fetch(l, {
291
+ const c = await fetch(l, {
286
292
  method: "GET",
287
- headers: c,
293
+ headers: a,
288
294
  credentials: "include",
289
295
  cache: "force-cache"
290
296
  });
291
- if (a.ok) {
292
- const d = await a.json();
293
- return this.logger.debug({ result: d.data }), d;
297
+ if (c.ok) {
298
+ const g = await c.json();
299
+ return this.logger.debug({ GET_RESULT: g }), g;
294
300
  }
295
301
  return {
296
- code: a.status,
302
+ code: c.status,
297
303
  success: !1,
298
- msg: a.statusText
304
+ msg: c.statusText
299
305
  };
300
- } catch (a) {
306
+ } catch (c) {
301
307
  return {
302
308
  code: 500,
303
309
  success: !1,
304
- msg: a?.toString() ?? "Server exception!"
310
+ msg: c?.toString() ?? "Server exception!"
305
311
  };
306
312
  }
307
313
  }
@@ -310,16 +316,17 @@ class J {
310
316
  e = e ? { ...e } : {};
311
317
  const s = e.buffer ?? void 0, o = e.boundary ?? void 0;
312
318
  s && delete e.buffer, o && delete e.boundary;
313
- const c = this.assemblyParameter(e), l = this.convertUrlParameter(c), i = await this.assemblyHeader({ urlParams: l, token: r });
319
+ const a = this.assemblyParameter(e), l = this.convertUrlParameter(a), i = await this.assemblyHeader({ urlParams: l, token: r });
314
320
  s && o && (i["Content-Type"] = `multipart/form-data; boundary=${o}`);
315
- const a = this.getApiUrl(t), d = {
321
+ const c = this.getApiUrl(t), g = {
316
322
  method: "POST",
317
- url: a,
318
- headers: i
323
+ url: c,
324
+ headers: i,
325
+ params: a
319
326
  };
320
- this.logger.info(d);
327
+ this.logger.info(g);
321
328
  try {
322
- const g = s ? `${a}?${l}` : a, u = await fetch(g, {
329
+ const d = s ? `${c}?${l}` : c, u = await fetch(d, {
323
330
  method: "POST",
324
331
  headers: i,
325
332
  body: s || l.toString(),
@@ -327,18 +334,18 @@ class J {
327
334
  });
328
335
  if (u.ok) {
329
336
  const f = await u.json();
330
- return this.logger.debug({ result: f.data }), f;
337
+ return this.logger.debug({ POST_RESULT: f }), f;
331
338
  }
332
339
  return {
333
340
  code: u.status,
334
341
  success: !1,
335
342
  msg: u.statusText
336
343
  };
337
- } catch (g) {
344
+ } catch (d) {
338
345
  return {
339
346
  code: 500,
340
347
  success: !1,
341
- msg: g?.toString() ?? "Server exception!"
348
+ msg: d?.toString() ?? "Server exception!"
342
349
  };
343
350
  }
344
351
  }
@@ -347,17 +354,18 @@ class J {
347
354
  e = e ? { ...e } : {};
348
355
  const s = e.buffer ?? void 0, o = e.boundary ?? void 0;
349
356
  s && delete e.buffer, o && delete e.boundary;
350
- const c = this.assemblyParameter(e), l = this.convertUrlParameter(c), i = await this.assemblyHeader({ urlParams: l, token: r });
357
+ const a = this.assemblyParameter(e), l = this.convertUrlParameter(a), i = await this.assemblyHeader({ urlParams: l, token: r });
351
358
  s && o && (i["Content-Type"] = `multipart/form-data; boundary=${o}`), i.Connection = "keep-alive", i["X-Accel-Buffering"] = "no", i["Cache-Control"] = "no-cache";
352
- const a = this.getApiUrl(t);
359
+ const c = this.getApiUrl(t);
353
360
  try {
354
- const d = s ? `${a}?${l}` : a, g = {
355
- method: "POST",
356
- url: a,
357
- headers: i
361
+ const g = s ? `${c}?${l}` : c, d = {
362
+ method: "STREAM",
363
+ url: c,
364
+ headers: i,
365
+ params: a
358
366
  };
359
- this.logger.info(g);
360
- const u = await fetch(d, {
367
+ this.logger.info(d);
368
+ const u = await fetch(g, {
361
369
  method: "POST",
362
370
  headers: i,
363
371
  body: s || l.toString(),
@@ -374,8 +382,8 @@ class J {
374
382
  Connection: "keep-alive"
375
383
  }
376
384
  });
377
- } catch (d) {
378
- throw d;
385
+ } catch (g) {
386
+ throw g;
379
387
  }
380
388
  }
381
389
  getUserInfo(t) {
@@ -410,15 +418,15 @@ class J {
410
418
  };
411
419
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
412
420
  setToken(t, e) {
413
- const { id: r, name: s, username: o, nickname: c, sex: l, headImg: i, token: a, lastLoginTime: d, tokenExpired: g, deviceId: u, userType: f, mustChangePwd: v } = t, P = {
421
+ const { id: r, name: s, username: o, nickname: a, sex: l, headImg: i, token: c, lastLoginTime: g, tokenExpired: d, deviceId: u, userType: f, mustChangePwd: v } = t, P = {
414
422
  id: r,
415
423
  name: s,
416
424
  username: o,
417
- nickname: c,
425
+ nickname: a,
418
426
  sex: l,
419
427
  headImg: i,
420
- lastLoginTime: d,
421
- tokenExpired: g,
428
+ lastLoginTime: g,
429
+ tokenExpired: d,
422
430
  deviceId: u,
423
431
  userType: f,
424
432
  status: 0,
@@ -430,7 +438,7 @@ class J {
430
438
  createTime: "",
431
439
  mustChangePwd: v
432
440
  };
433
- return e.cookies.set(h.token, a, {
441
+ return e.cookies.set(h.token, c, {
434
442
  httpOnly: !0,
435
443
  secure: !this._isDebug,
436
444
  // 在生产环境中启用Secure
@@ -455,10 +463,10 @@ class J {
455
463
  }
456
464
  }
457
465
  export {
458
- M as ACCOUNT_TYPE_MAP,
466
+ L as ACCOUNT_TYPE_MAP,
459
467
  _ as CURRENT_WEBSITE_KEY,
460
468
  U as DEFAULT_LOCALE,
461
- T as DEVICE_ID_KEY,
469
+ w as DEVICE_ID_KEY,
462
470
  J as HttpClient,
463
471
  $ as USER_FORM_MAP,
464
472
  W as USER_SEX_MAP,
@@ -469,7 +477,7 @@ export {
469
477
  j as iGet,
470
478
  K as iPost,
471
479
  F as iPostSuccess,
472
- S as post,
480
+ O as post,
473
481
  x as setDefaultRequestHeader
474
482
  };
475
483
  //# sourceMappingURL=iboot-http-client.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"iboot-http-client.es.js","sources":["../src/types/user.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}","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 == null || 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 pino from \"pino\";\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} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\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\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?.heads;\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\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 return await response.json();\r\n }\r\n return {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\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?.heads;\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 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 return await response.json();\r\n }\r\n return {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\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 private readonly logger: pino.Logger;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType }: Readonly<HttpClientOpts>) {\r\n this.baseUrl = process.env.BASE_URL ?? '';\r\n this.helloMethod = process.env.HELLO_URL ?? ''\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 this.logger = pino({\r\n name: 'iboot',\r\n level: this._isDebug ? 'debug' : 'info',\r\n nestedKey: 'payload'\r\n })\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 this.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 this.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 this.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 }: Readonly<{ url: string, data?: Record<string, any>, token?: Readonly<HttpToken> }>): 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 this.logger.info(logInfo);\r\n try {\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: headers,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n\r\n if (res.ok) {\r\n const result = await res.json();\r\n this.logger.debug({ result: result.data })\r\n return result;\r\n }\r\n return {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n } catch (e) {\r\n return {\r\n code: 500,\r\n success: false,\r\n msg: e?.toString() ?? 'Server exception!'\r\n }\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token }: Readonly<{ url: string, data?: Record<string, any>, token?: Readonly<HttpToken> }>): 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 }\r\n this.logger.info(logInfo);\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\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 if (res.ok) {\r\n const result = await res.json();\r\n this.logger.debug({ result: result.data })\r\n return result;\r\n }\r\n return {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n } catch (e) {\r\n return {\r\n code: 500,\r\n success: false,\r\n msg: e?.toString() ?? 'Server exception!'\r\n }\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<{ url: string, data?: Record<string, any>, token?: Readonly<HttpToken> }>): 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\": \"POST\",\r\n \"url\": api,\r\n \"headers\": headers,\r\n\r\n }\r\n this.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","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","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","pino","key","CryptoJS","p","o","v","arr_item","item_field","item_field_value","item1","index","f","s","oValue","_apiKey","a","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","e","buffer","boundary","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.es.js","sources":["../src/types/user.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}","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 == null || 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 pino from \"pino\";\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} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\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?.heads;\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\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 return await response.json();\r\n }\r\n return {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\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?.heads;\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 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 return await response.json();\r\n }\r\n return {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\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 private readonly logger: pino.Logger;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType, helloURL, appName }: 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 this.logger = pino({\r\n name: appName,\r\n level: this._isDebug ? 'debug' : 'info',\r\n nestedKey: 'payload',\r\n messageKey: 'msg', //明确指定消息键,可解决乱码问题\r\n formatters: {\r\n level: (label) => {\r\n return { level: label };\r\n }\r\n }\r\n })\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 this.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 this.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 this.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 }: Readonly<{ url: string, data?: Record<string, any>, token?: Readonly<HttpToken> }>): 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 this.logger.info(logInfo);\r\n try {\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: headers,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n\r\n if (res.ok) {\r\n const result = await res.json();\r\n this.logger.debug({ \"GET_RESULT\": result })\r\n return result;\r\n }\r\n return {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n } catch (e) {\r\n return {\r\n code: 500,\r\n success: false,\r\n msg: e?.toString() ?? 'Server exception!'\r\n }\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token }: Readonly<{ url: string, data?: Record<string, any>, token?: Readonly<HttpToken> }>): 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 this.logger.info(logInfo);\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\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 if (res.ok) {\r\n const result = await res.json();\r\n this.logger.debug({ \"POST_RESULT\": result })\r\n return result;\r\n }\r\n return {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n } catch (e) {\r\n return {\r\n code: 500,\r\n success: false,\r\n msg: e?.toString() ?? 'Server exception!'\r\n }\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<{ url: string, data?: Record<string, any>, token?: Readonly<HttpToken> }>): 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 }\r\n this.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","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","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","helloURL","appName","pino","label","key","CryptoJS","p","o","v","arr_item","item_field","item_field_value","item1","index","f","s","oValue","_apiKey","a","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","e","buffer","boundary","cookies","userjson","utype","user","id","name","nickname","sex","headImg","lastLoginTime","tokenExpired","mustChangePwd","loginUser"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- (function(l,y){typeof exports=="object"&&typeof module<"u"?y(exports,require("js-md5"),require("crypto-js"),require("pino")):typeof define=="function"&&define.amd?define(["exports","js-md5","crypto-js","pino"],y):(l=typeof globalThis<"u"?globalThis:l||self,y(l["iboot-http-client"]={},l.md5,l.CryptoJS,l.pino))})(this,(function(l,y,m,N){"use strict";const U={GENERAL:0,PHONE:1,EMAIL:2},O={TYPE_MGT:0,TYPE_C:1,TYPE_B:2},D={FROM_WEB:1,FROM_PC:2,FROM_WX_MINI_PRO:3,FROM_WX_PLU:4,FROM_WX_E:5,FROM_APP:6,FROM_DEVICE:7},k={unknown:0,male:1,female:2},S=o=>Array.isArray(o)||typeof o=="object"&&Object.prototype.toString.call(o)==="[object Array]",v=o=>{const t=o,e="ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",r=e.length;let s="";for(let n=0;n<t;n++)s+=e.charAt(Math.floor(Math.random()*r));return s},M=(o,t)=>{const e={};return o.split("&").forEach(s=>{const n=s.split("=");n[1]&&(e[n[0]]=n[1])}),e},E=o=>o==null||o==""||o.length==0?"":encodeURIComponent(o).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\'/g,"%27").replace(/\!/g,"%21").replace(/\~/g,"%7E"),P="zh-CN",_="_device_id_key",I="_current_website_key",C="Get request error!",T="Post request error!",b={"Device-Id":"Device-Id",Lang:"Lang","Website-Id":"Website-Id","Website-No":"Website-No"},d={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"},A=()=>{const o=localStorage.getItem(_)??"",t=localStorage.getItem(I),e=t!=null?JSON.parse(t):null,r={};return o.length>0&&(r["Device-Id"]=o),e&&(r.Lang=e.language,e.websiteId&&(r["Website-Id"]=e.websiteId),e.websiteNo&&(r["Website-No"]=e.websiteNo)),r},B=(o,t)=>{localStorage.setItem(_,o),t&&localStorage.setItem(I,JSON.stringify(t))},R=async(o,t)=>{if(t?.data){const n=new URLSearchParams(t.data);o.indexOf("?")!=-1?o+=`&${n}`:o+=`?${n}`}const e=A(),r=t?.heads;if(r)for(const n in r){const c=r[n];c&&(e[n]=c)}const s=await fetch(o,{method:"GET",headers:e,cache:t?.useCache?"force-cache":"default"});return s.ok?await s.json():{code:s.status,success:!1,msg:s.statusText}},w=async(o,t)=>{const e=t?.data??{},r=t?.heads;let s;const n=new Headers(A());if(e instanceof FormData?s=e:(s=JSON.stringify(e),n.set("Content-Type","application/json")),r)for(let u in r){const i=r[u];i&&n.set(u,i)}const c=await fetch(o,{method:"POST",headers:n,body:s});return c.ok?await c.json():{code:c.status,success:!1,msg:c.statusText}},L=async(o,t)=>{const e=await R(o,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??C);return}throw Error(e.msg??C)},j=async(o,t)=>{const e=await w(o,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??T);return}throw Error(e.msg??T)},W=async(o,t)=>{const e=await w(o,t);return e.success?(t?.showSuccess&&t.showSuccess(e.msg??"SUCCESS"),!0):(t?.showError&&t.showError(e.msg??T),!1)},$=o=>{const t=o.headers.get(b["Device-Id"]),e=o.headers.get(b.Lang),r=o.headers.get(b["Website-Id"]),s=o.headers.get(b["Website-No"]),n={};return t&&t.length>0&&(n.deviceId=t),e&&e.length>0&&(n.lang=e),r&&r.length>0&&(n.websiteId=r),s&&s.length>0&&(n.websiteNo=s),n},H=o=>{const t={},e=o.get(d.IBOOT_DEVICE_ID)?.value,r=o.get(d.IBOOT_LOCALE)?.value,s=o.get(d.IBOOT_WEBSITE_ID)?.value,n=o.get(d.IBOOT_WEBSITE_NO)?.value;return e&&e.length>0&&(t.deviceId=e),r&&r.length>0&&(t.lang=r),s&&s.length>0&&(t.websiteId=s),n&&n.length>0&&(t.websiteNo=n),t};class K{baseUrl;helloMethod;apiKey;userType;userFrom;deviceId;version="1";lang;websiteId;websiteNo;_isDebug;logger;constructor({deviceId:t,lang:e,websiteId:r,websiteNo:s,userType:n}){this.baseUrl=process.env.BASE_URL??"",this.helloMethod=process.env.HELLO_URL??"",this.apiKey=process.env.API_KEY??"",this.userType=n??O.TYPE_MGT,this.userFrom=process.env.USER_FROM||"1",this.deviceId=t??v(10),this.lang=e??P,this.websiteId=r,this.websiteNo=s,this._isDebug=process.env.NODE_ENV!="production",this.logger=N({name:"iboot",level:this._isDebug?"debug":"info",nestedKey:"payload"})}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 r in t){let s=t[r];if(s&&typeof s=="string")s=s.trim();else if(s&&typeof s=="object"){if(S(s)){if(s.length===0)continue;for(let n=0;n<s.length;n++){const c=s[n];for(const u in c){const i=c[u]??void 0;if(i){if(typeof i=="object")S(i)&&i.forEach((a,f)=>{if(a)for(const g in a){const h=a[g];if(h&&h.toString().length>0){const p=`[${n.toString()}].${u+`[${f.toString()}].${g}`}=${E(h)}`;e.push(r+p)}}});else if(i.toString().length>0){const a=`[${n.toString()}].${u}=${E(i.toString())}`;e.push(r+a)}}}}}else for(const n in s){const c=s[n];if(c!=null&&c!=""&&c.length!=0){const u=`.${n}=${E(c)}`;e.push(r+u)}}continue}else s&&typeof s=="function"&&(s=null);s!=null&&s!=""&&s.length!=0&&e.push(r+"="+E(s))}return e&&e.join("&")}async sign(t){const e="&key="+await this.helloIboot(),r=[];for(const i in t)r.push(i);r.sort((i,a)=>i.toLowerCase().localeCompare(a.toLowerCase()));const s=[];r.forEach(i=>{let a=t[i];typeof a=="object"&&(a=JSON.stringify(a)),s.push(i+"="+a)});const n=s.join("&"),c=y.md5((n+e).toLocaleUpperCase()),u={params:n,md5:c};return this.logger.debug(u),c}assemblyParameter(t,e){const r=t??{};return r.timestamp=Date.now()+"",r.echostr=v(10),r.version=this.version,r.deviceId=this.deviceId,r.webid=this.websiteId,r.apiKey=this.apiKey,e&&e.length>0&&(r.username=e),r}async assemblyHeader({urlParams:t,token:e}){const r={"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&&(r.Lang=this.lang),this.websiteId&&this.websiteId.length>0&&(r["Web-Id"]=this.websiteId),this.websiteNo&&this.websiteNo.length>0&&(r["Web-No"]=this.websiteNo),e&&(e.token&&e.token.length>0&&e.username&&e.username.length>0&&(r.Authorization=e.token,r.Username=e.username),e.xcsrf&&(r[e.xcsrf.csrfHeader]=e.xcsrf.csrfToken));const s=M(t),n=await this.sign(s);return r.Sign=n,r}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},r={url:t,headers:e};this.logger.debug(r);const s=await fetch(t,{method:"GET",headers:e,credentials:"include",cache:"force-cache"});if(s.ok){const n=await s.json();return this.logger.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:r}){const s=this.assemblyParameter(e),n=this.convertUrlParameter(s),c=await this.assemblyHeader({urlParams:n,token:r}),u=`${this.getApiUrl(t)}?${n.toString()}`,i={method:"GET",url:u,headers:c};this.logger.info(i);try{const a=await fetch(u,{method:"GET",headers:c,credentials:"include",cache:"force-cache"});if(a.ok){const f=await a.json();return this.logger.debug({result:f.data}),f}return{code:a.status,success:!1,msg:a.statusText}}catch(a){return{code:500,success:!1,msg:a?.toString()??"Server exception!"}}}async post({url:t,data:e,token:r}){e=e?{...e}:{};const s=e.buffer??void 0,n=e.boundary??void 0;s&&delete e.buffer,n&&delete e.boundary;const c=this.assemblyParameter(e),u=this.convertUrlParameter(c),i=await this.assemblyHeader({urlParams:u,token:r});s&&n&&(i["Content-Type"]=`multipart/form-data; boundary=${n}`);const a=this.getApiUrl(t),f={method:"POST",url:a,headers:i};this.logger.info(f);try{const g=s?`${a}?${u}`:a,h=await fetch(g,{method:"POST",headers:i,body:s||u.toString(),credentials:"include"});if(h.ok){const p=await h.json();return this.logger.debug({result:p.data}),p}return{code:h.status,success:!1,msg:h.statusText}}catch(g){return{code:500,success:!1,msg:g?.toString()??"Server exception!"}}}async stream({url:t,data:e,token:r}){e=e?{...e}:{};const s=e.buffer??void 0,n=e.boundary??void 0;s&&delete e.buffer,n&&delete e.boundary;const c=this.assemblyParameter(e),u=this.convertUrlParameter(c),i=await this.assemblyHeader({urlParams:u,token:r});s&&n&&(i["Content-Type"]=`multipart/form-data; boundary=${n}`),i.Connection="keep-alive",i["X-Accel-Buffering"]="no",i["Cache-Control"]="no-cache";const a=this.getApiUrl(t);try{const f=s?`${a}?${u}`:a,g={method:"POST",url:a,headers:i};this.logger.info(g);const h=await fetch(f,{method:"POST",headers:i,body:s||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(d.user)?.value;return e&&e.length>0?JSON.parse(e):null}getToken(t){const e=t.get("user")?.value;let r="",s=this.userType;if(e&&e.length>0){const n=JSON.parse(e);r=n.username,s=n.userType.toString()}return{username:r,utype:s,token:t.get(d.token)?.value??""}}getTokenByCookies=t=>{const e=t.get("user")?.value;let r="",s=this.userType;if(e&&e.length>0){const n=JSON.parse(e);r=n.username,s=n.userType.toString()}return{username:r,utype:s,token:t.get(d.token)?.value??""}};setToken(t,e){const{id:r,name:s,username:n,nickname:c,sex:u,headImg:i,token:a,lastLoginTime:f,tokenExpired:g,deviceId:h,userType:p,mustChangePwd:F}=t,Y={id:r,name:s,username:n,nickname:c,sex:u,headImg:i,lastLoginTime:f,tokenExpired:g,deviceId:h,userType:p,status:0,accountType:0,enabled:!1,userFrom:1,needToReview:!1,socketOnline:!1,createTime:"",mustChangePwd:F};return e.cookies.set(d.token,a,{httpOnly:!0,secure:!this._isDebug,sameSite:"strict",path:"/"}),e.cookies.set(d.user,JSON.stringify(Y)),e}cleanToken(t){return t.cookies.set(d.token,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.set(d.user,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.delete(d.token),t.cookies.delete(d.user),t}}l.ACCOUNT_TYPE_MAP=U,l.CURRENT_WEBSITE_KEY=I,l.DEFAULT_LOCALE=P,l.DEVICE_ID_KEY=_,l.HttpClient=K,l.USER_FORM_MAP=D,l.USER_SEX_MAP=k,l.USER_TYPE_MAP=O,l.get=R,l.getHttpClientOpts=$,l.getHttpClientOptsByCookie=H,l.iGet=L,l.iPost=j,l.iPostSuccess=W,l.post=w,l.setDefaultRequestHeader=B,Object.defineProperty(l,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(u,y){typeof exports=="object"&&typeof module<"u"?y(exports,require("js-md5"),require("crypto-js"),require("pino")):typeof define=="function"&&define.amd?define(["exports","js-md5","crypto-js","pino"],y):(u=typeof globalThis<"u"?globalThis:u||self,y(u["iboot-http-client"]={},u.md5,u.CryptoJS,u.pino))})(this,(function(u,y,m,N){"use strict";const U={GENERAL:0,PHONE:1,EMAIL:2},O={TYPE_MGT:0,TYPE_C:1,TYPE_B:2},D={FROM_WEB:1,FROM_PC:2,FROM_WX_MINI_PRO:3,FROM_WX_PLU:4,FROM_WX_E:5,FROM_APP:6,FROM_DEVICE:7},k={unknown:0,male:1,female:2},S=o=>Array.isArray(o)||typeof o=="object"&&Object.prototype.toString.call(o)==="[object Array]",v=o=>{const t=o,e="ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",r=e.length;let s="";for(let n=0;n<t;n++)s+=e.charAt(Math.floor(Math.random()*r));return s},M=(o,t)=>{const e={};return o.split("&").forEach(s=>{const n=s.split("=");n[1]&&(e[n[0]]=n[1])}),e},E=o=>o==null||o==""||o.length==0?"":encodeURIComponent(o).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\'/g,"%27").replace(/\!/g,"%21").replace(/\~/g,"%7E"),P="zh-CN",T="_device_id_key",b="_current_website_key",C="Get request error!",I="Post request error!",_={"Device-Id":"Device-Id",Lang:"Lang","Website-Id":"Website-Id","Website-No":"Website-No"},d={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"},A=()=>{const o=localStorage.getItem(T)??"",t=localStorage.getItem(b),e=t!=null?JSON.parse(t):null,r={};return o.length>0&&(r["Device-Id"]=o),e&&(r.Lang=e.language,e.websiteId&&(r["Website-Id"]=e.websiteId),e.websiteNo&&(r["Website-No"]=e.websiteNo)),r},B=(o,t)=>{localStorage.setItem(T,o),t&&localStorage.setItem(b,JSON.stringify(t))},R=async(o,t)=>{if(t?.data){const n=new URLSearchParams(t.data);o.indexOf("?")!=-1?o+=`&${n}`:o+=`?${n}`}const e=A(),r=t?.heads;if(r)for(const n in r){const a=r[n];a&&(e[n]=a)}const s=await fetch(o,{method:"GET",headers:e,cache:t?.useCache?"force-cache":"default"});return s.ok?await s.json():{code:s.status,success:!1,msg:s.statusText}},w=async(o,t)=>{const e=t?.data??{},r=t?.heads;let s;const n=new Headers(A());if(e instanceof FormData?s=e:(s=JSON.stringify(e),n.set("Content-Type","application/json")),r)for(let l in r){const i=r[l];i&&n.set(l,i)}const a=await fetch(o,{method:"POST",headers:n,body:s});return a.ok?await a.json():{code:a.status,success:!1,msg:a.statusText}},L=async(o,t)=>{const e=await R(o,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??C);return}throw Error(e.msg??C)},j=async(o,t)=>{const e=await w(o,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??I);return}throw Error(e.msg??I)},W=async(o,t)=>{const e=await w(o,t);return e.success?(t?.showSuccess&&t.showSuccess(e.msg??"SUCCESS"),!0):(t?.showError&&t.showError(e.msg??I),!1)},$=o=>{const t=o.headers.get(_["Device-Id"]),e=o.headers.get(_.Lang),r=o.headers.get(_["Website-Id"]),s=o.headers.get(_["Website-No"]),n={};return t&&t.length>0&&(n.deviceId=t),e&&e.length>0&&(n.lang=e),r&&r.length>0&&(n.websiteId=r),s&&s.length>0&&(n.websiteNo=s),n},K=o=>{const t={},e=o.get(d.IBOOT_DEVICE_ID)?.value,r=o.get(d.IBOOT_LOCALE)?.value,s=o.get(d.IBOOT_WEBSITE_ID)?.value,n=o.get(d.IBOOT_WEBSITE_NO)?.value;return e&&e.length>0&&(t.deviceId=e),r&&r.length>0&&(t.lang=r),s&&s.length>0&&(t.websiteId=s),n&&n.length>0&&(t.websiteNo=n),t};class H{baseUrl;helloMethod;apiKey;userType;userFrom;deviceId;version="1";lang;websiteId;websiteNo;_isDebug;logger;constructor({deviceId:t,lang:e,websiteId:r,websiteNo:s,userType:n,helloURL:a,appName:l}){this.baseUrl=process.env.BASE_URL??"",this.helloMethod=a??"",this.apiKey=process.env.API_KEY??"",this.userType=n??O.TYPE_MGT,this.userFrom=process.env.USER_FROM||"1",this.deviceId=t??v(10),this.lang=e??P,this.websiteId=r,this.websiteNo=s,this._isDebug=process.env.NODE_ENV!="production",this.logger=N({name:l,level:this._isDebug?"debug":"info",nestedKey:"payload",messageKey:"msg",formatters:{level:i=>({level:i})}})}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 r in t){let s=t[r];if(s&&typeof s=="string")s=s.trim();else if(s&&typeof s=="object"){if(S(s)){if(s.length===0)continue;for(let n=0;n<s.length;n++){const a=s[n];for(const l in a){const i=a[l]??void 0;if(i){if(typeof i=="object")S(i)&&i.forEach((c,f)=>{if(c)for(const g in c){const h=c[g];if(h&&h.toString().length>0){const p=`[${n.toString()}].${l+`[${f.toString()}].${g}`}=${E(h)}`;e.push(r+p)}}});else if(i.toString().length>0){const c=`[${n.toString()}].${l}=${E(i.toString())}`;e.push(r+c)}}}}}else for(const n in s){const a=s[n];if(a!=null&&a!=""&&a.length!=0){const l=`.${n}=${E(a)}`;e.push(r+l)}}continue}else s&&typeof s=="function"&&(s=null);s!=null&&s!=""&&s.length!=0&&e.push(r+"="+E(s))}return e&&e.join("&")}async sign(t){const e="&key="+await this.helloIboot(),r=[];for(const i in t)r.push(i);r.sort((i,c)=>i.toLowerCase().localeCompare(c.toLowerCase()));const s=[];r.forEach(i=>{let c=t[i];typeof c=="object"&&(c=JSON.stringify(c)),s.push(i+"="+c)});const n=s.join("&"),a=y.md5((n+e).toLocaleUpperCase()),l={name:"sort",params:n,md5:a};return this.logger.debug(l),a}assemblyParameter(t,e){const r=t??{};return r.timestamp=Date.now()+"",r.echostr=v(10),r.version=this.version,r.deviceId=this.deviceId,r.webid=this.websiteId,r.apiKey=this.apiKey,e&&e.length>0&&(r.username=e),r}async assemblyHeader({urlParams:t,token:e}){const r={"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&&(r.Lang=this.lang),this.websiteId&&this.websiteId.length>0&&(r["Web-Id"]=this.websiteId),this.websiteNo&&this.websiteNo.length>0&&(r["Web-No"]=this.websiteNo),e&&(e.token&&e.token.length>0&&e.username&&e.username.length>0&&(r.Authorization=e.token,r.Username=e.username),e.xcsrf&&(r[e.xcsrf.csrfHeader]=e.xcsrf.csrfToken));const s=M(t),n=await this.sign(s);return r.Sign=n,r}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},r={url:t,headers:e};this.logger.debug(r);const s=await fetch(t,{method:"GET",headers:e,credentials:"include",cache:"force-cache"});if(s.ok){const n=await s.json();return this.logger.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:r}){const s=this.assemblyParameter(e),n=this.convertUrlParameter(s),a=await this.assemblyHeader({urlParams:n,token:r}),l=`${this.getApiUrl(t)}?${n.toString()}`,i={method:"GET",url:l,headers:a};this.logger.info(i);try{const c=await fetch(l,{method:"GET",headers:a,credentials:"include",cache:"force-cache"});if(c.ok){const f=await c.json();return this.logger.debug({GET_RESULT:f}),f}return{code:c.status,success:!1,msg:c.statusText}}catch(c){return{code:500,success:!1,msg:c?.toString()??"Server exception!"}}}async post({url:t,data:e,token:r}){e=e?{...e}:{};const s=e.buffer??void 0,n=e.boundary??void 0;s&&delete e.buffer,n&&delete e.boundary;const a=this.assemblyParameter(e),l=this.convertUrlParameter(a),i=await this.assemblyHeader({urlParams:l,token:r});s&&n&&(i["Content-Type"]=`multipart/form-data; boundary=${n}`);const c=this.getApiUrl(t),f={method:"POST",url:c,headers:i,params:a};this.logger.info(f);try{const g=s?`${c}?${l}`:c,h=await fetch(g,{method:"POST",headers:i,body:s||l.toString(),credentials:"include"});if(h.ok){const p=await h.json();return this.logger.debug({POST_RESULT:p}),p}return{code:h.status,success:!1,msg:h.statusText}}catch(g){return{code:500,success:!1,msg:g?.toString()??"Server exception!"}}}async stream({url:t,data:e,token:r}){e=e?{...e}:{};const s=e.buffer??void 0,n=e.boundary??void 0;s&&delete e.buffer,n&&delete e.boundary;const a=this.assemblyParameter(e),l=this.convertUrlParameter(a),i=await this.assemblyHeader({urlParams:l,token:r});s&&n&&(i["Content-Type"]=`multipart/form-data; boundary=${n}`),i.Connection="keep-alive",i["X-Accel-Buffering"]="no",i["Cache-Control"]="no-cache";const c=this.getApiUrl(t);try{const f=s?`${c}?${l}`:c,g={method:"STREAM",url:c,headers:i,params:a};this.logger.info(g);const h=await fetch(f,{method:"POST",headers:i,body:s||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(f){throw f}}getUserInfo(t){const e=t.get(d.user)?.value;return e&&e.length>0?JSON.parse(e):null}getToken(t){const e=t.get("user")?.value;let r="",s=this.userType;if(e&&e.length>0){const n=JSON.parse(e);r=n.username,s=n.userType.toString()}return{username:r,utype:s,token:t.get(d.token)?.value??""}}getTokenByCookies=t=>{const e=t.get("user")?.value;let r="",s=this.userType;if(e&&e.length>0){const n=JSON.parse(e);r=n.username,s=n.userType.toString()}return{username:r,utype:s,token:t.get(d.token)?.value??""}};setToken(t,e){const{id:r,name:s,username:n,nickname:a,sex:l,headImg:i,token:c,lastLoginTime:f,tokenExpired:g,deviceId:h,userType:p,mustChangePwd:F}=t,Y={id:r,name:s,username:n,nickname:a,sex:l,headImg:i,lastLoginTime:f,tokenExpired:g,deviceId:h,userType:p,status:0,accountType:0,enabled:!1,userFrom:1,needToReview:!1,socketOnline:!1,createTime:"",mustChangePwd:F};return e.cookies.set(d.token,c,{httpOnly:!0,secure:!this._isDebug,sameSite:"strict",path:"/"}),e.cookies.set(d.user,JSON.stringify(Y)),e}cleanToken(t){return t.cookies.set(d.token,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.set(d.user,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.delete(d.token),t.cookies.delete(d.user),t}}u.ACCOUNT_TYPE_MAP=U,u.CURRENT_WEBSITE_KEY=b,u.DEFAULT_LOCALE=P,u.DEVICE_ID_KEY=T,u.HttpClient=H,u.USER_FORM_MAP=D,u.USER_SEX_MAP=k,u.USER_TYPE_MAP=O,u.get=R,u.getHttpClientOpts=$,u.getHttpClientOptsByCookie=K,u.iGet=L,u.iPost=j,u.iPostSuccess=W,u.post=w,u.setDefaultRequestHeader=B,Object.defineProperty(u,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/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}","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 == null || 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 pino from \"pino\";\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} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\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\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?.heads;\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\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 return await response.json();\r\n }\r\n return {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\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?.heads;\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 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 return await response.json();\r\n }\r\n return {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\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 private readonly logger: pino.Logger;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType }: Readonly<HttpClientOpts>) {\r\n this.baseUrl = process.env.BASE_URL ?? '';\r\n this.helloMethod = process.env.HELLO_URL ?? ''\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 this.logger = pino({\r\n name: 'iboot',\r\n level: this._isDebug ? 'debug' : 'info',\r\n nestedKey: 'payload'\r\n })\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 this.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 this.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 this.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 }: Readonly<{ url: string, data?: Record<string, any>, token?: Readonly<HttpToken> }>): 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 this.logger.info(logInfo);\r\n try {\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: headers,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n\r\n if (res.ok) {\r\n const result = await res.json();\r\n this.logger.debug({ result: result.data })\r\n return result;\r\n }\r\n return {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n } catch (e) {\r\n return {\r\n code: 500,\r\n success: false,\r\n msg: e?.toString() ?? 'Server exception!'\r\n }\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token }: Readonly<{ url: string, data?: Record<string, any>, token?: Readonly<HttpToken> }>): 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 }\r\n this.logger.info(logInfo);\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\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 if (res.ok) {\r\n const result = await res.json();\r\n this.logger.debug({ result: result.data })\r\n return result;\r\n }\r\n return {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n } catch (e) {\r\n return {\r\n code: 500,\r\n success: false,\r\n msg: e?.toString() ?? 'Server exception!'\r\n }\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<{ url: string, data?: Record<string, any>, token?: Readonly<HttpToken> }>): 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\": \"POST\",\r\n \"url\": api,\r\n \"headers\": headers,\r\n\r\n }\r\n this.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","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","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","pino","key","CryptoJS","p","o","v","arr_item","item_field","item_field_value","item1","index","f","s","oValue","_apiKey","a","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","e","buffer","boundary","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/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}","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 == null || 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 pino from \"pino\";\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} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\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?.heads;\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\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 return await response.json();\r\n }\r\n return {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\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?.heads;\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 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 return await response.json();\r\n }\r\n return {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\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 private readonly logger: pino.Logger;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType, helloURL, appName }: 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 this.logger = pino({\r\n name: appName,\r\n level: this._isDebug ? 'debug' : 'info',\r\n nestedKey: 'payload',\r\n messageKey: 'msg', //明确指定消息键,可解决乱码问题\r\n formatters: {\r\n level: (label) => {\r\n return { level: label };\r\n }\r\n }\r\n })\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 this.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 this.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 this.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 }: Readonly<{ url: string, data?: Record<string, any>, token?: Readonly<HttpToken> }>): 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 this.logger.info(logInfo);\r\n try {\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: headers,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n\r\n if (res.ok) {\r\n const result = await res.json();\r\n this.logger.debug({ \"GET_RESULT\": result })\r\n return result;\r\n }\r\n return {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n } catch (e) {\r\n return {\r\n code: 500,\r\n success: false,\r\n msg: e?.toString() ?? 'Server exception!'\r\n }\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token }: Readonly<{ url: string, data?: Record<string, any>, token?: Readonly<HttpToken> }>): 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 this.logger.info(logInfo);\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\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 if (res.ok) {\r\n const result = await res.json();\r\n this.logger.debug({ \"POST_RESULT\": result })\r\n return result;\r\n }\r\n return {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n } catch (e) {\r\n return {\r\n code: 500,\r\n success: false,\r\n msg: e?.toString() ?? 'Server exception!'\r\n }\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<{ url: string, data?: Record<string, any>, token?: Readonly<HttpToken> }>): 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 }\r\n this.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","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","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","helloURL","appName","pino","label","key","CryptoJS","p","o","v","arr_item","item_field","item_field_value","item1","index","f","s","oValue","_apiKey","a","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","e","buffer","boundary","cookies","userjson","utype","user","id","name","nickname","sex","headImg","lastLoginTime","tokenExpired","mustChangePwd","loginUser"],"mappings":"8VAAO,MAAMA,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,EC1BaC,EAAWC,GAEhB,MAAM,QAAQA,CAAG,GAChB,OAAOA,GAAQ,UACZ,OAAO,UAAU,SAAS,KAAKA,CAAG,IAAM,iBAQvCC,EAAgBC,GAAgB,CAC3C,MAAMC,EAAID,EACJE,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,IAELF,EAAOE,EAAI,CAAC,CAAC,EAAIA,EAAI,CAAC,EAG5B,CAAC,EACMF,CACT,EAEaG,EAAaC,GACpBA,GAAS,MAAQA,GAAS,IAAMA,EAAM,QAAU,EAC3C,GAGP,mBAAmBA,CAAK,EAGrB,QAAQ,MAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EC5BdC,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,MACpB,GAAIG,EACA,UAAWC,KAASD,EAAO,CACvB,MAAMrB,EAAQqB,EAAMC,CAAK,EACrBtB,IACAoB,EAAQE,CAAK,EAAItB,EAEzB,CAGJ,MAAMuB,EAAW,MAAM,MAAMN,EAAK,CAC9B,OAAQ,MACR,QAAAG,EACA,MAAOF,GAAM,SAAW,cAAgB,SAAA,CAC3C,EAED,OAAIK,EAAS,GACF,MAAMA,EAAS,KAAA,EAEnB,CACH,KAAMA,EAAS,OACf,QAAS,GACT,IAAKA,EAAS,UAAA,CAEtB,EAEaC,EAAO,MAAUP,EAAaC,IAAqD,CAC5F,MAAMO,EAAOP,GAAM,MAAQ,CAAA,EACrBG,EAAQH,GAAM,MACpB,IAAIQ,EACJ,MAAMC,EAAe,IAAI,QAAQnB,GAAyB,EAO1D,GANMiB,aAAgB,SAIlBC,EAAOD,GAHPC,EAAO,KAAK,UAAUD,CAAI,EAC1BE,EAAa,IAAI,eAAgB,kBAAkB,GAInDN,EACA,QAASC,KAASD,EAAO,CACrB,MAAMrB,EAAQqB,EAAMC,CAAK,EACrBtB,GACA2B,EAAa,IAAIL,EAAOtB,CAAK,CAErC,CAEJ,MAAMuB,EAAW,MAAM,MAAMN,EAAK,CAC9B,OAAQ,OACR,QAASU,EACT,KAAAD,CAAA,CACH,EACD,OAAIH,EAAS,GACF,MAAMA,EAAS,KAAA,EAEnB,CACH,KAAMA,EAAS,OACf,QAAS,GACT,IAAKA,EAAS,UAAA,CAEtB,EAEaK,EAAO,MAAUX,EAAaC,IAAmD,CAC1F,MAAMW,EAAM,MAAMb,EAAOC,EAAKC,CAAI,EAClC,GAAIW,EAAI,QACJ,OAAOA,EAAI,KAEf,GAAIX,GAAM,UAAW,CACjBA,EAAK,UAAUW,EAAI,KAAOzB,CAAU,EACpC,MACJ,CACA,MAAM,MAAMyB,EAAI,KAAOzB,CAAU,CACrC,EAEa0B,EAAQ,MAAUb,EAAaC,IAAoD,CAC5F,MAAMW,EAAM,MAAML,EAAQP,EAAKC,CAAI,EACnC,GAAIW,EAAI,QACJ,OAAOA,EAAI,KAEf,GAAIX,GAAM,UAAW,CACjBA,EAAK,UAAUW,EAAI,KAAOxB,CAAW,EACrC,MACJ,CACA,MAAM,MAAMwB,EAAI,KAAOxB,CAAW,CACtC,EAEa0B,EAAe,MAAOd,EAAaC,IAA8C,CAC1F,MAAMW,EAAM,MAAML,EAAKP,EAAKC,CAAI,EAChC,OAAIW,EAAI,SACAX,GAAM,aACNA,EAAK,YAAYW,EAAI,KAAO,SAAS,EAElC,KAEPX,GAAM,WACNA,EAAK,UAAUW,EAAI,KAAOxB,CAAW,EAElC,GACX,EAGa2B,EAAqBC,GAAqC,CACnE,MAAMnB,EAAWmB,EAAQ,QAAQ,IAAI3B,EAAa,WAAW,CAAC,EACxD4B,EAAOD,EAAQ,QAAQ,IAAI3B,EAAa,IAAI,EAC5C6B,EAAYF,EAAQ,QAAQ,IAAI3B,EAAa,YAAY,CAAC,EAC1D8B,EAAYH,EAAQ,QAAQ,IAAI3B,EAAa,YAAY,CAAC,EAC1DV,EAAyB,CAAA,EAC/B,OAAIkB,GAAYA,EAAS,OAAS,IAC9BlB,EAAO,SAAWkB,GAElBoB,GAAQA,EAAK,OAAS,IACtBtC,EAAO,KAAOsC,GAEdC,GAAaA,EAAU,OAAS,IAChCvC,EAAO,UAAYuC,GAEnBC,GAAaA,EAAU,OAAS,IAChCxC,EAAO,UAAYwC,GAEhBxC,CACX,EAEayC,EAA6BC,GAAiD,CACvF,MAAM1C,EAAyB,CAAA,EACzBkB,EAAWwB,EAAO,IAAI/B,EAAa,eAAe,GAAG,MACrD2B,EAAOI,EAAO,IAAI/B,EAAa,YAAY,GAAG,MAC9C4B,EAAYG,EAAO,IAAI/B,EAAa,gBAAgB,GAAG,MACvD6B,EAAYE,EAAO,IAAI/B,EAAa,gBAAgB,GAAG,MAC7D,OAAIO,GAAYA,EAAS,OAAS,IAC9BlB,EAAO,SAAWkB,GAElBoB,GAAQA,EAAK,OAAS,IACtBtC,EAAO,KAAOsC,GAEdC,GAAaA,EAAU,OAAS,IAChCvC,EAAO,UAAYuC,GAEnBC,GAAaA,EAAU,OAAS,IAChCxC,EAAO,UAAYwC,GAEhBxC,CACX,EAEO,MAAM2C,CAAW,CACH,QACA,YACA,OACA,SACA,SACA,SACA,QAAkB,IAClB,KACA,UACA,UACA,SACA,OACjB,YAAY,CAAE,SAAAzB,EAAU,KAAAoB,EAAM,UAAAC,EAAW,UAAAC,EAAW,SAAAI,EAAU,SAAAC,EAAU,QAAAC,GAAqC,CACzG,KAAK,QAAU,QAAQ,IAAI,UAAY,GACvC,KAAK,YAAcD,GAAY,GAC/B,KAAK,OAAS,QAAQ,IAAI,SAAW,GACrC,KAAK,SAAWD,GAAY3D,EAAc,SAC1C,KAAK,SAAW,QAAQ,IAAI,WAAa,IACzC,KAAK,SAAWiC,GAAY5B,EAAa,EAAE,EAC3C,KAAK,KAAOgD,GAAQjC,EACpB,KAAK,UAAYkC,EACjB,KAAK,UAAYC,EACjB,KAAK,SAAW,QAAQ,IAAI,UAAY,aACxC,KAAK,OAASO,EAAK,CACf,KAAMD,EACN,MAAO,KAAK,SAAW,QAAU,OACjC,UAAW,UACX,WAAY,MACZ,WAAY,CACR,MAAQE,IACG,CAAE,MAAOA,CAAA,EACpB,CACJ,CACH,CACL,CAEA,SAAU,CACN,OAAO,KAAK,QAChB,CAEA,QAAQnB,EAAc,CAClB,MAAMoB,EAAMC,EAAS,IAAI,KAAK,MAAM,KAAK,MAAM,EAC/C,OAAOA,EAAS,IAAI,QAAQrB,EAAMoB,CAAG,EAAE,SAAA,CAC3C,CAEA,QAAQpB,EAAc,CAClB,MAAMoB,EAAMC,EAAS,IAAI,KAAK,MAAM,KAAK,MAAM,EAC/C,OAAOA,EAAS,IAAI,QAAQrB,EAAMoB,EAAK,CACnC,KAAMC,EAAS,KAAK,GAAA,CACvB,EAAE,SAASA,EAAS,IAAI,IAAI,CACjC,CAEA,aAAc,CACV,OAAO,KAAK,QAChB,CAGQ,oBAAoBrB,EAAmC,CAC3D,MAAMsB,EAAc,CAAA,EACpB,UAAWC,KAAKvB,EAAM,CAClB,IAAIwB,EAAIxB,EAAKuB,CAAC,EACd,GAAIC,GAAK,OAAOA,GAAM,SAClBA,EAAIA,EAAE,KAAA,UACCA,GAAK,OAAOA,GAAM,SAAU,CACnC,GAAIjE,EAAQiE,CAAC,EAAG,CACZ,GAAIA,EAAE,SAAW,EACb,SAEJ,QAASzD,EAAI,EAAGA,EAAIyD,EAAE,OAAQzD,IAAK,CAC/B,MAAM0D,EAAWD,EAAEzD,CAAC,EACpB,UAAW2D,KAAcD,EAAU,CAC/B,MAAME,EAAmBF,EAASC,CAAU,GAAK,OACjD,GAAIC,GACA,GAAI,OAAOA,GAAqB,SACxBpE,EAAQoE,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,IAAIhE,EAAE,SAAA,CAAU,KAAK2D,EAAa,IAAIG,EAAM,SAAA,CAAU,KAAKC,CAAC,EAAE,IAAIxD,EAAUkD,CAAC,CAAC,GACxFF,EAAE,KAAKC,EAAIQ,CAAC,CAChB,CACJ,CAER,CAAC,UAEEJ,EAAiB,SAAA,EAAW,OAAS,EAAG,CAC/C,MAAMI,EAAI,IAAIhE,EAAE,SAAA,CAAU,KAAK2D,CAAU,IAAIpD,EAAUqD,EAAiB,SAAA,CAAU,CAAC,GACnFL,EAAE,KAAKC,EAAIQ,CAAC,CAChB,EAER,CACJ,CACJ,KACI,WAAWvE,KAAOgE,EAAG,CACjB,MAAMQ,EAASR,EAAEhE,CAAG,EACpB,GAAIwE,GAAU,MAAQA,GAAU,IAAMA,EAAO,QAAU,EAAG,CACtD,MAAMD,EAAI,IAAIvE,CAAG,IAAIc,EAAU0D,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,IAAMjD,EAAUkD,CAAC,CAAC,CAErC,CACA,OAAQF,GAAKA,EAAE,KAAK,GAAG,CAC3B,CAEA,MAAc,KAAKtB,EAAwD,CAEvE,MAAMiC,EAAU,QAAW,MAAM,KAAK,WAAA,EAChC5D,EAAgB,CAAA,EACtB,UAAWkD,KAAKvB,EACZ3B,EAAI,KAAKkD,CAAC,EAEdlD,EAAI,KAAK,CAAC6D,EAAWC,IACVD,EAAE,YAAA,EAAc,cAAcC,EAAE,aAAa,CACvD,EACD,MAAM/B,EAAgB,CAAA,EACtB/B,EAAI,QAASmD,GAAc,CACvB,IAAIjD,EAAyByB,EAAKwB,CAAC,EAC/B,OAAOjD,GAAU,WACjBA,EAAQ,KAAK,UAAUA,CAAK,GAEhC6B,EAAI,KAAKoB,EAAI,IAAMjD,CAAK,CAC5B,CAAC,EACD,MAAM6D,EAAoBhC,EAAI,KAAK,GAAG,EAChCiC,EAAMC,EAAI,KAAKF,EAAYH,GAAS,mBAAmB,EACvDM,EAAU,CACZ,KAAK,OACL,OAAQH,EACR,IAAKC,CAAA,EAET,YAAK,OAAO,MAAME,CAAO,EAClBF,CACX,CAGQ,kBAAkBrC,EAA4BwC,EAAwC,CAC1F,MAAM9C,EAASM,GAAQ,CAAA,EACvB,OAAAN,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,OACpB8C,GAAYA,EAAS,OAAS,IAC9B9C,EAAO,SAAc8C,GAElB9C,CACX,CAEA,MAAc,eAAe,CAAE,UAAA+C,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,MAAM1C,EAAOhC,EAAeyE,CAAS,EAC/BG,EAAO,MAAM,KAAK,KAAK5C,CAAI,EACjC,OAAA2C,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,EAEf,KAAK,OAAO,MAAMJ,CAAO,EACzB,MAAMnC,EAAM,MAAM,MAAMyC,EAAK,CACzB,OAAQ,MACR,QAASF,EACT,YAAa,UACb,MAAO,aAAA,CACV,EACD,GAAIvC,EAAI,GAAI,CACR,MAAMjC,EAAS,MAAMiC,EAAI,KAAA,EACzB,YAAK,OAAO,MAAM,CAAE,OAAQjC,EAAO,KAAM,EAClCA,EAAO,IAClB,CACA,MAAM,IAAI,MAAM,oBAAoB,CACxC,CAEQ,UAAUqB,EAAqB,CACnC,MAAO,GAAG,KAAK,OAAO,IAAIA,CAAG,EACjC,CAEA,MAAM,MAAoC,CACtC,MAAMY,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,IAAAR,EAAK,KAAAQ,EAAM,MAAA0C,GAAsH,CAC5I,MAAMhD,EAAS,KAAK,kBAAkBM,CAAI,EACpCyC,EAAY,KAAK,oBAAoB/C,CAAM,EAC3CC,EAAU,MAAM,KAAK,eAAe,CAAE,UAAa8C,EAAW,MAASC,EAAO,EAC9EG,EAAM,GAAG,KAAK,UAAUrD,CAAG,CAAC,IAAIiD,EAAU,SAAA,CAAU,GACpDF,EAAU,CACZ,OAAU,MACV,IAAOM,EACP,QAAWlD,CAAA,EAEf,KAAK,OAAO,KAAK4C,CAAO,EACxB,GAAI,CACA,MAAMnC,EAAM,MAAM,MAAMyC,EAAK,CACzB,OAAQ,MACR,QAAAlD,EACA,YAAa,UACb,MAAO,aAAA,CACV,EAED,GAAIS,EAAI,GAAI,CACR,MAAMjC,EAAS,MAAMiC,EAAI,KAAA,EACzB,YAAK,OAAO,MAAM,CAAE,WAAcjC,EAAQ,EACnCA,CACX,CACA,MAAO,CACH,KAAMiC,EAAI,OACV,QAAS,GACT,IAAKA,EAAI,UAAA,CAEjB,OAAS0C,EAAG,CACR,MAAO,CACH,KAAM,IACN,QAAS,GACT,IAAKA,GAAG,YAAc,mBAAA,CAE9B,CACJ,CAGA,MAAM,KAAQ,CAAE,IAAAtD,EAAK,KAAAQ,EAAM,MAAA0C,GAAsH,CAC7I1C,EAAOA,EAAO,CAAE,GAAGA,CAAA,EAAS,CAAA,EAC5B,MAAM+C,EAAS/C,EAAK,QAAU,OACxBgD,EAAWhD,EAAK,UAAY,OAC9B+C,GACA,OAAO/C,EAAK,OAEZgD,GACA,OAAOhD,EAAK,SAEhB,MAAMN,EAAS,KAAK,kBAAkBM,CAAI,EACpCyC,EAAY,KAAK,oBAAoB/C,CAAM,EAC3CC,EAAU,MAAM,KAAK,eAAe,CAAE,UAAa8C,EAAW,MAASC,EAAO,EAChFK,GAAUC,IACVrD,EAAQ,cAAc,EAAI,iCAAiCqD,CAAQ,IAEvE,MAAMH,EAAM,KAAK,UAAUrD,CAAG,EACxB+C,EAAU,CACZ,OAAU,OACV,IAAOM,EACP,QAAWlD,EACX,OAAUD,CAAA,EAEd,KAAK,OAAO,KAAK6C,CAAO,EACxB,GAAI,CACA,MAAM/C,EAAMuD,EAAS,GAAGF,CAAG,IAAIJ,CAAS,GAAKI,EACvCzC,EAAM,MAAM,MAAMZ,EAAK,CACzB,OAAQ,OACR,QAAAG,EACA,KAAMoD,GAAkBN,EAAU,SAAA,EAClC,YAAa,SAAA,CAChB,EACD,GAAIrC,EAAI,GAAI,CACR,MAAMjC,EAAS,MAAMiC,EAAI,KAAA,EACzB,YAAK,OAAO,MAAM,CAAE,YAAejC,EAAQ,EACpCA,CACX,CACA,MAAO,CACH,KAAMiC,EAAI,OACV,QAAS,GACT,IAAKA,EAAI,UAAA,CAEjB,OAAS0C,EAAG,CACR,MAAO,CACH,KAAM,IACN,QAAS,GACT,IAAKA,GAAG,YAAc,mBAAA,CAE9B,CACJ,CAGA,MAAM,OAAO,CAAE,IAAAtD,EAAK,KAAAQ,EAAM,MAAA0C,GAAgH,CACtI1C,EAAOA,EAAO,CAAE,GAAGA,CAAA,EAAS,CAAA,EAC5B,MAAM+C,EAAS/C,EAAK,QAAU,OACxBgD,EAAWhD,EAAK,UAAY,OAC9B+C,GACA,OAAO/C,EAAK,OAEZgD,GACA,OAAOhD,EAAK,SAEhB,MAAMN,EAAS,KAAK,kBAAkBM,CAAI,EACpCyC,EAAY,KAAK,oBAAoB/C,CAAM,EAE3CC,EAAU,MAAM,KAAK,eAAe,CAAE,UAAa8C,EAAW,MAASC,EAAO,EAChFK,GAAUC,IACVrD,EAAQ,cAAc,EAAI,iCAAiCqD,CAAQ,IAEvErD,EAAQ,WAAgB,aACxBA,EAAQ,mBAAmB,EAAI,KAC/BA,EAAQ,eAAe,EAAI,WAC3B,MAAMkD,EAAM,KAAK,UAAUrD,CAAG,EAC9B,GAAI,CACA,MAAMA,EAAMuD,EAAS,GAAGF,CAAG,IAAIJ,CAAS,GAAKI,EACvCN,EAAU,CACZ,OAAU,SACV,IAAOM,EACP,QAAWlD,EACX,OAASD,CAAA,EAGb,KAAK,OAAO,KAAK6C,CAAO,EACxB,MAAMnC,EAAM,MAAM,MAAMZ,EAAK,CACzB,OAAQ,OACR,QAAAG,EACA,KAAMoD,GAAkBN,EAAU,SAAA,EAClC,YAAa,SAAA,CAChB,EAED,GAAI,CAACrC,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,OAAS0C,EAAG,CACR,MAAMA,CACV,CACJ,CAEA,YAAYG,EAAwC,CAChD,MAAMC,EAAWD,EAAQ,IAAInE,EAAa,IAAI,GAAG,MACjD,OAAIoE,GAAYA,EAAS,OAAS,EACvB,KAAK,MAAMA,CAAQ,EAEvB,IACX,CAEA,SAASD,EAAsC,CAC3C,MAAMC,EAAWD,EAAQ,IAAI,MAAM,GAAG,MACtC,IAAIT,EAAW,GACXW,EAAQ,KAAK,SACjB,GAAID,GAAYA,EAAS,OAAS,EAAG,CACjC,MAAME,EAAO,KAAK,MAAMF,CAAQ,EAChCV,EAAWY,EAAK,SAChBD,EAAQC,EAAK,SAAS,SAAA,CAC1B,CACA,MAAO,CACH,SAAAZ,EACA,MAAAW,EACA,MAAOF,EAAQ,IAAInE,EAAa,KAAK,GAAG,OAAS,EAAA,CAEzD,CAEA,kBAAqBmE,GAA6C,CAC9D,MAAMC,EAAWD,EAAQ,IAAI,MAAM,GAAG,MACtC,IAAIT,EAAW,GACXW,EAAQ,KAAK,SACjB,GAAID,GAAYA,EAAS,OAAS,EAAG,CACjC,MAAME,EAAO,KAAK,MAAMF,CAAQ,EAChCV,EAAWY,EAAK,SAChBD,EAAQC,EAAK,SAAS,SAAA,CAC1B,CACA,MAAO,CACH,SAAAZ,EACA,MAAAW,EACA,MAAOF,EAAQ,IAAInE,EAAa,KAAK,GAAG,OAAS,EAAA,CAEzD,EAGA,SAASkB,EAAgEF,EAA4C,CACjH,KAAM,CAAE,GAAAuD,EAAI,KAAAC,EAAM,SAAAd,EAAU,SAAAe,EAAU,IAAAC,EAAK,QAAAC,EAAS,MAAAf,EAAO,cAAAgB,EAAe,aAAAC,EAAc,SAAAtE,EAAU,SAAA0B,EAAU,cAAA6C,GAAkB5D,EACxH6D,EAAkB,CACpB,GAAAR,EACA,KAAAC,EACA,SAAAd,EACA,SAAAe,EACA,IAAAC,EACA,QAAAC,EACA,cAAAC,EACA,aAAAC,EACA,SAAAtE,EACA,SAAA0B,EACA,OAAQ,EACR,YAAa,EACb,QAAS,GACT,SAAU,EACV,aAAc,GACd,aAAc,GACd,WAAY,GACZ,cAAA6C,CAAA,EAEJ,OAAA9D,EAAS,QAAQ,IAAIhB,EAAa,MAAO4D,EAAO,CAC5C,SAAU,GACV,OAAQ,CAAC,KAAK,SACd,SAAU,SACV,KAAM,GAAA,CACT,EACD5C,EAAS,QAAQ,IAAIhB,EAAa,KAAM,KAAK,UAAU+E,CAAS,CAAC,EAC1D/D,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"}
@@ -24,7 +24,7 @@ export declare class HttpClient {
24
24
  private readonly websiteNo?;
25
25
  private readonly _isDebug;
26
26
  private readonly logger;
27
- constructor({ deviceId, lang, websiteId, websiteNo, userType }: Readonly<HttpClientOpts>);
27
+ constructor({ deviceId, lang, websiteId, websiteNo, userType, helloURL, appName }: Readonly<HttpClientOpts>);
28
28
  isDebug(): boolean;
29
29
  encrypt(data: string): string;
30
30
  decrypt(data: string): string;
@@ -12,6 +12,8 @@ export type HttpClientOpts = {
12
12
  "websiteId"?: string;
13
13
  "websiteNo"?: string;
14
14
  "userType"?: USER_TYPE;
15
+ "helloURL"?: string;
16
+ "appName"?: string;
15
17
  };
16
18
  export type HttpHeaderNames = 'Device-Id' | 'Website-Id' | 'Website-No' | 'Lang';
17
19
  export type HttpHeaders = {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "iboot-http-client",
3
3
  "private": false,
4
- "version": "1.0.5",
4
+ "version": "1.0.6",
5
5
  "description": "iBoot.xin 相关应用的客户端Http封装",
6
6
  "type": "module",
7
7
  "main": "./dist/iboot-http-client.cjs.js",