diff --git a/src/shared/cookie.ts b/src/shared/cookie.ts index 8fdf768..8a9febf 100644 --- a/src/shared/cookie.ts +++ b/src/shared/cookie.ts @@ -15,6 +15,24 @@ 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) { for (const str of cookies) { @@ -35,6 +53,7 @@ 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 3805605..f2637df 100644 --- a/src/worker/index.ts +++ b/src/worker/index.ts @@ -19,22 +19,6 @@ 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; @@ -45,11 +29,7 @@ export class ScramjetServiceWorker extends EventTarget { } if (data.scramjet$type === "cookie") { - await 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"); + this.cookieStore.setCookies([data.cookie], new URL(data.url)); } }); }