From 4b6261188e3d27264a47612a627a87bf09807d34 Mon Sep 17 00:00:00 2001 From: Avad3 <65318266+Avad3@users.noreply.github.com> Date: Thu, 18 Jul 2024 21:55:17 -0400 Subject: [PATCH 1/2] properly rewrite sessionStorage --- src/client/storage.ts | 167 +++++++++++++++++++++++++++--------------- 1 file changed, 106 insertions(+), 61 deletions(-) diff --git a/src/client/storage.ts b/src/client/storage.ts index 2c249fa..efbb816 100644 --- a/src/client/storage.ts +++ b/src/client/storage.ts @@ -8,67 +8,112 @@ const store = new IDBMapSync(locationProxy.host, { await store.sync(); -function storageProxy(scope: Storage): Storage { - return new Proxy(scope, { - get(target, prop) { - switch (prop) { - case "getItem": - return (key: string) => { - return store.get(key); - }; - - case "setItem": - return (key: string, value: string) => { - store.set(key, value); - store.sync(); - }; - - case "removeItem": - return (key: string) => { - store.delete(key); - store.sync(); - }; - - case "clear": - return () => { - store.clear(); - store.sync(); - }; - - case "key": - return (index: number) => { - return [...store.keys()][index]; - }; - case "length": - return store.size; - default: - if (prop in Object.prototype) { - return Reflect.get(target, prop); - } - - return store.get(prop); - } - }, - - //@ts-ignore - set(target, prop, value) { - store.set(prop, value); - store.sync(); - }, - - defineProperty(target, property, attributes) { - store.set(property as string, attributes.value); - - return true; - }, - }); -} - -const localStorageProxy = storageProxy(window.localStorage); -const sessionStorageProxy = storageProxy(window.sessionStorage); - delete window.localStorage; delete window.sessionStorage; -window.localStorage = localStorageProxy; -window.sessionStorage = sessionStorageProxy; +window.localStorage = new Proxy(localStorage, { + get(target, prop) { + switch (prop) { + case "getItem": + return (key: string) => { + return store.get(key); + }; + + case "setItem": + return (key: string, value: string) => { + store.set(key, value); + store.sync(); + }; + + case "removeItem": + return (key: string) => { + store.delete(key); + store.sync(); + }; + + case "clear": + return () => { + store.clear(); + store.sync(); + }; + + case "key": + return (index: number) => { + return [...store.keys()][index]; + }; + case "length": + return store.size; + default: + if (prop in Object.prototype) { + return Reflect.get(target, prop); + } + + return store.get(prop); + } + }, + + //@ts-ignore + set(target, prop, value) { + store.set(prop, value); + store.sync(); + }, + + defineProperty(target, property, attributes) { + store.set(property as string, attributes.value); + + return true; + }, +}); + +window.sessionStorage = new Proxy(sessionStorage, { + get(target, prop) { + switch (prop) { + case "getItem": + return (key: string) => { + return target.getItem(locationProxy.host + "@" + key); + } + + case "setItem": + return (key: string, value: string) => { + target.setItem(locationProxy.host + "@" + key, value); + } + + case "removeItem": + return (key: string) => { + target.removeItem(locationProxy.host + "@" + key); + } + + case "clear": + return () => { + for (const key in Object.keys(target)) { + if (key.startsWith(locationProxy.host)) { + target.removeItem(key); + } + } + } + + case "key": + return (index: number) => { + const keys = Object.keys(target).filter((key) => key.startsWith(locationProxy.host)); + + return target.getItem(keys[index]); + } + + case "length": + return target.length; + + default: + if (prop in Object.prototype) { + return Reflect.get(target, prop); + } + + return target.getItem(locationProxy.host + "@" + (prop as string)); + } + }, + + defineProperty(target, property, attributes) { + target.setItem(locationProxy.host + "@" + (property as string), attributes.value); + + return true; + }, +}); \ No newline at end of file From 8a3d45dc54531afd70a5f22e242e6ec1e2eb43b7 Mon Sep 17 00:00:00 2001 From: Avad3 <65318266+Avad3@users.noreply.github.com> Date: Thu, 18 Jul 2024 22:05:41 -0400 Subject: [PATCH 2/2] fix Storage logic --- src/client/storage.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/client/storage.ts b/src/client/storage.ts index efbb816..9b49dbc 100644 --- a/src/client/storage.ts +++ b/src/client/storage.ts @@ -8,10 +8,7 @@ const store = new IDBMapSync(locationProxy.host, { await store.sync(); -delete window.localStorage; -delete window.sessionStorage; - -window.localStorage = new Proxy(localStorage, { +const localStorageProxy = new Proxy(window.localStorage, { get(target, prop) { switch (prop) { case "getItem": @@ -65,7 +62,7 @@ window.localStorage = new Proxy(localStorage, { }, }); -window.sessionStorage = new Proxy(sessionStorage, { +const sessionStorageProxy = new Proxy(window.sessionStorage, { get(target, prop) { switch (prop) { case "getItem": @@ -116,4 +113,10 @@ window.sessionStorage = new Proxy(sessionStorage, { return true; }, -}); \ No newline at end of file +}); + +delete window.localStorage; +delete window.sessionStorage; + +window.localStorage = localStorageProxy; +window.sessionStorage = sessionStorageProxy; \ No newline at end of file