UNPKG

resig.js

Version:

Universal reactive signal library with complete platform features: signals, animations, CRDTs, scheduling, DOM integration. Works identically across React, SolidJS, Svelte, Vue, and Qwik.

157 lines 11.9 kB
"use strict"; /** * Network Algebra - HTTP operations and async data fetching * React-Query replacement with algebraic composition */ Object.defineProperty(exports, "__esModule", { value: true }); exports.withTimeout = exports.post = exports.get = exports.fetch = void 0; const effect_1 = require("../core/effect"); const time_1 = require("./time"); /** * Creates a Fetch effect with network operations */ const fetch = (fetcher, deps = []) => { const baseEffect = (0, effect_1.effect)({ loading: true }); let retryCount = 0; // Used by setRetries method const fetchInstance = { value: baseEffect.value, map: baseEffect.map, subscribe: baseEffect.subscribe, bind: baseEffect.bind, chain: baseEffect.chain, _set: baseEffect._set, retry: (n) => { const retryFetch = (0, exports.fetch)(fetcher, deps); const attemptFetch = async (attemptsLeft) => { try { retryFetch._set({ loading: true }); const data = await fetcher(); retryFetch._set({ data, loading: false }); } catch (error) { if (attemptsLeft > 0) { // Exponential backoff const delay = Math.pow(2, n - attemptsLeft) * 1000; setTimeout(() => attemptFetch(attemptsLeft - 1), delay); } else { retryFetch._set({ error: error instanceof Error ? error : new Error(String(error)), loading: false, }); } } }; attemptFetch(n); return retryFetch; }, cache: (key, ttl = 300000) => { // 5 min default TTL const cached = (0, exports.fetch)(fetcher, deps); // Check cache first const cacheKey = `fetch_cache_${key}`; const cacheTimeKey = `fetch_cache_time_${key}`; try { const cachedData = localStorage.getItem(cacheKey); const cacheTime = localStorage.getItem(cacheTimeKey); if (cachedData && cacheTime) { const age = Date.now() - parseInt(cacheTime); if (age < ttl) { cached._set({ data: JSON.parse(cachedData), loading: false, }); return cached; } } } catch (e) { // Cache read failed, proceed with fetch } // Subscribe to successful fetches and cache them baseEffect.subscribe((state) => { if (state.data && !state.loading && !state.error) { try { localStorage.setItem(cacheKey, JSON.stringify(state.data)); localStorage.setItem(cacheTimeKey, Date.now().toString()); } catch (e) { // Cache write failed, continue without caching } } cached._set(state); }); return cached; }, refetch: () => { const refetched = (0, exports.fetch)(fetcher, deps); executeFetch(refetched); return refetched; }, // Compatibility methods for factories getState: () => baseEffect.value(), setRetries: (n) => { retryCount = n; // Store retry count for future use console.log(`Retry count set to: ${retryCount}`); }, }; // Execute initial fetch const executeFetch = async (target) => { try { target._set({ loading: true }); const data = await fetcher(); target._set({ data, loading: false }); } catch (error) { target._set({ error: error instanceof Error ? error : new Error(String(error)), loading: false, }); } }; executeFetch(fetchInstance); // Re-fetch when dependencies change deps.forEach((dep) => { dep.subscribe(() => { executeFetch(fetchInstance); }); }); return fetchInstance; }; exports.fetch = fetch; /** * GET request helper */ const get = (url, deps = []) => { return (0, exports.fetch)(() => window.fetch(url).then((res) => { if (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`); return res.json(); }), deps); }; exports.get = get; /** * POST request helper */ const post = (url, body, deps = []) => { return (0, exports.fetch)(() => window .fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body), }) .then((res) => { if (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`); return res.json(); }), deps); }; exports.post = post; /** * Natural transformation: Time → Fetch (timeout injection) */ const withTimeout = (ms) => (fetchEffect) => { return (0, time_1.timeout)(ms, fetchEffect); }; exports.withTimeout = withTimeout; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmV0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWxnZWJyYXMvZmV0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7O0FBRUgsMkNBQWdEO0FBRWhELGlDQUF1QztBQWlCdkM7O0dBRUc7QUFDSSxNQUFNLEtBQUssR0FBRyxDQUNuQixPQUF5QixFQUN6QixPQUEwQixFQUFFLEVBQ3lCLEVBQUU7SUFDdkQsTUFBTSxVQUFVLEdBQUcsSUFBQSxlQUFNLEVBQWdCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUQsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsNEJBQTRCO0lBRWhELE1BQU0sYUFBYSxHQUF3RDtRQUN6RSxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUs7UUFDdkIsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHO1FBQ25CLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUztRQUMvQixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7UUFDckIsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLO1FBQ3ZCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTtRQUVyQixLQUFLLEVBQUUsQ0FBQyxDQUFTLEVBQVksRUFBRTtZQUM3QixNQUFNLFVBQVUsR0FBRyxJQUFBLGFBQUssRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFeEMsTUFBTSxZQUFZLEdBQUcsS0FBSyxFQUFFLFlBQW9CLEVBQWlCLEVBQUU7Z0JBQ2pFLElBQUksQ0FBQztvQkFDSCxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ25DLE1BQU0sSUFBSSxHQUFHLE1BQU0sT0FBTyxFQUFFLENBQUM7b0JBQzdCLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQzVDLENBQUM7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