iboot-http-client 1.0.4 → 1.0.5

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",I="_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(I),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(I,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}},_=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 _(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 _(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.helloIboot.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=I;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=_;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},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;
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.helloIboot.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":"mJAAaA,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,EAEaC,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,GAAsC,CACtF,KAAK,QAAU,QAAQ,IAAI,UAAY,GACvC,KAAK,YAAc,QAAQ,IAAI,WAAa,GAC5C,KAAK,OAAS,QAAQ,IAAI,SAAW,GACrC,KAAK,SAAWA,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,OAASK,EAAK,CACf,KAAM,QACN,MAAO,KAAK,SAAW,QAAU,OACjC,UAAW,SAAA,CACd,CACL,CAEA,SAAU,CACN,OAAO,KAAK,QAChB,CAEA,QAAQhB,EAAc,CAClB,MAAMiB,EAAMC,EAAS,IAAI,KAAK,MAAM,KAAK,MAAM,EAC/C,OAAOA,EAAS,IAAI,QAAQlB,EAAMiB,CAAG,EAAE,SAAA,CAC3C,CAEA,QAAQjB,EAAc,CAClB,MAAMiB,EAAMC,EAAS,IAAI,KAAK,MAAM,KAAK,MAAM,EAC/C,OAAOA,EAAS,IAAI,QAAQlB,EAAMiB,EAAK,CACnC,KAAMC,EAAS,KAAK,GAAA,CACvB,EAAE,SAASA,EAAS,IAAI,IAAI,CACjC,CAEA,aAAc,CACV,OAAO,KAAK,QAChB,CAGQ,oBAAoBlB,EAAmC,CAC3D,MAAMmB,EAAc,CAAA,EACpB,UAAWC,KAAKpB,EAAM,CAClB,IAAIqB,EAAIrB,EAAKoB,CAAC,EACd,GAAIC,GAAK,OAAOA,GAAM,SAClBA,EAAIA,EAAE,KAAA,UACCA,GAAK,OAAOA,GAAM,SAAU,CACnC,GAAI9D,EAAQ8D,CAAC,EAAG,CACZ,GAAIA,EAAE,SAAW,EACb,SAEJ,QAAStD,EAAI,EAAGA,EAAIsD,EAAE,OAAQtD,IAAK,CAC/B,MAAMuD,EAAWD,EAAEtD,CAAC,EACpB,UAAWwD,KAAcD,EAAU,CAC/B,MAAME,EAAmBF,EAASC,CAAU,GAAK,OACjD,GAAIC,GACA,GAAI,OAAOA,GAAqB,SACxBjE,EAAQiE,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,IAAI7D,EAAE,SAAA,CAAU,KAAKwD,EAAa,IAAIG,EAAM,SAAA,CAAU,KAAKC,CAAC,EAAE,IAAIrD,EAAU+C,CAAC,CAAC,GACxFF,EAAE,KAAKC,EAAIQ,CAAC,CAChB,CACJ,CAER,CAAC,UAEEJ,EAAiB,SAAA,EAAW,OAAS,EAAG,CAC/C,MAAMI,EAAI,IAAI7D,EAAE,SAAA,CAAU,KAAKwD,CAAU,IAAIjD,EAAUkD,EAAiB,SAAA,CAAU,CAAC,GACnFL,EAAE,KAAKC,EAAIQ,CAAC,CAChB,EAER,CACJ,CACJ,KACI,WAAWpE,KAAO6D,EAAG,CACjB,MAAMQ,EAASR,EAAE7D,CAAG,EACpB,GAAIqE,GAAU,MAAQA,GAAU,IAAMA,EAAO,QAAU,EAAG,CACtD,MAAMD,EAAI,IAAIpE,CAAG,IAAIc,EAAUuD,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,IAAM9C,EAAU+C,CAAC,CAAC,CAErC,CACA,OAAQF,GAAKA,EAAE,KAAK,GAAG,CAC3B,CAEA,MAAc,KAAKnB,EAAwD,CAEvE,MAAM8B,EAAU,QAAW,MAAM,KAAK,WAAA,EAChCzD,EAAgB,CAAA,EACtB,UAAW+C,KAAKpB,EACZ3B,EAAI,KAAK+C,CAAC,EAEd/C,EAAI,KAAK,CAAC0D,EAAWC,IACVD,EAAE,YAAA,EAAc,cAAcC,EAAE,aAAa,CACvD,EACD,MAAM5B,EAAgB,CAAA,EACtB/B,EAAI,QAASgD,GAAc,CACvB,IAAI9C,EAAyByB,EAAKqB,CAAC,EAC/B,OAAO9C,GAAU,WACjBA,EAAQ,KAAK,UAAUA,CAAK,GAEhC6B,EAAI,KAAKiB,EAAI,IAAM9C,CAAK,CAC5B,CAAC,EACD,MAAM0D,EAAoB7B,EAAI,KAAK,GAAG,EAChC8B,EAAMC,EAAI,KAAKF,EAAYH,GAAS,mBAAmB,EACvDM,EAAU,CACZ,OAAQH,EACR,IAAKC,CAAA,EAET,YAAK,OAAO,MAAME,CAAO,EAClBF,CACX,CAGQ,kBAAkBlC,EAA4BqC,EAAwC,CAC1F,MAAM3C,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,OACpB2C,GAAYA,EAAS,OAAS,IAC9B3C,EAAO,SAAc2C,GAElB3C,CACX,CAEA,MAAc,eAAe,CAAE,UAAA4C,EAAW,MAAAC,GAAuE,CAC7G,MAAMC,EAA4B,CAC9B,eAAgB,oCAChB,WAAY,OACZ,YAAa,KAAK,SAClB,YAAaD,GAAO,MAAM,YAAc,KAAK,SAAS,SAAA,EACtD,YAAa,KAAK,SAClB,UAAW,KAAK,MAAA,EAEhB,KAAK,MAAQ,KAAK,KAAK,OAAS,IAChCC,EAAE,KAAU,KAAK,MAEjB,KAAK,WAAa,KAAK,UAAU,OAAS,IAC1CA,EAAE,QAAQ,EAAI,KAAK,WAEnB,KAAK,WAAa,KAAK,UAAU,OAAS,IAC1CA,EAAE,QAAQ,EAAI,KAAK,WAEnBD,IACIA,EAAM,OAASA,EAAM,MAAM,OAAS,GAAKA,EAAM,UAAYA,EAAM,SAAS,OAAS,IACnFC,EAAE,cAAmBD,EAAM,MAC3BC,EAAE,SAAcD,EAAM,UAEtBA,EAAM,QACNC,EAAED,EAAM,MAAM,UAAU,EAAIA,EAAM,MAAM,YAGhD,MAAMvC,EAAOhC,EAAesE,CAAS,EAC/BG,EAAO,MAAM,KAAK,KAAKzC,CAAI,EACjC,OAAAwC,EAAE,KAAUC,EACLD,CACX,CAEA,MAAc,YAA8B,CACxC,GAAI,KAAK,WAAW,SAAW,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,MAAMhC,EAAM,MAAM,MAAMsC,EAAK,CACzB,OAAQ,MACR,QAASF,EACT,YAAa,UACb,MAAO,aAAA,CACV,EACD,GAAIpC,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,MAAAuC,GAAsH,CAC5I,MAAM7C,EAAS,KAAK,kBAAkBM,CAAI,EACpCsC,EAAY,KAAK,oBAAoB5C,CAAM,EAC3CC,EAAU,MAAM,KAAK,eAAe,CAAE,UAAa2C,EAAW,MAASC,EAAO,EAC9EG,EAAM,GAAG,KAAK,UAAUlD,CAAG,CAAC,IAAI8C,EAAU,SAAA,CAAU,GACpDF,EAAU,CACZ,OAAU,MACV,IAAOM,EACP,QAAW/C,CAAA,EAEf,KAAK,OAAO,KAAKyC,CAAO,EACxB,GAAI,CACA,MAAMhC,EAAM,MAAM,MAAMsC,EAAK,CACzB,OAAQ,MACR,QAAA/C,EACA,YAAa,UACb,MAAO,aAAA,CACV,EAED,GAAIS,EAAI,GAAI,CACR,MAAMjC,EAAS,MAAMiC,EAAI,KAAA,EACzB,YAAK,OAAO,MAAM,CAAE,OAAQjC,EAAO,KAAM,EAClCA,CACX,CACA,MAAO,CACH,KAAMiC,EAAI,OACV,QAAS,GACT,IAAKA,EAAI,UAAA,CAEjB,OAASuC,EAAG,CACR,MAAO,CACH,KAAM,IACN,QAAS,GACT,IAAKA,GAAG,YAAc,mBAAA,CAE9B,CACJ,CAGA,MAAM,KAAQ,CAAE,IAAAnD,EAAK,KAAAQ,EAAM,MAAAuC,GAAsH,CAC7IvC,EAAOA,EAAO,CAAE,GAAGA,CAAA,EAAS,CAAA,EAC5B,MAAM4C,EAAS5C,EAAK,QAAU,OACxB6C,EAAW7C,EAAK,UAAY,OAC9B4C,GACA,OAAO5C,EAAK,OAEZ6C,GACA,OAAO7C,EAAK,SAEhB,MAAMN,EAAS,KAAK,kBAAkBM,CAAI,EACpCsC,EAAY,KAAK,oBAAoB5C,CAAM,EAC3CC,EAAU,MAAM,KAAK,eAAe,CAAE,UAAa2C,EAAW,MAASC,EAAO,EAChFK,GAAUC,IACVlD,EAAQ,cAAc,EAAI,iCAAiCkD,CAAQ,IAEvE,MAAMH,EAAM,KAAK,UAAUlD,CAAG,EACxB4C,EAAU,CACZ,OAAU,OACV,IAAOM,EACP,QAAW/C,CAAA,EAEf,KAAK,OAAO,KAAKyC,CAAO,EACxB,GAAI,CACA,MAAM5C,EAAMoD,EAAS,GAAGF,CAAG,IAAIJ,CAAS,GAAKI,EACvCtC,EAAM,MAAM,MAAMZ,EAAK,CACzB,OAAQ,OACR,QAAAG,EACA,KAAMiD,GAAkBN,EAAU,SAAA,EAClC,YAAa,SAAA,CAChB,EACD,GAAIlC,EAAI,GAAI,CACR,MAAMjC,EAAS,MAAMiC,EAAI,KAAA,EACzB,YAAK,OAAO,MAAM,CAAE,OAAQjC,EAAO,KAAM,EAClCA,CACX,CACA,MAAO,CACH,KAAMiC,EAAI,OACV,QAAS,GACT,IAAKA,EAAI,UAAA,CAEjB,OAASuC,EAAG,CACR,MAAO,CACH,KAAM,IACN,QAAS,GACT,IAAKA,GAAG,YAAc,mBAAA,CAE9B,CACJ,CAGA,MAAM,OAAO,CAAE,IAAAnD,EAAK,KAAAQ,EAAM,MAAAuC,GAAgH,CACtIvC,EAAOA,EAAO,CAAE,GAAGA,CAAA,EAAS,CAAA,EAC5B,MAAM4C,EAAS5C,EAAK,QAAU,OACxB6C,EAAW7C,EAAK,UAAY,OAC9B4C,GACA,OAAO5C,EAAK,OAEZ6C,GACA,OAAO7C,EAAK,SAEhB,MAAMN,EAAS,KAAK,kBAAkBM,CAAI,EACpCsC,EAAY,KAAK,oBAAoB5C,CAAM,EAE3CC,EAAU,MAAM,KAAK,eAAe,CAAE,UAAa2C,EAAW,MAASC,EAAO,EAChFK,GAAUC,IACVlD,EAAQ,cAAc,EAAI,iCAAiCkD,CAAQ,IAEvElD,EAAQ,WAAgB,aACxBA,EAAQ,mBAAmB,EAAI,KAC/BA,EAAQ,eAAe,EAAI,WAC3B,MAAM+C,EAAM,KAAK,UAAUlD,CAAG,EAC9B,GAAI,CACA,MAAMA,EAAMoD,EAAS,GAAGF,CAAG,IAAIJ,CAAS,GAAKI,EACvCN,EAAU,CACZ,OAAU,OACV,IAAOM,EACP,QAAW/C,CAAA,EAGf,KAAK,OAAO,KAAKyC,CAAO,EACxB,MAAMhC,EAAM,MAAM,MAAMZ,EAAK,CACzB,OAAQ,OACR,QAAAG,EACA,KAAMiD,GAAkBN,EAAU,SAAA,EAClC,YAAa,SAAA,CAChB,EAED,GAAI,CAAClC,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,OAASuC,EAAG,CACR,MAAMA,CACV,CACJ,CAEA,YAAYG,EAAwC,CAChD,MAAMC,EAAWD,EAAQ,IAAIhE,EAAa,IAAI,GAAG,MACjD,OAAIiE,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,IAAIhE,EAAa,KAAK,GAAG,OAAS,EAAA,CAEzD,CAEA,kBAAqBgE,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,IAAIhE,EAAa,KAAK,GAAG,OAAS,EAAA,CAEzD,EAGA,SAASkB,EAAgEF,EAA4C,CACjH,KAAM,CAAE,GAAAoD,EAAI,KAAAC,EAAM,SAAAd,EAAU,SAAAe,EAAU,IAAAC,EAAK,QAAAC,EAAS,MAAAf,EAAO,cAAAgB,EAAe,aAAAC,EAAc,SAAAnE,EAAU,SAAA0B,EAAU,cAAA0C,GAAkBzD,EACxH0D,EAAkB,CACpB,GAAAR,EACA,KAAAC,EACA,SAAAd,EACA,SAAAe,EACA,IAAAC,EACA,QAAAC,EACA,cAAAC,EACA,aAAAC,EACA,SAAAnE,EACA,SAAA0B,EACA,OAAQ,EACR,YAAa,EACb,QAAS,GACT,SAAU,EACV,aAAc,GACd,aAAc,GACd,WAAY,GACZ,cAAA0C,CAAA,EAEJ,OAAA3D,EAAS,QAAQ,IAAIhB,EAAa,MAAOyD,EAAO,CAC5C,SAAU,GACV,OAAQ,CAAC,KAAK,SACd,SAAU,SACV,KAAM,GAAA,CACT,EACDzC,EAAS,QAAQ,IAAIhB,EAAa,KAAM,KAAK,UAAU4E,CAAS,CAAC,EAC1D5D,CACX,CAEA,WAAWA,EAA4C,CACnD,OAAAA,EAAS,QAAQ,IAAIhB,EAAa,MAAO,GAAI,CACzC,OAAQ,GACR,SAAU,GACV,KAAM,GAAA,CACT,EACDgB,EAAS,QAAQ,IAAIhB,EAAa,KAAM,GAAI,CACxC,OAAQ,GACR,SAAU,GACV,KAAM,GAAA,CACT,EACDgB,EAAS,QAAQ,OAAOhB,EAAa,KAAK,EAC1CgB,EAAS,QAAQ,OAAOhB,EAAa,IAAI,EAClCgB,CACX,CACJ"}
1
+ {"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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"}
@@ -237,7 +237,7 @@ class J {
237
237
  return r.Sign = o, r;
238
238
  }
239
239
  async helloIboot() {
240
- if (this.helloIboot.length === 0)
240
+ if (this.helloMethod.length <= 0)
241
241
  return this.apiKey;
242
242
  const t = this.getApiUrl(this.helloMethod), e = {
243
243
  "Content-Type": "application/x-www-form-urlencoded",
@@ -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.helloIboot.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\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,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",I="_device_id_key",_="_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(I)??"",t=localStorage.getItem(_),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(I,o),t&&localStorage.setItem(_,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.helloIboot.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=_,l.DEFAULT_LOCALE=P,l.DEVICE_ID_KEY=I,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(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"})}));
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.helloIboot.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\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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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "iboot-http-client",
3
3
  "private": false,
4
- "version": "1.0.4",
4
+ "version": "1.0.5",
5
5
  "description": "iBoot.xin 相关应用的客户端Http封装",
6
6
  "type": "module",
7
7
  "main": "./dist/iboot-http-client.cjs.js",