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)