iboot-http-client 1.0.9 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/iboot-http-client.cjs.js +1 -1
- package/dist/iboot-http-client.cjs.js.map +1 -1
- package/dist/iboot-http-client.es.js +73 -79
- package/dist/iboot-http-client.es.js.map +1 -1
- package/dist/iboot-http-client.umd.js +1 -1
- package/dist/iboot-http-client.umd.js.map +1 -1
- package/package.json +13 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const D=require("pino"),M=require("js-md5"),m=require("crypto-js"),k={GENERAL:0,PHONE:1,EMAIL:2},C={TYPE_MGT:0,TYPE_C:1,TYPE_B:2},B={FROM_WEB:1,FROM_PC:2,FROM_WX_MINI_PRO:3,FROM_WX_PLU:4,FROM_WX_E:5,FROM_APP:6,FROM_DEVICE:7},L={unknown:0,male:1,female:2};process.platform==="win32"&&(process.stdout.setEncoding("utf8"),process.stderr.setEncoding("utf8"));const u=D({name:process.env.APP_NAME??"iBoot",level:process.env.NODE_ENV!="production"?"debug":"info",nestedKey:"payload",formatters:{level:n=>({level:n})},transport:{target:"pino-pretty",options:{colorize:!0,translateTime:"SYS:yyyy-mm-dd HH:MM:ss",ignore:"pid,hostname",messageFormat:"{msg}",singleLine:!0}}}),b=n=>Array.isArray(n)||typeof n=="object"&&Object.prototype.toString.call(n)==="[object Array]",I=n=>{const t=n||32,e="ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",s=e.length;let r="";for(let o=0;o<t;o++)r+=e.charAt(Math.floor(Math.random()*s));return r},A=(n,t)=>{const e={};return n.split("&").forEach(r=>{const o=r.split("=");o[1]&&(!t||t.indexOf(o[0])==-1)&&(e[o[0]]=o[1])}),e},E=n=>!n||n==""||n.length==0?"":encodeURIComponent(n).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\'/g,"%27").replace(/\!/g,"%21").replace(/\~/g,"%7E"),R="zh-CN",w="_device_id_key",O="_current_website_key",v="Get request error!",S="Post request error!",_={"Device-Id":"Device-Id",Lang:"Lang","Website-Id":"Website-Id","Website-No":"Website-No"},f={IBOOT_DEVICE_ID:"IBOOT_DEVICE_ID",IBOOT_LOCALE:"IBOOT_LOCALE",IBOOT_WEBSITE_ID:"IBOOT_WEBSITE_ID",IBOOT_WEBSITE_NO:"IBOOT_WEBSITE_NO",token:"token",user:"user"},N=()=>{const n=localStorage.getItem(w)??"",t=localStorage.getItem(O),e=t!=null?JSON.parse(t):null,s={};return n.length>0&&(s["Device-Id"]=n),e&&(s.Lang=e.language,e.websiteId&&(s["Website-Id"]=e.websiteId),e.websiteNo&&(s["Website-No"]=e.websiteNo)),s},W=(n,t)=>{localStorage.setItem(w,n),t&&localStorage.setItem(O,JSON.stringify(t))},U=async(n,t)=>{if(t?.data){const i=new URLSearchParams(t.data);n.indexOf("?")!=-1?n+=`&${i}`:n+=`?${i}`}const e=N(),s=t?.headers;if(s)for(const i in s){const l=s[i];l&&(e[i]=l)}u.debug({method:"GET",url:n,headers:e});const r=await fetch(n,{method:"GET",headers:e,cache:t?.useCache?"force-cache":"default"});if(r.ok){const i=await r.json();return u.debug({GET_RESULT:i}),i}const o={code:r.status,success:!1,msg:r.statusText};return u.error(o),o},P=async(n,t)=>{const e=t?.data??{},s=t?.headers;let r;const o=new Headers(N());if(e instanceof FormData?r=e:(r=JSON.stringify(e),o.set("Content-Type","application/json")),s)for(let a in s){const c=s[a];c&&o.set(a,c)}u.debug({method:"GET",url:n,headers:o});const i=await fetch(n,{method:"POST",headers:o,body:r});if(i.ok){const a=await i.json();return u.debug({POST_RESULT:a}),a}const l={code:i.status,success:!1,msg:i.statusText};return u.error(l),l},$=async(n,t)=>{const e=await U(n,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??v);return}throw Error(e.msg??v)},H=async(n,t)=>{const e=await P(n,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??S);return}throw Error(e.msg??S)},j=async(n,t)=>{const e=await P(n,t);return e.success?(t?.showSuccess&&t.showSuccess(e.msg??"SUCCESS"),!0):(t?.showError&&t.showError(e.msg??S),!1)},F=n=>{const t=n.headers.get(_["Device-Id"]),e=n.headers.get(_.Lang),s=n.headers.get(_["Website-Id"]),r=n.headers.get(_["Website-No"]),o={};return t&&t.length>0&&(o.deviceId=t),e&&e.length>0&&(o.lang=e),s&&s.length>0&&(o.websiteId=s),r&&r.length>0&&(o.websiteNo=r),o},K=n=>{const t={},e=n.get(f.IBOOT_DEVICE_ID)?.value,s=n.get(f.IBOOT_LOCALE)?.value,r=n.get(f.IBOOT_WEBSITE_ID)?.value,o=n.get(f.IBOOT_WEBSITE_NO)?.value;return e&&e.length>0&&(t.deviceId=e),s&&s.length>0&&(t.lang=s),r&&r.length>0&&(t.websiteId=r),o&&o.length>0&&(t.websiteNo=o),t};class x{baseUrl;helloMethod;apiKey;userType;userFrom;deviceId;version="1";lang;websiteId;websiteNo;_isDebug;constructor({deviceId:t,lang:e,websiteId:s,websiteNo:r,userType:o,helloURL:i}){this.baseUrl=process.env.BASE_URL??"",this.helloMethod=i??"",this.apiKey=process.env.API_KEY??"",this.userType=o??C.TYPE_MGT,this.userFrom=process.env.USER_FROM||"1",this.deviceId=t??I(10),this.lang=e??R,this.websiteId=s,this.websiteNo=r,this._isDebug=process.env.NODE_ENV!="production"}isDebug(){return this._isDebug}encrypt(t){const e=m.enc.Utf8.parse(this.apiKey);return m.AES.encrypt(t,e).toString()}decrypt(t){const e=m.enc.Utf8.parse(this.apiKey);return m.AES.decrypt(t,e,{mode:m.mode.ECB}).toString(m.enc.Utf8)}getDeviceId(){return this.deviceId}convertUrlParameter(t){const e=[];for(const s in t){let r=t[s];if(r&&typeof r=="string")r=r.trim();else if(r&&typeof r=="object"){if(b(r)){if(r.length===0)continue;for(let o=0;o<r.length;o++){const i=r[o];for(const l in i){const a=i[l]??void 0;if(a){if(typeof a=="object")b(a)&&a.forEach((c,d)=>{if(c)for(const g in c){const h=c[g];if(h&&h.toString().length>0){const p=`[${o.toString()}].${l+`[${d.toString()}].${g}`}=${E(h)}`;e.push(s+p)}}});else if(a.toString().length>0){const c=`[${o.toString()}].${l}=${E(a.toString())}`;e.push(s+c)}}}}}else for(const o in r){const i=r[o];if(i!=null&&i!=""&&i.length!=0){const l=`.${o}=${E(i)}`;e.push(s+l)}}continue}else r&&typeof r=="function"&&(r=null);r!=null&&r!=""&&r.length!=0&&e.push(s+"="+E(r))}return e&&e.join("&")}async sign(t){const e="&key="+await this.helloIboot(),s=[];for(const a in t)s.push(a);s.sort((a,c)=>a.toLowerCase().localeCompare(c.toLowerCase()));const r=[];s.forEach(a=>{let c=t[a];typeof c=="object"&&(c=JSON.stringify(c)),r.push(a+"="+c)});const o=r.join("&"),i=M.md5((o+e).toLocaleUpperCase()),l={name:"sort",params:o,md5:i};return u.debug(l),i}assemblyParameter(t,e){const s=t??{};return s.timestamp=Date.now()+"",s.echostr=I(10),s.version=this.version,s.deviceId=this.deviceId,s.webid=this.websiteId,s.apiKey=this.apiKey,e&&e.length>0&&(s.username=e),s}async assemblyHeader({urlParams:t,token:e}){const s={"Content-Type":"application/x-www-form-urlencoded","Res-Type":"json","Device-Id":this.deviceId,"User-Type":e?.utype.toString()??this.userType.toString(),"User-From":this.userFrom,"Api-Key":this.apiKey};this.lang&&this.lang.length>0&&(s.Lang=this.lang),this.websiteId&&this.websiteId.length>0&&(s["Web-Id"]=this.websiteId),this.websiteNo&&this.websiteNo.length>0&&(s["Web-No"]=this.websiteNo),e&&(e.token&&e.token.length>0&&e.username&&e.username.length>0&&(s.Authorization=e.token,s.Username=e.username),e.xcsrf&&(s[e.xcsrf.csrfHeader]=e.xcsrf.csrfToken));const r=A(t),o=await this.sign(r);return s.Sign=o,s}async helloIboot(){if(this.helloMethod.length<=0)return this.apiKey;const t=this.getApiUrl(this.helloMethod),e={"Content-Type":"application/x-www-form-urlencoded","Res-Type":"json","Api-Key":this.apiKey},s={url:t,headers:e};u.debug(s);const r=await fetch(t,{method:"GET",headers:e,credentials:"include",cache:"force-cache"});if(r.ok){const o=await r.json();return u.debug({result:o.data}),o.data}throw new Error("hello iBoot error!")}getApiUrl(t){return`${this.baseUrl}/${t}`}async csrf(){const t=await this.get({url:"guest/csrf"});if(t.success){const e=t.data;if(e)return e.csrfToken.toString()}}async get({url:t,data:e,token:s,cache:r="default"}){const o=this.assemblyParameter(e),i=this.convertUrlParameter(o),l=await this.assemblyHeader({urlParams:i,token:s}),a=`${this.getApiUrl(t)}?${i.toString()}`,c={method:"GET",url:a,headers:l};u.info(c);const d=await fetch(a,{method:"GET",headers:l,credentials:"include",cache:r});if(d.ok){const h=await d.json();return u.debug({GET_RESULT:h}),h}const g={code:d.status,success:!1,msg:d.statusText};return u.error(g),g}async post({url:t,data:e,token:s,cache:r="default"}){e=e?{...e}:{};const o=e.buffer??void 0,i=e.boundary??void 0;o&&delete e.buffer,i&&delete e.boundary;const l=this.assemblyParameter(e),a=this.convertUrlParameter(l),c=await this.assemblyHeader({urlParams:a,token:s});o&&i&&(c["Content-Type"]=`multipart/form-data; boundary=${i}`);const d=this.getApiUrl(t),g={method:"POST",url:d,headers:c,params:l};u.info(g);const h=o?`${d}?${a}`:d,p=await fetch(h,{method:"POST",headers:c,body:o||a.toString(),credentials:"include",cache:r});if(p.ok){const T=await p.json();return u.debug({POST_RESULT:T}),T}const y={code:p.status,success:!1,msg:p.statusText};return u.error(y),y}async stream({url:t,data:e,token:s}){e=e?{...e}:{};const r=e.buffer??void 0,o=e.boundary??void 0;r&&delete e.buffer,o&&delete e.boundary;const i=this.assemblyParameter(e),l=this.convertUrlParameter(i),a=await this.assemblyHeader({urlParams:l,token:s});r&&o&&(a["Content-Type"]=`multipart/form-data; boundary=${o}`),a.Connection="keep-alive",a["X-Accel-Buffering"]="no",a["Cache-Control"]="no-cache";const c=this.getApiUrl(t);try{const d=r?`${c}?${l}`:c,g={method:"STREAM",url:c,headers:a,params:i};u.info(g);const h=await fetch(d,{method:"POST",headers:a,body:r||l.toString(),credentials:"include"});if(!h.ok)throw new Error(`HTTP error! status: ${h.status}`);if(!h.body)throw new Error("No response body");return new Response(h.body,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}catch(d){throw d}}getUserInfo(t){const e=t.get(f.user)?.value;return e&&e.length>0?JSON.parse(e):null}getToken(t){const e=t.get("user")?.value;let s="",r=this.userType;if(e&&e.length>0){const o=JSON.parse(e);s=o.username,r=o.userType.toString()}return{username:s,utype:r,token:t.get(f.token)?.value??""}}getTokenByCookies=t=>{const e=t.get("user")?.value;let s="",r=this.userType;if(e&&e.length>0){const o=JSON.parse(e);s=o.username,r=o.userType.toString()}return{username:s,utype:r,token:t.get(f.token)?.value??""}};setToken(t,e){const{id:s,name:r,username:o,nickname:i,sex:l,headImg:a,token:c,lastLoginTime:d,tokenExpired:g,deviceId:h,userType:p,mustChangePwd:y}=t,T={id:s,name:r,username:o,nickname:i,sex:l,headImg:a,lastLoginTime:d,tokenExpired:g,deviceId:h,userType:p,status:0,accountType:0,enabled:!1,userFrom:1,needToReview:!1,socketOnline:!1,createTime:"",mustChangePwd:y};return e.cookies.set(f.token,c,{httpOnly:!0,secure:!this._isDebug,sameSite:"strict",path:"/"}),e.cookies.set(f.user,JSON.stringify(T)),e}cleanToken(t){return t.cookies.set(f.token,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.set(f.user,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.delete(f.token),t.cookies.delete(f.user),t}}exports.ACCOUNT_TYPE_MAP=k;exports.CURRENT_WEBSITE_KEY=O;exports.DEFAULT_LOCALE=R;exports.DEVICE_ID_KEY=w;exports.HttpClient=x;exports.USER_FORM_MAP=B;exports.USER_SEX_MAP=L;exports.USER_TYPE_MAP=C;exports.get=U;exports.getHttpClientOpts=F;exports.getHttpClientOptsByCookie=K;exports.iGet=$;exports.iPost=H;exports.iPostSuccess=j;exports.isArray=b;exports.logger=u;exports.post=P;exports.randomString=I;exports.setDefaultRequestHeader=W;exports.urlEncode=E;exports.urlParamToJson=A;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const k=require("pino"),D=require("koffi"),L=require("js-md5"),m=require("crypto-js"),M={GENERAL:0,PHONE:1,EMAIL:2},v={TYPE_MGT:0,TYPE_C:1,TYPE_B:2},B={FROM_WEB:1,FROM_PC:2,FROM_WX_MINI_PRO:3,FROM_WX_PLU:4,FROM_WX_E:5,FROM_APP:6,FROM_DEVICE:7},H={unknown:0,male:1,female:2};if(typeof window>"u"&&process.platform==="win32")try{const t=D.load("Kernel32"),e=t.func("SetConsoleOutputCP","bool",["int"]),s=t.func("SetConsoleCP","bool",["int"]);e(65001),s(65001)}catch(n){console.log(n)}const u=k({name:process.env.APP_NAME??"iBoot",level:process.env.NODE_ENV!=="production"?"debug":"info",nestedKey:"payload",transport:{target:"pino-pretty",options:{colorize:!0,translateTime:"SYS:yyyy-mm-dd HH:MM:ss",ignore:"pid,hostname",messageFormat:"{msg}",singleLine:!0}}}),b=n=>Array.isArray(n)||typeof n=="object"&&Object.prototype.toString.call(n)==="[object Array]",I=n=>{const t=n||32,e="ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",s=e.length;let r="";for(let o=0;o<t;o++)r+=e.charAt(Math.floor(Math.random()*s));return r},A=(n,t)=>{const e={};return n.split("&").forEach(r=>{const o=r.split("=");o[1]&&(!t||t.indexOf(o[0])==-1)&&(e[o[0]]=o[1])}),e},E=n=>!n||n==""||n.length==0?"":encodeURIComponent(n).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\'/g,"%27").replace(/\!/g,"%21").replace(/\~/g,"%7E"),R="zh-CN",O="_device_id_key",w="_current_website_key",C="Get request error!",S="Post request error!",_={"Device-Id":"Device-Id",Lang:"Lang","Website-Id":"Website-Id","Website-No":"Website-No"},f={IBOOT_DEVICE_ID:"IBOOT_DEVICE_ID",IBOOT_LOCALE:"IBOOT_LOCALE",IBOOT_WEBSITE_ID:"IBOOT_WEBSITE_ID",IBOOT_WEBSITE_NO:"IBOOT_WEBSITE_NO",token:"token",user:"user"},U=()=>{const n=localStorage.getItem(O)??"",t=localStorage.getItem(w),e=t!=null?JSON.parse(t):null,s={};return n.length>0&&(s["Device-Id"]=n),e&&(s.Lang=e.language,e.websiteId&&(s["Website-Id"]=e.websiteId),e.websiteNo&&(s["Website-No"]=e.websiteNo)),s},W=(n,t)=>{localStorage.setItem(O,n),t&&localStorage.setItem(w,JSON.stringify(t))},N=async(n,t)=>{if(t?.data){const i=new URLSearchParams(t.data);n.indexOf("?")!=-1?n+=`&${i}`:n+=`?${i}`}const e=U(),s=t?.headers;if(s)for(const i in s){const l=s[i];l&&(e[i]=l)}u.debug({url:n,headers:e},"GET");const r=await fetch(n,{method:"GET",headers:e,cache:t?.useCache?"force-cache":"default"});if(r.ok){const i=await r.json();return u.debug(i,"GET_RESULT"),i}const o={code:r.status,success:!1,msg:r.statusText};return u.error(o),o},P=async(n,t)=>{const e=t?.data??{},s=t?.headers;let r;const o=new Headers(U());if(e instanceof FormData?r=e:(r=JSON.stringify(e),o.set("Content-Type","application/json")),s)for(let a in s){const c=s[a];c&&o.set(a,c)}u.debug({url:n,headers:o},"POST");const i=await fetch(n,{method:"POST",headers:o,body:r});if(i.ok){const a=await i.json();return u.debug(a,"POST_RESULT"),a}const l={code:i.status,success:!1,msg:i.statusText};return u.error(l),l},$=async(n,t)=>{const e=await N(n,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??C);return}throw Error(e.msg??C)},F=async(n,t)=>{const e=await P(n,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??S);return}throw Error(e.msg??S)},j=async(n,t)=>{const e=await P(n,t);return e.success?(t?.showSuccess&&t.showSuccess(e.msg??"SUCCESS"),!0):(t?.showError&&t.showError(e.msg??S),!1)},K=n=>{const t=n.headers.get(_["Device-Id"]),e=n.headers.get(_.Lang),s=n.headers.get(_["Website-Id"]),r=n.headers.get(_["Website-No"]),o={};return t&&t.length>0&&(o.deviceId=t),e&&e.length>0&&(o.lang=e),s&&s.length>0&&(o.websiteId=s),r&&r.length>0&&(o.websiteNo=r),o},x=n=>{const t={},e=n.get(f.IBOOT_DEVICE_ID)?.value,s=n.get(f.IBOOT_LOCALE)?.value,r=n.get(f.IBOOT_WEBSITE_ID)?.value,o=n.get(f.IBOOT_WEBSITE_NO)?.value;return e&&e.length>0&&(t.deviceId=e),s&&s.length>0&&(t.lang=s),r&&r.length>0&&(t.websiteId=r),o&&o.length>0&&(t.websiteNo=o),t};class G{baseUrl;helloMethod;apiKey;userType;userFrom;deviceId;version="1";lang;websiteId;websiteNo;_isDebug;constructor({deviceId:t,lang:e,websiteId:s,websiteNo:r,userType:o,helloURL:i}){this.baseUrl=process.env.BASE_URL??"",this.helloMethod=i??"",this.apiKey=process.env.API_KEY??"",this.userType=o??v.TYPE_MGT,this.userFrom=process.env.USER_FROM||"1",this.deviceId=t??I(10),this.lang=e??R,this.websiteId=s,this.websiteNo=r,this._isDebug=process.env.NODE_ENV!="production"}isDebug(){return this._isDebug}encrypt(t){const e=m.enc.Utf8.parse(this.apiKey);return m.AES.encrypt(t,e).toString()}decrypt(t){const e=m.enc.Utf8.parse(this.apiKey);return m.AES.decrypt(t,e,{mode:m.mode.ECB}).toString(m.enc.Utf8)}getDeviceId(){return this.deviceId}convertUrlParameter(t){const e=[];for(const s in t){let r=t[s];if(r&&typeof r=="string")r=r.trim();else if(r&&typeof r=="object"){if(b(r)){if(r.length===0)continue;for(let o=0;o<r.length;o++){const i=r[o];for(const l in i){const a=i[l]??void 0;if(a){if(typeof a=="object")b(a)&&a.forEach((c,d)=>{if(c)for(const g in c){const h=c[g];if(h&&h.toString().length>0){const p=`[${o.toString()}].${l+`[${d.toString()}].${g}`}=${E(h)}`;e.push(s+p)}}});else if(a.toString().length>0){const c=`[${o.toString()}].${l}=${E(a.toString())}`;e.push(s+c)}}}}}else for(const o in r){const i=r[o];if(i!=null&&i!=""&&i.length!=0){const l=`.${o}=${E(i)}`;e.push(s+l)}}continue}else r&&typeof r=="function"&&(r=null);r!=null&&r!=""&&r.length!=0&&e.push(s+"="+E(r))}return e&&e.join("&")}async sign(t){const e="&key="+await this.helloIboot(),s=[];for(const a in t)s.push(a);s.sort((a,c)=>a.toLowerCase().localeCompare(c.toLowerCase()));const r=[];s.forEach(a=>{let c=t[a];typeof c=="object"&&(c=JSON.stringify(c)),r.push(a+"="+c)});const o=r.join("&"),i=L.md5((o+e).toLocaleUpperCase()),l={params:o,md5:i};return u.debug(l,"API_SIGN"),i}assemblyParameter(t,e){const s=t??{};return s.timestamp=Date.now()+"",s.echostr=I(10),s.version=this.version,s.deviceId=this.deviceId,s.webid=this.websiteId,s.apiKey=this.apiKey,e&&e.length>0&&(s.username=e),s}async assemblyHeader({urlParams:t,token:e}){const s={"Content-Type":"application/x-www-form-urlencoded","Res-Type":"json","Device-Id":this.deviceId,"User-Type":e?.utype.toString()??this.userType.toString(),"User-From":this.userFrom,"Api-Key":this.apiKey};this.lang&&this.lang.length>0&&(s.Lang=this.lang),this.websiteId&&this.websiteId.length>0&&(s["Web-Id"]=this.websiteId),this.websiteNo&&this.websiteNo.length>0&&(s["Web-No"]=this.websiteNo),e&&(e.token&&e.token.length>0&&e.username&&e.username.length>0&&(s.Authorization=e.token,s.Username=e.username),e.xcsrf&&(s[e.xcsrf.csrfHeader]=e.xcsrf.csrfToken));const r=A(t),o=await this.sign(r);return s.Sign=o,s}async helloIboot(){if(this.helloMethod.length<=0)return this.apiKey;const t=this.getApiUrl(this.helloMethod),e={"Content-Type":"application/x-www-form-urlencoded","Res-Type":"json","Api-Key":this.apiKey},s={url:t,headers:e};u.debug(s,"HELLO");const r=await fetch(t,{method:"GET",headers:e,credentials:"include",cache:"force-cache"});if(r.ok){const o=await r.json();return u.debug(o.data,"HELLO RESULT"),o.data}throw new Error("hello iBoot error!")}getApiUrl(t){return`${this.baseUrl}/${t}`}async csrf(){const t=await this.get({url:"guest/csrf"});if(t.success){const e=t.data;if(e)return e.csrfToken.toString()}}async get({url:t,data:e,token:s,cache:r="default"}){const o=this.assemblyParameter(e),i=this.convertUrlParameter(o),l=await this.assemblyHeader({urlParams:i,token:s}),a=`${this.getApiUrl(t)}?${i.toString()}`,c={url:a,headers:l};u.info(c,"GET");const d=await fetch(a,{method:"GET",headers:l,credentials:"include",cache:r});if(d.ok){const h=await d.json();return u.debug(h,"GET_RESULT"),h}const g={code:d.status,success:!1,msg:d.statusText};return u.error(g),g}async post({url:t,data:e,token:s,cache:r="default"}){e=e?{...e}:{};const o=e.buffer??void 0,i=e.boundary??void 0;o&&delete e.buffer,i&&delete e.boundary;const l=this.assemblyParameter(e),a=this.convertUrlParameter(l),c=await this.assemblyHeader({urlParams:a,token:s});o&&i&&(c["Content-Type"]=`multipart/form-data; boundary=${i}`);const d=this.getApiUrl(t),g={url:d,headers:c,params:l};u.info(g,"POST");const h=o?`${d}?${a}`:d,p=await fetch(h,{method:"POST",headers:c,body:o||a.toString(),credentials:"include",cache:r});if(p.ok){const T=await p.json();return u.debug(T,"POST_RESULT"),T}const y={code:p.status,success:!1,msg:p.statusText};return u.error(y),y}async stream({url:t,data:e,token:s}){e=e?{...e}:{};const r=e.buffer??void 0,o=e.boundary??void 0;r&&delete e.buffer,o&&delete e.boundary;const i=this.assemblyParameter(e),l=this.convertUrlParameter(i),a=await this.assemblyHeader({urlParams:l,token:s});r&&o&&(a["Content-Type"]=`multipart/form-data; boundary=${o}`),a.Connection="keep-alive",a["X-Accel-Buffering"]="no",a["Cache-Control"]="no-cache";const c=this.getApiUrl(t);try{const d=r?`${c}?${l}`:c,g={url:c,headers:a,params:i};u.info(g,"STREAM");const h=await fetch(d,{method:"POST",headers:a,body:r||l.toString(),credentials:"include"});if(!h.ok)throw new Error(`HTTP error! status: ${h.status}`);if(!h.body)throw new Error("No response body");return new Response(h.body,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}catch(d){throw d}}getUserInfo(t){const e=t.get(f.user)?.value;return e&&e.length>0?JSON.parse(e):null}getToken(t){const e=t.get("user")?.value;let s="",r=this.userType;if(e&&e.length>0){const o=JSON.parse(e);s=o.username,r=o.userType.toString()}return{username:s,utype:r,token:t.get(f.token)?.value??""}}getTokenByCookies=t=>{const e=t.get("user")?.value;let s="",r=this.userType;if(e&&e.length>0){const o=JSON.parse(e);s=o.username,r=o.userType.toString()}return{username:s,utype:r,token:t.get(f.token)?.value??""}};setToken(t,e){const{id:s,name:r,username:o,nickname:i,sex:l,headImg:a,token:c,lastLoginTime:d,tokenExpired:g,deviceId:h,userType:p,mustChangePwd:y}=t,T={id:s,name:r,username:o,nickname:i,sex:l,headImg:a,lastLoginTime:d,tokenExpired:g,deviceId:h,userType:p,status:0,accountType:0,enabled:!1,userFrom:1,needToReview:!1,socketOnline:!1,createTime:"",mustChangePwd:y};return e.cookies.set(f.token,c,{httpOnly:!0,secure:!this._isDebug,sameSite:"strict",path:"/"}),e.cookies.set(f.user,JSON.stringify(T)),e}cleanToken(t){return t.cookies.set(f.token,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.set(f.user,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.delete(f.token),t.cookies.delete(f.user),t}}exports.ACCOUNT_TYPE_MAP=M;exports.CURRENT_WEBSITE_KEY=w;exports.DEFAULT_LOCALE=R;exports.DEVICE_ID_KEY=O;exports.HttpClient=G;exports.USER_FORM_MAP=B;exports.USER_SEX_MAP=H;exports.USER_TYPE_MAP=v;exports.get=N;exports.getHttpClientOpts=K;exports.getHttpClientOptsByCookie=x;exports.iGet=$;exports.iPost=F;exports.iPostSuccess=j;exports.isArray=b;exports.logger=u;exports.post=P;exports.randomString=I;exports.setDefaultRequestHeader=W;exports.urlEncode=E;exports.urlParamToJson=A;
|
|
2
2
|
//# sourceMappingURL=iboot-http-client.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iboot-http-client.cjs.js","sources":["../src/types/user.ts","../src/logger.ts","../src/utils.ts","../src/http-client.ts"],"sourcesContent":["export const ACCOUNT_TYPE_MAP = {\r\n GENERAL : 0,\r\n PHONE : 1,\r\n EMAIL : 2\r\n}\r\n\r\nexport const USER_TYPE_MAP = {\r\n TYPE_MGT : 0,\r\n TYPE_C : 1,\r\n TYPE_B : 2\r\n}\r\n\r\nexport const USER_FORM_MAP = {\r\n FROM_WEB : 1,\r\n FROM_PC : 2,\r\n FROM_WX_MINI_PRO : 3,\r\n FROM_WX_PLU : 4,\r\n FROM_WX_E : 5,\r\n FROM_APP : 6,\r\n FROM_DEVICE : 7\r\n}\r\n\r\nexport const USER_SEX_MAP = {\r\n unknown:0,\r\n male:1,\r\n female:2,\r\n}\r\n\r\nexport type ACCOUNT_TYPE = typeof ACCOUNT_TYPE_MAP[keyof typeof ACCOUNT_TYPE_MAP];\r\nexport type USER_TYPE = typeof USER_TYPE_MAP[keyof typeof USER_TYPE_MAP];\r\nexport type USER_FORM = typeof USER_FORM_MAP[keyof typeof USER_FORM_MAP];\r\nexport type USER_SEX = typeof USER_SEX_MAP[keyof typeof USER_SEX_MAP];\r\n\r\n// User interface\r\nexport interface User {\r\n id: string;\r\n name: string;\r\n username: string;\r\n nickname: string;\r\n sex: USER_SEX;\r\n headImg: string;\r\n lastLoginTime: string;\r\n tokenExpired: string;\r\n deviceId: string;\r\n userType: USER_TYPE;\r\n status: number;\r\n accountType: number;\r\n enabled: boolean;\r\n userFrom: USER_FORM;\r\n needToReview: boolean;\r\n socketOnline: boolean;\r\n createTime: string;\r\n mustChangePwd: boolean;\r\n}","import pino from \"pino\";\r\n\r\n// 在 Windows 系统上确保中文字符正确显示\r\nif (process.platform === 'win32') {\r\n // 设置 stdout 和 stderr 的编码为 utf8\r\n process.stdout.setEncoding('utf8');\r\n process.stderr.setEncoding('utf8');\r\n}\r\n\r\nexport const logger = pino({\r\n name: process.env.APP_NAME ?? 'iBoot',\r\n level: process.env.NODE_ENV != 'production' ? 'debug' : 'info',\r\n nestedKey: 'payload',\r\n formatters: {\r\n level: (label) => {\r\n return { level: label };\r\n }\r\n },\r\n transport: {\r\n target: 'pino-pretty',\r\n options: {\r\n colorize: true,\r\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n ignore: 'pid,hostname',\r\n messageFormat: '{msg}',\r\n singleLine: true\r\n }\r\n }\r\n});","export const isArray = (obj: unknown) => {\r\n return (\r\n Array.isArray(obj) ||\r\n (typeof obj === \"object\" &&\r\n Object.prototype.toString.call(obj) === \"[object Array]\")\r\n );\r\n};\r\n\r\n/**\r\n * 生成指定长度的随机串\r\n * @param {Object} len\r\n */\r\nexport const randomString = (len: number) => {\r\n const l = len || 32;\r\n const $chars = \"ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678\";\r\n const maxPos = $chars.length;\r\n let pwd = \"\";\r\n for (let i = 0; i < l; i++) {\r\n pwd += $chars.charAt(Math.floor(Math.random() * maxPos));\r\n }\r\n return pwd;\r\n};\r\n\r\nexport const urlParamToJson = (urlQueryParams: string, exclude?: string[]): Record<string, string> => {\r\n const result: Record<string, string> = {};\r\n const strs = urlQueryParams.split(\"&\");\r\n strs.forEach((item) => {\r\n const arr = item.split(\"=\");\r\n if (arr[1]) {\r\n if (!exclude || exclude.indexOf(arr[0]) == -1) {\r\n result[arr[0]] = arr[1];\r\n }\r\n }\r\n });\r\n return result;\r\n};\r\n\r\nexport const urlEncode = (value: string | null | undefined): string => {\r\n if (!value || value == \"\" || value.length == 0) {\r\n return \"\";\r\n }\r\n return (\r\n encodeURIComponent(value)\r\n // .replace(/%20/g, '+')\r\n // .replace(/%2B/g, '\\\\+')\r\n .replace(/\\(/g, \"%28\")\r\n .replace(/\\)/g, \"%29\")\r\n .replace(/\\'/g, \"%27\")\r\n .replace(/\\!/g, \"%21\")\r\n .replace(/\\~/g, \"%7E\")\r\n );\r\n};\r\n","import md5 from \"js-md5\";\r\nimport CryptoJS from 'crypto-js';\r\nimport { isArray, randomString, urlEncode, urlParamToJson } from \"./utils\";\r\nimport {\r\n ClientGetParams,\r\n ClientPostParams,\r\n CookieNames,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaderNames,\r\n HttpHeaders,\r\n HttpToken,\r\n IbootCookieStore,\r\n IbootReadonlyCookies,\r\n IbootWritableCookie,\r\n ResultModel,\r\n ServerRequestOptions\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\r\n\r\nexport const DEFAULT_LOCALE = 'zh-CN';\r\nexport const DEVICE_ID_KEY = \"_device_id_key\";\r\nexport const CURRENT_WEBSITE_KEY = \"_current_website_key\"\r\n\r\nconst _GET_ERROR = \"Get request error!\"\r\nconst _POST_ERROR = \"Post request error!\";\r\n\r\nconst HEADER_NAMES: Record<HttpHeaderNames, HttpHeaderNames> = {\r\n \"Device-Id\": \"Device-Id\",\r\n \"Lang\": \"Lang\",\r\n \"Website-Id\": \"Website-Id\",\r\n \"Website-No\": \"Website-No\",\r\n}\r\n\r\nconst COOKIE_NAMES: Record<CookieNames, CookieNames> = {\r\n \"IBOOT_DEVICE_ID\": \"IBOOT_DEVICE_ID\",\r\n \"IBOOT_LOCALE\": \"IBOOT_LOCALE\",\r\n \"IBOOT_WEBSITE_ID\": \"IBOOT_WEBSITE_ID\",\r\n \"IBOOT_WEBSITE_NO\": \"IBOOT_WEBSITE_NO\",\r\n \"token\": \"token\",\r\n \"user\": \"user\"\r\n}\r\n\r\nconst getDefaultRequestHeader = (): HttpHeaders => {\r\n const devideId = localStorage.getItem(DEVICE_ID_KEY) ?? ''\r\n const json = localStorage.getItem(CURRENT_WEBSITE_KEY);\r\n const curWebsite: CurWebsite | null = json != null ? JSON.parse(json) : null;\r\n const header: HttpHeaders = {}\r\n if (devideId.length > 0) {\r\n header['Device-Id'] = devideId\r\n }\r\n if (curWebsite) {\r\n header['Lang'] = curWebsite.language;\r\n if (curWebsite.websiteId) {\r\n header['Website-Id'] = curWebsite.websiteId;\r\n }\r\n if (curWebsite.websiteNo) {\r\n header['Website-No'] = curWebsite.websiteNo\r\n }\r\n }\r\n return header;\r\n};\r\n\r\n\r\nexport const setDefaultRequestHeader = (deviceId: string, website?: CurWebsite): void => {\r\n localStorage.setItem(DEVICE_ID_KEY, deviceId);\r\n if (website) {\r\n localStorage.setItem(CURRENT_WEBSITE_KEY, JSON.stringify(website));\r\n }\r\n}\r\n\r\nexport const get = async <T>(url: string, opts?: ClientGetParams): Promise<ResultModel<T>> => {\r\n if (opts?.data) {\r\n const params = new URLSearchParams(opts.data);\r\n if (url.indexOf(\"?\") != -1) {\r\n url += `&${params}`\r\n } else {\r\n url += `?${params}`\r\n }\r\n }\r\n const headers: Record<string, string> = getDefaultRequestHeader();\r\n const heads = opts?.headers;\r\n if (heads) {\r\n for (const field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n headers[field] = value;\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"method\": \"GET\",\r\n \"url\": url,\r\n \"headers\": headers,\r\n })\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n cache: opts?.useCache ? 'force-cache' : 'default'\r\n });\r\n\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug({\r\n \"GET_RESULT\": result,\r\n })\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const post = async <T>(url: string, opts?: ClientPostParams): Promise<ResultModel<T>> => {\r\n const data = opts?.data ?? {};\r\n const heads = opts?.headers;\r\n let body: string | FormData;\r\n const proxyHeaders = new Headers(getDefaultRequestHeader());\r\n if (!(data instanceof FormData)) {\r\n body = JSON.stringify(data);\r\n proxyHeaders.set('Content-Type', 'application/json');\r\n } else {\r\n body = data;\r\n }\r\n if (heads) {\r\n for (let field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n proxyHeaders.set(field, value);\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"method\": \"GET\",\r\n \"url\": url,\r\n \"headers\": proxyHeaders,\r\n })\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: proxyHeaders,\r\n body: body,\r\n });\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug({\r\n \"POST_RESULT\": result,\r\n })\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const iGet = async <T>(url: string, opts?: ClientGetParams): Promise<T | undefined> => {\r\n const res = await get<T>(url, opts);\r\n if (res.success) {\r\n return res.data as T;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _GET_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _GET_ERROR)\r\n}\r\n\r\nexport const iPost = async <T>(url: string, opts?: ClientPostParams): Promise<T | undefined> => {\r\n const res = await post<T>(url, opts);\r\n if (res.success) {\r\n return res.data;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _POST_ERROR)\r\n}\r\n\r\nexport const iPostSuccess = async (url: string, opts?: ClientPostParams): Promise<boolean> => {\r\n const res = await post(url, opts);\r\n if (res.success) {\r\n if (opts?.showSuccess) {\r\n opts.showSuccess(res.msg ?? 'SUCCESS')\r\n }\r\n return true;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n }\r\n return false;\r\n}\r\n\r\n\r\nexport const getHttpClientOpts = (request: Request): HttpClientOpts => {\r\n const deviceId = request.headers.get(HEADER_NAMES[\"Device-Id\"]);\r\n const lang = request.headers.get(HEADER_NAMES.Lang);\r\n const websiteId = request.headers.get(HEADER_NAMES[\"Website-Id\"]);\r\n const websiteNo = request.headers.get(HEADER_NAMES[\"Website-No\"]);\r\n const result: HttpClientOpts = {}\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport const getHttpClientOptsByCookie = (cookie: IbootReadonlyCookies): HttpClientOpts => {\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookie.get(COOKIE_NAMES.IBOOT_DEVICE_ID)?.value;\r\n const lang = cookie.get(COOKIE_NAMES.IBOOT_LOCALE)?.value;\r\n const websiteId = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_ID)?.value;\r\n const websiteNo = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_NO)?.value;\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly baseUrl: string;\r\n private readonly helloMethod: string;\r\n private readonly apiKey: string;\r\n private readonly userType: USER_TYPE;\r\n private readonly userFrom: string;\r\n private readonly deviceId: string;\r\n private readonly version: string = '1';\r\n private readonly lang: string;\r\n private readonly websiteId?: string;\r\n private readonly websiteNo?: string;\r\n private readonly _isDebug: boolean;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType, helloURL }: Readonly<HttpClientOpts>) {\r\n this.baseUrl = process.env.BASE_URL ?? '';\r\n this.helloMethod = helloURL ?? ''\r\n this.apiKey = process.env.API_KEY ?? '';\r\n this.userType = userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.userFrom = process.env.USER_FROM || '1';\r\n this.deviceId = deviceId ?? randomString(10);\r\n this.lang = lang ?? DEFAULT_LOCALE;\r\n this.websiteId = websiteId\r\n this.websiteNo = websiteNo\r\n this._isDebug = process.env.NODE_ENV != 'production';\r\n }\r\n\r\n isDebug() {\r\n return this._isDebug;\r\n }\r\n\r\n encrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.encrypt(data, key).toString();\r\n }\r\n\r\n decrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.decrypt(data, key, {\r\n mode: CryptoJS.mode.ECB,\r\n }).toString(CryptoJS.enc.Utf8);\r\n }\r\n\r\n getDeviceId() {\r\n return this.deviceId;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private convertUrlParameter(data: Record<string, any>): string {\r\n const p: string[] = [];\r\n for (const o in data) {\r\n let v = data[o];\r\n if (v && typeof v === \"string\") {\r\n v = v.trim();\r\n } else if (v && typeof v === \"object\") {\r\n if (isArray(v)) {\r\n if (v.length === 0) {\r\n continue;\r\n }\r\n for (let i = 0; i < v.length; i++) {\r\n const arr_item = v[i];\r\n for (const item_field in arr_item) {\r\n const item_field_value = arr_item[item_field] ?? undefined;\r\n if (item_field_value) {\r\n if (typeof item_field_value === \"object\") {\r\n if (isArray(item_field_value)) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n item_field_value.forEach((item1: any, index: number) => {\r\n if (item1) {\r\n for (const f in item1) {\r\n const v = item1[f];\r\n if (v && v.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field + `[${index.toString()}].${f}`}=${urlEncode(v)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n } else if (item_field_value.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field}=${urlEncode(item_field_value.toString())}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n for (const obj in v) {\r\n const oValue = v[obj];\r\n if (oValue != null && oValue != \"\" && oValue.length != 0) {\r\n const s = `.${obj}=${urlEncode(oValue)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n continue;\r\n } else if (v && typeof v === \"function\") {\r\n v = null;\r\n }\r\n\r\n if (v != null && v != \"\" && v.length != 0) {\r\n p.push(o + \"=\" + urlEncode(v));\r\n }\r\n }\r\n return (p && p.join(\"&\"));\r\n }\r\n\r\n private async sign(data: Record<string, object | string>): Promise<string> {\r\n //由后台分配\r\n const _apiKey = \"&key=\" + (await this.helloIboot());\r\n const arr: string[] = [];\r\n for (const o in data) {\r\n arr.push(o);\r\n }\r\n arr.sort((a: string, b: string) => {\r\n return a.toLowerCase().localeCompare(b.toLowerCase());\r\n });\r\n const res: string[] = [];\r\n arr.forEach((v: string) => {\r\n let value: object | string = data[v];\r\n if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n res.push(v + \"=\" + value);\r\n });\r\n const paramsStr: string = res.join(\"&\");\r\n const str = md5.md5((paramsStr + _apiKey).toLocaleUpperCase());\r\n const logInfo = {\r\n name: \"sort\",\r\n params: paramsStr,\r\n md5: str\r\n }\r\n logger.debug(logInfo)\r\n return str;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private assemblyParameter(data?: Record<string, any>, username?: string): Record<string, any> {\r\n const params = data ?? {};\r\n params['timestamp'] = Date.now() + '';\r\n params['echostr'] = randomString(10);\r\n params['version'] = this.version;\r\n params['deviceId'] = this.deviceId;\r\n params['webid'] = this.websiteId;\r\n params['apiKey'] = this.apiKey;\r\n if (username && username.length > 0) {\r\n params['username'] = username;\r\n }\r\n return params;\r\n }\r\n\r\n private async assemblyHeader({ urlParams, token }: Readonly<{ urlParams: string, token?: Readonly<HttpToken> }>) {\r\n const h: Record<string, string> = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Device-Id': this.deviceId,\r\n 'User-Type': token?.utype.toString() ?? this.userType.toString(),\r\n 'User-From': this.userFrom,\r\n 'Api-Key': this.apiKey\r\n }\r\n if (this.lang && this.lang.length > 0) {\r\n h['Lang'] = this.lang\r\n }\r\n if (this.websiteId && this.websiteId.length > 0) {\r\n h['Web-Id'] = this.websiteId\r\n }\r\n if (this.websiteNo && this.websiteNo.length > 0) {\r\n h['Web-No'] = this.websiteNo\r\n }\r\n if (token) {\r\n if (token.token && token.token.length > 0 && token.username && token.username.length > 0) {\r\n h['Authorization'] = token.token;\r\n h['Username'] = token.username;\r\n }\r\n if (token.xcsrf) {\r\n h[token.xcsrf.csrfHeader] = token.xcsrf.csrfToken;\r\n }\r\n }\r\n const data = urlParamToJson(urlParams);\r\n const sign = await this.sign(data);\r\n h['Sign'] = sign\r\n return h;\r\n }\r\n\r\n private async helloIboot(): Promise<string> {\r\n if (this.helloMethod.length <= 0) {\r\n return this.apiKey;\r\n }\r\n const api = this.getApiUrl(this.helloMethod);\r\n const h = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Api-Key': this.apiKey\r\n }\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": h\r\n }\r\n logger.debug(logInfo);\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: h,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug({ result: result.data })\r\n return result.data;\r\n }\r\n throw new Error('hello iBoot error!')\r\n }\r\n\r\n private getApiUrl(url: string): string {\r\n return `${this.baseUrl}/${url}`;\r\n }\r\n\r\n async csrf(): Promise<string | undefined> {\r\n const res = await this.get<CSRFToken>({\r\n url: 'guest/csrf'\r\n });\r\n if (res.success) {\r\n const data = res.data;\r\n if (data) {\r\n return data[\"csrfToken\"].toString();\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async get<T>({ url, data, token, cache = 'default' }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n const api = `${this.getApiUrl(url)}?${urlParams.toString()}`\r\n const logInfo = {\r\n \"method\": \"GET\",\r\n \"url\": api,\r\n \"headers\": headers\r\n }\r\n logger.info(logInfo);\r\n const res = await fetch(api, {\r\n \"method\": 'GET',\r\n \"headers\": headers,\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug({ \"GET_RESULT\": result })\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token, cache = \"default\" }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n const api = this.getApiUrl(url);\r\n const logInfo = {\r\n \"method\": \"POST\",\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo);\r\n const urls = buffer ? `${api}?${urlParams}` : api;\r\n const res = await fetch(urls, {\r\n \"method\": 'POST',\r\n \"headers\": headers,\r\n \"body\": buffer ? buffer : urlParams.toString(),\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug({ \"POST_RESULT\": result })\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<Omit<ServerRequestOptions, 'cache'>>): Promise<Response> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params); //new URLSearchParams(params);\r\n\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n headers['Connection'] = 'keep-alive';\r\n headers['X-Accel-Buffering'] = 'no'; //防止 Nginx 缓存\r\n headers['Cache-Control'] = 'no-cache';\r\n const api = this.getApiUrl(url)\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\r\n const logInfo = {\r\n \"method\": \"STREAM\",\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo);\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: buffer ? buffer : urlParams.toString(),\r\n credentials: 'include'\r\n });\r\n\r\n if (!res.ok) {\r\n throw new Error(`HTTP error! status: ${res.status}`);\r\n }\r\n if (!res.body) {\r\n throw new Error('No response body');\r\n }\r\n return new Response(res.body, {\r\n headers: {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive'\r\n }\r\n });\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n\r\n getUserInfo(cookies: IbootCookieStore): User | null {\r\n const userjson = cookies.get(COOKIE_NAMES.user)?.value;\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n return null;\r\n }\r\n\r\n getToken(cookies: IbootCookieStore): HttpToken {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n getTokenByCookies = (cookies: IbootReadonlyCookies): HttpToken => {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setToken(data: User & { token: string, extFields: Record<string, any> }, response: { cookies: IbootWritableCookie }) {\r\n const { id, name, username, nickname, sex, headImg, token, lastLoginTime, tokenExpired, deviceId, userType, mustChangePwd } = data;\r\n const loginUser: User = {\r\n id: id,\r\n name: name,\r\n username: username,\r\n nickname: nickname,\r\n sex: sex,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n tokenExpired: tokenExpired,\r\n deviceId: deviceId,\r\n userType: userType,\r\n status: 0,\r\n accountType: 0,\r\n enabled: false,\r\n userFrom: 1,\r\n needToReview: false,\r\n socketOnline: false,\r\n createTime: \"\",\r\n mustChangePwd: mustChangePwd\r\n };\r\n response.cookies.set(COOKIE_NAMES.token, token, {\r\n httpOnly: true,\r\n secure: !this._isDebug, // 在生产环境中启用Secure\r\n sameSite: 'strict', // 防止 CSRF 攻击\r\n path: '/', // Cookie 的路径\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, JSON.stringify(loginUser));\r\n return response;\r\n }\r\n\r\n cleanToken(response: { cookies: IbootWritableCookie }) {\r\n response.cookies.set(COOKIE_NAMES.token, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.delete(COOKIE_NAMES.token);\r\n response.cookies.delete(COOKIE_NAMES.user)\r\n return response;\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","logger","pino","label","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","HEADER_NAMES","COOKIE_NAMES","getDefaultRequestHeader","devideId","json","curWebsite","header","setDefaultRequestHeader","deviceId","website","get","url","opts","params","headers","heads","field","response","msg","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","helloURL","key","CryptoJS","p","o","v","arr_item","item_field","item_field_value","item1","index","f","s","oValue","_apiKey","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","cache","buffer","boundary","urls","e","cookies","userjson","utype","user","id","name","nickname","sex","headImg","lastLoginTime","tokenExpired","mustChangePwd","loginUser"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"iboot-http-client.cjs.js","sources":["../src/types/user.ts","../src/logger.ts","../src/utils.ts","../src/http-client.ts"],"sourcesContent":["export const ACCOUNT_TYPE_MAP = {\r\n GENERAL : 0,\r\n PHONE : 1,\r\n EMAIL : 2\r\n}\r\n\r\nexport const USER_TYPE_MAP = {\r\n TYPE_MGT : 0,\r\n TYPE_C : 1,\r\n TYPE_B : 2\r\n}\r\n\r\nexport const USER_FORM_MAP = {\r\n FROM_WEB : 1,\r\n FROM_PC : 2,\r\n FROM_WX_MINI_PRO : 3,\r\n FROM_WX_PLU : 4,\r\n FROM_WX_E : 5,\r\n FROM_APP : 6,\r\n FROM_DEVICE : 7\r\n}\r\n\r\nexport const USER_SEX_MAP = {\r\n unknown:0,\r\n male:1,\r\n female:2,\r\n}\r\n\r\nexport type ACCOUNT_TYPE = typeof ACCOUNT_TYPE_MAP[keyof typeof ACCOUNT_TYPE_MAP];\r\nexport type USER_TYPE = typeof USER_TYPE_MAP[keyof typeof USER_TYPE_MAP];\r\nexport type USER_FORM = typeof USER_FORM_MAP[keyof typeof USER_FORM_MAP];\r\nexport type USER_SEX = typeof USER_SEX_MAP[keyof typeof USER_SEX_MAP];\r\n\r\n// User interface\r\nexport interface User {\r\n id: string;\r\n name: string;\r\n username: string;\r\n nickname: string;\r\n sex: USER_SEX;\r\n headImg: string;\r\n lastLoginTime: string;\r\n tokenExpired: string;\r\n deviceId: string;\r\n userType: USER_TYPE;\r\n status: number;\r\n accountType: number;\r\n enabled: boolean;\r\n userFrom: USER_FORM;\r\n needToReview: boolean;\r\n socketOnline: boolean;\r\n createTime: string;\r\n mustChangePwd: boolean;\r\n}","import pino from \"pino\";\r\nimport koffi from 'koffi';\r\n\r\nif (typeof window === 'undefined' && process.platform === 'win32') {\r\n try {\r\n const CP_UTF8 = 65001;\r\n const kernel32 = koffi.load('Kernel32');\r\n const setConsoleOutputCP = kernel32.func('SetConsoleOutputCP', 'bool', ['int']);\r\n const setConsoleCP = kernel32.func('SetConsoleCP', 'bool', ['int']);\r\n setConsoleOutputCP(CP_UTF8);\r\n setConsoleCP(CP_UTF8);\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n}\r\n\r\nexport const logger = pino({\r\n name: process.env.APP_NAME ?? 'iBoot',\r\n level: process.env.NODE_ENV !== 'production' ? 'debug' : 'info',\r\n nestedKey: 'payload',\r\n transport: {\r\n target: 'pino-pretty',\r\n options: {\r\n colorize: true,\r\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n ignore: 'pid,hostname',\r\n messageFormat: '{msg}',\r\n singleLine: true,\r\n },\r\n }\r\n});","export const isArray = (obj: unknown) => {\r\n return (\r\n Array.isArray(obj) ||\r\n (typeof obj === \"object\" &&\r\n Object.prototype.toString.call(obj) === \"[object Array]\")\r\n );\r\n};\r\n\r\n/**\r\n * 生成指定长度的随机串\r\n * @param {Object} len\r\n */\r\nexport const randomString = (len: number) => {\r\n const l = len || 32;\r\n const $chars = \"ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678\";\r\n const maxPos = $chars.length;\r\n let pwd = \"\";\r\n for (let i = 0; i < l; i++) {\r\n pwd += $chars.charAt(Math.floor(Math.random() * maxPos));\r\n }\r\n return pwd;\r\n};\r\n\r\nexport const urlParamToJson = (urlQueryParams: string, exclude?: string[]): Record<string, string> => {\r\n const result: Record<string, string> = {};\r\n const strs = urlQueryParams.split(\"&\");\r\n strs.forEach((item) => {\r\n const arr = item.split(\"=\");\r\n if (arr[1]) {\r\n if (!exclude || exclude.indexOf(arr[0]) == -1) {\r\n result[arr[0]] = arr[1];\r\n }\r\n }\r\n });\r\n return result;\r\n};\r\n\r\nexport const urlEncode = (value: string | null | undefined): string => {\r\n if (!value || value == \"\" || value.length == 0) {\r\n return \"\";\r\n }\r\n return (\r\n encodeURIComponent(value)\r\n // .replace(/%20/g, '+')\r\n // .replace(/%2B/g, '\\\\+')\r\n .replace(/\\(/g, \"%28\")\r\n .replace(/\\)/g, \"%29\")\r\n .replace(/\\'/g, \"%27\")\r\n .replace(/\\!/g, \"%21\")\r\n .replace(/\\~/g, \"%7E\")\r\n );\r\n};\r\n","import md5 from \"js-md5\";\r\nimport CryptoJS from 'crypto-js';\r\nimport { isArray, randomString, urlEncode, urlParamToJson } from \"./utils\";\r\nimport {\r\n ClientGetParams,\r\n ClientPostParams,\r\n CookieNames,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaderNames,\r\n HttpHeaders,\r\n HttpToken,\r\n IbootCookieStore,\r\n IbootReadonlyCookies,\r\n IbootWritableCookie,\r\n ResultModel,\r\n ServerRequestOptions\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\r\n\r\nexport const DEFAULT_LOCALE = 'zh-CN';\r\nexport const DEVICE_ID_KEY = \"_device_id_key\";\r\nexport const CURRENT_WEBSITE_KEY = \"_current_website_key\"\r\n\r\nconst _GET_ERROR = \"Get request error!\"\r\nconst _POST_ERROR = \"Post request error!\";\r\n\r\nconst HEADER_NAMES: Record<HttpHeaderNames, HttpHeaderNames> = {\r\n \"Device-Id\": \"Device-Id\",\r\n \"Lang\": \"Lang\",\r\n \"Website-Id\": \"Website-Id\",\r\n \"Website-No\": \"Website-No\",\r\n}\r\n\r\nconst COOKIE_NAMES: Record<CookieNames, CookieNames> = {\r\n \"IBOOT_DEVICE_ID\": \"IBOOT_DEVICE_ID\",\r\n \"IBOOT_LOCALE\": \"IBOOT_LOCALE\",\r\n \"IBOOT_WEBSITE_ID\": \"IBOOT_WEBSITE_ID\",\r\n \"IBOOT_WEBSITE_NO\": \"IBOOT_WEBSITE_NO\",\r\n \"token\": \"token\",\r\n \"user\": \"user\"\r\n}\r\n\r\nconst getDefaultRequestHeader = (): HttpHeaders => {\r\n const devideId = localStorage.getItem(DEVICE_ID_KEY) ?? ''\r\n const json = localStorage.getItem(CURRENT_WEBSITE_KEY);\r\n const curWebsite: CurWebsite | null = json != null ? JSON.parse(json) : null;\r\n const header: HttpHeaders = {}\r\n if (devideId.length > 0) {\r\n header['Device-Id'] = devideId\r\n }\r\n if (curWebsite) {\r\n header['Lang'] = curWebsite.language;\r\n if (curWebsite.websiteId) {\r\n header['Website-Id'] = curWebsite.websiteId;\r\n }\r\n if (curWebsite.websiteNo) {\r\n header['Website-No'] = curWebsite.websiteNo\r\n }\r\n }\r\n return header;\r\n};\r\n\r\n\r\nexport const setDefaultRequestHeader = (deviceId: string, website?: CurWebsite): void => {\r\n localStorage.setItem(DEVICE_ID_KEY, deviceId);\r\n if (website) {\r\n localStorage.setItem(CURRENT_WEBSITE_KEY, JSON.stringify(website));\r\n }\r\n}\r\n\r\nexport const get = async <T>(url: string, opts?: ClientGetParams): Promise<ResultModel<T>> => {\r\n if (opts?.data) {\r\n const params = new URLSearchParams(opts.data);\r\n if (url.indexOf(\"?\") != -1) {\r\n url += `&${params}`\r\n } else {\r\n url += `?${params}`\r\n }\r\n }\r\n const headers: Record<string, string> = getDefaultRequestHeader();\r\n const heads = opts?.headers;\r\n if (heads) {\r\n for (const field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n headers[field] = value;\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": headers,\r\n }, \"GET\")\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n cache: opts?.useCache ? 'force-cache' : 'default'\r\n });\r\n\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const post = async <T>(url: string, opts?: ClientPostParams): Promise<ResultModel<T>> => {\r\n const data = opts?.data ?? {};\r\n const heads = opts?.headers;\r\n let body: string | FormData;\r\n const proxyHeaders = new Headers(getDefaultRequestHeader());\r\n if (!(data instanceof FormData)) {\r\n body = JSON.stringify(data);\r\n proxyHeaders.set('Content-Type', 'application/json');\r\n } else {\r\n body = data;\r\n }\r\n if (heads) {\r\n for (let field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n proxyHeaders.set(field, value);\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": proxyHeaders,\r\n }, \"POST\")\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: proxyHeaders,\r\n body: body,\r\n });\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const iGet = async <T>(url: string, opts?: ClientGetParams): Promise<T | undefined> => {\r\n const res = await get<T>(url, opts);\r\n if (res.success) {\r\n return res.data as T;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _GET_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _GET_ERROR)\r\n}\r\n\r\nexport const iPost = async <T>(url: string, opts?: ClientPostParams): Promise<T | undefined> => {\r\n const res = await post<T>(url, opts);\r\n if (res.success) {\r\n return res.data;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _POST_ERROR)\r\n}\r\n\r\nexport const iPostSuccess = async (url: string, opts?: ClientPostParams): Promise<boolean> => {\r\n const res = await post(url, opts);\r\n if (res.success) {\r\n if (opts?.showSuccess) {\r\n opts.showSuccess(res.msg ?? 'SUCCESS')\r\n }\r\n return true;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n }\r\n return false;\r\n}\r\n\r\n\r\nexport const getHttpClientOpts = (request: Request): HttpClientOpts => {\r\n const deviceId = request.headers.get(HEADER_NAMES[\"Device-Id\"]);\r\n const lang = request.headers.get(HEADER_NAMES.Lang);\r\n const websiteId = request.headers.get(HEADER_NAMES[\"Website-Id\"]);\r\n const websiteNo = request.headers.get(HEADER_NAMES[\"Website-No\"]);\r\n const result: HttpClientOpts = {}\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport const getHttpClientOptsByCookie = (cookie: IbootReadonlyCookies): HttpClientOpts => {\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookie.get(COOKIE_NAMES.IBOOT_DEVICE_ID)?.value;\r\n const lang = cookie.get(COOKIE_NAMES.IBOOT_LOCALE)?.value;\r\n const websiteId = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_ID)?.value;\r\n const websiteNo = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_NO)?.value;\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly baseUrl: string;\r\n private readonly helloMethod: string;\r\n private readonly apiKey: string;\r\n private readonly userType: USER_TYPE;\r\n private readonly userFrom: string;\r\n private readonly deviceId: string;\r\n private readonly version: string = '1';\r\n private readonly lang: string;\r\n private readonly websiteId?: string;\r\n private readonly websiteNo?: string;\r\n private readonly _isDebug: boolean;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType, helloURL }: Readonly<HttpClientOpts>) {\r\n this.baseUrl = process.env.BASE_URL ?? '';\r\n this.helloMethod = helloURL ?? ''\r\n this.apiKey = process.env.API_KEY ?? '';\r\n this.userType = userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.userFrom = process.env.USER_FROM || '1';\r\n this.deviceId = deviceId ?? randomString(10);\r\n this.lang = lang ?? DEFAULT_LOCALE;\r\n this.websiteId = websiteId\r\n this.websiteNo = websiteNo\r\n this._isDebug = process.env.NODE_ENV != 'production';\r\n }\r\n\r\n isDebug() {\r\n return this._isDebug;\r\n }\r\n\r\n encrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.encrypt(data, key).toString();\r\n }\r\n\r\n decrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.decrypt(data, key, {\r\n mode: CryptoJS.mode.ECB,\r\n }).toString(CryptoJS.enc.Utf8);\r\n }\r\n\r\n getDeviceId() {\r\n return this.deviceId;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private convertUrlParameter(data: Record<string, any>): string {\r\n const p: string[] = [];\r\n for (const o in data) {\r\n let v = data[o];\r\n if (v && typeof v === \"string\") {\r\n v = v.trim();\r\n } else if (v && typeof v === \"object\") {\r\n if (isArray(v)) {\r\n if (v.length === 0) {\r\n continue;\r\n }\r\n for (let i = 0; i < v.length; i++) {\r\n const arr_item = v[i];\r\n for (const item_field in arr_item) {\r\n const item_field_value = arr_item[item_field] ?? undefined;\r\n if (item_field_value) {\r\n if (typeof item_field_value === \"object\") {\r\n if (isArray(item_field_value)) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n item_field_value.forEach((item1: any, index: number) => {\r\n if (item1) {\r\n for (const f in item1) {\r\n const v = item1[f];\r\n if (v && v.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field + `[${index.toString()}].${f}`}=${urlEncode(v)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n } else if (item_field_value.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field}=${urlEncode(item_field_value.toString())}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n for (const obj in v) {\r\n const oValue = v[obj];\r\n if (oValue != null && oValue != \"\" && oValue.length != 0) {\r\n const s = `.${obj}=${urlEncode(oValue)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n continue;\r\n } else if (v && typeof v === \"function\") {\r\n v = null;\r\n }\r\n\r\n if (v != null && v != \"\" && v.length != 0) {\r\n p.push(o + \"=\" + urlEncode(v));\r\n }\r\n }\r\n return (p && p.join(\"&\"));\r\n }\r\n\r\n private async sign(data: Record<string, object | string>): Promise<string> {\r\n //由后台分配\r\n const _apiKey = \"&key=\" + (await this.helloIboot());\r\n const arr: string[] = [];\r\n for (const o in data) {\r\n arr.push(o);\r\n }\r\n arr.sort((a: string, b: string) => {\r\n return a.toLowerCase().localeCompare(b.toLowerCase());\r\n });\r\n const res: string[] = [];\r\n arr.forEach((v: string) => {\r\n let value: object | string = data[v];\r\n if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n res.push(v + \"=\" + value);\r\n });\r\n const paramsStr: string = res.join(\"&\");\r\n const str = md5.md5((paramsStr + _apiKey).toLocaleUpperCase());\r\n const logInfo = {\r\n params: paramsStr,\r\n md5: str\r\n }\r\n logger.debug(logInfo, \"API_SIGN\")\r\n return str;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private assemblyParameter(data?: Record<string, any>, username?: string): Record<string, any> {\r\n const params = data ?? {};\r\n params['timestamp'] = Date.now() + '';\r\n params['echostr'] = randomString(10);\r\n params['version'] = this.version;\r\n params['deviceId'] = this.deviceId;\r\n params['webid'] = this.websiteId;\r\n params['apiKey'] = this.apiKey;\r\n if (username && username.length > 0) {\r\n params['username'] = username;\r\n }\r\n return params;\r\n }\r\n\r\n private async assemblyHeader({ urlParams, token }: Readonly<{ urlParams: string, token?: Readonly<HttpToken> }>) {\r\n const h: Record<string, string> = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Device-Id': this.deviceId,\r\n 'User-Type': token?.utype.toString() ?? this.userType.toString(),\r\n 'User-From': this.userFrom,\r\n 'Api-Key': this.apiKey\r\n }\r\n if (this.lang && this.lang.length > 0) {\r\n h['Lang'] = this.lang\r\n }\r\n if (this.websiteId && this.websiteId.length > 0) {\r\n h['Web-Id'] = this.websiteId\r\n }\r\n if (this.websiteNo && this.websiteNo.length > 0) {\r\n h['Web-No'] = this.websiteNo\r\n }\r\n if (token) {\r\n if (token.token && token.token.length > 0 && token.username && token.username.length > 0) {\r\n h['Authorization'] = token.token;\r\n h['Username'] = token.username;\r\n }\r\n if (token.xcsrf) {\r\n h[token.xcsrf.csrfHeader] = token.xcsrf.csrfToken;\r\n }\r\n }\r\n const data = urlParamToJson(urlParams);\r\n const sign = await this.sign(data);\r\n h['Sign'] = sign\r\n return h;\r\n }\r\n\r\n private async helloIboot(): Promise<string> {\r\n if (this.helloMethod.length <= 0) {\r\n return this.apiKey;\r\n }\r\n const api = this.getApiUrl(this.helloMethod);\r\n const h = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Api-Key': this.apiKey\r\n }\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": h\r\n }\r\n logger.debug(logInfo, \"HELLO\");\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: h,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result.data, 'HELLO RESULT')\r\n return result.data;\r\n }\r\n throw new Error('hello iBoot error!')\r\n }\r\n\r\n private getApiUrl(url: string): string {\r\n return `${this.baseUrl}/${url}`;\r\n }\r\n\r\n async csrf(): Promise<string | undefined> {\r\n const res = await this.get<CSRFToken>({\r\n url: 'guest/csrf'\r\n });\r\n if (res.success) {\r\n const data = res.data;\r\n if (data) {\r\n return data[\"csrfToken\"].toString();\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async get<T>({ url, data, token, cache = 'default' }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n const api = `${this.getApiUrl(url)}?${urlParams.toString()}`\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers\r\n }\r\n logger.info(logInfo, \"GET\");\r\n const res = await fetch(api, {\r\n \"method\": 'GET',\r\n \"headers\": headers,\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token, cache = \"default\" }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n const api = this.getApiUrl(url);\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"POST\");\r\n const urls = buffer ? `${api}?${urlParams}` : api;\r\n const res = await fetch(urls, {\r\n \"method\": 'POST',\r\n \"headers\": headers,\r\n \"body\": buffer ? buffer : urlParams.toString(),\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<Omit<ServerRequestOptions, 'cache'>>): Promise<Response> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params); //new URLSearchParams(params);\r\n\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n headers['Connection'] = 'keep-alive';\r\n headers['X-Accel-Buffering'] = 'no'; //防止 Nginx 缓存\r\n headers['Cache-Control'] = 'no-cache';\r\n const api = this.getApiUrl(url)\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"STREAM\");\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: buffer ? buffer : urlParams.toString(),\r\n credentials: 'include'\r\n });\r\n\r\n if (!res.ok) {\r\n throw new Error(`HTTP error! status: ${res.status}`);\r\n }\r\n if (!res.body) {\r\n throw new Error('No response body');\r\n }\r\n return new Response(res.body, {\r\n headers: {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive'\r\n }\r\n });\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n\r\n getUserInfo(cookies: IbootCookieStore): User | null {\r\n const userjson = cookies.get(COOKIE_NAMES.user)?.value;\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n return null;\r\n }\r\n\r\n getToken(cookies: IbootCookieStore): HttpToken {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n getTokenByCookies = (cookies: IbootReadonlyCookies): HttpToken => {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setToken(data: User & { token: string, extFields: Record<string, any> }, response: { cookies: IbootWritableCookie }) {\r\n const { id, name, username, nickname, sex, headImg, token, lastLoginTime, tokenExpired, deviceId, userType, mustChangePwd } = data;\r\n const loginUser: User = {\r\n id: id,\r\n name: name,\r\n username: username,\r\n nickname: nickname,\r\n sex: sex,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n tokenExpired: tokenExpired,\r\n deviceId: deviceId,\r\n userType: userType,\r\n status: 0,\r\n accountType: 0,\r\n enabled: false,\r\n userFrom: 1,\r\n needToReview: false,\r\n socketOnline: false,\r\n createTime: \"\",\r\n mustChangePwd: mustChangePwd\r\n };\r\n response.cookies.set(COOKIE_NAMES.token, token, {\r\n httpOnly: true,\r\n secure: !this._isDebug, // 在生产环境中启用Secure\r\n sameSite: 'strict', // 防止 CSRF 攻击\r\n path: '/', // Cookie 的路径\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, JSON.stringify(loginUser));\r\n return response;\r\n }\r\n\r\n cleanToken(response: { cookies: IbootWritableCookie }) {\r\n response.cookies.set(COOKIE_NAMES.token, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.delete(COOKIE_NAMES.token);\r\n response.cookies.delete(COOKIE_NAMES.user)\r\n return response;\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","kernel32","koffi","setConsoleOutputCP","setConsoleCP","e","logger","pino","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","HEADER_NAMES","COOKIE_NAMES","getDefaultRequestHeader","devideId","json","curWebsite","header","setDefaultRequestHeader","deviceId","website","get","url","opts","params","headers","heads","field","response","msg","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","helloURL","key","CryptoJS","p","o","v","arr_item","item_field","item_field_value","item1","index","f","s","oValue","_apiKey","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","cache","buffer","boundary","urls","cookies","userjson","utype","user","id","name","nickname","sex","headImg","lastLoginTime","tokenExpired","mustChangePwd","loginUser"],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import N from "pino";
|
|
2
|
-
import A from "
|
|
3
|
-
import
|
|
4
|
-
|
|
2
|
+
import A from "koffi";
|
|
3
|
+
import U from "js-md5";
|
|
4
|
+
import m from "crypto-js";
|
|
5
|
+
const F = {
|
|
5
6
|
GENERAL: 0,
|
|
6
7
|
PHONE: 1,
|
|
7
8
|
EMAIL: 2
|
|
@@ -9,7 +10,7 @@ const $ = {
|
|
|
9
10
|
TYPE_MGT: 0,
|
|
10
11
|
TYPE_C: 1,
|
|
11
12
|
TYPE_B: 2
|
|
12
|
-
},
|
|
13
|
+
}, j = {
|
|
13
14
|
FROM_WEB: 1,
|
|
14
15
|
FROM_PC: 2,
|
|
15
16
|
FROM_WX_MINI_PRO: 3,
|
|
@@ -17,19 +18,22 @@ const $ = {
|
|
|
17
18
|
FROM_WX_E: 5,
|
|
18
19
|
FROM_APP: 6,
|
|
19
20
|
FROM_DEVICE: 7
|
|
20
|
-
},
|
|
21
|
+
}, H = {
|
|
21
22
|
unknown: 0,
|
|
22
23
|
male: 1,
|
|
23
24
|
female: 2
|
|
24
25
|
};
|
|
25
|
-
|
|
26
|
+
if (typeof window > "u" && process.platform === "win32")
|
|
27
|
+
try {
|
|
28
|
+
const t = A.load("Kernel32"), e = t.func("SetConsoleOutputCP", "bool", ["int"]), s = t.func("SetConsoleCP", "bool", ["int"]);
|
|
29
|
+
e(65001), s(65001);
|
|
30
|
+
} catch (n) {
|
|
31
|
+
console.log(n);
|
|
32
|
+
}
|
|
26
33
|
const h = N({
|
|
27
34
|
name: process.env.APP_NAME ?? "iBoot",
|
|
28
|
-
level: process.env.NODE_ENV
|
|
35
|
+
level: process.env.NODE_ENV !== "production" ? "debug" : "info",
|
|
29
36
|
nestedKey: "payload",
|
|
30
|
-
formatters: {
|
|
31
|
-
level: (n) => ({ level: n })
|
|
32
|
-
},
|
|
33
37
|
transport: {
|
|
34
38
|
target: "pino-pretty",
|
|
35
39
|
options: {
|
|
@@ -46,13 +50,13 @@ const h = N({
|
|
|
46
50
|
for (let o = 0; o < t; o++)
|
|
47
51
|
r += e.charAt(Math.floor(Math.random() * s));
|
|
48
52
|
return r;
|
|
49
|
-
},
|
|
53
|
+
}, k = (n, t) => {
|
|
50
54
|
const e = {};
|
|
51
55
|
return n.split("&").forEach((r) => {
|
|
52
56
|
const o = r.split("=");
|
|
53
57
|
o[1] && (!t || t.indexOf(o[0]) == -1) && (e[o[0]] = o[1]);
|
|
54
58
|
}), e;
|
|
55
|
-
}, b = (n) => !n || n == "" || n.length == 0 ? "" : encodeURIComponent(n).replace(/\(/g, "%28").replace(/\)/g, "%29").replace(/\'/g, "%27").replace(/\!/g, "%21").replace(/\~/g, "%7E"),
|
|
59
|
+
}, b = (n) => !n || n == "" || n.length == 0 ? "" : encodeURIComponent(n).replace(/\(/g, "%28").replace(/\)/g, "%29").replace(/\'/g, "%27").replace(/\!/g, "%21").replace(/\~/g, "%7E"), L = "zh-CN", S = "_device_id_key", P = "_current_website_key", O = "Get request error!", I = "Post request error!", T = {
|
|
56
60
|
"Device-Id": "Device-Id",
|
|
57
61
|
Lang: "Lang",
|
|
58
62
|
"Website-Id": "Website-Id",
|
|
@@ -64,27 +68,26 @@ const h = N({
|
|
|
64
68
|
IBOOT_WEBSITE_NO: "IBOOT_WEBSITE_NO",
|
|
65
69
|
token: "token",
|
|
66
70
|
user: "user"
|
|
67
|
-
},
|
|
68
|
-
const n = localStorage.getItem(S) ?? "", t = localStorage.getItem(
|
|
71
|
+
}, C = () => {
|
|
72
|
+
const n = localStorage.getItem(S) ?? "", t = localStorage.getItem(P), e = t != null ? JSON.parse(t) : null, s = {};
|
|
69
73
|
return n.length > 0 && (s["Device-Id"] = n), e && (s.Lang = e.language, e.websiteId && (s["Website-Id"] = e.websiteId), e.websiteNo && (s["Website-No"] = e.websiteNo)), s;
|
|
70
74
|
}, x = (n, t) => {
|
|
71
|
-
localStorage.setItem(S, n), t && localStorage.setItem(
|
|
75
|
+
localStorage.setItem(S, n), t && localStorage.setItem(P, JSON.stringify(t));
|
|
72
76
|
}, D = async (n, t) => {
|
|
73
77
|
if (t?.data) {
|
|
74
78
|
const i = new URLSearchParams(t.data);
|
|
75
79
|
n.indexOf("?") != -1 ? n += `&${i}` : n += `?${i}`;
|
|
76
80
|
}
|
|
77
|
-
const e =
|
|
81
|
+
const e = C(), s = t?.headers;
|
|
78
82
|
if (s)
|
|
79
83
|
for (const i in s) {
|
|
80
84
|
const l = s[i];
|
|
81
85
|
l && (e[i] = l);
|
|
82
86
|
}
|
|
83
87
|
h.debug({
|
|
84
|
-
method: "GET",
|
|
85
88
|
url: n,
|
|
86
89
|
headers: e
|
|
87
|
-
});
|
|
90
|
+
}, "GET");
|
|
88
91
|
const r = await fetch(n, {
|
|
89
92
|
method: "GET",
|
|
90
93
|
headers: e,
|
|
@@ -92,9 +95,7 @@ const h = N({
|
|
|
92
95
|
});
|
|
93
96
|
if (r.ok) {
|
|
94
97
|
const i = await r.json();
|
|
95
|
-
return h.debug(
|
|
96
|
-
GET_RESULT: i
|
|
97
|
-
}), i;
|
|
98
|
+
return h.debug(i, "GET_RESULT"), i;
|
|
98
99
|
}
|
|
99
100
|
const o = {
|
|
100
101
|
code: r.status,
|
|
@@ -102,20 +103,19 @@ const h = N({
|
|
|
102
103
|
msg: r.statusText
|
|
103
104
|
};
|
|
104
105
|
return h.error(o), o;
|
|
105
|
-
},
|
|
106
|
+
}, v = async (n, t) => {
|
|
106
107
|
const e = t?.data ?? {}, s = t?.headers;
|
|
107
108
|
let r;
|
|
108
|
-
const o = new Headers(
|
|
109
|
+
const o = new Headers(C());
|
|
109
110
|
if (e instanceof FormData ? r = e : (r = JSON.stringify(e), o.set("Content-Type", "application/json")), s)
|
|
110
111
|
for (let a in s) {
|
|
111
112
|
const c = s[a];
|
|
112
113
|
c && o.set(a, c);
|
|
113
114
|
}
|
|
114
115
|
h.debug({
|
|
115
|
-
method: "GET",
|
|
116
116
|
url: n,
|
|
117
117
|
headers: o
|
|
118
|
-
});
|
|
118
|
+
}, "POST");
|
|
119
119
|
const i = await fetch(n, {
|
|
120
120
|
method: "POST",
|
|
121
121
|
headers: o,
|
|
@@ -123,9 +123,7 @@ const h = N({
|
|
|
123
123
|
});
|
|
124
124
|
if (i.ok) {
|
|
125
125
|
const a = await i.json();
|
|
126
|
-
return h.debug(
|
|
127
|
-
POST_RESULT: a
|
|
128
|
-
}), a;
|
|
126
|
+
return h.debug(a, "POST_RESULT"), a;
|
|
129
127
|
}
|
|
130
128
|
const l = {
|
|
131
129
|
code: i.status,
|
|
@@ -133,7 +131,7 @@ const h = N({
|
|
|
133
131
|
msg: i.statusText
|
|
134
132
|
};
|
|
135
133
|
return h.error(l), l;
|
|
136
|
-
},
|
|
134
|
+
}, K = async (n, t) => {
|
|
137
135
|
const e = await D(n, t);
|
|
138
136
|
if (e.success)
|
|
139
137
|
return e.data;
|
|
@@ -142,8 +140,8 @@ const h = N({
|
|
|
142
140
|
return;
|
|
143
141
|
}
|
|
144
142
|
throw Error(e.msg ?? O);
|
|
145
|
-
},
|
|
146
|
-
const e = await
|
|
143
|
+
}, G = async (n, t) => {
|
|
144
|
+
const e = await v(n, t);
|
|
147
145
|
if (e.success)
|
|
148
146
|
return e.data;
|
|
149
147
|
if (t?.showError) {
|
|
@@ -151,17 +149,17 @@ const h = N({
|
|
|
151
149
|
return;
|
|
152
150
|
}
|
|
153
151
|
throw Error(e.msg ?? I);
|
|
154
|
-
},
|
|
155
|
-
const e = await
|
|
152
|
+
}, J = async (n, t) => {
|
|
153
|
+
const e = await v(n, t);
|
|
156
154
|
return e.success ? (t?.showSuccess && t.showSuccess(e.msg ?? "SUCCESS"), !0) : (t?.showError && t.showError(e.msg ?? I), !1);
|
|
157
|
-
},
|
|
155
|
+
}, Y = (n) => {
|
|
158
156
|
const t = n.headers.get(T["Device-Id"]), e = n.headers.get(T.Lang), s = n.headers.get(T["Website-Id"]), r = n.headers.get(T["Website-No"]), o = {};
|
|
159
157
|
return t && t.length > 0 && (o.deviceId = t), e && e.length > 0 && (o.lang = e), s && s.length > 0 && (o.websiteId = s), r && r.length > 0 && (o.websiteNo = r), o;
|
|
160
|
-
},
|
|
158
|
+
}, V = (n) => {
|
|
161
159
|
const t = {}, e = n.get(f.IBOOT_DEVICE_ID)?.value, s = n.get(f.IBOOT_LOCALE)?.value, r = n.get(f.IBOOT_WEBSITE_ID)?.value, o = n.get(f.IBOOT_WEBSITE_NO)?.value;
|
|
162
160
|
return e && e.length > 0 && (t.deviceId = e), s && s.length > 0 && (t.lang = s), r && r.length > 0 && (t.websiteId = r), o && o.length > 0 && (t.websiteNo = o), t;
|
|
163
161
|
};
|
|
164
|
-
class
|
|
162
|
+
class X {
|
|
165
163
|
baseUrl;
|
|
166
164
|
helloMethod;
|
|
167
165
|
apiKey;
|
|
@@ -174,20 +172,20 @@ class Y {
|
|
|
174
172
|
websiteNo;
|
|
175
173
|
_isDebug;
|
|
176
174
|
constructor({ deviceId: t, lang: e, websiteId: s, websiteNo: r, userType: o, helloURL: i }) {
|
|
177
|
-
this.baseUrl = process.env.BASE_URL ?? "", this.helloMethod = i ?? "", this.apiKey = process.env.API_KEY ?? "", this.userType = o ?? R.TYPE_MGT, this.userFrom = process.env.USER_FROM || "1", this.deviceId = t ?? w(10), this.lang = e ??
|
|
175
|
+
this.baseUrl = process.env.BASE_URL ?? "", this.helloMethod = i ?? "", this.apiKey = process.env.API_KEY ?? "", this.userType = o ?? R.TYPE_MGT, this.userFrom = process.env.USER_FROM || "1", this.deviceId = t ?? w(10), this.lang = e ?? L, this.websiteId = s, this.websiteNo = r, this._isDebug = process.env.NODE_ENV != "production";
|
|
178
176
|
}
|
|
179
177
|
isDebug() {
|
|
180
178
|
return this._isDebug;
|
|
181
179
|
}
|
|
182
180
|
encrypt(t) {
|
|
183
|
-
const e =
|
|
184
|
-
return
|
|
181
|
+
const e = m.enc.Utf8.parse(this.apiKey);
|
|
182
|
+
return m.AES.encrypt(t, e).toString();
|
|
185
183
|
}
|
|
186
184
|
decrypt(t) {
|
|
187
|
-
const e =
|
|
188
|
-
return
|
|
189
|
-
mode:
|
|
190
|
-
}).toString(
|
|
185
|
+
const e = m.enc.Utf8.parse(this.apiKey);
|
|
186
|
+
return m.AES.decrypt(t, e, {
|
|
187
|
+
mode: m.mode.ECB
|
|
188
|
+
}).toString(m.enc.Utf8);
|
|
191
189
|
}
|
|
192
190
|
getDeviceId() {
|
|
193
191
|
return this.deviceId;
|
|
@@ -214,8 +212,8 @@ class Y {
|
|
|
214
212
|
for (const g in c) {
|
|
215
213
|
const d = c[g];
|
|
216
214
|
if (d && d.toString().length > 0) {
|
|
217
|
-
const
|
|
218
|
-
e.push(s +
|
|
215
|
+
const p = `[${o.toString()}].${l + `[${u.toString()}].${g}`}=${b(d)}`;
|
|
216
|
+
e.push(s + p);
|
|
219
217
|
}
|
|
220
218
|
}
|
|
221
219
|
});
|
|
@@ -250,12 +248,11 @@ class Y {
|
|
|
250
248
|
let c = t[a];
|
|
251
249
|
typeof c == "object" && (c = JSON.stringify(c)), r.push(a + "=" + c);
|
|
252
250
|
});
|
|
253
|
-
const o = r.join("&"), i =
|
|
254
|
-
name: "sort",
|
|
251
|
+
const o = r.join("&"), i = U.md5((o + e).toLocaleUpperCase()), l = {
|
|
255
252
|
params: o,
|
|
256
253
|
md5: i
|
|
257
254
|
};
|
|
258
|
-
return h.debug(l), i;
|
|
255
|
+
return h.debug(l, "API_SIGN"), i;
|
|
259
256
|
}
|
|
260
257
|
//eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
261
258
|
assemblyParameter(t, e) {
|
|
@@ -272,7 +269,7 @@ class Y {
|
|
|
272
269
|
"Api-Key": this.apiKey
|
|
273
270
|
};
|
|
274
271
|
this.lang && this.lang.length > 0 && (s.Lang = this.lang), this.websiteId && this.websiteId.length > 0 && (s["Web-Id"] = this.websiteId), this.websiteNo && this.websiteNo.length > 0 && (s["Web-No"] = this.websiteNo), e && (e.token && e.token.length > 0 && e.username && e.username.length > 0 && (s.Authorization = e.token, s.Username = e.username), e.xcsrf && (s[e.xcsrf.csrfHeader] = e.xcsrf.csrfToken));
|
|
275
|
-
const r =
|
|
272
|
+
const r = k(t), o = await this.sign(r);
|
|
276
273
|
return s.Sign = o, s;
|
|
277
274
|
}
|
|
278
275
|
async helloIboot() {
|
|
@@ -286,7 +283,7 @@ class Y {
|
|
|
286
283
|
url: t,
|
|
287
284
|
headers: e
|
|
288
285
|
};
|
|
289
|
-
h.debug(s);
|
|
286
|
+
h.debug(s, "HELLO");
|
|
290
287
|
const r = await fetch(t, {
|
|
291
288
|
method: "GET",
|
|
292
289
|
headers: e,
|
|
@@ -295,7 +292,7 @@ class Y {
|
|
|
295
292
|
});
|
|
296
293
|
if (r.ok) {
|
|
297
294
|
const o = await r.json();
|
|
298
|
-
return h.debug(
|
|
295
|
+
return h.debug(o.data, "HELLO RESULT"), o.data;
|
|
299
296
|
}
|
|
300
297
|
throw new Error("hello iBoot error!");
|
|
301
298
|
}
|
|
@@ -315,11 +312,10 @@ class Y {
|
|
|
315
312
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
316
313
|
async get({ url: t, data: e, token: s, cache: r = "default" }) {
|
|
317
314
|
const o = this.assemblyParameter(e), i = this.convertUrlParameter(o), l = await this.assemblyHeader({ urlParams: i, token: s }), a = `${this.getApiUrl(t)}?${i.toString()}`, c = {
|
|
318
|
-
method: "GET",
|
|
319
315
|
url: a,
|
|
320
316
|
headers: l
|
|
321
317
|
};
|
|
322
|
-
h.info(c);
|
|
318
|
+
h.info(c, "GET");
|
|
323
319
|
const u = await fetch(a, {
|
|
324
320
|
method: "GET",
|
|
325
321
|
headers: l,
|
|
@@ -328,7 +324,7 @@ class Y {
|
|
|
328
324
|
});
|
|
329
325
|
if (u.ok) {
|
|
330
326
|
const d = await u.json();
|
|
331
|
-
return h.debug(
|
|
327
|
+
return h.debug(d, "GET_RESULT"), d;
|
|
332
328
|
}
|
|
333
329
|
const g = {
|
|
334
330
|
code: u.status,
|
|
@@ -345,27 +341,26 @@ class Y {
|
|
|
345
341
|
const l = this.assemblyParameter(e), a = this.convertUrlParameter(l), c = await this.assemblyHeader({ urlParams: a, token: s });
|
|
346
342
|
o && i && (c["Content-Type"] = `multipart/form-data; boundary=${i}`);
|
|
347
343
|
const u = this.getApiUrl(t), g = {
|
|
348
|
-
method: "POST",
|
|
349
344
|
url: u,
|
|
350
345
|
headers: c,
|
|
351
346
|
params: l
|
|
352
347
|
};
|
|
353
|
-
h.info(g);
|
|
354
|
-
const d = o ? `${u}?${a}` : u,
|
|
348
|
+
h.info(g, "POST");
|
|
349
|
+
const d = o ? `${u}?${a}` : u, p = await fetch(d, {
|
|
355
350
|
method: "POST",
|
|
356
351
|
headers: c,
|
|
357
352
|
body: o || a.toString(),
|
|
358
353
|
credentials: "include",
|
|
359
354
|
cache: r
|
|
360
355
|
});
|
|
361
|
-
if (
|
|
362
|
-
const E = await
|
|
363
|
-
return h.debug(
|
|
356
|
+
if (p.ok) {
|
|
357
|
+
const E = await p.json();
|
|
358
|
+
return h.debug(E, "POST_RESULT"), E;
|
|
364
359
|
}
|
|
365
360
|
const y = {
|
|
366
|
-
code:
|
|
361
|
+
code: p.status,
|
|
367
362
|
success: !1,
|
|
368
|
-
msg:
|
|
363
|
+
msg: p.statusText
|
|
369
364
|
};
|
|
370
365
|
return h.error(y), y;
|
|
371
366
|
}
|
|
@@ -379,12 +374,11 @@ class Y {
|
|
|
379
374
|
const c = this.getApiUrl(t);
|
|
380
375
|
try {
|
|
381
376
|
const u = r ? `${c}?${l}` : c, g = {
|
|
382
|
-
method: "STREAM",
|
|
383
377
|
url: c,
|
|
384
378
|
headers: a,
|
|
385
379
|
params: i
|
|
386
380
|
};
|
|
387
|
-
h.info(g);
|
|
381
|
+
h.info(g, "STREAM");
|
|
388
382
|
const d = await fetch(u, {
|
|
389
383
|
method: "POST",
|
|
390
384
|
headers: a,
|
|
@@ -438,7 +432,7 @@ class Y {
|
|
|
438
432
|
};
|
|
439
433
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
440
434
|
setToken(t, e) {
|
|
441
|
-
const { id: s, name: r, username: o, nickname: i, sex: l, headImg: a, token: c, lastLoginTime: u, tokenExpired: g, deviceId: d, userType:
|
|
435
|
+
const { id: s, name: r, username: o, nickname: i, sex: l, headImg: a, token: c, lastLoginTime: u, tokenExpired: g, deviceId: d, userType: p, mustChangePwd: y } = t, E = {
|
|
442
436
|
id: s,
|
|
443
437
|
name: r,
|
|
444
438
|
username: o,
|
|
@@ -448,7 +442,7 @@ class Y {
|
|
|
448
442
|
lastLoginTime: u,
|
|
449
443
|
tokenExpired: g,
|
|
450
444
|
deviceId: d,
|
|
451
|
-
userType:
|
|
445
|
+
userType: p,
|
|
452
446
|
status: 0,
|
|
453
447
|
accountType: 0,
|
|
454
448
|
enabled: !1,
|
|
@@ -483,26 +477,26 @@ class Y {
|
|
|
483
477
|
}
|
|
484
478
|
}
|
|
485
479
|
export {
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
480
|
+
F as ACCOUNT_TYPE_MAP,
|
|
481
|
+
P as CURRENT_WEBSITE_KEY,
|
|
482
|
+
L as DEFAULT_LOCALE,
|
|
489
483
|
S as DEVICE_ID_KEY,
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
484
|
+
X as HttpClient,
|
|
485
|
+
j as USER_FORM_MAP,
|
|
486
|
+
H as USER_SEX_MAP,
|
|
493
487
|
R as USER_TYPE_MAP,
|
|
494
488
|
D as get,
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
489
|
+
Y as getHttpClientOpts,
|
|
490
|
+
V as getHttpClientOptsByCookie,
|
|
491
|
+
K as iGet,
|
|
492
|
+
G as iPost,
|
|
493
|
+
J as iPostSuccess,
|
|
500
494
|
_ as isArray,
|
|
501
495
|
h as logger,
|
|
502
|
-
|
|
496
|
+
v as post,
|
|
503
497
|
w as randomString,
|
|
504
498
|
x as setDefaultRequestHeader,
|
|
505
499
|
b as urlEncode,
|
|
506
|
-
|
|
500
|
+
k as urlParamToJson
|
|
507
501
|
};
|
|
508
502
|
//# sourceMappingURL=iboot-http-client.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iboot-http-client.es.js","sources":["../src/types/user.ts","../src/logger.ts","../src/utils.ts","../src/http-client.ts"],"sourcesContent":["export const ACCOUNT_TYPE_MAP = {\r\n GENERAL : 0,\r\n PHONE : 1,\r\n EMAIL : 2\r\n}\r\n\r\nexport const USER_TYPE_MAP = {\r\n TYPE_MGT : 0,\r\n TYPE_C : 1,\r\n TYPE_B : 2\r\n}\r\n\r\nexport const USER_FORM_MAP = {\r\n FROM_WEB : 1,\r\n FROM_PC : 2,\r\n FROM_WX_MINI_PRO : 3,\r\n FROM_WX_PLU : 4,\r\n FROM_WX_E : 5,\r\n FROM_APP : 6,\r\n FROM_DEVICE : 7\r\n}\r\n\r\nexport const USER_SEX_MAP = {\r\n unknown:0,\r\n male:1,\r\n female:2,\r\n}\r\n\r\nexport type ACCOUNT_TYPE = typeof ACCOUNT_TYPE_MAP[keyof typeof ACCOUNT_TYPE_MAP];\r\nexport type USER_TYPE = typeof USER_TYPE_MAP[keyof typeof USER_TYPE_MAP];\r\nexport type USER_FORM = typeof USER_FORM_MAP[keyof typeof USER_FORM_MAP];\r\nexport type USER_SEX = typeof USER_SEX_MAP[keyof typeof USER_SEX_MAP];\r\n\r\n// User interface\r\nexport interface User {\r\n id: string;\r\n name: string;\r\n username: string;\r\n nickname: string;\r\n sex: USER_SEX;\r\n headImg: string;\r\n lastLoginTime: string;\r\n tokenExpired: string;\r\n deviceId: string;\r\n userType: USER_TYPE;\r\n status: number;\r\n accountType: number;\r\n enabled: boolean;\r\n userFrom: USER_FORM;\r\n needToReview: boolean;\r\n socketOnline: boolean;\r\n createTime: string;\r\n mustChangePwd: boolean;\r\n}","import pino from \"pino\";\r\n\r\n// 在 Windows 系统上确保中文字符正确显示\r\nif (process.platform === 'win32') {\r\n // 设置 stdout 和 stderr 的编码为 utf8\r\n process.stdout.setEncoding('utf8');\r\n process.stderr.setEncoding('utf8');\r\n}\r\n\r\nexport const logger = pino({\r\n name: process.env.APP_NAME ?? 'iBoot',\r\n level: process.env.NODE_ENV != 'production' ? 'debug' : 'info',\r\n nestedKey: 'payload',\r\n formatters: {\r\n level: (label) => {\r\n return { level: label };\r\n }\r\n },\r\n transport: {\r\n target: 'pino-pretty',\r\n options: {\r\n colorize: true,\r\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n ignore: 'pid,hostname',\r\n messageFormat: '{msg}',\r\n singleLine: true\r\n }\r\n }\r\n});","export const isArray = (obj: unknown) => {\r\n return (\r\n Array.isArray(obj) ||\r\n (typeof obj === \"object\" &&\r\n Object.prototype.toString.call(obj) === \"[object Array]\")\r\n );\r\n};\r\n\r\n/**\r\n * 生成指定长度的随机串\r\n * @param {Object} len\r\n */\r\nexport const randomString = (len: number) => {\r\n const l = len || 32;\r\n const $chars = \"ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678\";\r\n const maxPos = $chars.length;\r\n let pwd = \"\";\r\n for (let i = 0; i < l; i++) {\r\n pwd += $chars.charAt(Math.floor(Math.random() * maxPos));\r\n }\r\n return pwd;\r\n};\r\n\r\nexport const urlParamToJson = (urlQueryParams: string, exclude?: string[]): Record<string, string> => {\r\n const result: Record<string, string> = {};\r\n const strs = urlQueryParams.split(\"&\");\r\n strs.forEach((item) => {\r\n const arr = item.split(\"=\");\r\n if (arr[1]) {\r\n if (!exclude || exclude.indexOf(arr[0]) == -1) {\r\n result[arr[0]] = arr[1];\r\n }\r\n }\r\n });\r\n return result;\r\n};\r\n\r\nexport const urlEncode = (value: string | null | undefined): string => {\r\n if (!value || value == \"\" || value.length == 0) {\r\n return \"\";\r\n }\r\n return (\r\n encodeURIComponent(value)\r\n // .replace(/%20/g, '+')\r\n // .replace(/%2B/g, '\\\\+')\r\n .replace(/\\(/g, \"%28\")\r\n .replace(/\\)/g, \"%29\")\r\n .replace(/\\'/g, \"%27\")\r\n .replace(/\\!/g, \"%21\")\r\n .replace(/\\~/g, \"%7E\")\r\n );\r\n};\r\n","import md5 from \"js-md5\";\r\nimport CryptoJS from 'crypto-js';\r\nimport { isArray, randomString, urlEncode, urlParamToJson } from \"./utils\";\r\nimport {\r\n ClientGetParams,\r\n ClientPostParams,\r\n CookieNames,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaderNames,\r\n HttpHeaders,\r\n HttpToken,\r\n IbootCookieStore,\r\n IbootReadonlyCookies,\r\n IbootWritableCookie,\r\n ResultModel,\r\n ServerRequestOptions\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\r\n\r\nexport const DEFAULT_LOCALE = 'zh-CN';\r\nexport const DEVICE_ID_KEY = \"_device_id_key\";\r\nexport const CURRENT_WEBSITE_KEY = \"_current_website_key\"\r\n\r\nconst _GET_ERROR = \"Get request error!\"\r\nconst _POST_ERROR = \"Post request error!\";\r\n\r\nconst HEADER_NAMES: Record<HttpHeaderNames, HttpHeaderNames> = {\r\n \"Device-Id\": \"Device-Id\",\r\n \"Lang\": \"Lang\",\r\n \"Website-Id\": \"Website-Id\",\r\n \"Website-No\": \"Website-No\",\r\n}\r\n\r\nconst COOKIE_NAMES: Record<CookieNames, CookieNames> = {\r\n \"IBOOT_DEVICE_ID\": \"IBOOT_DEVICE_ID\",\r\n \"IBOOT_LOCALE\": \"IBOOT_LOCALE\",\r\n \"IBOOT_WEBSITE_ID\": \"IBOOT_WEBSITE_ID\",\r\n \"IBOOT_WEBSITE_NO\": \"IBOOT_WEBSITE_NO\",\r\n \"token\": \"token\",\r\n \"user\": \"user\"\r\n}\r\n\r\nconst getDefaultRequestHeader = (): HttpHeaders => {\r\n const devideId = localStorage.getItem(DEVICE_ID_KEY) ?? ''\r\n const json = localStorage.getItem(CURRENT_WEBSITE_KEY);\r\n const curWebsite: CurWebsite | null = json != null ? JSON.parse(json) : null;\r\n const header: HttpHeaders = {}\r\n if (devideId.length > 0) {\r\n header['Device-Id'] = devideId\r\n }\r\n if (curWebsite) {\r\n header['Lang'] = curWebsite.language;\r\n if (curWebsite.websiteId) {\r\n header['Website-Id'] = curWebsite.websiteId;\r\n }\r\n if (curWebsite.websiteNo) {\r\n header['Website-No'] = curWebsite.websiteNo\r\n }\r\n }\r\n return header;\r\n};\r\n\r\n\r\nexport const setDefaultRequestHeader = (deviceId: string, website?: CurWebsite): void => {\r\n localStorage.setItem(DEVICE_ID_KEY, deviceId);\r\n if (website) {\r\n localStorage.setItem(CURRENT_WEBSITE_KEY, JSON.stringify(website));\r\n }\r\n}\r\n\r\nexport const get = async <T>(url: string, opts?: ClientGetParams): Promise<ResultModel<T>> => {\r\n if (opts?.data) {\r\n const params = new URLSearchParams(opts.data);\r\n if (url.indexOf(\"?\") != -1) {\r\n url += `&${params}`\r\n } else {\r\n url += `?${params}`\r\n }\r\n }\r\n const headers: Record<string, string> = getDefaultRequestHeader();\r\n const heads = opts?.headers;\r\n if (heads) {\r\n for (const field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n headers[field] = value;\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"method\": \"GET\",\r\n \"url\": url,\r\n \"headers\": headers,\r\n })\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n cache: opts?.useCache ? 'force-cache' : 'default'\r\n });\r\n\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug({\r\n \"GET_RESULT\": result,\r\n })\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const post = async <T>(url: string, opts?: ClientPostParams): Promise<ResultModel<T>> => {\r\n const data = opts?.data ?? {};\r\n const heads = opts?.headers;\r\n let body: string | FormData;\r\n const proxyHeaders = new Headers(getDefaultRequestHeader());\r\n if (!(data instanceof FormData)) {\r\n body = JSON.stringify(data);\r\n proxyHeaders.set('Content-Type', 'application/json');\r\n } else {\r\n body = data;\r\n }\r\n if (heads) {\r\n for (let field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n proxyHeaders.set(field, value);\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"method\": \"GET\",\r\n \"url\": url,\r\n \"headers\": proxyHeaders,\r\n })\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: proxyHeaders,\r\n body: body,\r\n });\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug({\r\n \"POST_RESULT\": result,\r\n })\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const iGet = async <T>(url: string, opts?: ClientGetParams): Promise<T | undefined> => {\r\n const res = await get<T>(url, opts);\r\n if (res.success) {\r\n return res.data as T;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _GET_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _GET_ERROR)\r\n}\r\n\r\nexport const iPost = async <T>(url: string, opts?: ClientPostParams): Promise<T | undefined> => {\r\n const res = await post<T>(url, opts);\r\n if (res.success) {\r\n return res.data;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _POST_ERROR)\r\n}\r\n\r\nexport const iPostSuccess = async (url: string, opts?: ClientPostParams): Promise<boolean> => {\r\n const res = await post(url, opts);\r\n if (res.success) {\r\n if (opts?.showSuccess) {\r\n opts.showSuccess(res.msg ?? 'SUCCESS')\r\n }\r\n return true;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n }\r\n return false;\r\n}\r\n\r\n\r\nexport const getHttpClientOpts = (request: Request): HttpClientOpts => {\r\n const deviceId = request.headers.get(HEADER_NAMES[\"Device-Id\"]);\r\n const lang = request.headers.get(HEADER_NAMES.Lang);\r\n const websiteId = request.headers.get(HEADER_NAMES[\"Website-Id\"]);\r\n const websiteNo = request.headers.get(HEADER_NAMES[\"Website-No\"]);\r\n const result: HttpClientOpts = {}\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport const getHttpClientOptsByCookie = (cookie: IbootReadonlyCookies): HttpClientOpts => {\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookie.get(COOKIE_NAMES.IBOOT_DEVICE_ID)?.value;\r\n const lang = cookie.get(COOKIE_NAMES.IBOOT_LOCALE)?.value;\r\n const websiteId = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_ID)?.value;\r\n const websiteNo = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_NO)?.value;\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly baseUrl: string;\r\n private readonly helloMethod: string;\r\n private readonly apiKey: string;\r\n private readonly userType: USER_TYPE;\r\n private readonly userFrom: string;\r\n private readonly deviceId: string;\r\n private readonly version: string = '1';\r\n private readonly lang: string;\r\n private readonly websiteId?: string;\r\n private readonly websiteNo?: string;\r\n private readonly _isDebug: boolean;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType, helloURL }: Readonly<HttpClientOpts>) {\r\n this.baseUrl = process.env.BASE_URL ?? '';\r\n this.helloMethod = helloURL ?? ''\r\n this.apiKey = process.env.API_KEY ?? '';\r\n this.userType = userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.userFrom = process.env.USER_FROM || '1';\r\n this.deviceId = deviceId ?? randomString(10);\r\n this.lang = lang ?? DEFAULT_LOCALE;\r\n this.websiteId = websiteId\r\n this.websiteNo = websiteNo\r\n this._isDebug = process.env.NODE_ENV != 'production';\r\n }\r\n\r\n isDebug() {\r\n return this._isDebug;\r\n }\r\n\r\n encrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.encrypt(data, key).toString();\r\n }\r\n\r\n decrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.decrypt(data, key, {\r\n mode: CryptoJS.mode.ECB,\r\n }).toString(CryptoJS.enc.Utf8);\r\n }\r\n\r\n getDeviceId() {\r\n return this.deviceId;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private convertUrlParameter(data: Record<string, any>): string {\r\n const p: string[] = [];\r\n for (const o in data) {\r\n let v = data[o];\r\n if (v && typeof v === \"string\") {\r\n v = v.trim();\r\n } else if (v && typeof v === \"object\") {\r\n if (isArray(v)) {\r\n if (v.length === 0) {\r\n continue;\r\n }\r\n for (let i = 0; i < v.length; i++) {\r\n const arr_item = v[i];\r\n for (const item_field in arr_item) {\r\n const item_field_value = arr_item[item_field] ?? undefined;\r\n if (item_field_value) {\r\n if (typeof item_field_value === \"object\") {\r\n if (isArray(item_field_value)) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n item_field_value.forEach((item1: any, index: number) => {\r\n if (item1) {\r\n for (const f in item1) {\r\n const v = item1[f];\r\n if (v && v.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field + `[${index.toString()}].${f}`}=${urlEncode(v)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n } else if (item_field_value.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field}=${urlEncode(item_field_value.toString())}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n for (const obj in v) {\r\n const oValue = v[obj];\r\n if (oValue != null && oValue != \"\" && oValue.length != 0) {\r\n const s = `.${obj}=${urlEncode(oValue)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n continue;\r\n } else if (v && typeof v === \"function\") {\r\n v = null;\r\n }\r\n\r\n if (v != null && v != \"\" && v.length != 0) {\r\n p.push(o + \"=\" + urlEncode(v));\r\n }\r\n }\r\n return (p && p.join(\"&\"));\r\n }\r\n\r\n private async sign(data: Record<string, object | string>): Promise<string> {\r\n //由后台分配\r\n const _apiKey = \"&key=\" + (await this.helloIboot());\r\n const arr: string[] = [];\r\n for (const o in data) {\r\n arr.push(o);\r\n }\r\n arr.sort((a: string, b: string) => {\r\n return a.toLowerCase().localeCompare(b.toLowerCase());\r\n });\r\n const res: string[] = [];\r\n arr.forEach((v: string) => {\r\n let value: object | string = data[v];\r\n if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n res.push(v + \"=\" + value);\r\n });\r\n const paramsStr: string = res.join(\"&\");\r\n const str = md5.md5((paramsStr + _apiKey).toLocaleUpperCase());\r\n const logInfo = {\r\n name: \"sort\",\r\n params: paramsStr,\r\n md5: str\r\n }\r\n logger.debug(logInfo)\r\n return str;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private assemblyParameter(data?: Record<string, any>, username?: string): Record<string, any> {\r\n const params = data ?? {};\r\n params['timestamp'] = Date.now() + '';\r\n params['echostr'] = randomString(10);\r\n params['version'] = this.version;\r\n params['deviceId'] = this.deviceId;\r\n params['webid'] = this.websiteId;\r\n params['apiKey'] = this.apiKey;\r\n if (username && username.length > 0) {\r\n params['username'] = username;\r\n }\r\n return params;\r\n }\r\n\r\n private async assemblyHeader({ urlParams, token }: Readonly<{ urlParams: string, token?: Readonly<HttpToken> }>) {\r\n const h: Record<string, string> = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Device-Id': this.deviceId,\r\n 'User-Type': token?.utype.toString() ?? this.userType.toString(),\r\n 'User-From': this.userFrom,\r\n 'Api-Key': this.apiKey\r\n }\r\n if (this.lang && this.lang.length > 0) {\r\n h['Lang'] = this.lang\r\n }\r\n if (this.websiteId && this.websiteId.length > 0) {\r\n h['Web-Id'] = this.websiteId\r\n }\r\n if (this.websiteNo && this.websiteNo.length > 0) {\r\n h['Web-No'] = this.websiteNo\r\n }\r\n if (token) {\r\n if (token.token && token.token.length > 0 && token.username && token.username.length > 0) {\r\n h['Authorization'] = token.token;\r\n h['Username'] = token.username;\r\n }\r\n if (token.xcsrf) {\r\n h[token.xcsrf.csrfHeader] = token.xcsrf.csrfToken;\r\n }\r\n }\r\n const data = urlParamToJson(urlParams);\r\n const sign = await this.sign(data);\r\n h['Sign'] = sign\r\n return h;\r\n }\r\n\r\n private async helloIboot(): Promise<string> {\r\n if (this.helloMethod.length <= 0) {\r\n return this.apiKey;\r\n }\r\n const api = this.getApiUrl(this.helloMethod);\r\n const h = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Api-Key': this.apiKey\r\n }\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": h\r\n }\r\n logger.debug(logInfo);\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: h,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug({ result: result.data })\r\n return result.data;\r\n }\r\n throw new Error('hello iBoot error!')\r\n }\r\n\r\n private getApiUrl(url: string): string {\r\n return `${this.baseUrl}/${url}`;\r\n }\r\n\r\n async csrf(): Promise<string | undefined> {\r\n const res = await this.get<CSRFToken>({\r\n url: 'guest/csrf'\r\n });\r\n if (res.success) {\r\n const data = res.data;\r\n if (data) {\r\n return data[\"csrfToken\"].toString();\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async get<T>({ url, data, token, cache = 'default' }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n const api = `${this.getApiUrl(url)}?${urlParams.toString()}`\r\n const logInfo = {\r\n \"method\": \"GET\",\r\n \"url\": api,\r\n \"headers\": headers\r\n }\r\n logger.info(logInfo);\r\n const res = await fetch(api, {\r\n \"method\": 'GET',\r\n \"headers\": headers,\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug({ \"GET_RESULT\": result })\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token, cache = \"default\" }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n const api = this.getApiUrl(url);\r\n const logInfo = {\r\n \"method\": \"POST\",\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo);\r\n const urls = buffer ? `${api}?${urlParams}` : api;\r\n const res = await fetch(urls, {\r\n \"method\": 'POST',\r\n \"headers\": headers,\r\n \"body\": buffer ? buffer : urlParams.toString(),\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug({ \"POST_RESULT\": result })\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<Omit<ServerRequestOptions, 'cache'>>): Promise<Response> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params); //new URLSearchParams(params);\r\n\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n headers['Connection'] = 'keep-alive';\r\n headers['X-Accel-Buffering'] = 'no'; //防止 Nginx 缓存\r\n headers['Cache-Control'] = 'no-cache';\r\n const api = this.getApiUrl(url)\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\r\n const logInfo = {\r\n \"method\": \"STREAM\",\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo);\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: buffer ? buffer : urlParams.toString(),\r\n credentials: 'include'\r\n });\r\n\r\n if (!res.ok) {\r\n throw new Error(`HTTP error! status: ${res.status}`);\r\n }\r\n if (!res.body) {\r\n throw new Error('No response body');\r\n }\r\n return new Response(res.body, {\r\n headers: {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive'\r\n }\r\n });\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n\r\n getUserInfo(cookies: IbootCookieStore): User | null {\r\n const userjson = cookies.get(COOKIE_NAMES.user)?.value;\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n return null;\r\n }\r\n\r\n getToken(cookies: IbootCookieStore): HttpToken {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n getTokenByCookies = (cookies: IbootReadonlyCookies): HttpToken => {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setToken(data: User & { token: string, extFields: Record<string, any> }, response: { cookies: IbootWritableCookie }) {\r\n const { id, name, username, nickname, sex, headImg, token, lastLoginTime, tokenExpired, deviceId, userType, mustChangePwd } = data;\r\n const loginUser: User = {\r\n id: id,\r\n name: name,\r\n username: username,\r\n nickname: nickname,\r\n sex: sex,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n tokenExpired: tokenExpired,\r\n deviceId: deviceId,\r\n userType: userType,\r\n status: 0,\r\n accountType: 0,\r\n enabled: false,\r\n userFrom: 1,\r\n needToReview: false,\r\n socketOnline: false,\r\n createTime: \"\",\r\n mustChangePwd: mustChangePwd\r\n };\r\n response.cookies.set(COOKIE_NAMES.token, token, {\r\n httpOnly: true,\r\n secure: !this._isDebug, // 在生产环境中启用Secure\r\n sameSite: 'strict', // 防止 CSRF 攻击\r\n path: '/', // Cookie 的路径\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, JSON.stringify(loginUser));\r\n return response;\r\n }\r\n\r\n cleanToken(response: { cookies: IbootWritableCookie }) {\r\n response.cookies.set(COOKIE_NAMES.token, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.delete(COOKIE_NAMES.token);\r\n response.cookies.delete(COOKIE_NAMES.user)\r\n return response;\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","logger","pino","label","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","HEADER_NAMES","COOKIE_NAMES","getDefaultRequestHeader","devideId","json","curWebsite","header","setDefaultRequestHeader","deviceId","website","get","url","opts","params","headers","heads","field","response","msg","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","helloURL","key","CryptoJS","p","o","v","arr_item","item_field","item_field_value","item1","index","f","s","oValue","_apiKey","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","cache","buffer","boundary","urls","e","cookies","userjson","utype","user","id","name","nickname","sex","headImg","lastLoginTime","tokenExpired","mustChangePwd","loginUser"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"iboot-http-client.es.js","sources":["../src/types/user.ts","../src/logger.ts","../src/utils.ts","../src/http-client.ts"],"sourcesContent":["export const ACCOUNT_TYPE_MAP = {\r\n GENERAL : 0,\r\n PHONE : 1,\r\n EMAIL : 2\r\n}\r\n\r\nexport const USER_TYPE_MAP = {\r\n TYPE_MGT : 0,\r\n TYPE_C : 1,\r\n TYPE_B : 2\r\n}\r\n\r\nexport const USER_FORM_MAP = {\r\n FROM_WEB : 1,\r\n FROM_PC : 2,\r\n FROM_WX_MINI_PRO : 3,\r\n FROM_WX_PLU : 4,\r\n FROM_WX_E : 5,\r\n FROM_APP : 6,\r\n FROM_DEVICE : 7\r\n}\r\n\r\nexport const USER_SEX_MAP = {\r\n unknown:0,\r\n male:1,\r\n female:2,\r\n}\r\n\r\nexport type ACCOUNT_TYPE = typeof ACCOUNT_TYPE_MAP[keyof typeof ACCOUNT_TYPE_MAP];\r\nexport type USER_TYPE = typeof USER_TYPE_MAP[keyof typeof USER_TYPE_MAP];\r\nexport type USER_FORM = typeof USER_FORM_MAP[keyof typeof USER_FORM_MAP];\r\nexport type USER_SEX = typeof USER_SEX_MAP[keyof typeof USER_SEX_MAP];\r\n\r\n// User interface\r\nexport interface User {\r\n id: string;\r\n name: string;\r\n username: string;\r\n nickname: string;\r\n sex: USER_SEX;\r\n headImg: string;\r\n lastLoginTime: string;\r\n tokenExpired: string;\r\n deviceId: string;\r\n userType: USER_TYPE;\r\n status: number;\r\n accountType: number;\r\n enabled: boolean;\r\n userFrom: USER_FORM;\r\n needToReview: boolean;\r\n socketOnline: boolean;\r\n createTime: string;\r\n mustChangePwd: boolean;\r\n}","import pino from \"pino\";\r\nimport koffi from 'koffi';\r\n\r\nif (typeof window === 'undefined' && process.platform === 'win32') {\r\n try {\r\n const CP_UTF8 = 65001;\r\n const kernel32 = koffi.load('Kernel32');\r\n const setConsoleOutputCP = kernel32.func('SetConsoleOutputCP', 'bool', ['int']);\r\n const setConsoleCP = kernel32.func('SetConsoleCP', 'bool', ['int']);\r\n setConsoleOutputCP(CP_UTF8);\r\n setConsoleCP(CP_UTF8);\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n}\r\n\r\nexport const logger = pino({\r\n name: process.env.APP_NAME ?? 'iBoot',\r\n level: process.env.NODE_ENV !== 'production' ? 'debug' : 'info',\r\n nestedKey: 'payload',\r\n transport: {\r\n target: 'pino-pretty',\r\n options: {\r\n colorize: true,\r\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n ignore: 'pid,hostname',\r\n messageFormat: '{msg}',\r\n singleLine: true,\r\n },\r\n }\r\n});","export const isArray = (obj: unknown) => {\r\n return (\r\n Array.isArray(obj) ||\r\n (typeof obj === \"object\" &&\r\n Object.prototype.toString.call(obj) === \"[object Array]\")\r\n );\r\n};\r\n\r\n/**\r\n * 生成指定长度的随机串\r\n * @param {Object} len\r\n */\r\nexport const randomString = (len: number) => {\r\n const l = len || 32;\r\n const $chars = \"ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678\";\r\n const maxPos = $chars.length;\r\n let pwd = \"\";\r\n for (let i = 0; i < l; i++) {\r\n pwd += $chars.charAt(Math.floor(Math.random() * maxPos));\r\n }\r\n return pwd;\r\n};\r\n\r\nexport const urlParamToJson = (urlQueryParams: string, exclude?: string[]): Record<string, string> => {\r\n const result: Record<string, string> = {};\r\n const strs = urlQueryParams.split(\"&\");\r\n strs.forEach((item) => {\r\n const arr = item.split(\"=\");\r\n if (arr[1]) {\r\n if (!exclude || exclude.indexOf(arr[0]) == -1) {\r\n result[arr[0]] = arr[1];\r\n }\r\n }\r\n });\r\n return result;\r\n};\r\n\r\nexport const urlEncode = (value: string | null | undefined): string => {\r\n if (!value || value == \"\" || value.length == 0) {\r\n return \"\";\r\n }\r\n return (\r\n encodeURIComponent(value)\r\n // .replace(/%20/g, '+')\r\n // .replace(/%2B/g, '\\\\+')\r\n .replace(/\\(/g, \"%28\")\r\n .replace(/\\)/g, \"%29\")\r\n .replace(/\\'/g, \"%27\")\r\n .replace(/\\!/g, \"%21\")\r\n .replace(/\\~/g, \"%7E\")\r\n );\r\n};\r\n","import md5 from \"js-md5\";\r\nimport CryptoJS from 'crypto-js';\r\nimport { isArray, randomString, urlEncode, urlParamToJson } from \"./utils\";\r\nimport {\r\n ClientGetParams,\r\n ClientPostParams,\r\n CookieNames,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaderNames,\r\n HttpHeaders,\r\n HttpToken,\r\n IbootCookieStore,\r\n IbootReadonlyCookies,\r\n IbootWritableCookie,\r\n ResultModel,\r\n ServerRequestOptions\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\r\n\r\nexport const DEFAULT_LOCALE = 'zh-CN';\r\nexport const DEVICE_ID_KEY = \"_device_id_key\";\r\nexport const CURRENT_WEBSITE_KEY = \"_current_website_key\"\r\n\r\nconst _GET_ERROR = \"Get request error!\"\r\nconst _POST_ERROR = \"Post request error!\";\r\n\r\nconst HEADER_NAMES: Record<HttpHeaderNames, HttpHeaderNames> = {\r\n \"Device-Id\": \"Device-Id\",\r\n \"Lang\": \"Lang\",\r\n \"Website-Id\": \"Website-Id\",\r\n \"Website-No\": \"Website-No\",\r\n}\r\n\r\nconst COOKIE_NAMES: Record<CookieNames, CookieNames> = {\r\n \"IBOOT_DEVICE_ID\": \"IBOOT_DEVICE_ID\",\r\n \"IBOOT_LOCALE\": \"IBOOT_LOCALE\",\r\n \"IBOOT_WEBSITE_ID\": \"IBOOT_WEBSITE_ID\",\r\n \"IBOOT_WEBSITE_NO\": \"IBOOT_WEBSITE_NO\",\r\n \"token\": \"token\",\r\n \"user\": \"user\"\r\n}\r\n\r\nconst getDefaultRequestHeader = (): HttpHeaders => {\r\n const devideId = localStorage.getItem(DEVICE_ID_KEY) ?? ''\r\n const json = localStorage.getItem(CURRENT_WEBSITE_KEY);\r\n const curWebsite: CurWebsite | null = json != null ? JSON.parse(json) : null;\r\n const header: HttpHeaders = {}\r\n if (devideId.length > 0) {\r\n header['Device-Id'] = devideId\r\n }\r\n if (curWebsite) {\r\n header['Lang'] = curWebsite.language;\r\n if (curWebsite.websiteId) {\r\n header['Website-Id'] = curWebsite.websiteId;\r\n }\r\n if (curWebsite.websiteNo) {\r\n header['Website-No'] = curWebsite.websiteNo\r\n }\r\n }\r\n return header;\r\n};\r\n\r\n\r\nexport const setDefaultRequestHeader = (deviceId: string, website?: CurWebsite): void => {\r\n localStorage.setItem(DEVICE_ID_KEY, deviceId);\r\n if (website) {\r\n localStorage.setItem(CURRENT_WEBSITE_KEY, JSON.stringify(website));\r\n }\r\n}\r\n\r\nexport const get = async <T>(url: string, opts?: ClientGetParams): Promise<ResultModel<T>> => {\r\n if (opts?.data) {\r\n const params = new URLSearchParams(opts.data);\r\n if (url.indexOf(\"?\") != -1) {\r\n url += `&${params}`\r\n } else {\r\n url += `?${params}`\r\n }\r\n }\r\n const headers: Record<string, string> = getDefaultRequestHeader();\r\n const heads = opts?.headers;\r\n if (heads) {\r\n for (const field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n headers[field] = value;\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": headers,\r\n }, \"GET\")\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n cache: opts?.useCache ? 'force-cache' : 'default'\r\n });\r\n\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const post = async <T>(url: string, opts?: ClientPostParams): Promise<ResultModel<T>> => {\r\n const data = opts?.data ?? {};\r\n const heads = opts?.headers;\r\n let body: string | FormData;\r\n const proxyHeaders = new Headers(getDefaultRequestHeader());\r\n if (!(data instanceof FormData)) {\r\n body = JSON.stringify(data);\r\n proxyHeaders.set('Content-Type', 'application/json');\r\n } else {\r\n body = data;\r\n }\r\n if (heads) {\r\n for (let field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n proxyHeaders.set(field, value);\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": proxyHeaders,\r\n }, \"POST\")\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: proxyHeaders,\r\n body: body,\r\n });\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const iGet = async <T>(url: string, opts?: ClientGetParams): Promise<T | undefined> => {\r\n const res = await get<T>(url, opts);\r\n if (res.success) {\r\n return res.data as T;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _GET_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _GET_ERROR)\r\n}\r\n\r\nexport const iPost = async <T>(url: string, opts?: ClientPostParams): Promise<T | undefined> => {\r\n const res = await post<T>(url, opts);\r\n if (res.success) {\r\n return res.data;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _POST_ERROR)\r\n}\r\n\r\nexport const iPostSuccess = async (url: string, opts?: ClientPostParams): Promise<boolean> => {\r\n const res = await post(url, opts);\r\n if (res.success) {\r\n if (opts?.showSuccess) {\r\n opts.showSuccess(res.msg ?? 'SUCCESS')\r\n }\r\n return true;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n }\r\n return false;\r\n}\r\n\r\n\r\nexport const getHttpClientOpts = (request: Request): HttpClientOpts => {\r\n const deviceId = request.headers.get(HEADER_NAMES[\"Device-Id\"]);\r\n const lang = request.headers.get(HEADER_NAMES.Lang);\r\n const websiteId = request.headers.get(HEADER_NAMES[\"Website-Id\"]);\r\n const websiteNo = request.headers.get(HEADER_NAMES[\"Website-No\"]);\r\n const result: HttpClientOpts = {}\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport const getHttpClientOptsByCookie = (cookie: IbootReadonlyCookies): HttpClientOpts => {\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookie.get(COOKIE_NAMES.IBOOT_DEVICE_ID)?.value;\r\n const lang = cookie.get(COOKIE_NAMES.IBOOT_LOCALE)?.value;\r\n const websiteId = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_ID)?.value;\r\n const websiteNo = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_NO)?.value;\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly baseUrl: string;\r\n private readonly helloMethod: string;\r\n private readonly apiKey: string;\r\n private readonly userType: USER_TYPE;\r\n private readonly userFrom: string;\r\n private readonly deviceId: string;\r\n private readonly version: string = '1';\r\n private readonly lang: string;\r\n private readonly websiteId?: string;\r\n private readonly websiteNo?: string;\r\n private readonly _isDebug: boolean;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType, helloURL }: Readonly<HttpClientOpts>) {\r\n this.baseUrl = process.env.BASE_URL ?? '';\r\n this.helloMethod = helloURL ?? ''\r\n this.apiKey = process.env.API_KEY ?? '';\r\n this.userType = userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.userFrom = process.env.USER_FROM || '1';\r\n this.deviceId = deviceId ?? randomString(10);\r\n this.lang = lang ?? DEFAULT_LOCALE;\r\n this.websiteId = websiteId\r\n this.websiteNo = websiteNo\r\n this._isDebug = process.env.NODE_ENV != 'production';\r\n }\r\n\r\n isDebug() {\r\n return this._isDebug;\r\n }\r\n\r\n encrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.encrypt(data, key).toString();\r\n }\r\n\r\n decrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.decrypt(data, key, {\r\n mode: CryptoJS.mode.ECB,\r\n }).toString(CryptoJS.enc.Utf8);\r\n }\r\n\r\n getDeviceId() {\r\n return this.deviceId;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private convertUrlParameter(data: Record<string, any>): string {\r\n const p: string[] = [];\r\n for (const o in data) {\r\n let v = data[o];\r\n if (v && typeof v === \"string\") {\r\n v = v.trim();\r\n } else if (v && typeof v === \"object\") {\r\n if (isArray(v)) {\r\n if (v.length === 0) {\r\n continue;\r\n }\r\n for (let i = 0; i < v.length; i++) {\r\n const arr_item = v[i];\r\n for (const item_field in arr_item) {\r\n const item_field_value = arr_item[item_field] ?? undefined;\r\n if (item_field_value) {\r\n if (typeof item_field_value === \"object\") {\r\n if (isArray(item_field_value)) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n item_field_value.forEach((item1: any, index: number) => {\r\n if (item1) {\r\n for (const f in item1) {\r\n const v = item1[f];\r\n if (v && v.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field + `[${index.toString()}].${f}`}=${urlEncode(v)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n } else if (item_field_value.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field}=${urlEncode(item_field_value.toString())}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n for (const obj in v) {\r\n const oValue = v[obj];\r\n if (oValue != null && oValue != \"\" && oValue.length != 0) {\r\n const s = `.${obj}=${urlEncode(oValue)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n continue;\r\n } else if (v && typeof v === \"function\") {\r\n v = null;\r\n }\r\n\r\n if (v != null && v != \"\" && v.length != 0) {\r\n p.push(o + \"=\" + urlEncode(v));\r\n }\r\n }\r\n return (p && p.join(\"&\"));\r\n }\r\n\r\n private async sign(data: Record<string, object | string>): Promise<string> {\r\n //由后台分配\r\n const _apiKey = \"&key=\" + (await this.helloIboot());\r\n const arr: string[] = [];\r\n for (const o in data) {\r\n arr.push(o);\r\n }\r\n arr.sort((a: string, b: string) => {\r\n return a.toLowerCase().localeCompare(b.toLowerCase());\r\n });\r\n const res: string[] = [];\r\n arr.forEach((v: string) => {\r\n let value: object | string = data[v];\r\n if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n res.push(v + \"=\" + value);\r\n });\r\n const paramsStr: string = res.join(\"&\");\r\n const str = md5.md5((paramsStr + _apiKey).toLocaleUpperCase());\r\n const logInfo = {\r\n params: paramsStr,\r\n md5: str\r\n }\r\n logger.debug(logInfo, \"API_SIGN\")\r\n return str;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private assemblyParameter(data?: Record<string, any>, username?: string): Record<string, any> {\r\n const params = data ?? {};\r\n params['timestamp'] = Date.now() + '';\r\n params['echostr'] = randomString(10);\r\n params['version'] = this.version;\r\n params['deviceId'] = this.deviceId;\r\n params['webid'] = this.websiteId;\r\n params['apiKey'] = this.apiKey;\r\n if (username && username.length > 0) {\r\n params['username'] = username;\r\n }\r\n return params;\r\n }\r\n\r\n private async assemblyHeader({ urlParams, token }: Readonly<{ urlParams: string, token?: Readonly<HttpToken> }>) {\r\n const h: Record<string, string> = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Device-Id': this.deviceId,\r\n 'User-Type': token?.utype.toString() ?? this.userType.toString(),\r\n 'User-From': this.userFrom,\r\n 'Api-Key': this.apiKey\r\n }\r\n if (this.lang && this.lang.length > 0) {\r\n h['Lang'] = this.lang\r\n }\r\n if (this.websiteId && this.websiteId.length > 0) {\r\n h['Web-Id'] = this.websiteId\r\n }\r\n if (this.websiteNo && this.websiteNo.length > 0) {\r\n h['Web-No'] = this.websiteNo\r\n }\r\n if (token) {\r\n if (token.token && token.token.length > 0 && token.username && token.username.length > 0) {\r\n h['Authorization'] = token.token;\r\n h['Username'] = token.username;\r\n }\r\n if (token.xcsrf) {\r\n h[token.xcsrf.csrfHeader] = token.xcsrf.csrfToken;\r\n }\r\n }\r\n const data = urlParamToJson(urlParams);\r\n const sign = await this.sign(data);\r\n h['Sign'] = sign\r\n return h;\r\n }\r\n\r\n private async helloIboot(): Promise<string> {\r\n if (this.helloMethod.length <= 0) {\r\n return this.apiKey;\r\n }\r\n const api = this.getApiUrl(this.helloMethod);\r\n const h = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Api-Key': this.apiKey\r\n }\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": h\r\n }\r\n logger.debug(logInfo, \"HELLO\");\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: h,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result.data, 'HELLO RESULT')\r\n return result.data;\r\n }\r\n throw new Error('hello iBoot error!')\r\n }\r\n\r\n private getApiUrl(url: string): string {\r\n return `${this.baseUrl}/${url}`;\r\n }\r\n\r\n async csrf(): Promise<string | undefined> {\r\n const res = await this.get<CSRFToken>({\r\n url: 'guest/csrf'\r\n });\r\n if (res.success) {\r\n const data = res.data;\r\n if (data) {\r\n return data[\"csrfToken\"].toString();\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async get<T>({ url, data, token, cache = 'default' }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n const api = `${this.getApiUrl(url)}?${urlParams.toString()}`\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers\r\n }\r\n logger.info(logInfo, \"GET\");\r\n const res = await fetch(api, {\r\n \"method\": 'GET',\r\n \"headers\": headers,\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token, cache = \"default\" }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n const api = this.getApiUrl(url);\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"POST\");\r\n const urls = buffer ? `${api}?${urlParams}` : api;\r\n const res = await fetch(urls, {\r\n \"method\": 'POST',\r\n \"headers\": headers,\r\n \"body\": buffer ? buffer : urlParams.toString(),\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<Omit<ServerRequestOptions, 'cache'>>): Promise<Response> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params); //new URLSearchParams(params);\r\n\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n headers['Connection'] = 'keep-alive';\r\n headers['X-Accel-Buffering'] = 'no'; //防止 Nginx 缓存\r\n headers['Cache-Control'] = 'no-cache';\r\n const api = this.getApiUrl(url)\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"STREAM\");\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: buffer ? buffer : urlParams.toString(),\r\n credentials: 'include'\r\n });\r\n\r\n if (!res.ok) {\r\n throw new Error(`HTTP error! status: ${res.status}`);\r\n }\r\n if (!res.body) {\r\n throw new Error('No response body');\r\n }\r\n return new Response(res.body, {\r\n headers: {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive'\r\n }\r\n });\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n\r\n getUserInfo(cookies: IbootCookieStore): User | null {\r\n const userjson = cookies.get(COOKIE_NAMES.user)?.value;\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n return null;\r\n }\r\n\r\n getToken(cookies: IbootCookieStore): HttpToken {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n getTokenByCookies = (cookies: IbootReadonlyCookies): HttpToken => {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setToken(data: User & { token: string, extFields: Record<string, any> }, response: { cookies: IbootWritableCookie }) {\r\n const { id, name, username, nickname, sex, headImg, token, lastLoginTime, tokenExpired, deviceId, userType, mustChangePwd } = data;\r\n const loginUser: User = {\r\n id: id,\r\n name: name,\r\n username: username,\r\n nickname: nickname,\r\n sex: sex,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n tokenExpired: tokenExpired,\r\n deviceId: deviceId,\r\n userType: userType,\r\n status: 0,\r\n accountType: 0,\r\n enabled: false,\r\n userFrom: 1,\r\n needToReview: false,\r\n socketOnline: false,\r\n createTime: \"\",\r\n mustChangePwd: mustChangePwd\r\n };\r\n response.cookies.set(COOKIE_NAMES.token, token, {\r\n httpOnly: true,\r\n secure: !this._isDebug, // 在生产环境中启用Secure\r\n sameSite: 'strict', // 防止 CSRF 攻击\r\n path: '/', // Cookie 的路径\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, JSON.stringify(loginUser));\r\n return response;\r\n }\r\n\r\n cleanToken(response: { cookies: IbootWritableCookie }) {\r\n response.cookies.set(COOKIE_NAMES.token, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.delete(COOKIE_NAMES.token);\r\n response.cookies.delete(COOKIE_NAMES.user)\r\n return response;\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","kernel32","koffi","setConsoleOutputCP","setConsoleCP","e","logger","pino","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","HEADER_NAMES","COOKIE_NAMES","getDefaultRequestHeader","devideId","json","curWebsite","header","setDefaultRequestHeader","deviceId","website","get","url","opts","params","headers","heads","field","response","msg","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","helloURL","key","CryptoJS","p","o","v","arr_item","item_field","item_field_value","item1","index","f","s","oValue","_apiKey","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","cache","buffer","boundary","urls","cookies","userjson","utype","user","id","name","nickname","sex","headImg","lastLoginTime","tokenExpired","mustChangePwd","loginUser"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(c,y){typeof exports=="object"&&typeof module<"u"?y(exports,require("pino"),require("js-md5"),require("crypto-js")):typeof define=="function"&&define.amd?define(["exports","pino","js-md5","crypto-js"],y):(c=typeof globalThis<"u"?globalThis:c||self,y(c["iboot-http-client"]={},c.pino,c.md5,c.CryptoJS))})(this,(function(c,y,k,p){"use strict";const B={GENERAL:0,PHONE:1,EMAIL:2},A={TYPE_MGT:0,TYPE_C:1,TYPE_B:2},L={FROM_WEB:1,FROM_PC:2,FROM_WX_MINI_PRO:3,FROM_WX_PLU:4,FROM_WX_E:5,FROM_APP:6,FROM_DEVICE:7},j={unknown:0,male:1,female:2};process.platform==="win32"&&(process.stdout.setEncoding("utf8"),process.stderr.setEncoding("utf8"));const d=y({name:process.env.APP_NAME??"iBoot",level:process.env.NODE_ENV!="production"?"debug":"info",nestedKey:"payload",formatters:{level:o=>({level:o})},transport:{target:"pino-pretty",options:{colorize:!0,translateTime:"SYS:yyyy-mm-dd HH:MM:ss",ignore:"pid,hostname",messageFormat:"{msg}",singleLine:!0}}}),w=o=>Array.isArray(o)||typeof o=="object"&&Object.prototype.toString.call(o)==="[object Array]",O=o=>{const t=o||32,e="ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",s=e.length;let r="";for(let n=0;n<t;n++)r+=e.charAt(Math.floor(Math.random()*s));return r},R=(o,t)=>{const e={};return o.split("&").forEach(r=>{const n=r.split("=");n[1]&&(!t||t.indexOf(n[0])==-1)&&(e[n[0]]=n[1])}),e},T=o=>!o||o==""||o.length==0?"":encodeURIComponent(o).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\'/g,"%27").replace(/\!/g,"%21").replace(/\~/g,"%7E"),N="zh-CN",S="_device_id_key",P="_current_website_key",U="Get request error!",v="Post request error!",_={"Device-Id":"Device-Id",Lang:"Lang","Website-Id":"Website-Id","Website-No":"Website-No"},g={IBOOT_DEVICE_ID:"IBOOT_DEVICE_ID",IBOOT_LOCALE:"IBOOT_LOCALE",IBOOT_WEBSITE_ID:"IBOOT_WEBSITE_ID",IBOOT_WEBSITE_NO:"IBOOT_WEBSITE_NO",token:"token",user:"user"},D=()=>{const o=localStorage.getItem(S)??"",t=localStorage.getItem(P),e=t!=null?JSON.parse(t):null,s={};return o.length>0&&(s["Device-Id"]=o),e&&(s.Lang=e.language,e.websiteId&&(s["Website-Id"]=e.websiteId),e.websiteNo&&(s["Website-No"]=e.websiteNo)),s},W=(o,t)=>{localStorage.setItem(S,o),t&&localStorage.setItem(P,JSON.stringify(t))},M=async(o,t)=>{if(t?.data){const i=new URLSearchParams(t.data);o.indexOf("?")!=-1?o+=`&${i}`:o+=`?${i}`}const e=D(),s=t?.headers;if(s)for(const i in s){const u=s[i];u&&(e[i]=u)}d.debug({method:"GET",url:o,headers:e});const r=await fetch(o,{method:"GET",headers:e,cache:t?.useCache?"force-cache":"default"});if(r.ok){const i=await r.json();return d.debug({GET_RESULT:i}),i}const n={code:r.status,success:!1,msg:r.statusText};return d.error(n),n},C=async(o,t)=>{const e=t?.data??{},s=t?.headers;let r;const n=new Headers(D());if(e instanceof FormData?r=e:(r=JSON.stringify(e),n.set("Content-Type","application/json")),s)for(let a in s){const l=s[a];l&&n.set(a,l)}d.debug({method:"GET",url:o,headers:n});const i=await fetch(o,{method:"POST",headers:n,body:r});if(i.ok){const a=await i.json();return d.debug({POST_RESULT:a}),a}const u={code:i.status,success:!1,msg:i.statusText};return d.error(u),u},$=async(o,t)=>{const e=await M(o,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??U);return}throw Error(e.msg??U)},H=async(o,t)=>{const e=await C(o,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??v);return}throw Error(e.msg??v)},F=async(o,t)=>{const e=await C(o,t);return e.success?(t?.showSuccess&&t.showSuccess(e.msg??"SUCCESS"),!0):(t?.showError&&t.showError(e.msg??v),!1)},K=o=>{const t=o.headers.get(_["Device-Id"]),e=o.headers.get(_.Lang),s=o.headers.get(_["Website-Id"]),r=o.headers.get(_["Website-No"]),n={};return t&&t.length>0&&(n.deviceId=t),e&&e.length>0&&(n.lang=e),s&&s.length>0&&(n.websiteId=s),r&&r.length>0&&(n.websiteNo=r),n},G=o=>{const t={},e=o.get(g.IBOOT_DEVICE_ID)?.value,s=o.get(g.IBOOT_LOCALE)?.value,r=o.get(g.IBOOT_WEBSITE_ID)?.value,n=o.get(g.IBOOT_WEBSITE_NO)?.value;return e&&e.length>0&&(t.deviceId=e),s&&s.length>0&&(t.lang=s),r&&r.length>0&&(t.websiteId=r),n&&n.length>0&&(t.websiteNo=n),t};class Y{baseUrl;helloMethod;apiKey;userType;userFrom;deviceId;version="1";lang;websiteId;websiteNo;_isDebug;constructor({deviceId:t,lang:e,websiteId:s,websiteNo:r,userType:n,helloURL:i}){this.baseUrl=process.env.BASE_URL??"",this.helloMethod=i??"",this.apiKey=process.env.API_KEY??"",this.userType=n??A.TYPE_MGT,this.userFrom=process.env.USER_FROM||"1",this.deviceId=t??O(10),this.lang=e??N,this.websiteId=s,this.websiteNo=r,this._isDebug=process.env.NODE_ENV!="production"}isDebug(){return this._isDebug}encrypt(t){const e=p.enc.Utf8.parse(this.apiKey);return p.AES.encrypt(t,e).toString()}decrypt(t){const e=p.enc.Utf8.parse(this.apiKey);return p.AES.decrypt(t,e,{mode:p.mode.ECB}).toString(p.enc.Utf8)}getDeviceId(){return this.deviceId}convertUrlParameter(t){const e=[];for(const s in t){let r=t[s];if(r&&typeof r=="string")r=r.trim();else if(r&&typeof r=="object"){if(w(r)){if(r.length===0)continue;for(let n=0;n<r.length;n++){const i=r[n];for(const u in i){const a=i[u]??void 0;if(a){if(typeof a=="object")w(a)&&a.forEach((l,h)=>{if(l)for(const m in l){const f=l[m];if(f&&f.toString().length>0){const E=`[${n.toString()}].${u+`[${h.toString()}].${m}`}=${T(f)}`;e.push(s+E)}}});else if(a.toString().length>0){const l=`[${n.toString()}].${u}=${T(a.toString())}`;e.push(s+l)}}}}}else for(const n in r){const i=r[n];if(i!=null&&i!=""&&i.length!=0){const u=`.${n}=${T(i)}`;e.push(s+u)}}continue}else r&&typeof r=="function"&&(r=null);r!=null&&r!=""&&r.length!=0&&e.push(s+"="+T(r))}return e&&e.join("&")}async sign(t){const e="&key="+await this.helloIboot(),s=[];for(const a in t)s.push(a);s.sort((a,l)=>a.toLowerCase().localeCompare(l.toLowerCase()));const r=[];s.forEach(a=>{let l=t[a];typeof l=="object"&&(l=JSON.stringify(l)),r.push(a+"="+l)});const n=r.join("&"),i=k.md5((n+e).toLocaleUpperCase()),u={name:"sort",params:n,md5:i};return d.debug(u),i}assemblyParameter(t,e){const s=t??{};return s.timestamp=Date.now()+"",s.echostr=O(10),s.version=this.version,s.deviceId=this.deviceId,s.webid=this.websiteId,s.apiKey=this.apiKey,e&&e.length>0&&(s.username=e),s}async assemblyHeader({urlParams:t,token:e}){const s={"Content-Type":"application/x-www-form-urlencoded","Res-Type":"json","Device-Id":this.deviceId,"User-Type":e?.utype.toString()??this.userType.toString(),"User-From":this.userFrom,"Api-Key":this.apiKey};this.lang&&this.lang.length>0&&(s.Lang=this.lang),this.websiteId&&this.websiteId.length>0&&(s["Web-Id"]=this.websiteId),this.websiteNo&&this.websiteNo.length>0&&(s["Web-No"]=this.websiteNo),e&&(e.token&&e.token.length>0&&e.username&&e.username.length>0&&(s.Authorization=e.token,s.Username=e.username),e.xcsrf&&(s[e.xcsrf.csrfHeader]=e.xcsrf.csrfToken));const r=R(t),n=await this.sign(r);return s.Sign=n,s}async helloIboot(){if(this.helloMethod.length<=0)return this.apiKey;const t=this.getApiUrl(this.helloMethod),e={"Content-Type":"application/x-www-form-urlencoded","Res-Type":"json","Api-Key":this.apiKey},s={url:t,headers:e};d.debug(s);const r=await fetch(t,{method:"GET",headers:e,credentials:"include",cache:"force-cache"});if(r.ok){const n=await r.json();return d.debug({result:n.data}),n.data}throw new Error("hello iBoot error!")}getApiUrl(t){return`${this.baseUrl}/${t}`}async csrf(){const t=await this.get({url:"guest/csrf"});if(t.success){const e=t.data;if(e)return e.csrfToken.toString()}}async get({url:t,data:e,token:s,cache:r="default"}){const n=this.assemblyParameter(e),i=this.convertUrlParameter(n),u=await this.assemblyHeader({urlParams:i,token:s}),a=`${this.getApiUrl(t)}?${i.toString()}`,l={method:"GET",url:a,headers:u};d.info(l);const h=await fetch(a,{method:"GET",headers:u,credentials:"include",cache:r});if(h.ok){const f=await h.json();return d.debug({GET_RESULT:f}),f}const m={code:h.status,success:!1,msg:h.statusText};return d.error(m),m}async post({url:t,data:e,token:s,cache:r="default"}){e=e?{...e}:{};const n=e.buffer??void 0,i=e.boundary??void 0;n&&delete e.buffer,i&&delete e.boundary;const u=this.assemblyParameter(e),a=this.convertUrlParameter(u),l=await this.assemblyHeader({urlParams:a,token:s});n&&i&&(l["Content-Type"]=`multipart/form-data; boundary=${i}`);const h=this.getApiUrl(t),m={method:"POST",url:h,headers:l,params:u};d.info(m);const f=n?`${h}?${a}`:h,E=await fetch(f,{method:"POST",headers:l,body:n||a.toString(),credentials:"include",cache:r});if(E.ok){const I=await E.json();return d.debug({POST_RESULT:I}),I}const b={code:E.status,success:!1,msg:E.statusText};return d.error(b),b}async stream({url:t,data:e,token:s}){e=e?{...e}:{};const r=e.buffer??void 0,n=e.boundary??void 0;r&&delete e.buffer,n&&delete e.boundary;const i=this.assemblyParameter(e),u=this.convertUrlParameter(i),a=await this.assemblyHeader({urlParams:u,token:s});r&&n&&(a["Content-Type"]=`multipart/form-data; boundary=${n}`),a.Connection="keep-alive",a["X-Accel-Buffering"]="no",a["Cache-Control"]="no-cache";const l=this.getApiUrl(t);try{const h=r?`${l}?${u}`:l,m={method:"STREAM",url:l,headers:a,params:i};d.info(m);const f=await fetch(h,{method:"POST",headers:a,body:r||u.toString(),credentials:"include"});if(!f.ok)throw new Error(`HTTP error! status: ${f.status}`);if(!f.body)throw new Error("No response body");return new Response(f.body,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}catch(h){throw h}}getUserInfo(t){const e=t.get(g.user)?.value;return e&&e.length>0?JSON.parse(e):null}getToken(t){const e=t.get("user")?.value;let s="",r=this.userType;if(e&&e.length>0){const n=JSON.parse(e);s=n.username,r=n.userType.toString()}return{username:s,utype:r,token:t.get(g.token)?.value??""}}getTokenByCookies=t=>{const e=t.get("user")?.value;let s="",r=this.userType;if(e&&e.length>0){const n=JSON.parse(e);s=n.username,r=n.userType.toString()}return{username:s,utype:r,token:t.get(g.token)?.value??""}};setToken(t,e){const{id:s,name:r,username:n,nickname:i,sex:u,headImg:a,token:l,lastLoginTime:h,tokenExpired:m,deviceId:f,userType:E,mustChangePwd:b}=t,I={id:s,name:r,username:n,nickname:i,sex:u,headImg:a,lastLoginTime:h,tokenExpired:m,deviceId:f,userType:E,status:0,accountType:0,enabled:!1,userFrom:1,needToReview:!1,socketOnline:!1,createTime:"",mustChangePwd:b};return e.cookies.set(g.token,l,{httpOnly:!0,secure:!this._isDebug,sameSite:"strict",path:"/"}),e.cookies.set(g.user,JSON.stringify(I)),e}cleanToken(t){return t.cookies.set(g.token,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.set(g.user,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.delete(g.token),t.cookies.delete(g.user),t}}c.ACCOUNT_TYPE_MAP=B,c.CURRENT_WEBSITE_KEY=P,c.DEFAULT_LOCALE=N,c.DEVICE_ID_KEY=S,c.HttpClient=Y,c.USER_FORM_MAP=L,c.USER_SEX_MAP=j,c.USER_TYPE_MAP=A,c.get=M,c.getHttpClientOpts=K,c.getHttpClientOptsByCookie=G,c.iGet=$,c.iPost=H,c.iPostSuccess=F,c.isArray=w,c.logger=d,c.post=C,c.randomString=O,c.setDefaultRequestHeader=W,c.urlEncode=T,c.urlParamToJson=R,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})}));
|
|
1
|
+
(function(c,y){typeof exports=="object"&&typeof module<"u"?y(exports,require("pino"),require("koffi"),require("js-md5"),require("crypto-js")):typeof define=="function"&&define.amd?define(["exports","pino","koffi","js-md5","crypto-js"],y):(c=typeof globalThis<"u"?globalThis:c||self,y(c["iboot-http-client"]={},c.pino,c.koffi,c.md5,c.CryptoJS))})(this,(function(c,y,L,M,p){"use strict";const B={GENERAL:0,PHONE:1,EMAIL:2},A={TYPE_MGT:0,TYPE_C:1,TYPE_B:2},j={FROM_WEB:1,FROM_PC:2,FROM_WX_MINI_PRO:3,FROM_WX_PLU:4,FROM_WX_E:5,FROM_APP:6,FROM_DEVICE:7},H={unknown:0,male:1,female:2};if(typeof window>"u"&&process.platform==="win32")try{const t=L.load("Kernel32"),e=t.func("SetConsoleOutputCP","bool",["int"]),s=t.func("SetConsoleCP","bool",["int"]);e(65001),s(65001)}catch(o){console.log(o)}const d=y({name:process.env.APP_NAME??"iBoot",level:process.env.NODE_ENV!=="production"?"debug":"info",nestedKey:"payload",transport:{target:"pino-pretty",options:{colorize:!0,translateTime:"SYS:yyyy-mm-dd HH:MM:ss",ignore:"pid,hostname",messageFormat:"{msg}",singleLine:!0}}}),O=o=>Array.isArray(o)||typeof o=="object"&&Object.prototype.toString.call(o)==="[object Array]",S=o=>{const t=o||32,e="ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",s=e.length;let n="";for(let r=0;r<t;r++)n+=e.charAt(Math.floor(Math.random()*s));return n},R=(o,t)=>{const e={};return o.split("&").forEach(n=>{const r=n.split("=");r[1]&&(!t||t.indexOf(r[0])==-1)&&(e[r[0]]=r[1])}),e},T=o=>!o||o==""||o.length==0?"":encodeURIComponent(o).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/\'/g,"%27").replace(/\!/g,"%21").replace(/\~/g,"%7E"),U="zh-CN",w="_device_id_key",P="_current_website_key",N="Get request error!",C="Post request error!",_={"Device-Id":"Device-Id",Lang:"Lang","Website-Id":"Website-Id","Website-No":"Website-No"},g={IBOOT_DEVICE_ID:"IBOOT_DEVICE_ID",IBOOT_LOCALE:"IBOOT_LOCALE",IBOOT_WEBSITE_ID:"IBOOT_WEBSITE_ID",IBOOT_WEBSITE_NO:"IBOOT_WEBSITE_NO",token:"token",user:"user"},k=()=>{const o=localStorage.getItem(w)??"",t=localStorage.getItem(P),e=t!=null?JSON.parse(t):null,s={};return o.length>0&&(s["Device-Id"]=o),e&&(s.Lang=e.language,e.websiteId&&(s["Website-Id"]=e.websiteId),e.websiteNo&&(s["Website-No"]=e.websiteNo)),s},W=(o,t)=>{localStorage.setItem(w,o),t&&localStorage.setItem(P,JSON.stringify(t))},D=async(o,t)=>{if(t?.data){const i=new URLSearchParams(t.data);o.indexOf("?")!=-1?o+=`&${i}`:o+=`?${i}`}const e=k(),s=t?.headers;if(s)for(const i in s){const u=s[i];u&&(e[i]=u)}d.debug({url:o,headers:e},"GET");const n=await fetch(o,{method:"GET",headers:e,cache:t?.useCache?"force-cache":"default"});if(n.ok){const i=await n.json();return d.debug(i,"GET_RESULT"),i}const r={code:n.status,success:!1,msg:n.statusText};return d.error(r),r},v=async(o,t)=>{const e=t?.data??{},s=t?.headers;let n;const r=new Headers(k());if(e instanceof FormData?n=e:(n=JSON.stringify(e),r.set("Content-Type","application/json")),s)for(let a in s){const l=s[a];l&&r.set(a,l)}d.debug({url:o,headers:r},"POST");const i=await fetch(o,{method:"POST",headers:r,body:n});if(i.ok){const a=await i.json();return d.debug(a,"POST_RESULT"),a}const u={code:i.status,success:!1,msg:i.statusText};return d.error(u),u},$=async(o,t)=>{const e=await D(o,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??N);return}throw Error(e.msg??N)},F=async(o,t)=>{const e=await v(o,t);if(e.success)return e.data;if(t?.showError){t.showError(e.msg??C);return}throw Error(e.msg??C)},K=async(o,t)=>{const e=await v(o,t);return e.success?(t?.showSuccess&&t.showSuccess(e.msg??"SUCCESS"),!0):(t?.showError&&t.showError(e.msg??C),!1)},G=o=>{const t=o.headers.get(_["Device-Id"]),e=o.headers.get(_.Lang),s=o.headers.get(_["Website-Id"]),n=o.headers.get(_["Website-No"]),r={};return t&&t.length>0&&(r.deviceId=t),e&&e.length>0&&(r.lang=e),s&&s.length>0&&(r.websiteId=s),n&&n.length>0&&(r.websiteNo=n),r},Y=o=>{const t={},e=o.get(g.IBOOT_DEVICE_ID)?.value,s=o.get(g.IBOOT_LOCALE)?.value,n=o.get(g.IBOOT_WEBSITE_ID)?.value,r=o.get(g.IBOOT_WEBSITE_NO)?.value;return e&&e.length>0&&(t.deviceId=e),s&&s.length>0&&(t.lang=s),n&&n.length>0&&(t.websiteId=n),r&&r.length>0&&(t.websiteNo=r),t};class V{baseUrl;helloMethod;apiKey;userType;userFrom;deviceId;version="1";lang;websiteId;websiteNo;_isDebug;constructor({deviceId:t,lang:e,websiteId:s,websiteNo:n,userType:r,helloURL:i}){this.baseUrl=process.env.BASE_URL??"",this.helloMethod=i??"",this.apiKey=process.env.API_KEY??"",this.userType=r??A.TYPE_MGT,this.userFrom=process.env.USER_FROM||"1",this.deviceId=t??S(10),this.lang=e??U,this.websiteId=s,this.websiteNo=n,this._isDebug=process.env.NODE_ENV!="production"}isDebug(){return this._isDebug}encrypt(t){const e=p.enc.Utf8.parse(this.apiKey);return p.AES.encrypt(t,e).toString()}decrypt(t){const e=p.enc.Utf8.parse(this.apiKey);return p.AES.decrypt(t,e,{mode:p.mode.ECB}).toString(p.enc.Utf8)}getDeviceId(){return this.deviceId}convertUrlParameter(t){const e=[];for(const s in t){let n=t[s];if(n&&typeof n=="string")n=n.trim();else if(n&&typeof n=="object"){if(O(n)){if(n.length===0)continue;for(let r=0;r<n.length;r++){const i=n[r];for(const u in i){const a=i[u]??void 0;if(a){if(typeof a=="object")O(a)&&a.forEach((l,f)=>{if(l)for(const m in l){const h=l[m];if(h&&h.toString().length>0){const E=`[${r.toString()}].${u+`[${f.toString()}].${m}`}=${T(h)}`;e.push(s+E)}}});else if(a.toString().length>0){const l=`[${r.toString()}].${u}=${T(a.toString())}`;e.push(s+l)}}}}}else for(const r in n){const i=n[r];if(i!=null&&i!=""&&i.length!=0){const u=`.${r}=${T(i)}`;e.push(s+u)}}continue}else n&&typeof n=="function"&&(n=null);n!=null&&n!=""&&n.length!=0&&e.push(s+"="+T(n))}return e&&e.join("&")}async sign(t){const e="&key="+await this.helloIboot(),s=[];for(const a in t)s.push(a);s.sort((a,l)=>a.toLowerCase().localeCompare(l.toLowerCase()));const n=[];s.forEach(a=>{let l=t[a];typeof l=="object"&&(l=JSON.stringify(l)),n.push(a+"="+l)});const r=n.join("&"),i=M.md5((r+e).toLocaleUpperCase()),u={params:r,md5:i};return d.debug(u,"API_SIGN"),i}assemblyParameter(t,e){const s=t??{};return s.timestamp=Date.now()+"",s.echostr=S(10),s.version=this.version,s.deviceId=this.deviceId,s.webid=this.websiteId,s.apiKey=this.apiKey,e&&e.length>0&&(s.username=e),s}async assemblyHeader({urlParams:t,token:e}){const s={"Content-Type":"application/x-www-form-urlencoded","Res-Type":"json","Device-Id":this.deviceId,"User-Type":e?.utype.toString()??this.userType.toString(),"User-From":this.userFrom,"Api-Key":this.apiKey};this.lang&&this.lang.length>0&&(s.Lang=this.lang),this.websiteId&&this.websiteId.length>0&&(s["Web-Id"]=this.websiteId),this.websiteNo&&this.websiteNo.length>0&&(s["Web-No"]=this.websiteNo),e&&(e.token&&e.token.length>0&&e.username&&e.username.length>0&&(s.Authorization=e.token,s.Username=e.username),e.xcsrf&&(s[e.xcsrf.csrfHeader]=e.xcsrf.csrfToken));const n=R(t),r=await this.sign(n);return s.Sign=r,s}async helloIboot(){if(this.helloMethod.length<=0)return this.apiKey;const t=this.getApiUrl(this.helloMethod),e={"Content-Type":"application/x-www-form-urlencoded","Res-Type":"json","Api-Key":this.apiKey},s={url:t,headers:e};d.debug(s,"HELLO");const n=await fetch(t,{method:"GET",headers:e,credentials:"include",cache:"force-cache"});if(n.ok){const r=await n.json();return d.debug(r.data,"HELLO RESULT"),r.data}throw new Error("hello iBoot error!")}getApiUrl(t){return`${this.baseUrl}/${t}`}async csrf(){const t=await this.get({url:"guest/csrf"});if(t.success){const e=t.data;if(e)return e.csrfToken.toString()}}async get({url:t,data:e,token:s,cache:n="default"}){const r=this.assemblyParameter(e),i=this.convertUrlParameter(r),u=await this.assemblyHeader({urlParams:i,token:s}),a=`${this.getApiUrl(t)}?${i.toString()}`,l={url:a,headers:u};d.info(l,"GET");const f=await fetch(a,{method:"GET",headers:u,credentials:"include",cache:n});if(f.ok){const h=await f.json();return d.debug(h,"GET_RESULT"),h}const m={code:f.status,success:!1,msg:f.statusText};return d.error(m),m}async post({url:t,data:e,token:s,cache:n="default"}){e=e?{...e}:{};const r=e.buffer??void 0,i=e.boundary??void 0;r&&delete e.buffer,i&&delete e.boundary;const u=this.assemblyParameter(e),a=this.convertUrlParameter(u),l=await this.assemblyHeader({urlParams:a,token:s});r&&i&&(l["Content-Type"]=`multipart/form-data; boundary=${i}`);const f=this.getApiUrl(t),m={url:f,headers:l,params:u};d.info(m,"POST");const h=r?`${f}?${a}`:f,E=await fetch(h,{method:"POST",headers:l,body:r||a.toString(),credentials:"include",cache:n});if(E.ok){const I=await E.json();return d.debug(I,"POST_RESULT"),I}const b={code:E.status,success:!1,msg:E.statusText};return d.error(b),b}async stream({url:t,data:e,token:s}){e=e?{...e}:{};const n=e.buffer??void 0,r=e.boundary??void 0;n&&delete e.buffer,r&&delete e.boundary;const i=this.assemblyParameter(e),u=this.convertUrlParameter(i),a=await this.assemblyHeader({urlParams:u,token:s});n&&r&&(a["Content-Type"]=`multipart/form-data; boundary=${r}`),a.Connection="keep-alive",a["X-Accel-Buffering"]="no",a["Cache-Control"]="no-cache";const l=this.getApiUrl(t);try{const f=n?`${l}?${u}`:l,m={url:l,headers:a,params:i};d.info(m,"STREAM");const h=await fetch(f,{method:"POST",headers:a,body:n||u.toString(),credentials:"include"});if(!h.ok)throw new Error(`HTTP error! status: ${h.status}`);if(!h.body)throw new Error("No response body");return new Response(h.body,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}catch(f){throw f}}getUserInfo(t){const e=t.get(g.user)?.value;return e&&e.length>0?JSON.parse(e):null}getToken(t){const e=t.get("user")?.value;let s="",n=this.userType;if(e&&e.length>0){const r=JSON.parse(e);s=r.username,n=r.userType.toString()}return{username:s,utype:n,token:t.get(g.token)?.value??""}}getTokenByCookies=t=>{const e=t.get("user")?.value;let s="",n=this.userType;if(e&&e.length>0){const r=JSON.parse(e);s=r.username,n=r.userType.toString()}return{username:s,utype:n,token:t.get(g.token)?.value??""}};setToken(t,e){const{id:s,name:n,username:r,nickname:i,sex:u,headImg:a,token:l,lastLoginTime:f,tokenExpired:m,deviceId:h,userType:E,mustChangePwd:b}=t,I={id:s,name:n,username:r,nickname:i,sex:u,headImg:a,lastLoginTime:f,tokenExpired:m,deviceId:h,userType:E,status:0,accountType:0,enabled:!1,userFrom:1,needToReview:!1,socketOnline:!1,createTime:"",mustChangePwd:b};return e.cookies.set(g.token,l,{httpOnly:!0,secure:!this._isDebug,sameSite:"strict",path:"/"}),e.cookies.set(g.user,JSON.stringify(I)),e}cleanToken(t){return t.cookies.set(g.token,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.set(g.user,"",{maxAge:-1,httpOnly:!0,path:"/"}),t.cookies.delete(g.token),t.cookies.delete(g.user),t}}c.ACCOUNT_TYPE_MAP=B,c.CURRENT_WEBSITE_KEY=P,c.DEFAULT_LOCALE=U,c.DEVICE_ID_KEY=w,c.HttpClient=V,c.USER_FORM_MAP=j,c.USER_SEX_MAP=H,c.USER_TYPE_MAP=A,c.get=D,c.getHttpClientOpts=G,c.getHttpClientOptsByCookie=Y,c.iGet=$,c.iPost=F,c.iPostSuccess=K,c.isArray=O,c.logger=d,c.post=v,c.randomString=S,c.setDefaultRequestHeader=W,c.urlEncode=T,c.urlParamToJson=R,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})}));
|
|
2
2
|
//# sourceMappingURL=iboot-http-client.umd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iboot-http-client.umd.js","sources":["../src/types/user.ts","../src/logger.ts","../src/utils.ts","../src/http-client.ts"],"sourcesContent":["export const ACCOUNT_TYPE_MAP = {\r\n GENERAL : 0,\r\n PHONE : 1,\r\n EMAIL : 2\r\n}\r\n\r\nexport const USER_TYPE_MAP = {\r\n TYPE_MGT : 0,\r\n TYPE_C : 1,\r\n TYPE_B : 2\r\n}\r\n\r\nexport const USER_FORM_MAP = {\r\n FROM_WEB : 1,\r\n FROM_PC : 2,\r\n FROM_WX_MINI_PRO : 3,\r\n FROM_WX_PLU : 4,\r\n FROM_WX_E : 5,\r\n FROM_APP : 6,\r\n FROM_DEVICE : 7\r\n}\r\n\r\nexport const USER_SEX_MAP = {\r\n unknown:0,\r\n male:1,\r\n female:2,\r\n}\r\n\r\nexport type ACCOUNT_TYPE = typeof ACCOUNT_TYPE_MAP[keyof typeof ACCOUNT_TYPE_MAP];\r\nexport type USER_TYPE = typeof USER_TYPE_MAP[keyof typeof USER_TYPE_MAP];\r\nexport type USER_FORM = typeof USER_FORM_MAP[keyof typeof USER_FORM_MAP];\r\nexport type USER_SEX = typeof USER_SEX_MAP[keyof typeof USER_SEX_MAP];\r\n\r\n// User interface\r\nexport interface User {\r\n id: string;\r\n name: string;\r\n username: string;\r\n nickname: string;\r\n sex: USER_SEX;\r\n headImg: string;\r\n lastLoginTime: string;\r\n tokenExpired: string;\r\n deviceId: string;\r\n userType: USER_TYPE;\r\n status: number;\r\n accountType: number;\r\n enabled: boolean;\r\n userFrom: USER_FORM;\r\n needToReview: boolean;\r\n socketOnline: boolean;\r\n createTime: string;\r\n mustChangePwd: boolean;\r\n}","import pino from \"pino\";\r\n\r\n// 在 Windows 系统上确保中文字符正确显示\r\nif (process.platform === 'win32') {\r\n // 设置 stdout 和 stderr 的编码为 utf8\r\n process.stdout.setEncoding('utf8');\r\n process.stderr.setEncoding('utf8');\r\n}\r\n\r\nexport const logger = pino({\r\n name: process.env.APP_NAME ?? 'iBoot',\r\n level: process.env.NODE_ENV != 'production' ? 'debug' : 'info',\r\n nestedKey: 'payload',\r\n formatters: {\r\n level: (label) => {\r\n return { level: label };\r\n }\r\n },\r\n transport: {\r\n target: 'pino-pretty',\r\n options: {\r\n colorize: true,\r\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n ignore: 'pid,hostname',\r\n messageFormat: '{msg}',\r\n singleLine: true\r\n }\r\n }\r\n});","export const isArray = (obj: unknown) => {\r\n return (\r\n Array.isArray(obj) ||\r\n (typeof obj === \"object\" &&\r\n Object.prototype.toString.call(obj) === \"[object Array]\")\r\n );\r\n};\r\n\r\n/**\r\n * 生成指定长度的随机串\r\n * @param {Object} len\r\n */\r\nexport const randomString = (len: number) => {\r\n const l = len || 32;\r\n const $chars = \"ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678\";\r\n const maxPos = $chars.length;\r\n let pwd = \"\";\r\n for (let i = 0; i < l; i++) {\r\n pwd += $chars.charAt(Math.floor(Math.random() * maxPos));\r\n }\r\n return pwd;\r\n};\r\n\r\nexport const urlParamToJson = (urlQueryParams: string, exclude?: string[]): Record<string, string> => {\r\n const result: Record<string, string> = {};\r\n const strs = urlQueryParams.split(\"&\");\r\n strs.forEach((item) => {\r\n const arr = item.split(\"=\");\r\n if (arr[1]) {\r\n if (!exclude || exclude.indexOf(arr[0]) == -1) {\r\n result[arr[0]] = arr[1];\r\n }\r\n }\r\n });\r\n return result;\r\n};\r\n\r\nexport const urlEncode = (value: string | null | undefined): string => {\r\n if (!value || value == \"\" || value.length == 0) {\r\n return \"\";\r\n }\r\n return (\r\n encodeURIComponent(value)\r\n // .replace(/%20/g, '+')\r\n // .replace(/%2B/g, '\\\\+')\r\n .replace(/\\(/g, \"%28\")\r\n .replace(/\\)/g, \"%29\")\r\n .replace(/\\'/g, \"%27\")\r\n .replace(/\\!/g, \"%21\")\r\n .replace(/\\~/g, \"%7E\")\r\n );\r\n};\r\n","import md5 from \"js-md5\";\r\nimport CryptoJS from 'crypto-js';\r\nimport { isArray, randomString, urlEncode, urlParamToJson } from \"./utils\";\r\nimport {\r\n ClientGetParams,\r\n ClientPostParams,\r\n CookieNames,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaderNames,\r\n HttpHeaders,\r\n HttpToken,\r\n IbootCookieStore,\r\n IbootReadonlyCookies,\r\n IbootWritableCookie,\r\n ResultModel,\r\n ServerRequestOptions\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\r\n\r\nexport const DEFAULT_LOCALE = 'zh-CN';\r\nexport const DEVICE_ID_KEY = \"_device_id_key\";\r\nexport const CURRENT_WEBSITE_KEY = \"_current_website_key\"\r\n\r\nconst _GET_ERROR = \"Get request error!\"\r\nconst _POST_ERROR = \"Post request error!\";\r\n\r\nconst HEADER_NAMES: Record<HttpHeaderNames, HttpHeaderNames> = {\r\n \"Device-Id\": \"Device-Id\",\r\n \"Lang\": \"Lang\",\r\n \"Website-Id\": \"Website-Id\",\r\n \"Website-No\": \"Website-No\",\r\n}\r\n\r\nconst COOKIE_NAMES: Record<CookieNames, CookieNames> = {\r\n \"IBOOT_DEVICE_ID\": \"IBOOT_DEVICE_ID\",\r\n \"IBOOT_LOCALE\": \"IBOOT_LOCALE\",\r\n \"IBOOT_WEBSITE_ID\": \"IBOOT_WEBSITE_ID\",\r\n \"IBOOT_WEBSITE_NO\": \"IBOOT_WEBSITE_NO\",\r\n \"token\": \"token\",\r\n \"user\": \"user\"\r\n}\r\n\r\nconst getDefaultRequestHeader = (): HttpHeaders => {\r\n const devideId = localStorage.getItem(DEVICE_ID_KEY) ?? ''\r\n const json = localStorage.getItem(CURRENT_WEBSITE_KEY);\r\n const curWebsite: CurWebsite | null = json != null ? JSON.parse(json) : null;\r\n const header: HttpHeaders = {}\r\n if (devideId.length > 0) {\r\n header['Device-Id'] = devideId\r\n }\r\n if (curWebsite) {\r\n header['Lang'] = curWebsite.language;\r\n if (curWebsite.websiteId) {\r\n header['Website-Id'] = curWebsite.websiteId;\r\n }\r\n if (curWebsite.websiteNo) {\r\n header['Website-No'] = curWebsite.websiteNo\r\n }\r\n }\r\n return header;\r\n};\r\n\r\n\r\nexport const setDefaultRequestHeader = (deviceId: string, website?: CurWebsite): void => {\r\n localStorage.setItem(DEVICE_ID_KEY, deviceId);\r\n if (website) {\r\n localStorage.setItem(CURRENT_WEBSITE_KEY, JSON.stringify(website));\r\n }\r\n}\r\n\r\nexport const get = async <T>(url: string, opts?: ClientGetParams): Promise<ResultModel<T>> => {\r\n if (opts?.data) {\r\n const params = new URLSearchParams(opts.data);\r\n if (url.indexOf(\"?\") != -1) {\r\n url += `&${params}`\r\n } else {\r\n url += `?${params}`\r\n }\r\n }\r\n const headers: Record<string, string> = getDefaultRequestHeader();\r\n const heads = opts?.headers;\r\n if (heads) {\r\n for (const field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n headers[field] = value;\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"method\": \"GET\",\r\n \"url\": url,\r\n \"headers\": headers,\r\n })\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n cache: opts?.useCache ? 'force-cache' : 'default'\r\n });\r\n\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug({\r\n \"GET_RESULT\": result,\r\n })\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const post = async <T>(url: string, opts?: ClientPostParams): Promise<ResultModel<T>> => {\r\n const data = opts?.data ?? {};\r\n const heads = opts?.headers;\r\n let body: string | FormData;\r\n const proxyHeaders = new Headers(getDefaultRequestHeader());\r\n if (!(data instanceof FormData)) {\r\n body = JSON.stringify(data);\r\n proxyHeaders.set('Content-Type', 'application/json');\r\n } else {\r\n body = data;\r\n }\r\n if (heads) {\r\n for (let field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n proxyHeaders.set(field, value);\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"method\": \"GET\",\r\n \"url\": url,\r\n \"headers\": proxyHeaders,\r\n })\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: proxyHeaders,\r\n body: body,\r\n });\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug({\r\n \"POST_RESULT\": result,\r\n })\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const iGet = async <T>(url: string, opts?: ClientGetParams): Promise<T | undefined> => {\r\n const res = await get<T>(url, opts);\r\n if (res.success) {\r\n return res.data as T;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _GET_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _GET_ERROR)\r\n}\r\n\r\nexport const iPost = async <T>(url: string, opts?: ClientPostParams): Promise<T | undefined> => {\r\n const res = await post<T>(url, opts);\r\n if (res.success) {\r\n return res.data;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _POST_ERROR)\r\n}\r\n\r\nexport const iPostSuccess = async (url: string, opts?: ClientPostParams): Promise<boolean> => {\r\n const res = await post(url, opts);\r\n if (res.success) {\r\n if (opts?.showSuccess) {\r\n opts.showSuccess(res.msg ?? 'SUCCESS')\r\n }\r\n return true;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n }\r\n return false;\r\n}\r\n\r\n\r\nexport const getHttpClientOpts = (request: Request): HttpClientOpts => {\r\n const deviceId = request.headers.get(HEADER_NAMES[\"Device-Id\"]);\r\n const lang = request.headers.get(HEADER_NAMES.Lang);\r\n const websiteId = request.headers.get(HEADER_NAMES[\"Website-Id\"]);\r\n const websiteNo = request.headers.get(HEADER_NAMES[\"Website-No\"]);\r\n const result: HttpClientOpts = {}\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport const getHttpClientOptsByCookie = (cookie: IbootReadonlyCookies): HttpClientOpts => {\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookie.get(COOKIE_NAMES.IBOOT_DEVICE_ID)?.value;\r\n const lang = cookie.get(COOKIE_NAMES.IBOOT_LOCALE)?.value;\r\n const websiteId = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_ID)?.value;\r\n const websiteNo = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_NO)?.value;\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly baseUrl: string;\r\n private readonly helloMethod: string;\r\n private readonly apiKey: string;\r\n private readonly userType: USER_TYPE;\r\n private readonly userFrom: string;\r\n private readonly deviceId: string;\r\n private readonly version: string = '1';\r\n private readonly lang: string;\r\n private readonly websiteId?: string;\r\n private readonly websiteNo?: string;\r\n private readonly _isDebug: boolean;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType, helloURL }: Readonly<HttpClientOpts>) {\r\n this.baseUrl = process.env.BASE_URL ?? '';\r\n this.helloMethod = helloURL ?? ''\r\n this.apiKey = process.env.API_KEY ?? '';\r\n this.userType = userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.userFrom = process.env.USER_FROM || '1';\r\n this.deviceId = deviceId ?? randomString(10);\r\n this.lang = lang ?? DEFAULT_LOCALE;\r\n this.websiteId = websiteId\r\n this.websiteNo = websiteNo\r\n this._isDebug = process.env.NODE_ENV != 'production';\r\n }\r\n\r\n isDebug() {\r\n return this._isDebug;\r\n }\r\n\r\n encrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.encrypt(data, key).toString();\r\n }\r\n\r\n decrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.decrypt(data, key, {\r\n mode: CryptoJS.mode.ECB,\r\n }).toString(CryptoJS.enc.Utf8);\r\n }\r\n\r\n getDeviceId() {\r\n return this.deviceId;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private convertUrlParameter(data: Record<string, any>): string {\r\n const p: string[] = [];\r\n for (const o in data) {\r\n let v = data[o];\r\n if (v && typeof v === \"string\") {\r\n v = v.trim();\r\n } else if (v && typeof v === \"object\") {\r\n if (isArray(v)) {\r\n if (v.length === 0) {\r\n continue;\r\n }\r\n for (let i = 0; i < v.length; i++) {\r\n const arr_item = v[i];\r\n for (const item_field in arr_item) {\r\n const item_field_value = arr_item[item_field] ?? undefined;\r\n if (item_field_value) {\r\n if (typeof item_field_value === \"object\") {\r\n if (isArray(item_field_value)) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n item_field_value.forEach((item1: any, index: number) => {\r\n if (item1) {\r\n for (const f in item1) {\r\n const v = item1[f];\r\n if (v && v.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field + `[${index.toString()}].${f}`}=${urlEncode(v)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n } else if (item_field_value.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field}=${urlEncode(item_field_value.toString())}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n for (const obj in v) {\r\n const oValue = v[obj];\r\n if (oValue != null && oValue != \"\" && oValue.length != 0) {\r\n const s = `.${obj}=${urlEncode(oValue)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n continue;\r\n } else if (v && typeof v === \"function\") {\r\n v = null;\r\n }\r\n\r\n if (v != null && v != \"\" && v.length != 0) {\r\n p.push(o + \"=\" + urlEncode(v));\r\n }\r\n }\r\n return (p && p.join(\"&\"));\r\n }\r\n\r\n private async sign(data: Record<string, object | string>): Promise<string> {\r\n //由后台分配\r\n const _apiKey = \"&key=\" + (await this.helloIboot());\r\n const arr: string[] = [];\r\n for (const o in data) {\r\n arr.push(o);\r\n }\r\n arr.sort((a: string, b: string) => {\r\n return a.toLowerCase().localeCompare(b.toLowerCase());\r\n });\r\n const res: string[] = [];\r\n arr.forEach((v: string) => {\r\n let value: object | string = data[v];\r\n if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n res.push(v + \"=\" + value);\r\n });\r\n const paramsStr: string = res.join(\"&\");\r\n const str = md5.md5((paramsStr + _apiKey).toLocaleUpperCase());\r\n const logInfo = {\r\n name: \"sort\",\r\n params: paramsStr,\r\n md5: str\r\n }\r\n logger.debug(logInfo)\r\n return str;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private assemblyParameter(data?: Record<string, any>, username?: string): Record<string, any> {\r\n const params = data ?? {};\r\n params['timestamp'] = Date.now() + '';\r\n params['echostr'] = randomString(10);\r\n params['version'] = this.version;\r\n params['deviceId'] = this.deviceId;\r\n params['webid'] = this.websiteId;\r\n params['apiKey'] = this.apiKey;\r\n if (username && username.length > 0) {\r\n params['username'] = username;\r\n }\r\n return params;\r\n }\r\n\r\n private async assemblyHeader({ urlParams, token }: Readonly<{ urlParams: string, token?: Readonly<HttpToken> }>) {\r\n const h: Record<string, string> = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Device-Id': this.deviceId,\r\n 'User-Type': token?.utype.toString() ?? this.userType.toString(),\r\n 'User-From': this.userFrom,\r\n 'Api-Key': this.apiKey\r\n }\r\n if (this.lang && this.lang.length > 0) {\r\n h['Lang'] = this.lang\r\n }\r\n if (this.websiteId && this.websiteId.length > 0) {\r\n h['Web-Id'] = this.websiteId\r\n }\r\n if (this.websiteNo && this.websiteNo.length > 0) {\r\n h['Web-No'] = this.websiteNo\r\n }\r\n if (token) {\r\n if (token.token && token.token.length > 0 && token.username && token.username.length > 0) {\r\n h['Authorization'] = token.token;\r\n h['Username'] = token.username;\r\n }\r\n if (token.xcsrf) {\r\n h[token.xcsrf.csrfHeader] = token.xcsrf.csrfToken;\r\n }\r\n }\r\n const data = urlParamToJson(urlParams);\r\n const sign = await this.sign(data);\r\n h['Sign'] = sign\r\n return h;\r\n }\r\n\r\n private async helloIboot(): Promise<string> {\r\n if (this.helloMethod.length <= 0) {\r\n return this.apiKey;\r\n }\r\n const api = this.getApiUrl(this.helloMethod);\r\n const h = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Api-Key': this.apiKey\r\n }\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": h\r\n }\r\n logger.debug(logInfo);\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: h,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug({ result: result.data })\r\n return result.data;\r\n }\r\n throw new Error('hello iBoot error!')\r\n }\r\n\r\n private getApiUrl(url: string): string {\r\n return `${this.baseUrl}/${url}`;\r\n }\r\n\r\n async csrf(): Promise<string | undefined> {\r\n const res = await this.get<CSRFToken>({\r\n url: 'guest/csrf'\r\n });\r\n if (res.success) {\r\n const data = res.data;\r\n if (data) {\r\n return data[\"csrfToken\"].toString();\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async get<T>({ url, data, token, cache = 'default' }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n const api = `${this.getApiUrl(url)}?${urlParams.toString()}`\r\n const logInfo = {\r\n \"method\": \"GET\",\r\n \"url\": api,\r\n \"headers\": headers\r\n }\r\n logger.info(logInfo);\r\n const res = await fetch(api, {\r\n \"method\": 'GET',\r\n \"headers\": headers,\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug({ \"GET_RESULT\": result })\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token, cache = \"default\" }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n const api = this.getApiUrl(url);\r\n const logInfo = {\r\n \"method\": \"POST\",\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo);\r\n const urls = buffer ? `${api}?${urlParams}` : api;\r\n const res = await fetch(urls, {\r\n \"method\": 'POST',\r\n \"headers\": headers,\r\n \"body\": buffer ? buffer : urlParams.toString(),\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug({ \"POST_RESULT\": result })\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<Omit<ServerRequestOptions, 'cache'>>): Promise<Response> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params); //new URLSearchParams(params);\r\n\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n headers['Connection'] = 'keep-alive';\r\n headers['X-Accel-Buffering'] = 'no'; //防止 Nginx 缓存\r\n headers['Cache-Control'] = 'no-cache';\r\n const api = this.getApiUrl(url)\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\r\n const logInfo = {\r\n \"method\": \"STREAM\",\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo);\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: buffer ? buffer : urlParams.toString(),\r\n credentials: 'include'\r\n });\r\n\r\n if (!res.ok) {\r\n throw new Error(`HTTP error! status: ${res.status}`);\r\n }\r\n if (!res.body) {\r\n throw new Error('No response body');\r\n }\r\n return new Response(res.body, {\r\n headers: {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive'\r\n }\r\n });\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n\r\n getUserInfo(cookies: IbootCookieStore): User | null {\r\n const userjson = cookies.get(COOKIE_NAMES.user)?.value;\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n return null;\r\n }\r\n\r\n getToken(cookies: IbootCookieStore): HttpToken {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n getTokenByCookies = (cookies: IbootReadonlyCookies): HttpToken => {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setToken(data: User & { token: string, extFields: Record<string, any> }, response: { cookies: IbootWritableCookie }) {\r\n const { id, name, username, nickname, sex, headImg, token, lastLoginTime, tokenExpired, deviceId, userType, mustChangePwd } = data;\r\n const loginUser: User = {\r\n id: id,\r\n name: name,\r\n username: username,\r\n nickname: nickname,\r\n sex: sex,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n tokenExpired: tokenExpired,\r\n deviceId: deviceId,\r\n userType: userType,\r\n status: 0,\r\n accountType: 0,\r\n enabled: false,\r\n userFrom: 1,\r\n needToReview: false,\r\n socketOnline: false,\r\n createTime: \"\",\r\n mustChangePwd: mustChangePwd\r\n };\r\n response.cookies.set(COOKIE_NAMES.token, token, {\r\n httpOnly: true,\r\n secure: !this._isDebug, // 在生产环境中启用Secure\r\n sameSite: 'strict', // 防止 CSRF 攻击\r\n path: '/', // Cookie 的路径\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, JSON.stringify(loginUser));\r\n return response;\r\n }\r\n\r\n cleanToken(response: { cookies: IbootWritableCookie }) {\r\n response.cookies.set(COOKIE_NAMES.token, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.delete(COOKIE_NAMES.token);\r\n response.cookies.delete(COOKIE_NAMES.user)\r\n return response;\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","logger","pino","label","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","HEADER_NAMES","COOKIE_NAMES","getDefaultRequestHeader","devideId","json","curWebsite","header","setDefaultRequestHeader","deviceId","website","get","url","opts","params","headers","heads","field","response","msg","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","helloURL","key","CryptoJS","p","o","v","arr_item","item_field","item_field_value","item1","index","f","s","oValue","_apiKey","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","cache","buffer","boundary","urls","e","cookies","userjson","utype","user","id","name","nickname","sex","headImg","lastLoginTime","tokenExpired","mustChangePwd","loginUser"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"iboot-http-client.umd.js","sources":["../src/types/user.ts","../src/logger.ts","../src/utils.ts","../src/http-client.ts"],"sourcesContent":["export const ACCOUNT_TYPE_MAP = {\r\n GENERAL : 0,\r\n PHONE : 1,\r\n EMAIL : 2\r\n}\r\n\r\nexport const USER_TYPE_MAP = {\r\n TYPE_MGT : 0,\r\n TYPE_C : 1,\r\n TYPE_B : 2\r\n}\r\n\r\nexport const USER_FORM_MAP = {\r\n FROM_WEB : 1,\r\n FROM_PC : 2,\r\n FROM_WX_MINI_PRO : 3,\r\n FROM_WX_PLU : 4,\r\n FROM_WX_E : 5,\r\n FROM_APP : 6,\r\n FROM_DEVICE : 7\r\n}\r\n\r\nexport const USER_SEX_MAP = {\r\n unknown:0,\r\n male:1,\r\n female:2,\r\n}\r\n\r\nexport type ACCOUNT_TYPE = typeof ACCOUNT_TYPE_MAP[keyof typeof ACCOUNT_TYPE_MAP];\r\nexport type USER_TYPE = typeof USER_TYPE_MAP[keyof typeof USER_TYPE_MAP];\r\nexport type USER_FORM = typeof USER_FORM_MAP[keyof typeof USER_FORM_MAP];\r\nexport type USER_SEX = typeof USER_SEX_MAP[keyof typeof USER_SEX_MAP];\r\n\r\n// User interface\r\nexport interface User {\r\n id: string;\r\n name: string;\r\n username: string;\r\n nickname: string;\r\n sex: USER_SEX;\r\n headImg: string;\r\n lastLoginTime: string;\r\n tokenExpired: string;\r\n deviceId: string;\r\n userType: USER_TYPE;\r\n status: number;\r\n accountType: number;\r\n enabled: boolean;\r\n userFrom: USER_FORM;\r\n needToReview: boolean;\r\n socketOnline: boolean;\r\n createTime: string;\r\n mustChangePwd: boolean;\r\n}","import pino from \"pino\";\r\nimport koffi from 'koffi';\r\n\r\nif (typeof window === 'undefined' && process.platform === 'win32') {\r\n try {\r\n const CP_UTF8 = 65001;\r\n const kernel32 = koffi.load('Kernel32');\r\n const setConsoleOutputCP = kernel32.func('SetConsoleOutputCP', 'bool', ['int']);\r\n const setConsoleCP = kernel32.func('SetConsoleCP', 'bool', ['int']);\r\n setConsoleOutputCP(CP_UTF8);\r\n setConsoleCP(CP_UTF8);\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n}\r\n\r\nexport const logger = pino({\r\n name: process.env.APP_NAME ?? 'iBoot',\r\n level: process.env.NODE_ENV !== 'production' ? 'debug' : 'info',\r\n nestedKey: 'payload',\r\n transport: {\r\n target: 'pino-pretty',\r\n options: {\r\n colorize: true,\r\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',\r\n ignore: 'pid,hostname',\r\n messageFormat: '{msg}',\r\n singleLine: true,\r\n },\r\n }\r\n});","export const isArray = (obj: unknown) => {\r\n return (\r\n Array.isArray(obj) ||\r\n (typeof obj === \"object\" &&\r\n Object.prototype.toString.call(obj) === \"[object Array]\")\r\n );\r\n};\r\n\r\n/**\r\n * 生成指定长度的随机串\r\n * @param {Object} len\r\n */\r\nexport const randomString = (len: number) => {\r\n const l = len || 32;\r\n const $chars = \"ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678\";\r\n const maxPos = $chars.length;\r\n let pwd = \"\";\r\n for (let i = 0; i < l; i++) {\r\n pwd += $chars.charAt(Math.floor(Math.random() * maxPos));\r\n }\r\n return pwd;\r\n};\r\n\r\nexport const urlParamToJson = (urlQueryParams: string, exclude?: string[]): Record<string, string> => {\r\n const result: Record<string, string> = {};\r\n const strs = urlQueryParams.split(\"&\");\r\n strs.forEach((item) => {\r\n const arr = item.split(\"=\");\r\n if (arr[1]) {\r\n if (!exclude || exclude.indexOf(arr[0]) == -1) {\r\n result[arr[0]] = arr[1];\r\n }\r\n }\r\n });\r\n return result;\r\n};\r\n\r\nexport const urlEncode = (value: string | null | undefined): string => {\r\n if (!value || value == \"\" || value.length == 0) {\r\n return \"\";\r\n }\r\n return (\r\n encodeURIComponent(value)\r\n // .replace(/%20/g, '+')\r\n // .replace(/%2B/g, '\\\\+')\r\n .replace(/\\(/g, \"%28\")\r\n .replace(/\\)/g, \"%29\")\r\n .replace(/\\'/g, \"%27\")\r\n .replace(/\\!/g, \"%21\")\r\n .replace(/\\~/g, \"%7E\")\r\n );\r\n};\r\n","import md5 from \"js-md5\";\r\nimport CryptoJS from 'crypto-js';\r\nimport { isArray, randomString, urlEncode, urlParamToJson } from \"./utils\";\r\nimport {\r\n ClientGetParams,\r\n ClientPostParams,\r\n CookieNames,\r\n CSRFToken,\r\n CurWebsite,\r\n HttpClientOpts,\r\n HttpHeaderNames,\r\n HttpHeaders,\r\n HttpToken,\r\n IbootCookieStore,\r\n IbootReadonlyCookies,\r\n IbootWritableCookie,\r\n ResultModel,\r\n ServerRequestOptions\r\n} from \"./types/http\";\r\nimport { User, USER_TYPE, USER_TYPE_MAP } from \"./types/user\";\r\nimport { logger } from \"./logger\";\r\n\r\nexport const DEFAULT_LOCALE = 'zh-CN';\r\nexport const DEVICE_ID_KEY = \"_device_id_key\";\r\nexport const CURRENT_WEBSITE_KEY = \"_current_website_key\"\r\n\r\nconst _GET_ERROR = \"Get request error!\"\r\nconst _POST_ERROR = \"Post request error!\";\r\n\r\nconst HEADER_NAMES: Record<HttpHeaderNames, HttpHeaderNames> = {\r\n \"Device-Id\": \"Device-Id\",\r\n \"Lang\": \"Lang\",\r\n \"Website-Id\": \"Website-Id\",\r\n \"Website-No\": \"Website-No\",\r\n}\r\n\r\nconst COOKIE_NAMES: Record<CookieNames, CookieNames> = {\r\n \"IBOOT_DEVICE_ID\": \"IBOOT_DEVICE_ID\",\r\n \"IBOOT_LOCALE\": \"IBOOT_LOCALE\",\r\n \"IBOOT_WEBSITE_ID\": \"IBOOT_WEBSITE_ID\",\r\n \"IBOOT_WEBSITE_NO\": \"IBOOT_WEBSITE_NO\",\r\n \"token\": \"token\",\r\n \"user\": \"user\"\r\n}\r\n\r\nconst getDefaultRequestHeader = (): HttpHeaders => {\r\n const devideId = localStorage.getItem(DEVICE_ID_KEY) ?? ''\r\n const json = localStorage.getItem(CURRENT_WEBSITE_KEY);\r\n const curWebsite: CurWebsite | null = json != null ? JSON.parse(json) : null;\r\n const header: HttpHeaders = {}\r\n if (devideId.length > 0) {\r\n header['Device-Id'] = devideId\r\n }\r\n if (curWebsite) {\r\n header['Lang'] = curWebsite.language;\r\n if (curWebsite.websiteId) {\r\n header['Website-Id'] = curWebsite.websiteId;\r\n }\r\n if (curWebsite.websiteNo) {\r\n header['Website-No'] = curWebsite.websiteNo\r\n }\r\n }\r\n return header;\r\n};\r\n\r\n\r\nexport const setDefaultRequestHeader = (deviceId: string, website?: CurWebsite): void => {\r\n localStorage.setItem(DEVICE_ID_KEY, deviceId);\r\n if (website) {\r\n localStorage.setItem(CURRENT_WEBSITE_KEY, JSON.stringify(website));\r\n }\r\n}\r\n\r\nexport const get = async <T>(url: string, opts?: ClientGetParams): Promise<ResultModel<T>> => {\r\n if (opts?.data) {\r\n const params = new URLSearchParams(opts.data);\r\n if (url.indexOf(\"?\") != -1) {\r\n url += `&${params}`\r\n } else {\r\n url += `?${params}`\r\n }\r\n }\r\n const headers: Record<string, string> = getDefaultRequestHeader();\r\n const heads = opts?.headers;\r\n if (heads) {\r\n for (const field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n headers[field] = value;\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": headers,\r\n }, \"GET\")\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: headers,\r\n cache: opts?.useCache ? 'force-cache' : 'default'\r\n });\r\n\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const post = async <T>(url: string, opts?: ClientPostParams): Promise<ResultModel<T>> => {\r\n const data = opts?.data ?? {};\r\n const heads = opts?.headers;\r\n let body: string | FormData;\r\n const proxyHeaders = new Headers(getDefaultRequestHeader());\r\n if (!(data instanceof FormData)) {\r\n body = JSON.stringify(data);\r\n proxyHeaders.set('Content-Type', 'application/json');\r\n } else {\r\n body = data;\r\n }\r\n if (heads) {\r\n for (let field in heads) {\r\n const value = heads[field];\r\n if (value) {\r\n proxyHeaders.set(field, value);\r\n }\r\n }\r\n }\r\n logger.debug({\r\n \"url\": url,\r\n \"headers\": proxyHeaders,\r\n }, \"POST\")\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: proxyHeaders,\r\n body: body,\r\n });\r\n if (response.ok) {\r\n const result = await response.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result\r\n }\r\n const msg = {\r\n code: response.status,\r\n success: false,\r\n msg: response.statusText,\r\n }\r\n logger.error(msg);\r\n return msg;\r\n}\r\n\r\nexport const iGet = async <T>(url: string, opts?: ClientGetParams): Promise<T | undefined> => {\r\n const res = await get<T>(url, opts);\r\n if (res.success) {\r\n return res.data as T;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _GET_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _GET_ERROR)\r\n}\r\n\r\nexport const iPost = async <T>(url: string, opts?: ClientPostParams): Promise<T | undefined> => {\r\n const res = await post<T>(url, opts);\r\n if (res.success) {\r\n return res.data;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n return;\r\n }\r\n throw Error(res.msg ?? _POST_ERROR)\r\n}\r\n\r\nexport const iPostSuccess = async (url: string, opts?: ClientPostParams): Promise<boolean> => {\r\n const res = await post(url, opts);\r\n if (res.success) {\r\n if (opts?.showSuccess) {\r\n opts.showSuccess(res.msg ?? 'SUCCESS')\r\n }\r\n return true;\r\n }\r\n if (opts?.showError) {\r\n opts.showError(res.msg ?? _POST_ERROR);\r\n }\r\n return false;\r\n}\r\n\r\n\r\nexport const getHttpClientOpts = (request: Request): HttpClientOpts => {\r\n const deviceId = request.headers.get(HEADER_NAMES[\"Device-Id\"]);\r\n const lang = request.headers.get(HEADER_NAMES.Lang);\r\n const websiteId = request.headers.get(HEADER_NAMES[\"Website-Id\"]);\r\n const websiteNo = request.headers.get(HEADER_NAMES[\"Website-No\"]);\r\n const result: HttpClientOpts = {}\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport const getHttpClientOptsByCookie = (cookie: IbootReadonlyCookies): HttpClientOpts => {\r\n const result: HttpClientOpts = {}\r\n const deviceId = cookie.get(COOKIE_NAMES.IBOOT_DEVICE_ID)?.value;\r\n const lang = cookie.get(COOKIE_NAMES.IBOOT_LOCALE)?.value;\r\n const websiteId = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_ID)?.value;\r\n const websiteNo = cookie.get(COOKIE_NAMES.IBOOT_WEBSITE_NO)?.value;\r\n if (deviceId && deviceId.length > 0) {\r\n result.deviceId = deviceId;\r\n }\r\n if (lang && lang.length > 0) {\r\n result.lang = lang\r\n }\r\n if (websiteId && websiteId.length > 0) {\r\n result.websiteId = websiteId\r\n }\r\n if (websiteNo && websiteNo.length > 0) {\r\n result.websiteNo = websiteNo\r\n }\r\n return result;\r\n}\r\n\r\nexport class HttpClient {\r\n private readonly baseUrl: string;\r\n private readonly helloMethod: string;\r\n private readonly apiKey: string;\r\n private readonly userType: USER_TYPE;\r\n private readonly userFrom: string;\r\n private readonly deviceId: string;\r\n private readonly version: string = '1';\r\n private readonly lang: string;\r\n private readonly websiteId?: string;\r\n private readonly websiteNo?: string;\r\n private readonly _isDebug: boolean;\r\n constructor({ deviceId, lang, websiteId, websiteNo, userType, helloURL }: Readonly<HttpClientOpts>) {\r\n this.baseUrl = process.env.BASE_URL ?? '';\r\n this.helloMethod = helloURL ?? ''\r\n this.apiKey = process.env.API_KEY ?? '';\r\n this.userType = userType ?? USER_TYPE_MAP.TYPE_MGT;\r\n this.userFrom = process.env.USER_FROM || '1';\r\n this.deviceId = deviceId ?? randomString(10);\r\n this.lang = lang ?? DEFAULT_LOCALE;\r\n this.websiteId = websiteId\r\n this.websiteNo = websiteNo\r\n this._isDebug = process.env.NODE_ENV != 'production';\r\n }\r\n\r\n isDebug() {\r\n return this._isDebug;\r\n }\r\n\r\n encrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.encrypt(data, key).toString();\r\n }\r\n\r\n decrypt(data: string) {\r\n const key = CryptoJS.enc.Utf8.parse(this.apiKey);\r\n return CryptoJS.AES.decrypt(data, key, {\r\n mode: CryptoJS.mode.ECB,\r\n }).toString(CryptoJS.enc.Utf8);\r\n }\r\n\r\n getDeviceId() {\r\n return this.deviceId;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private convertUrlParameter(data: Record<string, any>): string {\r\n const p: string[] = [];\r\n for (const o in data) {\r\n let v = data[o];\r\n if (v && typeof v === \"string\") {\r\n v = v.trim();\r\n } else if (v && typeof v === \"object\") {\r\n if (isArray(v)) {\r\n if (v.length === 0) {\r\n continue;\r\n }\r\n for (let i = 0; i < v.length; i++) {\r\n const arr_item = v[i];\r\n for (const item_field in arr_item) {\r\n const item_field_value = arr_item[item_field] ?? undefined;\r\n if (item_field_value) {\r\n if (typeof item_field_value === \"object\") {\r\n if (isArray(item_field_value)) {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n item_field_value.forEach((item1: any, index: number) => {\r\n if (item1) {\r\n for (const f in item1) {\r\n const v = item1[f];\r\n if (v && v.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field + `[${index.toString()}].${f}`}=${urlEncode(v)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n } else if (item_field_value.toString().length > 0) {\r\n const s = `[${i.toString()}].${item_field}=${urlEncode(item_field_value.toString())}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n for (const obj in v) {\r\n const oValue = v[obj];\r\n if (oValue != null && oValue != \"\" && oValue.length != 0) {\r\n const s = `.${obj}=${urlEncode(oValue)}`;\r\n p.push(o + s);\r\n }\r\n }\r\n }\r\n continue;\r\n } else if (v && typeof v === \"function\") {\r\n v = null;\r\n }\r\n\r\n if (v != null && v != \"\" && v.length != 0) {\r\n p.push(o + \"=\" + urlEncode(v));\r\n }\r\n }\r\n return (p && p.join(\"&\"));\r\n }\r\n\r\n private async sign(data: Record<string, object | string>): Promise<string> {\r\n //由后台分配\r\n const _apiKey = \"&key=\" + (await this.helloIboot());\r\n const arr: string[] = [];\r\n for (const o in data) {\r\n arr.push(o);\r\n }\r\n arr.sort((a: string, b: string) => {\r\n return a.toLowerCase().localeCompare(b.toLowerCase());\r\n });\r\n const res: string[] = [];\r\n arr.forEach((v: string) => {\r\n let value: object | string = data[v];\r\n if (typeof value === \"object\") {\r\n value = JSON.stringify(value);\r\n }\r\n res.push(v + \"=\" + value);\r\n });\r\n const paramsStr: string = res.join(\"&\");\r\n const str = md5.md5((paramsStr + _apiKey).toLocaleUpperCase());\r\n const logInfo = {\r\n params: paramsStr,\r\n md5: str\r\n }\r\n logger.debug(logInfo, \"API_SIGN\")\r\n return str;\r\n }\r\n\r\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private assemblyParameter(data?: Record<string, any>, username?: string): Record<string, any> {\r\n const params = data ?? {};\r\n params['timestamp'] = Date.now() + '';\r\n params['echostr'] = randomString(10);\r\n params['version'] = this.version;\r\n params['deviceId'] = this.deviceId;\r\n params['webid'] = this.websiteId;\r\n params['apiKey'] = this.apiKey;\r\n if (username && username.length > 0) {\r\n params['username'] = username;\r\n }\r\n return params;\r\n }\r\n\r\n private async assemblyHeader({ urlParams, token }: Readonly<{ urlParams: string, token?: Readonly<HttpToken> }>) {\r\n const h: Record<string, string> = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Device-Id': this.deviceId,\r\n 'User-Type': token?.utype.toString() ?? this.userType.toString(),\r\n 'User-From': this.userFrom,\r\n 'Api-Key': this.apiKey\r\n }\r\n if (this.lang && this.lang.length > 0) {\r\n h['Lang'] = this.lang\r\n }\r\n if (this.websiteId && this.websiteId.length > 0) {\r\n h['Web-Id'] = this.websiteId\r\n }\r\n if (this.websiteNo && this.websiteNo.length > 0) {\r\n h['Web-No'] = this.websiteNo\r\n }\r\n if (token) {\r\n if (token.token && token.token.length > 0 && token.username && token.username.length > 0) {\r\n h['Authorization'] = token.token;\r\n h['Username'] = token.username;\r\n }\r\n if (token.xcsrf) {\r\n h[token.xcsrf.csrfHeader] = token.xcsrf.csrfToken;\r\n }\r\n }\r\n const data = urlParamToJson(urlParams);\r\n const sign = await this.sign(data);\r\n h['Sign'] = sign\r\n return h;\r\n }\r\n\r\n private async helloIboot(): Promise<string> {\r\n if (this.helloMethod.length <= 0) {\r\n return this.apiKey;\r\n }\r\n const api = this.getApiUrl(this.helloMethod);\r\n const h = {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n 'Res-Type': 'json',\r\n 'Api-Key': this.apiKey\r\n }\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": h\r\n }\r\n logger.debug(logInfo, \"HELLO\");\r\n const res = await fetch(api, {\r\n method: 'GET',\r\n headers: h,\r\n credentials: 'include',\r\n cache: 'force-cache'\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result.data, 'HELLO RESULT')\r\n return result.data;\r\n }\r\n throw new Error('hello iBoot error!')\r\n }\r\n\r\n private getApiUrl(url: string): string {\r\n return `${this.baseUrl}/${url}`;\r\n }\r\n\r\n async csrf(): Promise<string | undefined> {\r\n const res = await this.get<CSRFToken>({\r\n url: 'guest/csrf'\r\n });\r\n if (res.success) {\r\n const data = res.data;\r\n if (data) {\r\n return data[\"csrfToken\"].toString();\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async get<T>({ url, data, token, cache = 'default' }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n const api = `${this.getApiUrl(url)}?${urlParams.toString()}`\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers\r\n }\r\n logger.info(logInfo, \"GET\");\r\n const res = await fetch(api, {\r\n \"method\": 'GET',\r\n \"headers\": headers,\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"GET_RESULT\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async post<T>({ url, data, token, cache = \"default\" }: Readonly<ServerRequestOptions>): Promise<ResultModel<T>> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params);\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n const api = this.getApiUrl(url);\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"POST\");\r\n const urls = buffer ? `${api}?${urlParams}` : api;\r\n const res = await fetch(urls, {\r\n \"method\": 'POST',\r\n \"headers\": headers,\r\n \"body\": buffer ? buffer : urlParams.toString(),\r\n \"credentials\": 'include',\r\n \"cache\": cache\r\n });\r\n if (res.ok) {\r\n const result = await res.json();\r\n logger.debug(result, \"POST_RESULT\")\r\n return result;\r\n }\r\n const msg = {\r\n code: res.status,\r\n success: false,\r\n msg: res.statusText\r\n }\r\n logger.error(msg);\r\n return msg;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n async stream({ url, data, token }: Readonly<Omit<ServerRequestOptions, 'cache'>>): Promise<Response> {\r\n data = data ? { ...data } : {}\r\n const buffer = data.buffer ?? undefined;\r\n const boundary = data.boundary ?? undefined;\r\n if (buffer) {\r\n delete data.buffer;\r\n }\r\n if (boundary) {\r\n delete data.boundary;\r\n }\r\n const params = this.assemblyParameter(data);\r\n const urlParams = this.convertUrlParameter(params); //new URLSearchParams(params);\r\n\r\n const headers = await this.assemblyHeader({ \"urlParams\": urlParams, \"token\": token });\r\n if (buffer && boundary) {\r\n headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;\r\n }\r\n headers['Connection'] = 'keep-alive';\r\n headers['X-Accel-Buffering'] = 'no'; //防止 Nginx 缓存\r\n headers['Cache-Control'] = 'no-cache';\r\n const api = this.getApiUrl(url)\r\n try {\r\n const url = buffer ? `${api}?${urlParams}` : api;\r\n const logInfo = {\r\n \"url\": api,\r\n \"headers\": headers,\r\n \"params\": params\r\n }\r\n logger.info(logInfo, \"STREAM\");\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: headers,\r\n body: buffer ? buffer : urlParams.toString(),\r\n credentials: 'include'\r\n });\r\n\r\n if (!res.ok) {\r\n throw new Error(`HTTP error! status: ${res.status}`);\r\n }\r\n if (!res.body) {\r\n throw new Error('No response body');\r\n }\r\n return new Response(res.body, {\r\n headers: {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive'\r\n }\r\n });\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n\r\n getUserInfo(cookies: IbootCookieStore): User | null {\r\n const userjson = cookies.get(COOKIE_NAMES.user)?.value;\r\n if (userjson && userjson.length > 0) {\r\n return JSON.parse(userjson);\r\n }\r\n return null;\r\n }\r\n\r\n getToken(cookies: IbootCookieStore): HttpToken {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n getTokenByCookies = (cookies: IbootReadonlyCookies): HttpToken => {\r\n const userjson = cookies.get('user')?.value;\r\n let username = '';\r\n let utype = this.userType;\r\n if (userjson && userjson.length > 0) {\r\n const user = JSON.parse(userjson);\r\n username = user.username;\r\n utype = user.userType.toString();\r\n }\r\n return {\r\n username: username,\r\n utype: utype,\r\n token: cookies.get(COOKIE_NAMES.token)?.value ?? ''\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n setToken(data: User & { token: string, extFields: Record<string, any> }, response: { cookies: IbootWritableCookie }) {\r\n const { id, name, username, nickname, sex, headImg, token, lastLoginTime, tokenExpired, deviceId, userType, mustChangePwd } = data;\r\n const loginUser: User = {\r\n id: id,\r\n name: name,\r\n username: username,\r\n nickname: nickname,\r\n sex: sex,\r\n headImg: headImg,\r\n lastLoginTime: lastLoginTime,\r\n tokenExpired: tokenExpired,\r\n deviceId: deviceId,\r\n userType: userType,\r\n status: 0,\r\n accountType: 0,\r\n enabled: false,\r\n userFrom: 1,\r\n needToReview: false,\r\n socketOnline: false,\r\n createTime: \"\",\r\n mustChangePwd: mustChangePwd\r\n };\r\n response.cookies.set(COOKIE_NAMES.token, token, {\r\n httpOnly: true,\r\n secure: !this._isDebug, // 在生产环境中启用Secure\r\n sameSite: 'strict', // 防止 CSRF 攻击\r\n path: '/', // Cookie 的路径\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, JSON.stringify(loginUser));\r\n return response;\r\n }\r\n\r\n cleanToken(response: { cookies: IbootWritableCookie }) {\r\n response.cookies.set(COOKIE_NAMES.token, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.set(COOKIE_NAMES.user, '', {\r\n maxAge: -1, //设置为 -1表示立即过期\r\n httpOnly: true,\r\n path: '/',\r\n });\r\n response.cookies.delete(COOKIE_NAMES.token);\r\n response.cookies.delete(COOKIE_NAMES.user)\r\n return response;\r\n }\r\n}"],"names":["ACCOUNT_TYPE_MAP","USER_TYPE_MAP","USER_FORM_MAP","USER_SEX_MAP","kernel32","koffi","setConsoleOutputCP","setConsoleCP","e","logger","pino","isArray","obj","randomString","len","l","$chars","maxPos","pwd","i","urlParamToJson","urlQueryParams","exclude","result","item","arr","urlEncode","value","DEFAULT_LOCALE","DEVICE_ID_KEY","CURRENT_WEBSITE_KEY","_GET_ERROR","_POST_ERROR","HEADER_NAMES","COOKIE_NAMES","getDefaultRequestHeader","devideId","json","curWebsite","header","setDefaultRequestHeader","deviceId","website","get","url","opts","params","headers","heads","field","response","msg","post","data","body","proxyHeaders","iGet","res","iPost","iPostSuccess","getHttpClientOpts","request","lang","websiteId","websiteNo","getHttpClientOptsByCookie","cookie","HttpClient","userType","helloURL","key","CryptoJS","p","o","v","arr_item","item_field","item_field_value","item1","index","f","s","oValue","_apiKey","b","paramsStr","str","md5","logInfo","username","urlParams","token","h","sign","api","cache","buffer","boundary","urls","cookies","userjson","utype","user","id","name","nickname","sex","headImg","lastLoginTime","tokenExpired","mustChangePwd","loginUser"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iboot-http-client",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.0
|
|
4
|
+
"version": "1.1.0",
|
|
5
5
|
"description": "iBoot.xin 相关应用的客户端Http封装",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/iboot-http-client.cjs.js",
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@types/crypto-js": "^4.2.2",
|
|
42
42
|
"@types/node": "^25.0.3",
|
|
43
|
+
"koffi": "^2.15.0",
|
|
43
44
|
"typescript": "~5.9.3",
|
|
44
45
|
"vite": "^7.2.4",
|
|
45
46
|
"vite-plugin-dts": "^4.5.4",
|
|
@@ -58,5 +59,16 @@
|
|
|
58
59
|
"js-md5": "^0.8.3",
|
|
59
60
|
"pino": "^10.1.0",
|
|
60
61
|
"pino-pretty": "^13.1.3"
|
|
62
|
+
},
|
|
63
|
+
"peerDependencies": {
|
|
64
|
+
"crypto-js": "^4.2.0",
|
|
65
|
+
"js-md5": "^0.8.3",
|
|
66
|
+
"pino": "^10.1.0",
|
|
67
|
+
"pino-pretty": "^13.1.3"
|
|
68
|
+
},
|
|
69
|
+
"peerDependenciesMeta": {
|
|
70
|
+
"pino-pretty": {
|
|
71
|
+
"optional": true
|
|
72
|
+
}
|
|
61
73
|
}
|
|
62
74
|
}
|