diff --git a/src/client/client.ts b/src/client/client.ts index 1e16865..484371c 100644 --- a/src/client/client.ts +++ b/src/client/client.ts @@ -98,9 +98,13 @@ export class ScramjetClient { } else { this.bare = new BareClient( new Promise((resolve) => { - addEventListener("message", (e) => { - if (e.data instanceof MessagePort) { - resolve(e.data); + addEventListener("message", ({ data }) => { + if (typeof data !== "object") return; + if ( + "$scramjet$type" in data && + data.$scramjet$type === "baremuxinit" + ) { + resolve(data.port); } }); }) diff --git a/src/client/dom/postmessage.ts b/src/client/dom/postmessage.ts index 840f186..c39edc4 100644 --- a/src/client/dom/postmessage.ts +++ b/src/client/dom/postmessage.ts @@ -1,3 +1,4 @@ +import { iswindow } from ".."; import { SCRAMJETCLIENT } from "../../symbols"; import { ScramjetClient } from "../client"; import { POLLUTANT } from "../shared/realm"; @@ -32,6 +33,7 @@ export default function (client: ScramjetClient) { ); ctx.args[0] = { + $scramjet$messagetype: "window", $scramjet$origin: callerClient.url.origin, $scramjet$data: ctx.args[0], }; @@ -44,4 +46,21 @@ export default function (client: ScramjetClient) { ); }, }); + + const toproxy = [ + "Worker.prototype.postMessage", + "MessagePort.prototype.postMessage", + ]; + if (!iswindow) toproxy.push("self.postMessage"); // only do the generic version if we're in a worker + + client.Proxy(toproxy, { + apply(ctx) { + // origin/source doesn't need to be preserved - it's null in the message event + + ctx.args[0] = { + $scramjet$messagetype: "worker", + $scramjet$data: ctx.args[0], + }; + }, + }); } diff --git a/src/client/shared/event.ts b/src/client/shared/event.ts index 982d7fe..a1a7ebf 100644 --- a/src/client/shared/event.ts +++ b/src/client/shared/event.ts @@ -23,6 +23,8 @@ export default function (client: ScramjetClient, self: Self) { return this.ports; }, source() { + if (this.source === null) return null; + const scram: ScramjetClient = this.source[SCRAMJETCLIENT]; if (scram) return scram.globalProxy; @@ -33,7 +35,6 @@ export default function (client: ScramjetClient, self: Self) { if (typeof this.data === "object" && "$scramjet$origin" in this.data) return this.data.$scramjet$origin; - // then it must be from a worker, which we aren't currently rewriting return client.url.origin; }, data() { diff --git a/src/client/shared/worker.ts b/src/client/shared/worker.ts index b478b49..e64bd83 100644 --- a/src/client/shared/worker.ts +++ b/src/client/shared/worker.ts @@ -33,9 +33,16 @@ export default function (client: ScramjetClient, self: typeof globalThis) { const worker = call(); const conn = new BareMuxConnection(); + (async () => { const port = await conn.getInnerPort(); - worker.postMessage(port, [port]); + worker.postMessage( + { + $scramjet$type: "baremuxinit", + port, + }, + [port] + ); })(); }, });