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