diff --git a/src/client/dom/cookie.ts b/src/client/dom/cookie.ts index ccffd7a..85c3f54 100644 --- a/src/client/dom/cookie.ts +++ b/src/client/dom/cookie.ts @@ -1,12 +1,28 @@ import { ScramjetClient } from "../client"; export default function (client: ScramjetClient, self: typeof window) { + client.serviceworker.addEventListener("message", ({ data }) => { + if (!("scramjet$type" in data)) return; + + if (data.scramjet$type === "cookie") { + this.cookieStore.setCookies([data.cookie], new URL(data.url)); + return; + } + }); + client.Trap("Document.prototype.cookie", { get() { return client.cookieStore.getCookies(client.url, true); }, set(ctx, value: string) { client.cookieStore.setCookies([value], client.url); + + // TODO hardcode because scoping whatever + client.serviceworker.controller!.postMessage({ + scramjet$type: "cookie", + cookie: value, + url: client.url.href, + }); }, }); diff --git a/src/client/index.ts b/src/client/index.ts index 4d3c30c..7de8dd5 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -16,8 +16,7 @@ dbg.log("scrammin"); if (!(ScramjetClient.SCRAMJET in self)) { const client = new ScramjetClient(self); - client.loadcookies(self.COOKIE); - delete self.COOKIE; + if (self.COOKIE) client.loadcookies(self.COOKIE); client.hook(); diff --git a/src/worker/index.ts b/src/worker/index.ts index 6bbfe81..2a730c4 100644 --- a/src/worker/index.ts +++ b/src/worker/index.ts @@ -31,12 +31,16 @@ export class ScramjetServiceWorker { if (data.scramjet$type === "registerServiceWorker") { this.serviceWorkers.push(new FakeServiceWorker(data.port, data.origin)); - return; } - const resolve = this.syncPool[data.scramjet$token]; - delete this.syncPool[data.scramjet$token]; + if (data.scramjet$type === "cookie") { + this.cookieStore.setCookies([data.cookie], new URL(data.url)); + return; + } + + // const resolve = this.syncPool[data.scramjet$token]; + // delete this.syncPool[data.scramjet$token]; }); } @@ -119,13 +123,19 @@ type RegisterServiceWorkerMessage = { origin: string; }; +type CookieMessage = { + scramjet$type: "cookie"; + cookie: string; + url: string; +}; + type MessageCommon = { scramjet$type: string; scramjet$token: number; }; -type MessageTypeC2W = RegisterServiceWorkerMessage; -type MessageTypeW2C = never; +type MessageTypeC2W = RegisterServiceWorkerMessage | CookieMessage; +type MessageTypeW2C = CookieMessage; // c2w: client to (service) worker export type MessageC2W = MessageCommon & MessageTypeC2W;