scramjet/src/client/dom/cookie.ts
2025-03-06 20:29:36 -05:00

43 lines
1.1 KiB
TypeScript

import type { MessageC2W, MessageW2C } from "../../worker";
import { ScramjetClient } from "../client";
export default function (client: ScramjetClient, self: typeof window) {
client.serviceWorker.addEventListener(
"message",
({ data }: { data: MessageW2C }) => {
if (!("scramjet$type" in data)) return;
if (data.scramjet$type === "cookie") {
client.cookieStore.setCookies([data.cookie], new URL(data.url));
let msg = {
scramjet$token: data.scramjet$token,
scramjet$type: "cookie",
};
client.serviceWorker.controller.postMessage(msg);
}
}
);
client.Trap("Document.prototype.cookie", {
get() {
return client.cookieStore.getCookies(client.url, true);
},
set(ctx, value: string) {
client.cookieStore.setCookies([value], client.url);
const controller = client.descriptors.get(
"ServiceWorkerContainer.prototype.controller",
client.serviceWorker
);
if (controller) {
client.natives.call("ServiceWorker.prototype.postMessage", controller, {
scramjet$type: "cookie",
cookie: value,
url: client.url.href,
});
}
},
});
// @ts-ignore
delete self.cookieStore;
}