fix: more service worker emu stuff

This commit is contained in:
Percs 2024-12-12 10:59:57 -06:00
parent f38ea98054
commit 88d76852d6
2 changed files with 23 additions and 17 deletions

View file

@ -15,9 +15,12 @@ export default function (client: ScramjetClient, self: typeof window) {
}, },
set(ctx, value: string) { set(ctx, value: string) {
client.cookieStore.setCookies([value], client.url); client.cookieStore.setCookies([value], client.url);
const controller = client.descriptors.get(
if (client.serviceWorker.controller) { "ServiceWorkerContainer.prototype.controller",
client.serviceWorker.controller!.postMessage({ client.serviceWorker
);
if (controller) {
client.natives.call("ServiceWorker.prototype.postMessage", controller, {
scramjet$type: "cookie", scramjet$type: "cookie",
cookie: value, cookie: value,
url: client.url.href, url: client.url.href,

View file

@ -13,10 +13,6 @@ export const enabled = (client: ScramjetClient) =>
export function disabled(_client: ScramjetClient, _self: Self) { export function disabled(_client: ScramjetClient, _self: Self) {
Reflect.deleteProperty(Navigator.prototype, "serviceWorker"); Reflect.deleteProperty(Navigator.prototype, "serviceWorker");
} }
let realPostMessage;
if (self.ServiceWorker) {
realPostMessage = ServiceWorker.prototype.postMessage;
}
export default function (client: ScramjetClient, _self: Self) { export default function (client: ScramjetClient, _self: Self) {
let registration; let registration;
@ -39,40 +35,47 @@ export default function (client: ScramjetClient, _self: Self) {
}, },
}); });
client.Proxy("navigator.serviceWorker.getRegistration", { client.Proxy("ServiceWorkerContainer.prototype.getRegistration", {
apply(ctx) { apply(ctx) {
ctx.return(new Promise((resolve) => resolve(registration))); ctx.return(new Promise((resolve) => resolve(registration)));
}, },
}); });
client.Proxy("navigator.serviceWorker.getRegistrations", { client.Proxy("ServiceWorkerContainer.prototype.getRegistrations", {
apply(ctx) { apply(ctx) {
ctx.return(new Promise((resolve) => resolve([registration]))); ctx.return(new Promise((resolve) => resolve([registration])));
}, },
}); });
client.Trap("navigator.serviceWorker.ready", { client.Trap("ServiceWorkerContainer.prototype.ready", {
get(_ctx) { get(_ctx) {
console.log(registration);
return new Promise((resolve) => resolve(registration)); return new Promise((resolve) => resolve(registration));
}, },
}); });
client.Proxy("navigator.serviceWorker.register", { client.Trap("ServiceWorkerContainer.prototype.controller", {
get(ctx) {
return registration?.active;
},
});
client.Proxy("ServiceWorkerContainer.prototype.register", {
apply(ctx) { apply(ctx) {
if (ctx.args[0] instanceof URL) ctx.args[0] = ctx.args[0].href;
let url = rewriteUrl(ctx.args[0], client.meta) + "?dest=serviceworker"; let url = rewriteUrl(ctx.args[0], client.meta) + "?dest=serviceworker";
if (ctx.args[1] && ctx.args[1].type === "module") { if (ctx.args[1] && ctx.args[1].type === "module") {
url += "&type=module"; url += "&type=module";
} }
const worker = client.natives.construct("SharedWorker", url); const worker = client.natives.construct("SharedWorker", url);
const handle = worker.port; const handle = worker.port;
const controller = client.descriptors.get(
"ServiceWorkerContainer.prototype.controller",
client.serviceWorker
);
realPostMessage.call( client.natives.call(
client.serviceWorker.controller, "ServiceWorker.prototype.postMessage",
controller,
{ {
scramjet$type: "registerServiceWorker", scramjet$type: "registerServiceWorker",
port: handle, port: handle,