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
JavaScript
;
/**
* 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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