diff --git a/src/shared/cookie.ts b/src/shared/cookie.ts index 36ef89e..39ce4a8 100644 --- a/src/shared/cookie.ts +++ b/src/shared/cookie.ts @@ -15,26 +15,8 @@ export type Cookie = { export class CookieStore { private cookies: Record = {}; - private db: IDBDatabase; - constructor() { - // TOOD: Something is seriously broken with this system, I'm not sure what, but mutating multiple cookies on the same domain seems to break things? - const request = indexedDB.open("$scramjet", 1); - - request.onsuccess = () => { - this.db = request.result; - - const tx = this.db.transaction("cookies", "readonly"); - const store = tx.objectStore("cookies"); - const req = store.get("cookies"); - - req.onsuccess = () => { - if (req.result) this.cookies = req.result; - }; - }; - } - - async setCookies(cookies: string[], url: URL) { + setCookies(cookies: string[], url: URL) { for (const str of cookies) { const parsed = parse(str); const domain = parsed.domain; @@ -53,10 +35,6 @@ export class CookieStore { const id = `${cookie.domain}@${cookie.path}@${cookie.name}`; this.cookies[id] = cookie; - this.db - .transaction("cookies", "readwrite") - .objectStore("cookies") - .put(this.cookies, "cookies"); } } diff --git a/src/worker/index.ts b/src/worker/index.ts index f2637df..b253a38 100644 --- a/src/worker/index.ts +++ b/src/worker/index.ts @@ -19,6 +19,22 @@ export class ScramjetServiceWorker extends EventTarget { super(); this.client = new $scramjet.shared.util.BareClient(); + const db = indexedDB.open("$scramjet", 1); + + db.onsuccess = () => { + const res = db.result; + const tx = res.transaction("cookies", "readonly"); + const store = tx.objectStore("cookies"); + const cookies = store.get("cookies"); + + cookies.onsuccess = () => { + if (cookies.result) { + this.cookieStore.load(cookies.result); + dbg.log("Loaded cookies from IDB!"); + } + }; + }; + addEventListener("message", async ({ data }: { data: MessageC2W }) => { if (!("scramjet$type" in data)) return; @@ -30,6 +46,10 @@ export class ScramjetServiceWorker extends EventTarget { if (data.scramjet$type === "cookie") { this.cookieStore.setCookies([data.cookie], new URL(data.url)); + const res = db.result; + const tx = res.transaction("cookies", "readwrite"); + const store = tx.objectStore("cookies"); + store.put(this.cookieStore.dump(), "cookies"); } }); }