UNPKG

rokapi

Version:
2 lines (1 loc) 5.88 kB
var rokapi=function(e,t){"use strict";let r;function n(){return r}function s(e){const t={},r=async(e,...r)=>{if(t[e])for(const n of t[e]){const e=await n(...r);if(void 0!==e)return e}};return{...e,on(e,r){t[e]||(t[e]=[]),t[e].push(r)},async get(t,n){const s=await r("beforeRequest",{url:t,...n})??await e.get(t,n);return r("responseBody",{url:t,...n},s),s},async post(t,n){const s=r("beforeRequest",{url:t,...n})??await e.post(t,n);return r("responseBody",{url:t,...n},s),s},async put(t,n){const s=r("beforeRequest",{url:t,...n})??await e.put(t,n);return r("responseBody",{url:t,...n},s),s},async delete(t,n){const s=r("beforeRequest",{url:t,...n})??await e.delete(t,n);return r("responseBody",{url:t,...n},s),s},async patch(t,n){const s=r("beforeRequest",{url:t,...n})??await e.patch(t,n);return r("responseBody",{url:t,...n},s),s}}}const o=e=>{const r=new t;r.append(e.url);for(const[t,n]of Object.entries(e.headers||{}))r.append(t),r.append(n);return e.body&&r.append("string"==typeof e.body?e.body:JSON.stringify(e.body)),e.params&&r.append(JSON.stringify(e.params)),e.data&&r.append(JSON.stringify(e.data)),r.end()};function a(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 c={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 i=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)}},l={cancel:e=>{i.abort(e)},cancelAll:()=>{i.abortAll()},has:e=>i.has(e)};let u=(e,t)=>{const{responseType:r}=t,{url:n,options:s}=c[t.method](e,t);return fetch(n,s).then((e=>"arraybuffer"===r?e.arrayBuffer():"blob"===r?e.blob():"text"===r?e.text():"json"===r?e.json():void 0))},p=null,y=null;const d=async(e,t)=>{let r;t.responseType=t.responseType||"json",p&&(t=await p(t));let{cancelKey:n,...s}=t;if(n){const e=i.registry(n);r=e?.signal}let o=await u(e,{...s,signal:r});return y&&(o=await y(o)),o},h={get:(e,t={})=>d(e,{...t,method:"GET"}),post:(e,t={})=>d(e,{...t,method:"POST"}),put:(e,t={})=>d(e,{...t,method:"PUT"}),delete:(e,t={})=>d(e,{...t,method:"DELETE"}),patch:(e,t={})=>d(e,{...t,method:"PATCH"})};return function(e){r=e}(h),e.combineRequestors=function(e,...t){return t.reduce(((e,t)=>t(e)),e)},e.createCacheRequestor=function(e={duration:36e5}){return t=>{const r=function(e){return{key:e?.key?e.key:o,persist:e?.persist??!1,duration:e?.duration??36e5,isValid:e?.isValid??(()=>!0)}}(e),c=a(r.persist),i=s(t=t||n());return i.on("beforeRequest",(async e=>{e.responseType=e.responseType||"json";const t=r.key(e);if(await c.has(t)){const n=await c.get(t);if(n&&(!r.isValid||r.isValid(t,e)||r.duration&&Date.now()-n.timestamp<=r.duration))return n.data}})),i.on("responseBody",(async(e,t)=>{const n=r.key(e);await c.set(n,{timestamp:Date.now(),data:t})})),i}},e.createIdemportentRequestor=e=>t=>{const r=s(t=t||n()),c=a(!1),i=async(t,n,s={responseType:"json"})=>{const a={...s,url:n},i=e?JSON.stringify(a):o(a),l=await c.get(i);if(l)return l;const u=await r[t](n,s);return await c.set(i,u),u};return{get:(e,t)=>i("get",e,t),post:(e,t)=>i("post",e,t),put:(e,t)=>i("put",e,t),delete:(e,t)=>i("delete",e,t),patch:(e,t)=>i("patch",e,t)}},e.createParalleRequestor=function(e=4){return t=>{const r=s(t=t||n()),o=[];let a=0;async function c(t,n,s={responseType:"json"}){return c=()=>r[t](n,s),new Promise(((t,r)=>{const n=()=>{a++,c().then((e=>{t(e)})).catch(r).finally((()=>{if(a--,o.length>0){const e=o.shift();e?.()}}))};a<e?n():o.push(n)}));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)}}},e.createRetryRequestor=function(e=5,t=500){return r=>{const o=s(r=r||n());async function a(r,n,s={responseType:"json"},c=e){try{return await o[r](n,s)}catch(e){if(c>0)return console.warn(`请求失败,正在重试...剩余次数:${c}`),setTimeout((()=>a(r,n,s,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)}}},e.createSerialRequestor=()=>e=>{const t=s(e=e||n()),r=[];let o=!1;const a=async()=>{if(o||0===r.length)return;o=!0;const e=r.shift();e&&await e(),o=!1,await a()},c=async(e,n,s)=>new Promise(((o,c)=>{r.push((async()=>{try{const r=await t[e](n,s||{responseType:"json"});o(r)}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)}},e.getHashKey=o,e.request=e=>{const{url:t,method:r}=e,n=r.toLowerCase();return h[n](t,e)},e.requestControlls=l,e.setRequestInterceptor=e=>{p=e},e.setResponseInterceptor=e=>{y=e},e.use=e=>{u=e},e.useRequestor=n,e}({},SparkMD5);