@tevm/sync-storage-persister
Version:
A package for persisting the state of the EVM to a sync storage
111 lines (107 loc) • 2.62 kB
JavaScript
;
// src/throttle.js
var throttle = (func, wait = 100) => {
let timer = null;
let params;
const throttledFn = (...args) => {
params = args;
if (timer === null) {
timer = setTimeout(() => {
const f = (
/** @type {any}*/
func
);
const res = f(...params);
timer = null;
return res;
}, wait);
}
};
return (
/** @type any*/
throttledFn
);
};
// src/createSyncStoragePersister.js
var createSyncStoragePersister = ({
storage,
key = "REACT_QUERY_OFFLINE_CACHE",
throttleTime = 1e3,
serialize = JSON.stringify,
deserialize = JSON.parse
}) => {
const trySave = (state) => {
try {
const serializedState = serialize(state);
storage.setItem(key, serializedState);
if (storage.getItem(key) !== serializedState) {
throw new Error(
"Detected a failure to save state. There appears to be a problem with the provided state persister"
);
}
return void 0;
} catch (error) {
return (
/** @type {Error}*/
error
);
}
};
return {
/**
* @param {import('@tevm/state').SerializableTevmState | undefined} persistedState
* @param {(error: Error | undefined) => void} [onError]
* @returns {Error | undefined}
*/
persistTevmState: throttle((persistedState, onError) => {
if (!persistedState) {
return;
}
const retries = 3;
let error = trySave(persistedState);
let errorCount = 0;
while (error && errorCount < retries) {
errorCount++;
error = trySave(persistedState);
}
if (onError && error) {
onError(error);
}
return error;
}, throttleTime),
/**
* @returns {import('@tevm/state').SerializableTevmState | undefined}
*/
restoreState: () => {
const cacheString = storage.getItem(key);
if (!cacheString) {
return;
}
return deserialize(cacheString);
},
/**
* @returns {Error | undefined}
*/
removePersistedState: () => {
try {
storage.removeItem(key);
return void 0;
} catch (e) {
return (
/** @type {Error} */
e
);
}
}
};
};
// src/noopPersister.js
var noopPersister = {
persistTevmState: () => void 0,
restoreState: () => void 0,
removePersistedState: () => void 0
};
exports.createSyncStoragePersister = createSyncStoragePersister;
exports.noopPersister = noopPersister;
//# sourceMappingURL=index.cjs.map
//# sourceMappingURL=index.cjs.map