diff --git a/src/createAsyncStoragePersistor-experimental/index.ts b/src/createAsyncStoragePersistor-experimental/index.ts index 0141229bb5..4ce550cb60 100644 --- a/src/createAsyncStoragePersistor-experimental/index.ts +++ b/src/createAsyncStoragePersistor-experimental/index.ts @@ -14,16 +14,26 @@ interface CreateAsyncStoragePersistorOptions { /** To avoid spamming, * pass a time in ms to throttle saving the cache to disk */ throttleTime?: number + /** + * @default `JSON.stringify` + */ + serialize?: (client: PersistedClient) => string + /** + * @default `JSON.parse` + */ + deserialize?: (cachedString: string) => PersistedClient } export const createAsyncStoragePersistor = ({ storage, key = `REACT_QUERY_OFFLINE_CACHE`, throttleTime = 1000, + serialize = JSON.stringify, + deserialize = JSON.parse, }: CreateAsyncStoragePersistorOptions): Persistor => { return { persistClient: asyncThrottle( - persistedClient => storage.setItem(key, JSON.stringify(persistedClient)), + persistedClient => storage.setItem(key, serialize(persistedClient)), { interval: throttleTime } ), restoreClient: async () => { @@ -33,7 +43,7 @@ export const createAsyncStoragePersistor = ({ return } - return JSON.parse(cacheString) as PersistedClient + return deserialize(cacheString) as PersistedClient }, removeClient: () => storage.removeItem(key), } diff --git a/src/createWebStoragePersistor-experimental/index.ts b/src/createWebStoragePersistor-experimental/index.ts index 3d54e64359..130f5d9f29 100644 --- a/src/createWebStoragePersistor-experimental/index.ts +++ b/src/createWebStoragePersistor-experimental/index.ts @@ -9,17 +9,29 @@ interface CreateWebStoragePersistorOptions { /** To avoid spamming, * pass a time in ms to throttle saving the cache to disk */ throttleTime?: number + /** + * How to serialize the data to storage. + * @default `JSON.stringify` + */ + serialize?: (client: PersistedClient) => string + /** + * How to deserialize the data from storage. + * @default `JSON.parse` + */ + deserialize?: (cachedString: string) => PersistedClient } export function createWebStoragePersistor({ storage, key = `REACT_QUERY_OFFLINE_CACHE`, throttleTime = 1000, + serialize = JSON.stringify, + deserialize = JSON.parse, }: CreateWebStoragePersistorOptions): Persistor { if (typeof storage !== 'undefined') { return { persistClient: throttle(persistedClient => { - storage.setItem(key, JSON.stringify(persistedClient)) + storage.setItem(key, serialize(persistedClient)) }, throttleTime), restoreClient: () => { const cacheString = storage.getItem(key) @@ -28,7 +40,7 @@ export function createWebStoragePersistor({ return } - return JSON.parse(cacheString) as PersistedClient + return deserialize(cacheString) as PersistedClient }, removeClient: () => { storage.removeItem(key)