MCPcopy
hub / github.com/cloudflare/capnweb / MessagePortTransport

Class MessagePortTransport

src/messageport.ts:19–103  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

17}
18
19class MessagePortTransport implements RpcTransportWithCustomEncoding {
20 readonly encodingLevel = "structuredClonable" as const;
21
22 constructor (port: MessagePort) {
23 this.#port = port;
24
25 // Start listening for messages
26 port.start();
27
28 port.addEventListener("message", (event: MessageEvent<any>) => {
29 if (this.#error) {
30 // Ignore further messages.
31 } else if (event.data === null) {
32 // Peer is signaling that they're closing the connection
33 this.#receivedError(new Error("Peer closed MessagePort connection."));
34 } else {
35 // Accept any structured-clonable data
36 if (this.#receiveResolver) {
37 this.#receiveResolver(event.data);
38 this.#receiveResolver = undefined;
39 this.#receiveRejecter = undefined;
40 } else {
41 this.#receiveQueue.push(event.data);
42 }
43 }
44 });
45
46 port.addEventListener("messageerror", (event: MessageEvent) => {
47 this.#receivedError(new Error("MessagePort message error."));
48 });
49 }
50
51 #port: MessagePort;
52 #receiveResolver?: (message: unknown) => void;
53 #receiveRejecter?: (err: any) => void;
54 #receiveQueue: unknown[] = [];
55 #error?: any;
56
57 send(message: unknown): void {
58 if (this.#error) {
59 throw this.#error;
60 }
61 this.#port.postMessage(message);
62 }
63
64 async receive(): Promise<unknown> {
65 if (this.#receiveQueue.length > 0) {
66 return this.#receiveQueue.shift()!;
67 } else if (this.#error) {
68 throw this.#error;
69 } else {
70 return new Promise<unknown>((resolve, reject) => {
71 this.#receiveResolver = resolve;
72 this.#receiveRejecter = reject;
73 });
74 }
75 }
76

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…