cookie DEI program

This commit is contained in:
velzie 2025-03-06 20:29:36 -05:00
parent ae843301de
commit ff719ee6fc
No known key found for this signature in database
GPG key ID: 456761F526D20BB0
3 changed files with 41 additions and 9 deletions

View file

@ -1,13 +1,22 @@
import type { MessageC2W, MessageW2C } from "../../worker";
import { ScramjetClient } from "../client";
export default function (client: ScramjetClient, self: typeof window) {
client.serviceWorker.addEventListener("message", ({ data }) => {
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() {

View file

@ -237,12 +237,16 @@ async function handleResponse(
const maybeHeaders = responseHeaders["set-cookie"] || [];
for (const cookie in maybeHeaders) {
if (client)
client.postMessage({
if (client) {
let promise = swtarget.dispatch(client, {
scramjet$type: "cookie",
cookie,
url: url.href,
} as MessageW2C);
});
if (destination != "document" && destination != "iframe") {
await promise;
}
}
}
await cookieStore.setCookies(

View file

@ -38,6 +38,14 @@ export class ScramjetServiceWorker extends EventTarget {
addEventListener("message", async ({ data }: { data: MessageC2W }) => {
if (!("scramjet$type" in data)) return;
if ("scramjet$token" in data) {
// (ack message)
const cb = this.syncPool[data.scramjet$token];
delete this.syncPool[data.scramjet$token];
cb(data);
return;
}
if (data.scramjet$type === "registerServiceWorker") {
this.serviceWorkers.push(new FakeServiceWorker(data.port, data.origin));
@ -58,6 +66,17 @@ export class ScramjetServiceWorker extends EventTarget {
});
}
async dispatch(client: Client, data: MessageW2C): Promise<MessageC2W> {
let token = this.synctoken++;
let cb: (val: MessageC2W) => void;
let promise: Promise<MessageC2W> = new Promise((r) => (cb = r));
this.syncPool[token] = cb;
data.scramjet$token = token;
client.postMessage(data);
return await promise;
}
async loadConfig() {
if (this.config) return;
@ -124,7 +143,7 @@ type ConfigMessage = {
type MessageCommon = {
scramjet$type: string;
scramjet$token: number;
scramjet$token?: number;
};
type MessageTypeC2W =