UNPKG

@ryanuo/utils

Version:

提供多种实用工具函数,涵盖算法、浏览器操作、网络请求等多个领域

107 lines (106 loc) 3.01 kB
async function fetchWithTimeout(url, options = {}, timeout = 5e3) { const controller = new AbortController(); const timer = setTimeout(() => controller.abort(), timeout); try { const response = await fetch(url, { ...options, signal: controller.signal }); clearTimeout(timer); return response; } catch (err) { clearTimeout(timer); throw new Error(`\u8BF7\u6C42\u8D85\u65F6\u6216\u5931\u8D25: ${err.message}`); } } async function request(method, url, data, headers = {}) { const config = { method, headers: { "Content-Type": "application/json", ...headers } }; if (data) config.body = JSON.stringify(data); const response = await fetchWithTimeout(url, config); if (!response.ok) throw new Error(`HTTP\u9519\u8BEF ${response.status}`); return response.json(); } async function parallelRequests(requests, concurrency = 5) { const results = []; const executing = /* @__PURE__ */ new Set(); for (const req of requests) { const p = req().then((res) => { results.push(res); executing.delete(p); }); executing.add(p); if (executing.size >= concurrency) await Promise.race(executing); } await Promise.all(executing); return results; } async function getClientIP() { try { const response = await request( "GET", "https://api.ipify.org?format=json" ); return response.ip; } catch { return "unknown"; } } async function getIndexedDBCache(dbName, storeName) { const openDB = () => { return new Promise((resolve, reject) => { const request2 = indexedDB.open(dbName, 1); request2.onupgradeneeded = () => { request2.result.createObjectStore(storeName); }; request2.onsuccess = () => resolve(request2.result); request2.onerror = reject; }); }; const db = await openDB(); return { async get(key) { return new Promise((resolve) => { const tx = db.transaction(storeName, "readonly"); const store = tx.objectStore(storeName); const request2 = store.get(key); request2.onsuccess = () => resolve(request2.result); request2.onerror = () => resolve(void 0); }); }, async set(key, value) { return new Promise((resolve, reject) => { const tx = db.transaction(storeName, "readwrite"); const store = tx.objectStore(storeName); const request2 = store.put(value, key); request2.onsuccess = () => resolve(); request2.onerror = reject; }); } }; } function checkNetworkStatus() { return new Promise((resolve) => { if (navigator.onLine !== void 0) { resolve(navigator.onLine); } else { const img = new Image(); img.onload = () => resolve(true); img.onerror = () => resolve(false); img.src = `https://www.google.com/favicon.ico?${Date.now()}`; } }); } export { checkNetworkStatus, getIndexedDBCache, getClientIP, parallelRequests, fetchWithTimeout, request };