rokapi
Version:
2 lines (1 loc) • 5.92 kB
JavaScript
import t from"spark-md5";let e;function n(){return e}function r(t){const e={},n=async(t,...n)=>{if(e[t])for(const r of e[t]){const t=await r(...n);if(void 0!==t)return t}};return{...t,on(t,n){e[t]||(e[t]=[]),e[t].push(n)},async get(e,r){const s=await n("beforeRequest",{url:e,...r})??await t.get(e,r);return n("responseBody",{url:e,...r},s),s},async post(e,r){const s=n("beforeRequest",{url:e,...r})??await t.post(e,r);return n("responseBody",{url:e,...r},s),s},async put(e,r){const s=n("beforeRequest",{url:e,...r})??await t.put(e,r);return n("responseBody",{url:e,...r},s),s},async delete(e,r){const s=n("beforeRequest",{url:e,...r})??await t.delete(e,r);return n("responseBody",{url:e,...r},s),s},async patch(e,r){const s=n("beforeRequest",{url:e,...r})??await t.patch(e,r);return n("responseBody",{url:e,...r},s),s}}}const s=e=>{const n=new t;n.append(e.url);for(const[t,r]of Object.entries(e.headers||{}))n.append(t),n.append(r);return e.body&&n.append("string"==typeof e.body?e.body:JSON.stringify(e.body)),e.params&&n.append(JSON.stringify(e.params)),e.data&&n.append(JSON.stringify(e.data)),n.end()};function o(t){return t?{has:async t=>null!==localStorage.getItem(t),async set(t,e){localStorage.setItem(t,JSON.stringify(e))},async get(t){const e=localStorage.getItem(t);if(null!==e)return JSON.parse(e)},async delete(t){localStorage.removeItem(t)},async clear(){localStorage.clear()}}:function(){const t=new Map;return{has:async e=>t.has(e),async set(e,n){t.set(e,n)},get:async e=>t.get(e),async delete(e){t.delete(e)},async clear(){t.clear()}}}()}function a(t={duration:36e5}){return e=>{const a=function(t){return{key:t?.key?t.key:s,persist:t?.persist??!1,duration:t?.duration??36e5,isValid:t?.isValid??(()=>!0)}}(t),c=o(a.persist),i=r(e=e||n());return i.on("beforeRequest",(async t=>{t.responseType=t.responseType||"json";const e=a.key(t);if(await c.has(e)){const n=await c.get(e);if(n&&(!a.isValid||a.isValid(e,t)||a.duration&&Date.now()-n.timestamp<=a.duration))return n.data}})),i.on("responseBody",(async(t,e)=>{const n=a.key(t);await c.set(n,{timestamp:Date.now(),data:e})})),i}}const c=t=>e=>{const a=r(e=e||n()),c=o(!1),i=async(e,n,r={responseType:"json"})=>{const o={...r,url:n},i=t?JSON.stringify(o):s(o),l=await c.get(i);if(l)return l;const p=await a[e](n,r);return await c.set(i,p),p};return{get:(t,e)=>i("get",t,e),post:(t,e)=>i("post",t,e),put:(t,e)=>i("put",t,e),delete:(t,e)=>i("delete",t,e),patch:(t,e)=>i("patch",t,e)}};function i(t=4){return e=>{const s=r(e=e||n()),o=[];let a=0;async function c(e,n,r={responseType:"json"}){return c=()=>s[e](n,r),new Promise(((e,n)=>{const r=()=>{a++,c().then((t=>{e(t)})).catch(n).finally((()=>{if(a--,o.length>0){const t=o.shift();t?.()}}))};a<t?r():o.push(r)}));var c}return{get:(t,e)=>c("get",t,e),post:(t,e)=>c("post",t,e),put:(t,e)=>c("put",t,e),delete:(t,e)=>c("delete",t,e),patch:(t,e)=>c("patch",t,e)}}}function l(t=5,e=500){return s=>{const o=r(s=s||n());async function a(n,r,s={responseType:"json"},c=t){try{return await o[n](r,s)}catch(t){if(c>0)return console.warn(`请求失败,正在重试...剩余次数:${c}`),setTimeout((()=>a(n,r,s,c-1)),e),Promise.reject();throw console.error("请求失败,已达到最大重试次数"),t}}return{get:(t,e)=>a("get",t,e),post:(t,e)=>a("post",t,e),put:(t,e)=>a("put",t,e),delete:(t,e)=>a("delete",t,e),patch:(t,e)=>a("patch",t,e)}}}const p=()=>t=>{const e=r(t=t||n()),s=[];let o=!1;const a=async()=>{if(o||0===s.length)return;o=!0;const t=s.shift();t&&await t(),o=!1,await a()},c=async(t,n,r)=>new Promise(((o,c)=>{s.push((async()=>{try{const s=await e[t](n,r||{responseType:"json"});o(s)}catch(t){c(t)}})),a()}));return{get:(t,e)=>c("get",t,e),post:(t,e)=>c("post",t,e),put:(t,e)=>c("put",t,e),delete:(t,e)=>c("delete",t,e),patch:(t,e)=>c("patch",t,e)}},u={GET:(t,e)=>(e.params&&(t+="?"+new URLSearchParams(e.params).toString()),{url:t,options:e}),POST:(t,e)=>(e.headers={"Content-Type":"application/json"},e.data&&(e.body=JSON.stringify(e.data)),{url:t,options:e}),PUT:(t,e)=>(e.headers={"Content-Type":"application/json"},e.params&&(e.body=JSON.stringify(e.params)),{url:t,options:e}),DELETE:(t,e)=>(e.params&&(t+="?"+new URLSearchParams(e.params).toString()),{url:t,options:e}),PATCH:(t,e)=>(e.headers={"Content-Type":"application/json"},e.data&&(e.body=JSON.stringify(e.data)),{url:t,options:e})};const y=new class{controllers=new Map;registry(t){if(this.controllers.has(t))throw new Error(`${t} 已经存在,不能重复注册`);const e=new AbortController;return this.controllers.set(t,e),e}abort(t){const e=this.controllers.get(t);e?.abort(),this.controllers.delete(t)}abortAll(){this.controllers.forEach((t=>{t.abort()})),this.controllers.clear()}has(t){return this.controllers.has(t)}},d={cancel:t=>{y.abort(t)},cancelAll:()=>{y.abortAll()},has:t=>y.has(t)};let h=(t,e)=>{const{responseType:n}=e,{url:r,options:s}=u[e.method](t,e);return fetch(r,s).then((t=>"arraybuffer"===n?t.arrayBuffer():"blob"===n?t.blob():"text"===n?t.text():"json"===n?t.json():void 0))},f=null,g=null;const w=t=>{f=t},m=t=>{g=t},b=async(t,e)=>{let n;e.responseType=e.responseType||"json",f&&(e=await f(e));let{cancelKey:r,...s}=e;if(r){const t=y.registry(r);n=t?.signal}let o=await h(t,{...s,signal:n});return g&&(o=await g(o)),o},T={get:(t,e={})=>b(t,{...e,method:"GET"}),post:(t,e={})=>b(t,{...e,method:"POST"}),put:(t,e={})=>b(t,{...e,method:"PUT"}),delete:(t,e={})=>b(t,{...e,method:"DELETE"}),patch:(t,e={})=>b(t,{...e,method:"PATCH"})};var S=t=>{const{url:e,method:n}=t,r=n.toLowerCase();return T[r](e,t)};const j=t=>{h=t};function O(t,...e){return e.reduce(((t,e)=>e(t)),t)}!function(t){e=t}(T);export{O as combineRequestors,a as createCacheRequestor,c as createIdemportentRequestor,i as createParalleRequestor,l as createRetryRequestor,p as createSerialRequestor,s as getHashKey,S as request,d as requestControlls,w as setRequestInterceptor,m as setResponseInterceptor,j as use,n as useRequestor};