iboot-http-client 1.1.1 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const M=require("pino"),D=require("pino-pretty"),L=require("js-md5"),E=require("crypto-js"),k={GENERAL:0,PHONE:1,EMAIL:2},C={TYPE_MGT:0,TYPE_C:1,TYPE_B:2},B={FROM_WEB:1,FROM_PC:2,FROM_WX_MINI_PRO:3,FROM_WX_PLU:4,FROM_WX_E:5,FROM_APP:6,FROM_DEVICE:7},x={unknown:0,male:1,female:2},H=D({colorize:!0,destination:process.stdout,translateTime:"SYS:yyyy-mm-dd HH:MM:ss",ignore:"pid,hostname",messageFormat:"{msg}",singleLine:!0}),u=M({name:process.env.APP_NAME??"iBoot",level:process.env.NODE_ENV!=="production"?"debug":"info",nestedKey:"payload"},H),_=o=>Array.isArray(o)||typeof o=="object"&&Object.prototype.toString.call(o)==="[object Array]",I=o=>{const t=o||32,e="ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",s=e.length;let r="";for(let n=0;n<t;n++)r+=e.charAt(Math.floor(Math.random()*s));return r},A=(o,t)=>{const e={};return o.split("&").forEach(r=>{const n=r.split("=");n[1]&&(!t||t.indexOf(n[0])==-1)&&(e[n[0]]=n[1])}),e},y=o=>!o||o==""||o.length==0?"":encodeURIComponent(o).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\'/g,"%27").replace(/\!/g,"%21").replace(/\~/g,"%7E"),W=(o,t)=>{const e={"M+":o.getMonth()+1,"d+":o.getDate(),"h+":o.getHours(),"m+":o.getMinutes(),"s+":o.getSeconds(),"q+":Math.floor((o.getMonth()+3)/3),S:o.getMilliseconds()};if(/(y+)/.test(t)){const r=new RegExp(/(y+)/).exec(t);let n=0;r&&r.length>0&&(n=r[0].length),t=t.replace(/(y+)/,o.getFullYear()+"").substring(4-n)}for(const s in e){const r="("+s+")",n=new RegExp(r);if(n.test(t)){const i=n.exec(t);let c=0;i&&i.length>0&&(c=i[0].length),t=t.replace(n,c==1?e[s].toString():("00"+e[s]).substring(e[s].toString().length))}}return t},R="zh-CN",O="_device_id_key",w="_current_website_key",v="Get request error!",S="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"},N=()=>{const o=localStorage.getItem(O)??"",t=localStorage.getItem(w),e=t!=null?JSON.parse(t):null,s={};return o.length>0&&(s["Device-Id"]=o),e&&(s.Lang=e.language,e.websiteId&&(s["Website-Id"]=e.websiteId),e.websiteNo&&(s["Website-No"]=e.websiteNo)),s},$=(o,t)=>{localStorage.setItem(O,o),t&&localStorage.setItem(w,JSON.stringify(t))},U=async(o,t)=>{if(t?.data){const i=new URLSearchParams(t.data);o.indexOf("?")!=-1?o+=`&${i}`:o+=`?${i}`}const e=N(),s=t?.headers;if(s)for(const i in s){const c=s[i];c&&(e[i]=c)}u.debug({url:o,headers:e},"GET");const r=await fetch(o,{method:"GET",headers:e,cache:t?.useCache?"force-cache":"default"});if(r.ok){const i=await r.json();return u.debug(i,"GET_RESULT"),i}const n={code:r.status,success:!1,msg:r.statusText};return u.error(n),n},P=async(o,t)=>{const e=t?.data??{},s=t?.headers;let r;const n=new Headers(N());if(e instanceof FormData?r=e:(r=JSON.stringify(e),n.set("Content-Type","application/json")),s)for(let a in s){const l=s[a];l&&n.set(a,l)}u.debug({url:o,headers:n},"POST");const i=await fetch(o,{method:"POST",headers:n,body:r});if(i.ok){const a=await i.json();return u.debug(a,"POST_RESULT"),a}const c={code:i.status,success:!1,msg:i.statusText};return u.error(c),c},F=async(o,t)=>{const e=await U(o,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??v);return}throw Error(e.msg??v)},j=async(o,t)=>{const e=await P(o,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??S);return}throw Error(e.msg??S)},K=async(o,t)=>{const e=await P(o,t);return e.success?(t?.showSuccess&&t.showSuccess(e.msg??"SUCCESS"),!0):(t?.showError&&t.showError(e.msg??S),!1)},G=o=>{const t=o.headers.get(b["Device-Id"]),e=o.headers.get(b.Lang),s=o.headers.get(b["Website-Id"]),r=o.headers.get(b["Website-No"]),n={};return t&&t.length>0&&(n.deviceId=t),e&&e.length>0&&(n.lang=e),s&&s.length>0&&(n.websiteId=s),r&&r.length>0&&(n.websiteNo=r),n},Y=o=>{const t={},e=o.get(d.IBOOT_DEVICE_ID)?.value,s=o.get(d.IBOOT_LOCALE)?.value,r=o.get(d.IBOOT_WEBSITE_ID)?.value,n=o.get(d.IBOOT_WEBSITE_NO)?.value;return e&&e.length>0&&(t.deviceId=e),s&&s.length>0&&(t.lang=s),r&&r.length>0&&(t.websiteId=r),n&&n.length>0&&(t.websiteNo=n),t};class J{baseUrl;helloMethod;apiKey;userType;userFrom;deviceId;version="1";lang;websiteId;websiteNo;_isDebug;constructor({deviceId:t,lang:e,websiteId:s,websiteNo:r,userType:n,helloURL:i}){this.baseUrl=process.env.BASE_URL??"",this.helloMethod=i??"",this.apiKey=process.env.API_KEY??"",this.userType=n??C.TYPE_MGT,this.userFrom=process.env.USER_FROM||"1",this.deviceId=t??I(10),this.lang=e??R,this.websiteId=s,this.websiteNo=r,this._isDebug=process.env.NODE_ENV!="production"}isDebug(){return this._isDebug}encrypt(t){const e=E.enc.Utf8.parse(this.apiKey);return E.AES.encrypt(t,e).toString()}decrypt(t){const e=E.enc.Utf8.parse(this.apiKey);return E.AES.decrypt(t,e,{mode:E.mode.ECB}).toString(E.enc.Utf8)}getDeviceId(){return this.deviceId}convertUrlParameter(t){const e=[];for(const s in t){let r=t[s];if(r&&typeof r=="string")r=r.trim();else if(r&&typeof r=="object"){if(_(r)){if(r.length===0)continue;for(let n=0;n<r.length;n++){const i=r[n];for(const c in i){const a=i[c]??void 0;if(a){if(typeof a=="object")_(a)&&a.forEach((l,h)=>{if(l)for(const f in l){const g=l[f];if(g&&g.toString().length>0){const p=`[${n.toString()}].${c+`[${h.toString()}].${f}`}=${y(g)}`;e.push(s+p)}}});else if(a.toString().length>0){const l=`[${n.toString()}].${c}=${y(a.toString())}`;e.push(s+l)}}}}}else for(const n in r){const i=r[n];if(i!=null&&i!=""&&i.length!=0){const c=`.${n}=${y(i)}`;e.push(s+c)}}continue}else r&&typeof r=="function"&&(r=null);r!=null&&r!=""&&r.length!=0&&e.push(s+"="+y(r))}return e&&e.join("&")}async sign(t){const e="&key="+await this.helloIboot(),s=[];for(const a in t)s.push(a);s.sort((a,l)=>a.toLowerCase().localeCompare(l.toLowerCase()));const r=[];s.forEach(a=>{let l=t[a];typeof l=="object"&&(l=JSON.stringify(l)),r.push(a+"="+l)});const n=r.join("&"),i=L.md5((n+e).toLocaleUpperCase()),c={params:n,md5:i};return u.debug(c,"API_SIGN"),i}assemblyParameter(t,e){const s=t??{};return s.timestamp=Date.now()+"",s.echostr=I(10),s.version=this.version,s.deviceId=this.deviceId,s.webid=this.websiteId,s.apiKey=this.apiKey,e&&e.length>0&&(s.username=e),s}async assemblyHeader({urlParams:t,token:e}){const s={"Content-Type":"application/x-www-form-urlencoded","Res-Type":"json","Device-Id":this.deviceId,"User-Type":e?.utype.toString()??this.userType.toString(),"User-From":this.userFrom,"Api-Key":this.apiKey};this.lang&&this.lang.length>0&&(s.Lang=this.lang),this.websiteId&&this.websiteId.length>0&&(s["Web-Id"]=this.websiteId),this.websiteNo&&this.websiteNo.length>0&&(s["Web-No"]=this.websiteNo),e&&(e.token&&e.token.length>0&&e.username&&e.username.length>0&&(s.Authorization=e.token,s.Username=e.username),e.xcsrf&&(s[e.xcsrf.csrfHeader]=e.xcsrf.csrfToken));const r=A(t),n=await this.sign(r);return s.Sign=n,s}async helloIboot(){if(this.helloMethod.length<=0)return this.apiKey;const t=this.getApiUrl(this.helloMethod),e={"Content-Type":"application/x-www-form-urlencoded","Res-Type":"json","Api-Key":this.apiKey},s={url:t,headers:e};u.debug(s,"HELLO");const r=await fetch(t,{method:"GET",headers:e,credentials:"include",cache:"force-cache"});if(r.ok){const n=await r.json();return u.debug(n.data,"HELLO RESULT"),n.data}throw new Error("hello iBoot error!")}getApiUrl(t){return`${this.baseUrl}/${t}`}async csrf(){const t=await this.get({url:"guest/csrf"});if(t.success){const e=t.data;if(e)return e.csrfToken.toString()}}async get({url:t,data:e,token:s,cache:r="default"}){const n=this.assemblyParameter(e),i=this.convertUrlParameter(n),c=await this.assemblyHeader({urlParams:i,token:s}),a=`${this.getApiUrl(t)}?${i.toString()}`,l={url:a,headers:c};u.info(l,"GET");const h=await fetch(a,{method:"GET",headers:c,credentials:"include",cache:r});if(h.ok){const g=await h.json();return u.debug(g,"GET_RESULT"),g}const f={code:h.status,success:!1,msg:h.statusText};return u.error(f),f}async post({url:t,data:e,token:s,cache:r="default"}){e=e?{...e}:{};const n=e.buffer??void 0,i=e.boundary??void 0;n&&delete e.buffer,i&&delete e.boundary;const c=this.assemblyParameter(e),a=this.convertUrlParameter(c),l=await this.assemblyHeader({urlParams:a,token:s});n&&i&&(l["Content-Type"]=`multipart/form-data; boundary=${i}`);const h=this.getApiUrl(t),f={url:h,headers:l,params:c};u.info(f,"POST");const g=n?`${h}?${a}`:h,p=await fetch(g,{method:"POST",headers:l,body:n||a.toString(),credentials:"include",cache:r});if(p.ok){const T=await p.json();return u.debug(T,"POST_RESULT"),T}const m={code:p.status,success:!1,msg:p.statusText};return u.error(m),m}async stream({url:t,data:e,token:s}){e=e?{...e}:{};const r=e.buffer??void 0,n=e.boundary??void 0;r&&delete e.buffer,n&&delete e.boundary;const i=this.assemblyParameter(e),c=this.convertUrlParameter(i),a=await this.assemblyHeader({urlParams:c,token:s});r&&n&&(a["Content-Type"]=`multipart/form-data; boundary=${n}`),a.Connection="keep-alive",a["X-Accel-Buffering"]="no",a["Cache-Control"]="no-cache";const l=this.getApiUrl(t);try{const h=r?`${l}?${c}`:l,f={url:l,headers:a,params:i};u.info(f,"STREAM");const g=await fetch(h,{method:"POST",headers:a,body:r||c.toString(),credentials:"include"});if(!g.ok)throw new Error(`HTTP error! status: ${g.status}`);if(!g.body)throw new Error("No response body");return new Response(g.body,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}catch(h){throw h}}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 s="",r=this.userType;if(e&&e.length>0){const n=JSON.parse(e);s=n.username,r=n.userType.toString()}return{username:s,utype:r,token:t.get(d.token)?.value??""}}getTokenByCookies=t=>{const e=t.get("user")?.value;let s="",r=this.userType;if(e&&e.length>0){const n=JSON.parse(e);s=n.username,r=n.userType.toString()}return{username:s,utype:r,token:t.get(d.token)?.value??""}};setToken(t,e){const{id:s,name:r,username:n,nickname:i,sex:c,headImg:a,token:l,lastLoginTime:h,tokenExpired:f,deviceId:g,userType:p,mustChangePwd:m}=t,T={id:s,name:r,username:n,nickname:i,sex:c,headImg:a,lastLoginTime:h,tokenExpired:f,deviceId:g,userType:p,status:0,accountType:0,enabled:!1,userFrom:1,needToReview:!1,socketOnline:!1,createTime:"",mustChangePwd:m};return e.cookies.set(d.token,l,{httpOnly:!0,secure:!this._isDebug,sameSite:"strict",path:"/"}),e.cookies.set(d.user,JSON.stringify(T)),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}}exports.ACCOUNT_TYPE_MAP=k;exports.CURRENT_WEBSITE_KEY=w;exports.DEFAULT_LOCALE=R;exports.DEVICE_ID_KEY=O;exports.HttpClient=J;exports.USER_FORM_MAP=B;exports.USER_SEX_MAP=x;exports.USER_TYPE_MAP=C;exports.dateFormat=W;exports.get=U;exports.getHttpClientOpts=G;exports.getHttpClientOptsByCookie=Y;exports.iGet=F;exports.iPost=j;exports.iPostSuccess=K;exports.isArray=_;exports.logger=u;exports.post=P;exports.randomString=I;exports.setDefaultRequestHeader=$;exports.urlEncode=y;exports.urlParamToJson=A;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const M=require("pino"),L=require("pino-pretty"),k=require("js-md5"),E=require("crypto-js"),B={GENERAL:0,PHONE:1,EMAIL:2},A={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},x={unknown:0,male:1,female:2},H=L({colorize:!0,destination:process.stdout,translateTime:"SYS:yyyy-mm-dd HH:MM:ss",ignore:"pid,hostname",messageFormat:"{msg}",singleLine:!0}),u=M({name:process.env.APP_NAME??"iBoot",level:process.env.APP_ENV==="production"?"info":"debug",nestedKey:"payload"},H),b=o=>Array.isArray(o)||typeof o=="object"&&Object.prototype.toString.call(o)==="[object Array]",_=o=>{const t=o||32,e="ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",s=e.length;let r="";for(let n=0;n<t;n++)r+=e.charAt(Math.floor(Math.random()*s));return r},C=(o,t)=>{const e={};return o.split("&").forEach(r=>{const n=r.split("=");n[1]&&(!t||t.indexOf(n[0])==-1)&&(e[n[0]]=n[1])}),e},y=o=>!o||o==""||o.length==0?"":encodeURIComponent(o).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\'/g,"%27").replace(/\!/g,"%21").replace(/\~/g,"%7E"),W=(o,t)=>{const e={"M+":o.getMonth()+1,"d+":o.getDate(),"h+":o.getHours(),"m+":o.getMinutes(),"s+":o.getSeconds(),"q+":Math.floor((o.getMonth()+3)/3),S:o.getMilliseconds()};if(/(y+)/.test(t)){const r=new RegExp(/(y+)/).exec(t);let n=0;r&&r.length>0&&(n=r[0].length),t=t.replace(/(y+)/,o.getFullYear()+"").substring(4-n)}for(const s in e){const r="("+s+")",n=new RegExp(r);if(n.test(t)){const i=n.exec(t);let c=0;i&&i.length>0&&(c=i[0].length),t=t.replace(n,c==1?e[s].toString():("00"+e[s]).substring(e[s].toString().length))}}return t},R="zh-CN",w="_device_id_key",O="_current_website_key",v="Get request error!",S="Post request error!",I={"Device-Id":"Device-Id",Lang:"Lang","Website-Id":"Website-Id","Website-No":"Website-No"},g={IBOOT_DEVICE_ID:"IBOOT_DEVICE_ID",IBOOT_LOCALE:"IBOOT_LOCALE",IBOOT_WEBSITE_ID:"IBOOT_WEBSITE_ID",IBOOT_WEBSITE_NO:"IBOOT_WEBSITE_NO",token:"token",user:"user"},U=()=>{const o=localStorage.getItem(w)??"",t=localStorage.getItem(O),e=t!=null?JSON.parse(t):null,s={};return o.length>0&&(s["Device-Id"]=o),e&&(s.Lang=e.language,e.websiteId&&(s["Website-Id"]=e.websiteId),e.websiteNo&&(s["Website-No"]=e.websiteNo)),s},$=(o,t)=>{localStorage.setItem(w,o),t&&localStorage.setItem(O,JSON.stringify(t))},N=async(o,t)=>{if(t?.data){const i=new URLSearchParams(t.data);o.indexOf("?")!=-1?o+=`&${i}`:o+=`?${i}`}const e=U(),s=t?.headers;if(s)for(const i in s){const c=s[i];c&&(e[i]=c)}u.debug({url:o,headers:e},"GET");const r=await fetch(o,{method:"GET",headers:e,cache:t?.useCache?"force-cache":"default"});if(r.ok){const i=await r.json();return u.debug(i,"GET_RESULT"),i}const n={code:r.status,success:!1,msg:r.statusText};return u.error(n),n},P=async(o,t)=>{const e=t?.data??{},s=t?.headers;let r;const n=new Headers(U());if(e instanceof FormData?r=e:(r=JSON.stringify(e),n.set("Content-Type","application/json")),s)for(let a in s){const l=s[a];l&&n.set(a,l)}u.debug({url:o,headers:n},"POST");const i=await fetch(o,{method:"POST",headers:n,body:r});if(i.ok){const a=await i.json();return u.debug(a,"POST_RESULT"),a}const c={code:i.status,success:!1,msg:i.statusText};return u.error(c),c},F=async(o,t)=>{const e=await N(o,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??v);return}throw Error(e.msg??v)},j=async(o,t)=>{const e=await P(o,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??S);return}throw Error(e.msg??S)},K=async(o,t)=>{const e=await P(o,t);return e.success?(t?.showSuccess&&t.showSuccess(e.msg??"SUCCESS"),!0):(t?.showError&&t.showError(e.msg??S),!1)},G=o=>{const t=o.headers.get(I["Device-Id"]),e=o.headers.get(I.Lang),s=o.headers.get(I["Website-Id"]),r=o.headers.get(I["Website-No"]),n={};return t&&t.length>0&&(n.deviceId=t),e&&e.length>0&&(n.lang=e),s&&s.length>0&&(n.websiteId=s),r&&r.length>0&&(n.websiteNo=r),n},Y=o=>{const t={},e=o.get(g.IBOOT_DEVICE_ID)?.value,s=o.get(g.IBOOT_LOCALE)?.value,r=o.get(g.IBOOT_WEBSITE_ID)?.value,n=o.get(g.IBOOT_WEBSITE_NO)?.value;return e&&e.length>0&&(t.deviceId=e),s&&s.length>0&&(t.lang=s),r&&r.length>0&&(t.websiteId=r),n&&n.length>0&&(t.websiteNo=n),t};class J{baseUrl;helloMethod;apiKey;userType;userFrom;deviceId;version="1";lang;websiteId;websiteNo;isProduction;constructor(t){this.isProduction=process.env.APP_ENV==="production",this.isProduction||u.warn("This is currently a development environment!"),this.baseUrl=process.env.APP_BASEURL,this.apiKey=process.env.APP_APIKEY,this.userFrom=process.env.APP_USERFROM??"1",this.helloMethod=t.helloURL??"",this.userType=t.userType??A.TYPE_MGT,this.deviceId=t.deviceId??_(10),this.lang=t.lang??R,this.websiteId=t.websiteId,this.websiteNo=t.websiteNo}encrypt(t){const e=E.enc.Utf8.parse(this.apiKey);return E.AES.encrypt(t,e).toString()}decrypt(t){const e=E.enc.Utf8.parse(this.apiKey);return E.AES.decrypt(t,e,{mode:E.mode.ECB}).toString(E.enc.Utf8)}getDeviceId(){return this.deviceId}convertUrlParameter(t){const e=[];for(const s in t){let r=t[s];if(r&&typeof r=="string")r=r.trim();else if(r&&typeof r=="object"){if(b(r)){if(r.length===0)continue;for(let n=0;n<r.length;n++){const i=r[n];for(const c in i){const a=i[c]??void 0;if(a){if(typeof a=="object")b(a)&&a.forEach((l,h)=>{if(l)for(const f in l){const d=l[f];if(d&&d.toString().length>0){const p=`[${n.toString()}].${c+`[${h.toString()}].${f}`}=${y(d)}`;e.push(s+p)}}});else if(a.toString().length>0){const l=`[${n.toString()}].${c}=${y(a.toString())}`;e.push(s+l)}}}}}else for(const n in r){const i=r[n];if(i!=null&&i!=""&&i.length!=0){const c=`.${n}=${y(i)}`;e.push(s+c)}}continue}else r&&typeof r=="function"&&(r=null);r!=null&&r!=""&&r.length!=0&&e.push(s+"="+y(r))}return e&&e.join("&")}async sign(t){const e="&key="+await this.helloIboot(),s=[];for(const a in t)s.push(a);s.sort((a,l)=>a.toLowerCase().localeCompare(l.toLowerCase()));const r=[];s.forEach(a=>{let l=t[a];typeof l=="object"&&(l=JSON.stringify(l)),r.push(a+"="+l)});const n=r.join("&"),i=k.md5((n+e).toLocaleUpperCase()),c={params:n,md5:i};return u.debug(c,"API_SIGN"),i}assemblyParameter(t,e){const s=t??{};return s.timestamp=Date.now()+"",s.echostr=_(10),s.version=this.version,s.deviceId=this.deviceId,s.webid=this.websiteId,s.apiKey=this.apiKey,e&&e.length>0&&(s.username=e),s}async assemblyHeader({urlParams:t,token:e}){const s={"Content-Type":"application/x-www-form-urlencoded","Res-Type":"json","Device-Id":this.deviceId,"User-Type":e?.utype.toString()??this.userType.toString(),"User-From":this.userFrom,"Api-Key":this.apiKey};this.lang&&this.lang.length>0&&(s.Lang=this.lang),this.websiteId&&this.websiteId.length>0&&(s["Web-Id"]=this.websiteId),this.websiteNo&&this.websiteNo.length>0&&(s["Web-No"]=this.websiteNo),e&&(e.token&&e.token.length>0&&e.username&&e.username.length>0&&(s.Authorization=e.token,s.Username=e.username),e.xcsrf&&(s[e.xcsrf.csrfHeader]=e.xcsrf.csrfToken));const r=C(t),n=await this.sign(r);return s.Sign=n,s}async helloIboot(){if(this.helloMethod.length<=0)return this.apiKey;const t=this.getApiUrl(this.helloMethod),e={"Content-Type":"application/x-www-form-urlencoded","Res-Type":"json","Api-Key":this.apiKey},s={url:t,headers:e};u.debug(s,"HELLO");const r=await fetch(t,{method:"GET",headers:e,credentials:"include",cache:"force-cache"});if(r.ok){const n=await r.json();return u.debug(n.data,"HELLO RESULT"),n.data}throw new Error("hello iBoot error!")}getApiUrl(t){return`${this.baseUrl}/${t}`}async csrf(){const t=await this.get({url:"guest/csrf"});if(t.success){const e=t.data;if(e)return e.csrfToken.toString()}}async get({url:t,data:e,token:s,cache:r="default"}){const n=this.assemblyParameter(e),i=this.convertUrlParameter(n),c=await this.assemblyHeader({urlParams:i,token:s}),a=`${this.getApiUrl(t)}?${i.toString()}`,l={url:a,headers:c};u.info(l,"GET");const h=await fetch(a,{method:"GET",headers:c,credentials:"include",cache:r});if(h.ok){const d=await h.json();return u.debug(d,"GET_RESULT"),d}const f={code:h.status,success:!1,msg:h.statusText};return u.error(f),f}async post({url:t,data:e,token:s,cache:r="default"}){e=e?{...e}:{};const n=e.buffer??void 0,i=e.boundary??void 0;n&&delete e.buffer,i&&delete e.boundary;const c=this.assemblyParameter(e),a=this.convertUrlParameter(c),l=await this.assemblyHeader({urlParams:a,token:s});n&&i&&(l["Content-Type"]=`multipart/form-data; boundary=${i}`);const h=this.getApiUrl(t),f={url:h,headers:l,params:c};u.info(f,"POST");const d=n?`${h}?${a}`:h,p=await fetch(d,{method:"POST",headers:l,body:n||a.toString(),credentials:"include",cache:r});if(p.ok){const T=await p.json();return u.debug(T,"POST_RESULT"),T}const m={code:p.status,success:!1,msg:p.statusText};return u.error(m),m}async stream({url:t,data:e,token:s}){e=e?{...e}:{};const r=e.buffer??void 0,n=e.boundary??void 0;r&&delete e.buffer,n&&delete e.boundary;const i=this.assemblyParameter(e),c=this.convertUrlParameter(i),a=await this.assemblyHeader({urlParams:c,token:s});r&&n&&(a["Content-Type"]=`multipart/form-data; boundary=${n}`),a.Connection="keep-alive",a["X-Accel-Buffering"]="no",a["Cache-Control"]="no-cache";const l=this.getApiUrl(t);try{const h=r?`${l}?${c}`:l,f={url:l,headers:a,params:i};u.info(f,"STREAM");const d=await fetch(h,{method:"POST",headers:a,body:r||c.toString(),credentials:"include"});if(!d.ok)throw new Error(`HTTP error! status: ${d.status}`);if(!d.body)throw new Error("No response body");return new Response(d.body,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}catch(h){throw h}}getUserInfo(t){const e=t.get(g.user)?.value;return e&&e.length>0?JSON.parse(e):null}getToken(t){const e=t.get("user")?.value;let s="",r=this.userType;if(e&&e.length>0){const n=JSON.parse(e);s=n.username,r=n.userType.toString()}return{username:s,utype:r,token:t.get(g.token)?.value??""}}getTokenByCookies=t=>{const e=t.get("user")?.value;let s="",r=this.userType;if(e&&e.length>0){const n=JSON.parse(e);s=n.username,r=n.userType.toString()}return{username:s,utype:r,token:t.get(g.token)?.value??""}};setToken(t,e){const{id:s,name:r,username:n,nickname:i,sex:c,headImg:a,token:l,lastLoginTime:h,tokenExpired:f,deviceId:d,userType:p,mustChangePwd:m}=t,T={id:s,name:r,username:n,nickname:i,sex:c,headImg:a,lastLoginTime:h,tokenExpired:f,deviceId:d,userType:p,status:0,accountType:0,enabled:!1,userFrom:1,needToReview:!1,socketOnline:!1,createTime:"",mustChangePwd:m};return e.cookies.set(g.token,l,{httpOnly:!0,secure:this.isProduction,sameSite:"strict",path:"/"}),e.cookies.set(g.user,JSON.stringify(T)),e}cleanToken(t){return t.cookies.set(g.token,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.set(g.user,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.delete(g.token),t.cookies.delete(g.user),t}}exports.ACCOUNT_TYPE_MAP=B;exports.CURRENT_WEBSITE_KEY=O;exports.DEFAULT_LOCALE=R;exports.DEVICE_ID_KEY=w;exports.HttpClient=J;exports.USER_FORM_MAP=D;exports.USER_SEX_MAP=x;exports.USER_TYPE_MAP=A;exports.dateFormat=W;exports.get=N;exports.getHttpClientOpts=G;exports.getHttpClientOptsByCookie=Y;exports.iGet=F;exports.iPost=j;exports.iPostSuccess=K;exports.isArray=b;exports.logger=u;exports.post=P;exports.randomString=_;exports.setDefaultRequestHeader=$;exports.urlEncode=y;exports.urlParamToJson=C;
2
2
  //# sourceMappingURL=iboot-http-client.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"iboot-http-client.cjs.js","sources":["../src/types/user.ts","../src/logger.ts","../src/utils.ts","../src/http-client.ts"],"sourcesContent":["export const ACCOUNT_TYPE_MAP = {\r\n GENERAL : 0,\r\n PHONE : 1,\r\n EMAIL : 2\r\n}\r\n\r\nexport const USER_TYPE_MAP = {\r\n TYPE_MGT : 0,\r\n TYPE_C : 1,\r\n TYPE_B : 2\r\n}\r\n\r\nexport const USER_FORM_MAP = {\r\n FROM_WEB : 1,\r\n FROM_PC : 2,\r\n FROM_WX_MINI_PRO : 3,\r\n FROM_WX_PLU : 4,\r\n FROM_WX_E : 5,\r\n FROM_APP : 6,\r\n FROM_DEVICE : 7\r\n}\r\n\r\nexport const USER_SEX_MAP = {\r\n unknown:0,\r\n male:1,\r\n female:2,\r\n}\r\n\r\nexport type ACCOUNT_TYPE = typeof ACCOUNT_TYPE_MAP[keyof typeof ACCOUNT_TYPE_MAP];\r\nexport type USER_TYPE = typeof USER_TYPE_MAP[keyof typeof USER_TYPE_MAP];\r\nexport type USER_FORM = typeof USER_FORM_MAP[keyof typeof USER_FORM_MAP];\r\nexport type USER_SEX = typeof USER_SEX_MAP[keyof typeof USER_SEX_MAP];\r\n\r\n// User interface\r\nexport interface User {\r\n id: string;\r\n name: string;\r\n username: string;\r\n nickname: string;\r\n sex: USER_SEX;\r\n headImg: string;\r\n lastLoginTime: string;\r\n tokenExpired: string;\r\n deviceId: string;\r\n userType: USER_TYPE;\r\n status: number;\r\n accountType: number;\r\n enabled: boolean;\r\n userFrom: USER_FORM;\r\n needToReview: boolean;\r\n socketOnline: boolean;\r\n createTime: string;\r\n mustChangePwd: boolean;\r\n}","import pino from \"pino\";\r\nimport PinoPretty from \"pino-pretty\";\r\n// import koffi from 'koffi';\r\n\r\n// if (typeof window === 'undefined' && process.platform === 'win32') {\r\n// try {\r\n// const CP_UTF8 = 65001;\r\n// const kernel32 = koffi.load('Kernel32');\r\n// const setConsoleOutputCP = kernel32.func('SetConsoleOutputCP', 'bool', ['int']);\r\n// const setConsoleCP = kernel32.func('SetConsoleCP', 'bool', ['int']);\r\n// setConsoleOutputCP(CP_UTF8);\r\n// setConsoleCP(CP_UTF8);\r\n// } catch (e) {\r\n// console.log(e);\r\n// }\r\n// }\r\n\r\n// export const logger = pino({\r\n// name: process.env.APP_NAME ?? 'iBoot',\r\n// level: process.env.NODE_ENV !== 'production' ? 'debug' : 'info',\r\n// nestedKey: 'payload',\r\n// transport: {\r\n// target: 'pino-pretty',\r\n// options: {\r\n// colorize: true,\r\n// translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n// ignore: 'pid,hostname',\r\n// messageFormat: '{msg}',\r\n// singleLine: true,\r\n// },\r\n// }\r\n// });\r\n\r\nconst stream = PinoPretty({\r\n colorize: true,\r\n destination: process.stdout,\r\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n ignore: 'pid,hostname',\r\n messageFormat: '{msg}',\r\n singleLine: true,\r\n});\r\n\r\nexport const logger = pino({\r\n name: process.env.APP_NAME ?? 'iBoot',\r\n level: process.env.NODE_ENV !== 'production' ? 'debug' : 'info',\r\n nestedKey: 'payload'\r\n}, stream);","export const isArray = (obj: unknown) => {\r\n return (\r\n Array.isArray(obj) ||\r\n (typeof obj === \"object\" &&\r\n Object.prototype.toString.call(obj) === \"[object Array]\")\r\n );\r\n};\r\n\r\n/**\r\n * 生成指定长度的随机串\r\n * @param {Object} len\r\n */\r\nexport const randomString = (len: number) => {\r\n const l = len || 32;\r\n const $chars = \"ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678\";\r\n const maxPos = $chars.length;\r\n let pwd = \"\";\r\n for (let i = 0; i < l; i++) {\r\n pwd += $chars.charAt(Math.floor(Math.random() * maxPos));\r\n }\r\n return pwd;\r\n};\r\n\r\nexport const urlParamToJson = (urlQueryParams: string, exclude?: string[]): Record<string, string> => {\r\n const result: Record<string, string> = {};\r\n const strs = urlQueryParams.split(\"&\");\r\n strs.forEach((item) => {\r\n const arr = item.split(\"=\");\r\n if (arr[1]) {\r\n if (!exclude || exclude.indexOf(arr[0]) == -1) {\r\n result[arr[0]] = arr[1];\r\n }\r\n }\r\n });\r\n return result;\r\n};\r\n\r\nexport const urlEncode = (value: string | null | undefined): string => {\r\n if (!value || value == \"\" || value.length == 0) {\r\n return \"\";\r\n }\r\n return (\r\n encodeURIComponent(value)\r\n // .replace(/%20/g, '+')\r\n // .replace(/%2B/g, '\\\\+')\r\n .replace(/\\(/g, \"%28\")\r\n .replace(/\\)/g, \"%29\")\r\n .replace(/\\'/g, \"%27\")\r\n .replace(/\\!/g, \"%21\")\r\n .replace(/\\~/g, \"%7E\")\r\n );\r\n};\r\n\r\nexport const dateFormat = (dt: Date, fmt: string) => {\r\n const o:Record<string, number> = {\r\n \"M+\": dt.getMonth() + 1, //月份\r\n \"d+\": dt.getDate(), //日\r\n \"h+\": dt.getHours(), //小时\r\n \"m+\": dt.getMinutes(), //分\r\n \"s+\": dt.getSeconds(), //秒\r\n \"q+\": Math.floor((dt.getMonth() + 3) / 3), //季度\r\n S: dt.getMilliseconds(), //毫秒\r\n };\r\n if (/(y+)/.test(fmt)){\r\n const regx = new RegExp(/(y+)/);\r\n const value = regx.exec(fmt);\r\n let len = 0;\r\n if(value && value.length > 0){\r\n len = value[0].length;\r\n }\r\n fmt = fmt.replace(/(y+)/, dt.getFullYear() + \"\").substring(4 - len);\r\n }\r\n\r\n for (const k in o){\r\n const s:string = \"(\" + k + \")\";\r\n const regx = new RegExp(s);\r\n if(regx.test(fmt)){\r\n const value = regx.exec(fmt);\r\n let len = 0;\r\n if(value && value.length > 0){\r\n len = value[0].length;\r\n }\r\n fmt = fmt.replace(regx, len == 1 ? o[k].toString() : (\"00\" + o[k]).substring(o[k].toString().length))\r\n }\r\n }\r\n return fmt;\r\n}","import md5 from \"js-md5\";\r\nimport CryptoJS from 'crypto-js';\r\nimport { isArray, randomString, urlEncode, urlParamToJson } from \"./utils\";\r\nimport {\r\n ClientGetParams,\r\n ClientPostParams,\r\n CookieNames,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaderNames,\r\n HttpHeaders,\r\n HttpToken,\r\n IbootCookieStore,\r\n IbootReadonlyCookies,\r\n IbootWritableCookie,\r\n ResultModel,\r\n ServerRequestOptions\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\r\n\r\nexport const DEFAULT_LOCALE = 'zh-CN';\r\nexport const DEVICE_ID_KEY = \"_device_id_key\";\r\nexport const CURRENT_WEBSITE_KEY = \"_current_website_key\"\r\n\r\nconst _GET_ERROR = \"Get request error!\"\r\nconst _POST_ERROR = \"Post request error!\";\r\n\r\nconst HEADER_NAMES: Record<HttpHeaderNames, HttpHeaderNames> = {\r\n \"Device-Id\": \"Device-Id\",\r\n \"Lang\": \"Lang\",\r\n \"Website-Id\": \"Website-Id\",\r\n \"Website-No\": \"Website-No\",\r\n}\r\n\r\nconst COOKIE_NAMES: Record<CookieNames, CookieNames> = {\r\n \"IBOOT_DEVICE_ID\": \"IBOOT_DEVICE_ID\",\r\n \"IBOOT_LOCALE\": \"IBOOT_LOCALE\",\r\n \"IBOOT_WEBSITE_ID\": \"IBOOT_WEBSITE_ID\",\r\n \"IBOOT_WEBSITE_NO\": \"IBOOT_WEBSITE_NO\",\r\n \"token\": \"token\",\r\n \"user\": \"user\"\r\n}\r\n\r\nconst getDefaultRequestHeader = (): HttpHeaders => {\r\n const devideId = localStorage.getItem(DEVICE_ID_KEY) ?? ''\r\n const json = localStorage.getItem(CURRENT_WEBSITE_KEY);\r\n const curWebsite: CurWebsite | null = json != null ? JSON.parse(json) : null;\r\n const header: HttpHeaders = {}\r\n if (devideId.length > 0) {\r\n header['Device-Id'] = devideId\r\n }\r\n if (curWebsite) {\r\n header['Lang'] = curWebsite.language;\r\n if (curWebsite.websiteId) {\r\n header['Website-Id'] = curWebsite.websiteId;\r\n }\r\n if (curWebsite.websiteNo) {\r\n header['Website-No'] = curWebsite.websiteNo\r\n }\r\n }\r\n return header;\r\n};\r\n\r\n\r\nexport const setDefaultRequestHeader = (deviceId: string, website?: CurWebsite): void => {\r\n localStorage.setItem(DEVICE_ID_KEY, deviceId);\r\n if (website) {\r\n localStorage.setItem(CURRENT_WEBSITE_KEY, JSON.stringify(website));\r\n }\r\n}\r\n\r\nexport const get = async <T>(url: string, opts?: ClientGetParams): Promise<ResultModel<T>> => {\r\n if (opts?.data) {\r\n const params = new URLSearchParams(opts.data);\r\n if (url.indexOf(\"?\") != -1) {\r\n url += `&${params}`\r\n } else {\r\n url += `?${params}`\r\n }\r\n }\r\n const headers: Record<string, string> = getDefaultRequestHeader();\r\n const heads = opts?.headers;\r\n if (heads) {\r\n for (const field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n headers[field] = value;\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": headers,\r\n }, \"GET\")\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n cache: opts?.useCache ? 'force-cache' : 'default'\r\n });\r\n\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const post = async <T>(url: string, opts?: ClientPostParams): Promise<ResultModel<T>> => {\r\n const data = opts?.data ?? {};\r\n const heads = opts?.headers;\r\n let body: string | FormData;\r\n const proxyHeaders = new Headers(getDefaultRequestHeader());\r\n if (!(data instanceof FormData)) {\r\n body = JSON.stringify(data);\r\n proxyHeaders.set('Content-Type', 'application/json');\r\n } else {\r\n body = data;\r\n }\r\n if (heads) {\r\n for (let field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n proxyHeaders.set(field, value);\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": proxyHeaders,\r\n }, \"POST\")\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: proxyHeaders,\r\n body: body,\r\n });\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const iGet = async <T>(url: string, opts?: ClientGetParams): Promise<T | undefined> => {\r\n const res = await get<T>(url, opts);\r\n if (res.success) {\r\n return res.data as T;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _GET_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _GET_ERROR)\r\n}\r\n\r\nexport const iPost = async <T>(url: string, opts?: ClientPostParams): Promise<T | undefined> => {\r\n const res = await post<T>(url, opts);\r\n if (res.success) {\r\n return res.data;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _POST_ERROR)\r\n}\r\n\r\nexport const iPostSuccess = async (url: string, opts?: ClientPostParams): Promise<boolean> => {\r\n const res = await post(url, opts);\r\n if (res.success) {\r\n if (opts?.showSuccess) {\r\n opts.showSuccess(res.msg ?? 'SUCCESS')\r\n }\r\n return true;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n }\r\n return false;\r\n}\r\n\r\n\r\nexport const getHttpClientOpts = (request: Request): HttpClientOpts => {\r\n const deviceId = request.headers.get(HEADER_NAMES[\"Device-Id\"]);\r\n const lang = request.headers.get(HEADER_NAMES.Lang);\r\n const websiteId = request.headers.get(HEADER_NAMES[\"Website-Id\"]);\r\n const websiteNo = request.headers.get(HEADER_NAMES[\"Website-No\"]);\r\n const result: HttpClientOpts = {}\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport const getHttpClientOptsByCookie = (cookie: IbootReadonlyCookies): HttpClientOpts => {\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookie.get(COOKIE_NAMES.IBOOT_DEVICE_ID)?.value;\r\n const lang = cookie.get(COOKIE_NAMES.IBOOT_LOCALE)?.value;\r\n const websiteId = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_ID)?.value;\r\n const websiteNo = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_NO)?.value;\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly baseUrl: string;\r\n private readonly helloMethod: string;\r\n private readonly apiKey: string;\r\n private readonly userType: USER_TYPE;\r\n private readonly userFrom: string;\r\n private readonly deviceId: string;\r\n private readonly version: string = '1';\r\n private readonly lang: string;\r\n private readonly websiteId?: string;\r\n private readonly websiteNo?: string;\r\n private readonly _isDebug: boolean;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType, helloURL }: Readonly<HttpClientOpts>) {\r\n this.baseUrl = process.env.BASE_URL ?? '';\r\n this.helloMethod = helloURL ?? ''\r\n this.apiKey = process.env.API_KEY ?? '';\r\n this.userType = userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.userFrom = process.env.USER_FROM || '1';\r\n this.deviceId = deviceId ?? randomString(10);\r\n this.lang = lang ?? DEFAULT_LOCALE;\r\n this.websiteId = websiteId\r\n this.websiteNo = websiteNo\r\n this._isDebug = process.env.NODE_ENV != 'production';\r\n }\r\n\r\n isDebug() {\r\n return this._isDebug;\r\n }\r\n\r\n encrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.encrypt(data, key).toString();\r\n }\r\n\r\n decrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.decrypt(data, key, {\r\n mode: CryptoJS.mode.ECB,\r\n }).toString(CryptoJS.enc.Utf8);\r\n }\r\n\r\n getDeviceId() {\r\n return this.deviceId;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private convertUrlParameter(data: Record<string, any>): string {\r\n const p: string[] = [];\r\n for (const o in data) {\r\n let v = data[o];\r\n if (v && typeof v === \"string\") {\r\n v = v.trim();\r\n } else if (v && typeof v === \"object\") {\r\n if (isArray(v)) {\r\n if (v.length === 0) {\r\n continue;\r\n }\r\n for (let i = 0; i < v.length; i++) {\r\n const arr_item = v[i];\r\n for (const item_field in arr_item) {\r\n const item_field_value = arr_item[item_field] ?? undefined;\r\n if (item_field_value) {\r\n if (typeof item_field_value === \"object\") {\r\n if (isArray(item_field_value)) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n item_field_value.forEach((item1: any, index: number) => {\r\n if (item1) {\r\n for (const f in item1) {\r\n const v = item1[f];\r\n if (v && v.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field + `[${index.toString()}].${f}`}=${urlEncode(v)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n } else if (item_field_value.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field}=${urlEncode(item_field_value.toString())}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n for (const obj in v) {\r\n const oValue = v[obj];\r\n if (oValue != null && oValue != \"\" && oValue.length != 0) {\r\n const s = `.${obj}=${urlEncode(oValue)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n continue;\r\n } else if (v && typeof v === \"function\") {\r\n v = null;\r\n }\r\n\r\n if (v != null && v != \"\" && v.length != 0) {\r\n p.push(o + \"=\" + urlEncode(v));\r\n }\r\n }\r\n return (p && p.join(\"&\"));\r\n }\r\n\r\n private async sign(data: Record<string, object | string>): Promise<string> {\r\n //由后台分配\r\n const _apiKey = \"&key=\" + (await this.helloIboot());\r\n const arr: string[] = [];\r\n for (const o in data) {\r\n arr.push(o);\r\n }\r\n arr.sort((a: string, b: string) => {\r\n return a.toLowerCase().localeCompare(b.toLowerCase());\r\n });\r\n const res: string[] = [];\r\n arr.forEach((v: string) => {\r\n let value: object | string = data[v];\r\n if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n res.push(v + \"=\" + value);\r\n });\r\n const paramsStr: string = res.join(\"&\");\r\n const str = md5.md5((paramsStr + _apiKey).toLocaleUpperCase());\r\n const logInfo = {\r\n params: paramsStr,\r\n md5: str\r\n }\r\n logger.debug(logInfo, \"API_SIGN\")\r\n return str;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private assemblyParameter(data?: Record<string, any>, username?: string): Record<string, any> {\r\n const params = data ?? {};\r\n params['timestamp'] = Date.now() + '';\r\n params['echostr'] = randomString(10);\r\n params['version'] = this.version;\r\n params['deviceId'] = this.deviceId;\r\n params['webid'] = this.websiteId;\r\n params['apiKey'] = this.apiKey;\r\n if (username && username.length > 0) {\r\n params['username'] = username;\r\n }\r\n return params;\r\n }\r\n\r\n private async assemblyHeader({ urlParams, token }: Readonly<{ urlParams: string, token?: Readonly<HttpToken> }>) {\r\n const h: Record<string, string> = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Device-Id': this.deviceId,\r\n 'User-Type': token?.utype.toString() ?? this.userType.toString(),\r\n 'User-From': this.userFrom,\r\n 'Api-Key': this.apiKey\r\n }\r\n if (this.lang && this.lang.length > 0) {\r\n h['Lang'] = this.lang\r\n }\r\n if (this.websiteId && this.websiteId.length > 0) {\r\n h['Web-Id'] = this.websiteId\r\n }\r\n if (this.websiteNo && this.websiteNo.length > 0) {\r\n h['Web-No'] = this.websiteNo\r\n }\r\n if (token) {\r\n if (token.token && token.token.length > 0 && token.username && token.username.length > 0) {\r\n h['Authorization'] = token.token;\r\n h['Username'] = token.username;\r\n }\r\n if (token.xcsrf) {\r\n h[token.xcsrf.csrfHeader] = token.xcsrf.csrfToken;\r\n }\r\n }\r\n const data = urlParamToJson(urlParams);\r\n const sign = await this.sign(data);\r\n h['Sign'] = sign\r\n return h;\r\n }\r\n\r\n private async helloIboot(): Promise<string> {\r\n if (this.helloMethod.length <= 0) {\r\n return this.apiKey;\r\n }\r\n const api = this.getApiUrl(this.helloMethod);\r\n const h = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Api-Key': this.apiKey\r\n }\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": h\r\n }\r\n logger.debug(logInfo, \"HELLO\");\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: h,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result.data, 'HELLO RESULT')\r\n return result.data;\r\n }\r\n throw new Error('hello iBoot error!')\r\n }\r\n\r\n private getApiUrl(url: string): string {\r\n return `${this.baseUrl}/${url}`;\r\n }\r\n\r\n async csrf(): Promise<string | undefined> {\r\n const res = await this.get<CSRFToken>({\r\n url: 'guest/csrf'\r\n });\r\n if (res.success) {\r\n const data = res.data;\r\n if (data) {\r\n return data[\"csrfToken\"].toString();\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async get<T>({ url, data, token, cache = 'default' }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n const api = `${this.getApiUrl(url)}?${urlParams.toString()}`\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers\r\n }\r\n logger.info(logInfo, \"GET\");\r\n const res = await fetch(api, {\r\n \"method\": 'GET',\r\n \"headers\": headers,\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token, cache = \"default\" }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n const api = this.getApiUrl(url);\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"POST\");\r\n const urls = buffer ? `${api}?${urlParams}` : api;\r\n const res = await fetch(urls, {\r\n \"method\": 'POST',\r\n \"headers\": headers,\r\n \"body\": buffer ? buffer : urlParams.toString(),\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<Omit<ServerRequestOptions, 'cache'>>): Promise<Response> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params); //new URLSearchParams(params);\r\n\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n headers['Connection'] = 'keep-alive';\r\n headers['X-Accel-Buffering'] = 'no'; //防止 Nginx 缓存\r\n headers['Cache-Control'] = 'no-cache';\r\n const api = this.getApiUrl(url)\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"STREAM\");\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: buffer ? buffer : urlParams.toString(),\r\n credentials: 'include'\r\n });\r\n\r\n if (!res.ok) {\r\n throw new Error(`HTTP error! status: ${res.status}`);\r\n }\r\n if (!res.body) {\r\n throw new Error('No response body');\r\n }\r\n return new Response(res.body, {\r\n headers: {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive'\r\n }\r\n });\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n\r\n getUserInfo(cookies: IbootCookieStore): User | null {\r\n const userjson = cookies.get(COOKIE_NAMES.user)?.value;\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n return null;\r\n }\r\n\r\n getToken(cookies: IbootCookieStore): HttpToken {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n getTokenByCookies = (cookies: IbootReadonlyCookies): HttpToken => {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setToken(data: User & { token: string, extFields: Record<string, any> }, response: { cookies: IbootWritableCookie }) {\r\n const { id, name, username, nickname, sex, headImg, token, lastLoginTime, tokenExpired, deviceId, userType, mustChangePwd } = data;\r\n const loginUser: User = {\r\n id: id,\r\n name: name,\r\n username: username,\r\n nickname: nickname,\r\n sex: sex,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n tokenExpired: tokenExpired,\r\n deviceId: deviceId,\r\n userType: userType,\r\n status: 0,\r\n accountType: 0,\r\n enabled: false,\r\n userFrom: 1,\r\n needToReview: false,\r\n socketOnline: false,\r\n createTime: \"\",\r\n mustChangePwd: mustChangePwd\r\n };\r\n response.cookies.set(COOKIE_NAMES.token, token, {\r\n httpOnly: true,\r\n secure: !this._isDebug, // 在生产环境中启用Secure\r\n sameSite: 'strict', // 防止 CSRF 攻击\r\n path: '/', // Cookie 的路径\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, JSON.stringify(loginUser));\r\n return response;\r\n }\r\n\r\n cleanToken(response: { cookies: IbootWritableCookie }) {\r\n response.cookies.set(COOKIE_NAMES.token, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.delete(COOKIE_NAMES.token);\r\n response.cookies.delete(COOKIE_NAMES.user)\r\n return response;\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","stream","PinoPretty","logger","pino","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","dateFormat","dt","fmt","o","k","s","regx","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","HEADER_NAMES","COOKIE_NAMES","getDefaultRequestHeader","devideId","json","curWebsite","header","setDefaultRequestHeader","deviceId","website","get","url","opts","params","headers","heads","field","response","msg","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","helloURL","key","CryptoJS","p","v","arr_item","item_field","item_field_value","item1","index","oValue","_apiKey","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","cache","buffer","boundary","urls","e","cookies","userjson","utype","user","id","name","nickname","sex","headImg","lastLoginTime","tokenExpired","mustChangePwd","loginUser"],"mappings":"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"}
1
+ {"version":3,"file":"iboot-http-client.cjs.js","sources":["../src/types/user.ts","../src/logger.ts","../src/utils.ts","../src/http-client.ts"],"sourcesContent":["export const ACCOUNT_TYPE_MAP = {\r\n GENERAL : 0,\r\n PHONE : 1,\r\n EMAIL : 2\r\n}\r\n\r\nexport const USER_TYPE_MAP = {\r\n TYPE_MGT : 0,\r\n TYPE_C : 1,\r\n TYPE_B : 2\r\n}\r\n\r\nexport const USER_FORM_MAP = {\r\n FROM_WEB : 1,\r\n FROM_PC : 2,\r\n FROM_WX_MINI_PRO : 3,\r\n FROM_WX_PLU : 4,\r\n FROM_WX_E : 5,\r\n FROM_APP : 6,\r\n FROM_DEVICE : 7\r\n}\r\n\r\nexport const USER_SEX_MAP = {\r\n unknown:0,\r\n male:1,\r\n female:2,\r\n}\r\n\r\nexport type ACCOUNT_TYPE = typeof ACCOUNT_TYPE_MAP[keyof typeof ACCOUNT_TYPE_MAP];\r\nexport type USER_TYPE = typeof USER_TYPE_MAP[keyof typeof USER_TYPE_MAP];\r\nexport type USER_FORM = typeof USER_FORM_MAP[keyof typeof USER_FORM_MAP];\r\nexport type USER_SEX = typeof USER_SEX_MAP[keyof typeof USER_SEX_MAP];\r\n\r\n// User interface\r\nexport interface User {\r\n id: string;\r\n name: string;\r\n username: string;\r\n nickname: string;\r\n sex: USER_SEX;\r\n headImg: string;\r\n lastLoginTime: string;\r\n tokenExpired: string;\r\n deviceId: string;\r\n userType: USER_TYPE;\r\n status: number;\r\n accountType: number;\r\n enabled: boolean;\r\n userFrom: USER_FORM;\r\n needToReview: boolean;\r\n socketOnline: boolean;\r\n createTime: string;\r\n mustChangePwd: boolean;\r\n}","import pino from \"pino\";\r\nimport PinoPretty from \"pino-pretty\";\r\n// import koffi from 'koffi';\r\n\r\n// if (typeof window === 'undefined' && process.platform === 'win32') {\r\n// try {\r\n// const CP_UTF8 = 65001;\r\n// const kernel32 = koffi.load('Kernel32');\r\n// const setConsoleOutputCP = kernel32.func('SetConsoleOutputCP', 'bool', ['int']);\r\n// const setConsoleCP = kernel32.func('SetConsoleCP', 'bool', ['int']);\r\n// setConsoleOutputCP(CP_UTF8);\r\n// setConsoleCP(CP_UTF8);\r\n// } catch (e) {\r\n// console.log(e);\r\n// }\r\n// }\r\n\r\n// export const logger = pino({\r\n// name: process.env.APP_NAME ?? 'iBoot',\r\n// level: process.env.NODE_ENV !== 'production' ? 'debug' : 'info',\r\n// nestedKey: 'payload',\r\n// transport: {\r\n// target: 'pino-pretty',\r\n// options: {\r\n// colorize: true,\r\n// translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n// ignore: 'pid,hostname',\r\n// messageFormat: '{msg}',\r\n// singleLine: true,\r\n// },\r\n// }\r\n// });\r\n\r\nconst stream = PinoPretty({\r\n colorize: true,\r\n destination: process.stdout,\r\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n ignore: 'pid,hostname',\r\n messageFormat: '{msg}',\r\n singleLine: true,\r\n});\r\n\r\nexport const logger = pino({\r\n name: process.env.APP_NAME ?? 'iBoot',\r\n level: process.env.APP_ENV === 'production' ? 'info' : 'debug',\r\n nestedKey: 'payload'\r\n}, stream);","export const isArray = (obj: unknown) => {\r\n return (\r\n Array.isArray(obj) ||\r\n (typeof obj === \"object\" &&\r\n Object.prototype.toString.call(obj) === \"[object Array]\")\r\n );\r\n};\r\n\r\n/**\r\n * 生成指定长度的随机串\r\n * @param {Object} len\r\n */\r\nexport const randomString = (len: number) => {\r\n const l = len || 32;\r\n const $chars = \"ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678\";\r\n const maxPos = $chars.length;\r\n let pwd = \"\";\r\n for (let i = 0; i < l; i++) {\r\n pwd += $chars.charAt(Math.floor(Math.random() * maxPos));\r\n }\r\n return pwd;\r\n};\r\n\r\nexport const urlParamToJson = (urlQueryParams: string, exclude?: string[]): Record<string, string> => {\r\n const result: Record<string, string> = {};\r\n const strs = urlQueryParams.split(\"&\");\r\n strs.forEach((item) => {\r\n const arr = item.split(\"=\");\r\n if (arr[1]) {\r\n if (!exclude || exclude.indexOf(arr[0]) == -1) {\r\n result[arr[0]] = arr[1];\r\n }\r\n }\r\n });\r\n return result;\r\n};\r\n\r\nexport const urlEncode = (value: string | null | undefined): string => {\r\n if (!value || value == \"\" || value.length == 0) {\r\n return \"\";\r\n }\r\n return (\r\n encodeURIComponent(value)\r\n // .replace(/%20/g, '+')\r\n // .replace(/%2B/g, '\\\\+')\r\n .replace(/\\(/g, \"%28\")\r\n .replace(/\\)/g, \"%29\")\r\n .replace(/\\'/g, \"%27\")\r\n .replace(/\\!/g, \"%21\")\r\n .replace(/\\~/g, \"%7E\")\r\n );\r\n};\r\n\r\nexport const dateFormat = (dt: Date, fmt: string) => {\r\n const o:Record<string, number> = {\r\n \"M+\": dt.getMonth() + 1, //月份\r\n \"d+\": dt.getDate(), //日\r\n \"h+\": dt.getHours(), //小时\r\n \"m+\": dt.getMinutes(), //分\r\n \"s+\": dt.getSeconds(), //秒\r\n \"q+\": Math.floor((dt.getMonth() + 3) / 3), //季度\r\n S: dt.getMilliseconds(), //毫秒\r\n };\r\n if (/(y+)/.test(fmt)){\r\n const regx = new RegExp(/(y+)/);\r\n const value = regx.exec(fmt);\r\n let len = 0;\r\n if(value && value.length > 0){\r\n len = value[0].length;\r\n }\r\n fmt = fmt.replace(/(y+)/, dt.getFullYear() + \"\").substring(4 - len);\r\n }\r\n\r\n for (const k in o){\r\n const s:string = \"(\" + k + \")\";\r\n const regx = new RegExp(s);\r\n if(regx.test(fmt)){\r\n const value = regx.exec(fmt);\r\n let len = 0;\r\n if(value && value.length > 0){\r\n len = value[0].length;\r\n }\r\n fmt = fmt.replace(regx, len == 1 ? o[k].toString() : (\"00\" + o[k]).substring(o[k].toString().length))\r\n }\r\n }\r\n return fmt;\r\n}","import md5 from \"js-md5\";\r\nimport CryptoJS from 'crypto-js';\r\nimport { isArray, randomString, urlEncode, urlParamToJson } from \"./utils\";\r\nimport {\r\n ClientGetParams,\r\n ClientPostParams,\r\n CookieNames,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaderNames,\r\n HttpHeaders,\r\n HttpToken,\r\n IbootCookieStore,\r\n IbootReadonlyCookies,\r\n IbootWritableCookie,\r\n ResultModel,\r\n ServerRequestOptions\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\r\n\r\nexport const DEFAULT_LOCALE = 'zh-CN';\r\nexport const DEVICE_ID_KEY = \"_device_id_key\";\r\nexport const CURRENT_WEBSITE_KEY = \"_current_website_key\"\r\n\r\nconst _GET_ERROR = \"Get request error!\"\r\nconst _POST_ERROR = \"Post request error!\";\r\n\r\nconst HEADER_NAMES: Record<HttpHeaderNames, HttpHeaderNames> = {\r\n \"Device-Id\": \"Device-Id\",\r\n \"Lang\": \"Lang\",\r\n \"Website-Id\": \"Website-Id\",\r\n \"Website-No\": \"Website-No\",\r\n}\r\n\r\nconst COOKIE_NAMES: Record<CookieNames, CookieNames> = {\r\n \"IBOOT_DEVICE_ID\": \"IBOOT_DEVICE_ID\",\r\n \"IBOOT_LOCALE\": \"IBOOT_LOCALE\",\r\n \"IBOOT_WEBSITE_ID\": \"IBOOT_WEBSITE_ID\",\r\n \"IBOOT_WEBSITE_NO\": \"IBOOT_WEBSITE_NO\",\r\n \"token\": \"token\",\r\n \"user\": \"user\"\r\n}\r\n\r\nconst getDefaultRequestHeader = (): HttpHeaders => {\r\n const devideId = localStorage.getItem(DEVICE_ID_KEY) ?? ''\r\n const json = localStorage.getItem(CURRENT_WEBSITE_KEY);\r\n const curWebsite: CurWebsite | null = json != null ? JSON.parse(json) : null;\r\n const header: HttpHeaders = {}\r\n if (devideId.length > 0) {\r\n header['Device-Id'] = devideId\r\n }\r\n if (curWebsite) {\r\n header['Lang'] = curWebsite.language;\r\n if (curWebsite.websiteId) {\r\n header['Website-Id'] = curWebsite.websiteId;\r\n }\r\n if (curWebsite.websiteNo) {\r\n header['Website-No'] = curWebsite.websiteNo\r\n }\r\n }\r\n return header;\r\n};\r\n\r\n\r\nexport const setDefaultRequestHeader = (deviceId: string, website?: CurWebsite): void => {\r\n localStorage.setItem(DEVICE_ID_KEY, deviceId);\r\n if (website) {\r\n localStorage.setItem(CURRENT_WEBSITE_KEY, JSON.stringify(website));\r\n }\r\n}\r\n\r\nexport const get = async <T>(url: string, opts?: ClientGetParams): Promise<ResultModel<T>> => {\r\n if (opts?.data) {\r\n const params = new URLSearchParams(opts.data);\r\n if (url.indexOf(\"?\") != -1) {\r\n url += `&${params}`\r\n } else {\r\n url += `?${params}`\r\n }\r\n }\r\n const headers: Record<string, string> = getDefaultRequestHeader();\r\n const heads = opts?.headers;\r\n if (heads) {\r\n for (const field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n headers[field] = value;\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": headers,\r\n }, \"GET\")\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n cache: opts?.useCache ? 'force-cache' : 'default'\r\n });\r\n\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const post = async <T>(url: string, opts?: ClientPostParams): Promise<ResultModel<T>> => {\r\n const data = opts?.data ?? {};\r\n const heads = opts?.headers;\r\n let body: string | FormData;\r\n const proxyHeaders = new Headers(getDefaultRequestHeader());\r\n if (!(data instanceof FormData)) {\r\n body = JSON.stringify(data);\r\n proxyHeaders.set('Content-Type', 'application/json');\r\n } else {\r\n body = data;\r\n }\r\n if (heads) {\r\n for (let field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n proxyHeaders.set(field, value);\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": proxyHeaders,\r\n }, \"POST\")\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: proxyHeaders,\r\n body: body,\r\n });\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const iGet = async <T>(url: string, opts?: ClientGetParams): Promise<T | undefined> => {\r\n const res = await get<T>(url, opts);\r\n if (res.success) {\r\n return res.data as T;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _GET_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _GET_ERROR)\r\n}\r\n\r\nexport const iPost = async <T>(url: string, opts?: ClientPostParams): Promise<T | undefined> => {\r\n const res = await post<T>(url, opts);\r\n if (res.success) {\r\n return res.data;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _POST_ERROR)\r\n}\r\n\r\nexport const iPostSuccess = async (url: string, opts?: ClientPostParams): Promise<boolean> => {\r\n const res = await post(url, opts);\r\n if (res.success) {\r\n if (opts?.showSuccess) {\r\n opts.showSuccess(res.msg ?? 'SUCCESS')\r\n }\r\n return true;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n }\r\n return false;\r\n}\r\n\r\n\r\nexport const getHttpClientOpts = (request: Request): HttpClientOpts => {\r\n const deviceId = request.headers.get(HEADER_NAMES[\"Device-Id\"]);\r\n const lang = request.headers.get(HEADER_NAMES.Lang);\r\n const websiteId = request.headers.get(HEADER_NAMES[\"Website-Id\"]);\r\n const websiteNo = request.headers.get(HEADER_NAMES[\"Website-No\"]);\r\n const result: HttpClientOpts = {}\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport const getHttpClientOptsByCookie = (cookie: IbootReadonlyCookies): HttpClientOpts => {\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookie.get(COOKIE_NAMES.IBOOT_DEVICE_ID)?.value;\r\n const lang = cookie.get(COOKIE_NAMES.IBOOT_LOCALE)?.value;\r\n const websiteId = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_ID)?.value;\r\n const websiteNo = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_NO)?.value;\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly baseUrl: string;\r\n private readonly helloMethod: string;\r\n private readonly apiKey: string;\r\n private readonly userType: USER_TYPE;\r\n private readonly userFrom: string;\r\n private readonly deviceId: string;\r\n private readonly version: string = '1';\r\n private readonly lang: string;\r\n private readonly websiteId?: string;\r\n private readonly websiteNo?: string;\r\n private readonly isProduction: boolean;\r\n constructor(opts: Readonly<HttpClientOpts>) {\r\n this.isProduction = process.env.APP_ENV === 'production';\r\n if (!this.isProduction) {\r\n logger.warn(\"This is currently a development environment!\")\r\n }\r\n this.baseUrl = process.env.APP_BASEURL!;\r\n this.apiKey = process.env.APP_APIKEY!;\r\n this.userFrom = process.env.APP_USERFROM ?? '1';\r\n\r\n this.helloMethod = opts.helloURL ?? ''\r\n this.userType = opts.userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.deviceId = opts.deviceId ?? randomString(10);\r\n this.lang = opts.lang ?? DEFAULT_LOCALE;\r\n this.websiteId = opts.websiteId\r\n this.websiteNo = opts.websiteNo\r\n }\r\n\r\n encrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.encrypt(data, key).toString();\r\n }\r\n\r\n decrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.decrypt(data, key, {\r\n mode: CryptoJS.mode.ECB,\r\n }).toString(CryptoJS.enc.Utf8);\r\n }\r\n\r\n getDeviceId() {\r\n return this.deviceId;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private convertUrlParameter(data: Record<string, any>): string {\r\n const p: string[] = [];\r\n for (const o in data) {\r\n let v = data[o];\r\n if (v && typeof v === \"string\") {\r\n v = v.trim();\r\n } else if (v && typeof v === \"object\") {\r\n if (isArray(v)) {\r\n if (v.length === 0) {\r\n continue;\r\n }\r\n for (let i = 0; i < v.length; i++) {\r\n const arr_item = v[i];\r\n for (const item_field in arr_item) {\r\n const item_field_value = arr_item[item_field] ?? undefined;\r\n if (item_field_value) {\r\n if (typeof item_field_value === \"object\") {\r\n if (isArray(item_field_value)) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n item_field_value.forEach((item1: any, index: number) => {\r\n if (item1) {\r\n for (const f in item1) {\r\n const v = item1[f];\r\n if (v && v.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field + `[${index.toString()}].${f}`}=${urlEncode(v)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n } else if (item_field_value.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field}=${urlEncode(item_field_value.toString())}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n for (const obj in v) {\r\n const oValue = v[obj];\r\n if (oValue != null && oValue != \"\" && oValue.length != 0) {\r\n const s = `.${obj}=${urlEncode(oValue)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n continue;\r\n } else if (v && typeof v === \"function\") {\r\n v = null;\r\n }\r\n\r\n if (v != null && v != \"\" && v.length != 0) {\r\n p.push(o + \"=\" + urlEncode(v));\r\n }\r\n }\r\n return (p && p.join(\"&\"));\r\n }\r\n\r\n private async sign(data: Record<string, object | string>): Promise<string> {\r\n //由后台分配\r\n const _apiKey = \"&key=\" + (await this.helloIboot());\r\n const arr: string[] = [];\r\n for (const o in data) {\r\n arr.push(o);\r\n }\r\n arr.sort((a: string, b: string) => {\r\n return a.toLowerCase().localeCompare(b.toLowerCase());\r\n });\r\n const res: string[] = [];\r\n arr.forEach((v: string) => {\r\n let value: object | string = data[v];\r\n if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n res.push(v + \"=\" + value);\r\n });\r\n const paramsStr: string = res.join(\"&\");\r\n const str = md5.md5((paramsStr + _apiKey).toLocaleUpperCase());\r\n const logInfo = {\r\n params: paramsStr,\r\n md5: str\r\n }\r\n logger.debug(logInfo, \"API_SIGN\")\r\n return str;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private assemblyParameter(data?: Record<string, any>, username?: string): Record<string, any> {\r\n const params = data ?? {};\r\n params['timestamp'] = Date.now() + '';\r\n params['echostr'] = randomString(10);\r\n params['version'] = this.version;\r\n params['deviceId'] = this.deviceId;\r\n params['webid'] = this.websiteId;\r\n params['apiKey'] = this.apiKey;\r\n if (username && username.length > 0) {\r\n params['username'] = username;\r\n }\r\n return params;\r\n }\r\n\r\n private async assemblyHeader({ urlParams, token }: Readonly<{ urlParams: string, token?: Readonly<HttpToken> }>) {\r\n const h: Record<string, string> = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Device-Id': this.deviceId,\r\n 'User-Type': token?.utype.toString() ?? this.userType.toString(),\r\n 'User-From': this.userFrom,\r\n 'Api-Key': this.apiKey\r\n }\r\n if (this.lang && this.lang.length > 0) {\r\n h['Lang'] = this.lang\r\n }\r\n if (this.websiteId && this.websiteId.length > 0) {\r\n h['Web-Id'] = this.websiteId\r\n }\r\n if (this.websiteNo && this.websiteNo.length > 0) {\r\n h['Web-No'] = this.websiteNo\r\n }\r\n if (token) {\r\n if (token.token && token.token.length > 0 && token.username && token.username.length > 0) {\r\n h['Authorization'] = token.token;\r\n h['Username'] = token.username;\r\n }\r\n if (token.xcsrf) {\r\n h[token.xcsrf.csrfHeader] = token.xcsrf.csrfToken;\r\n }\r\n }\r\n const data = urlParamToJson(urlParams);\r\n const sign = await this.sign(data);\r\n h['Sign'] = sign\r\n return h;\r\n }\r\n\r\n private async helloIboot(): Promise<string> {\r\n if (this.helloMethod.length <= 0) {\r\n return this.apiKey;\r\n }\r\n const api = this.getApiUrl(this.helloMethod);\r\n const h = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Api-Key': this.apiKey\r\n }\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": h\r\n }\r\n logger.debug(logInfo, \"HELLO\");\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: h,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result.data, 'HELLO RESULT')\r\n return result.data;\r\n }\r\n throw new Error('hello iBoot error!')\r\n }\r\n\r\n private getApiUrl(url: string): string {\r\n return `${this.baseUrl}/${url}`;\r\n }\r\n\r\n async csrf(): Promise<string | undefined> {\r\n const res = await this.get<CSRFToken>({\r\n url: 'guest/csrf'\r\n });\r\n if (res.success) {\r\n const data = res.data;\r\n if (data) {\r\n return data[\"csrfToken\"].toString();\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async get<T>({ url, data, token, cache = 'default' }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n const api = `${this.getApiUrl(url)}?${urlParams.toString()}`\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers\r\n }\r\n logger.info(logInfo, \"GET\");\r\n const res = await fetch(api, {\r\n \"method\": 'GET',\r\n \"headers\": headers,\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token, cache = \"default\" }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n const api = this.getApiUrl(url);\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"POST\");\r\n const urls = buffer ? `${api}?${urlParams}` : api;\r\n const res = await fetch(urls, {\r\n \"method\": 'POST',\r\n \"headers\": headers,\r\n \"body\": buffer ? buffer : urlParams.toString(),\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<Omit<ServerRequestOptions, 'cache'>>): Promise<Response> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params); //new URLSearchParams(params);\r\n\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n headers['Connection'] = 'keep-alive';\r\n headers['X-Accel-Buffering'] = 'no'; //防止 Nginx 缓存\r\n headers['Cache-Control'] = 'no-cache';\r\n const api = this.getApiUrl(url)\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"STREAM\");\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: buffer ? buffer : urlParams.toString(),\r\n credentials: 'include'\r\n });\r\n\r\n if (!res.ok) {\r\n throw new Error(`HTTP error! status: ${res.status}`);\r\n }\r\n if (!res.body) {\r\n throw new Error('No response body');\r\n }\r\n return new Response(res.body, {\r\n headers: {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive'\r\n }\r\n });\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n\r\n getUserInfo(cookies: IbootCookieStore): User | null {\r\n const userjson = cookies.get(COOKIE_NAMES.user)?.value;\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n return null;\r\n }\r\n\r\n getToken(cookies: IbootCookieStore): HttpToken {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n getTokenByCookies = (cookies: IbootReadonlyCookies): HttpToken => {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setToken(data: User & { token: string, extFields: Record<string, any> }, response: { cookies: IbootWritableCookie }) {\r\n const { id, name, username, nickname, sex, headImg, token, lastLoginTime, tokenExpired, deviceId, userType, mustChangePwd } = data;\r\n const loginUser: User = {\r\n id: id,\r\n name: name,\r\n username: username,\r\n nickname: nickname,\r\n sex: sex,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n tokenExpired: tokenExpired,\r\n deviceId: deviceId,\r\n userType: userType,\r\n status: 0,\r\n accountType: 0,\r\n enabled: false,\r\n userFrom: 1,\r\n needToReview: false,\r\n socketOnline: false,\r\n createTime: \"\",\r\n mustChangePwd: mustChangePwd\r\n };\r\n response.cookies.set(COOKIE_NAMES.token, token, {\r\n httpOnly: true,\r\n secure: this.isProduction, // 在生产环境中启用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","stream","PinoPretty","logger","pino","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","dateFormat","dt","fmt","o","k","s","regx","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","HEADER_NAMES","COOKIE_NAMES","getDefaultRequestHeader","devideId","json","curWebsite","header","setDefaultRequestHeader","deviceId","website","get","url","opts","params","headers","heads","field","response","msg","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","key","CryptoJS","p","v","arr_item","item_field","item_field_value","item1","index","oValue","_apiKey","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","cache","buffer","boundary","urls","e","cookies","userjson","utype","user","id","name","nickname","sex","headImg","lastLoginTime","tokenExpired","userType","mustChangePwd","loginUser"],"mappings":"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"}