From 116d6ce16abe2341bf8ac6e7205d7cb5094cfd16 Mon Sep 17 00:00:00 2001 From: velzie Date: Fri, 2 Aug 2024 22:59:50 -0400 Subject: [PATCH] re-attach port balls --- src/client/swruntime.ts | 17 +++++++++++++---- src/worker/fakesw.ts | 9 +++++++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/client/swruntime.ts b/src/client/swruntime.ts index 75b6d8c..aa4c64e 100644 --- a/src/client/swruntime.ts +++ b/src/client/swruntime.ts @@ -2,14 +2,17 @@ import { ScramjetClient } from "./client"; import { encodeUrl } from "./shared"; export class ScramjetServiceWorkerRuntime { + recvport: MessagePort; constructor(public client: ScramjetClient) { // @ts-ignore self.onconnect = (cevent: MessageEvent) => { const port = cevent.ports[0]; + dbg.log("sw", "connected"); port.addEventListener("message", (event) => { + console.log("sw", event.data); if ("scramjet$type" in event.data) { - handleMessage(client, event.data); + handleMessage.call(this, client, event.data); } }); @@ -20,12 +23,18 @@ export class ScramjetServiceWorkerRuntime { hook() {} } -function handleMessage(client: ScramjetClient, data: MessageW2R) { - const port = data.scramjet$port; +function handleMessage( + this: ScramjetServiceWorkerRuntime, + client: ScramjetClient, + data: MessageW2R +) { + if (data.scramjet$port) this.recvport = data.scramjet$port; + const port = this.recvport; const type = data.scramjet$type; const token = data.scramjet$token; if (type === "fetch") { + dbg.log("ee", data); const fetchhandlers = client.eventcallbacks.get(self); if (!fetchhandlers) return; @@ -116,4 +125,4 @@ type MessageCommon = { export type MessageR2W = MessageCommon & MessageTypeR2W; export type MessageW2R = MessageCommon & - MessageTypeW2R & { scramjet$port: MessagePort }; + MessageTypeW2R & { scramjet$port: MessagePort | undefined }; diff --git a/src/worker/fakesw.ts b/src/worker/fakesw.ts index ad23fc2..236848d 100644 --- a/src/worker/fakesw.ts +++ b/src/worker/fakesw.ts @@ -4,6 +4,7 @@ export class FakeServiceWorker { syncToken = 0; promises: Record void> = {}; messageChannel = new MessageChannel(); + alreadytransfered = false; constructor( public handle: MessagePort, @@ -31,7 +32,7 @@ export class FakeServiceWorker { const message: MessageW2R = { scramjet$type: "fetch", scramjet$token: token, - scramjet$port: this.messageChannel.port2, + scramjet$port: !this.alreadytransfered && this.messageChannel.port2, scramjet$request: { url: request.url, body: request.body, @@ -43,7 +44,11 @@ export class FakeServiceWorker { }; const transfer: any = request.body ? [request.body] : []; - transfer.push(this.messageChannel.port2); + + if (!this.alreadytransfered) { + this.alreadytransfered = true; + transfer.push(this.messageChannel.port2); + } this.handle.postMessage(message, transfer);