MCPcopy Create free account
hub / github.com/UsefulSoftwareCo/executor / CdpPage

Class CdpPage

e2e/desktop-packaged/stale-launchd-registration.test.ts:92–205  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

90}
91
92class CdpPage {
93 private nextId = 1;
94 private readonly pending = new Map<
95 number,
96 {
97 readonly resolve: (value: unknown) => void;
98 readonly reject: (error: Error) => void;
99 }
100 >();
101
102 private constructor(private readonly socket: WebSocket) {
103 socket.addEventListener("message", (event) => {
104 const data = event.data;
105 if (typeof data !== "string") return;
106 const message = JSON.parse(data) as CdpResponse<unknown>;
107 if (!message.id) return;
108 const pending = this.pending.get(message.id);
109 if (!pending) return;
110 this.pending.delete(message.id);
111 if (message.error) {
112 pending.reject(new Error(message.error.message ?? "CDP command failed"));
113 return;
114 }
115 pending.resolve(message.result);
116 });
117 socket.addEventListener("close", () => {
118 for (const [, pending] of this.pending) {
119 pending.reject(new Error("CDP socket closed"));
120 }
121 this.pending.clear();
122 });
123 }
124
125 static connect = (url: string): Promise<CdpPage> =>
126 new Promise((resolveConnect, rejectConnect) => {
127 const socket = new WebSocket(url);
128 const timer = setTimeout(() => {
129 socket.close();
130 rejectConnect(new Error(`Timed out connecting to page CDP target ${url}`));
131 }, 30_000);
132 socket.addEventListener(
133 "open",
134 () => {
135 clearTimeout(timer);
136 resolveConnect(new CdpPage(socket));
137 },
138 { once: true },
139 );
140 socket.addEventListener(
141 "error",
142 () => {
143 clearTimeout(timer);
144 rejectConnect(new Error(`Failed to connect to page CDP target ${url}`));
145 },
146 { once: true },
147 );
148 });
149

Callers

nothing calls this directly

Calls 3

setMethod · 0.80
closeMethod · 0.65
sendMethod · 0.65

Tested by

no test coverage detected