From 2b2c22f7fd3e531981f486c6041b217256a01919 Mon Sep 17 00:00:00 2001 From: Ben Grynhaus <ben@brandtotal.com> Date: Sun, 31 Oct 2021 16:26:39 +0200 Subject: [PATCH] feat: add optional functions to serialize and deserialize from Storage Persistors --- .../index.ts | 14 ++++++++++++-- .../index.ts | 16 ++++++++++++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/createAsyncStoragePersistor-experimental/index.ts b/src/createAsyncStoragePersistor-experimental/index.ts index 0141229bb53..763e662c699 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 + /** + * @defualt `JSON.stringify` + */ + serialize?: (client: PersistedClient) => string; + /** + * @defualt `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 3d54e64359a..4bf28c351ee 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. + * @defualt `JSON.stringify` + */ + serialize?: (client: PersistedClient) => string; + /** + * How to deserialize the data from storage. + * @defualt `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)