diff --git a/src/client/shared/postmessage.ts b/src/client/shared/postmessage.ts index c9b0310..33b1054 100644 --- a/src/client/shared/postmessage.ts +++ b/src/client/shared/postmessage.ts @@ -63,10 +63,9 @@ export default function (client: ScramjetClient) { }, }); - const toproxy = [ - "Worker.prototype.postMessage", - "MessagePort.prototype.postMessage", - ]; + const toproxy = ["MessagePort.prototype.postMessage"]; + + if (self.Worker) toproxy.push("Worker.prototype.postMessage"); if (!iswindow) toproxy.push("self.postMessage"); // only do the generic version if we're in a worker client.Proxy(toproxy, { diff --git a/src/client/shared/requests/xmlhttprequest.ts b/src/client/shared/requests/xmlhttprequest.ts index 05ea88e..6af7e71 100644 --- a/src/client/shared/requests/xmlhttprequest.ts +++ b/src/client/shared/requests/xmlhttprequest.ts @@ -1,9 +1,18 @@ -import { config, decodeUrl, encodeUrl, rewriteHeaders } from "../../../shared"; +import { config, decodeUrl, encodeUrl } from "../../../shared"; import { ScramjetClient } from "../../client"; -const nativeworker = Worker; -const postmessage = Worker.prototype.postMessage; +let nativeworker; +let postmessage; + +if (self.Worker) { + nativeworker = Worker; + postmessage = Worker.prototype.postMessage; +} + export default function (client: ScramjetClient, self: Self) { - const worker = new nativeworker(config.sync); + let worker; + if (self.Worker) { + worker = new nativeworker(config.sync); + } const ARGS = Symbol("xhr original args"); const HEADERS = Symbol("xhr headers"); diff --git a/src/client/shared/worker.ts b/src/client/shared/worker.ts index f042fe1..f348b5f 100644 --- a/src/client/shared/worker.ts +++ b/src/client/shared/worker.ts @@ -4,8 +4,11 @@ import { encodeUrl } from "../../shared/rewriters/url"; import type { MessageC2W } from "../../worker"; import { ScramjetClient } from "../client"; -const workerpostmessage = Worker.prototype.postMessage; - +const sharedworkerpostmessage = MessagePort.prototype.postMessage; +let workerpostmessage; +if (self.Worker) { + workerpostmessage = Worker.prototype.postMessage; +} export default function (client: ScramjetClient, self: typeof globalThis) { const handler = { construct({ args, call }) { @@ -39,14 +42,26 @@ export default function (client: ScramjetClient, self: typeof globalThis) { (async () => { const port = await conn.getInnerPort(); - workerpostmessage.call( - worker, - { - $scramjet$type: "baremuxinit", - port, - }, - [port] - ); + if (worker instanceof Worker) { + workerpostmessage.call( + worker, + { + $scramjet$type: "baremuxinit", + port, + }, + [port] + ); + } + if (worker instanceof SharedWorker) { + sharedworkerpostmessage.call( + worker.port, + { + $scramjet$type: "baremuxinit", + port, + }, + [port] + ); + } })(); }, };