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.
150 lines • 11.6 kB
JavaScript
/**
* Network Algebra - HTTP operations and async data fetching
* React-Query replacement with algebraic composition
*/
import { effect } from '../core/effect';
import { timeout } from './time';
/**
* Creates a Fetch effect with network operations
*/
export const fetch = (fetcher, deps = []) => {
const baseEffect = 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 = 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 = 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 = 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;
};
/**
* GET request helper
*/
export const get = (url, deps = []) => {
return fetch(() => window.fetch(url).then((res) => {
if (!res.ok)
throw new Error(`HTTP ${res.status}: ${res.statusText}`);
return res.json();
}), deps);
};
/**
* POST request helper
*/
export const post = (url, body, deps = []) => {
return 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);
};
/**
* Natural transformation: Time → Fetch (timeout injection)
*/
export const withTimeout = (ms) => (fetchEffect) => {
return timeout(ms, fetchEffect);
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmV0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWxnZWJyYXMvZmV0Y2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFVLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhELE9BQU8sRUFBUSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFpQnZDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQ25CLE9BQXlCLEVBQ3pCLE9BQTBCLEVBQUUsRUFDeUIsRUFBRTtJQUN2RCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQWdCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUQsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsNEJBQTRCO0lBRWhELE1BQU0sYUFBYSxHQUF3RDtRQUN6RSxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUs7UUFDdkIsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHO1FBQ25CLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUztRQUMvQixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7UUFDckIsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLO1FBQ3ZCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTtRQUVyQixLQUFLLEVBQUUsQ0FBQyxDQUFTLEVBQVksRUFBRTtZQUM3QixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRXhDLE1BQU0sWUFBWSxHQUFHLEtBQUssRUFBRSxZQUFvQixFQUFpQixFQUFFO2dCQUNqRSxJQUFJLENBQUM7b0JBQ0gsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNuQyxNQUFNLElBQUksR0FBRyxNQUFNLE9BQU8sRUFBRSxDQUFDO29CQUM3QixVQUFVLENBQUMsSUFBSSxDQUFDLEVB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