1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
"use strict";
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
var __create = Object.create;
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
var __defProp = Object.defineProperty;
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
var __getOwnPropNames = Object.getOwnPropertyNames;
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
var __getProtoOf = Object.getPrototypeOf;
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
var __hasOwnProp = Object.prototype.hasOwnProperty;
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
var __export = (target, all) => {
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
for (var name in all)
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
__defProp(target, name, { get: all[name], enumerable: true });
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
};
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
var __copyProps = (to, from, except, desc) => {
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (from && typeof from === "object" || typeof from === "function") {
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
for (let key of __getOwnPropNames(from))
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (!__hasOwnProp.call(to, key) && key !== except)
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
return to;
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
};
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
// If the importer is in node compatibility mode or this is not an ESM
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
// file that has been converted to a CommonJS file using a Babel-
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
// compatible transform (i.e. "__esModule" has not been set), then set
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
// "default" to the CommonJS "module.exports" for node compatibility.
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
mod
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
));
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
var cdpRelay_exports = {};
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
__export(cdpRelay_exports, {
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
CDPRelayServer: () => CDPRelayServer
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
});
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
module.exports = __toCommonJS(cdpRelay_exports);
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
var import_child_process = require("child_process");
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
var import_utilsBundle = require("playwright-core/lib/utilsBundle");
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
var import_registry = require("playwright-core/lib/server/registry/index");
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
var import_utils = require("playwright-core/lib/utils");
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
var import_http2 = require("../sdk/http");
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
var import_log = require("../log");
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
var protocol = __toESM(require("./protocol"));
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
const debugLogger = (0, import_utilsBundle.debug)("pw:mcp:relay");
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
class CDPRelayServer {
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
constructor(server, browserChannel, userDataDir, executablePath) {
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._playwrightConnection = null;
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._extensionConnection = null;
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._nextSessionId = 1;
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._wsHost = (0, import_http2.addressToString)(server.address(), { protocol: "ws" });
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._browserChannel = browserChannel;
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._userDataDir = userDataDir;
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._executablePath = executablePath;
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
const uuid = crypto.randomUUID();
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._cdpPath = `/cdp/${uuid}`;
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._extensionPath = `/extension/${uuid}`;
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._resetExtensionConnection();
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._wss = new import_utilsBundle.wsServer({ server });
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._wss.on("connection", this._onConnection.bind(this));
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
cdpEndpoint() {
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
return `${this._wsHost}${this._cdpPath}`;
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
extensionEndpoint() {
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
return `${this._wsHost}${this._extensionPath}`;
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
async ensureExtensionConnectionForMCPContext(clientInfo, abortSignal, toolName) {
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger("Ensuring extension connection for MCP context");
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (this._extensionConnection)
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
return;
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._connectBrowser(clientInfo, toolName);
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger("Waiting for incoming extension connection");
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
await Promise.race([
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._extensionConnectionPromise,
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
new Promise((_, reject) => setTimeout(() => {
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
reject(new Error(`Extension connection timeout. Make sure the "Playwright MCP Bridge" extension is installed. See https://github.com/microsoft/playwright-mcp/blob/main/extension/README.md for installation instructions.`));
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}, process.env.PWMCP_TEST_CONNECTION_TIMEOUT ? parseInt(process.env.PWMCP_TEST_CONNECTION_TIMEOUT, 10) : 5e3)),
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
new Promise((_, reject) => abortSignal.addEventListener("abort", reject))
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
]);
77
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger("Extension connection established");
78
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
79
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
_connectBrowser(clientInfo, toolName) {
80
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
const mcpRelayEndpoint = `${this._wsHost}${this._extensionPath}`;
81
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
const url = new URL("chrome-extension://jakfalbnbhgkpmoaakfflhflbfpkailf/connect.html");
82
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
url.searchParams.set("mcpRelayUrl", mcpRelayEndpoint);
83
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
const client = {
84
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
name: clientInfo.name,
85
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
version: clientInfo.version
86
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
};
87
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
url.searchParams.set("client", JSON.stringify(client));
88
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
url.searchParams.set("protocolVersion", process.env.PWMCP_TEST_PROTOCOL_VERSION ?? protocol.VERSION.toString());
89
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (toolName)
90
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
url.searchParams.set("newTab", String(toolName === "browser_navigate"));
91
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
const token = process.env.PLAYWRIGHT_MCP_EXTENSION_TOKEN;
92
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (token)
93
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
url.searchParams.set("token", token);
94
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
const href = url.toString();
95
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
let executablePath = this._executablePath;
96
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (!executablePath) {
97
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
const executableInfo = import_registry.registry.findExecutable(this._browserChannel);
98
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (!executableInfo)
99
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
throw new Error(`Unsupported channel: "${this._browserChannel}"`);
100
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
executablePath = executableInfo.executablePath("javascript");
101
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (!executablePath)
102
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
throw new Error(`"${this._browserChannel}" executable not found. Make sure it is installed at a standard location.`);
103
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
104
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
const args = [];
105
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (this._userDataDir)
106
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
args.push(`--user-data-dir=${this._userDataDir}`);
107
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
args.push(href);
108
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
(0, import_child_process.spawn)(executablePath, args, {
109
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
windowsHide: true,
110
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
detached: true,
111
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
shell: false,
112
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
stdio: "ignore"
113
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
});
114
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
115
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
stop() {
116
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this.closeConnections("Server stopped");
117
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._wss.close();
118
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
119
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
closeConnections(reason) {
120
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._closePlaywrightConnection(reason);
121
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._closeExtensionConnection(reason);
122
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
123
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
_onConnection(ws2, request) {
124
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
const url = new URL(`http://localhost${request.url}`);
125
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger(`New connection to ${url.pathname}`);
126
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (url.pathname === this._cdpPath) {
127
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._handlePlaywrightConnection(ws2);
128
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
} else if (url.pathname === this._extensionPath) {
129
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._handleExtensionConnection(ws2);
130
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
} else {
131
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger(`Invalid path: ${url.pathname}`);
132
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ws2.close(4004, "Invalid path");
133
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
134
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
135
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
_handlePlaywrightConnection(ws2) {
136
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (this._playwrightConnection) {
137
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger("Rejecting second Playwright connection");
138
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ws2.close(1e3, "Another CDP client already connected");
139
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
return;
140
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
141
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._playwrightConnection = ws2;
142
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ws2.on("message", async (data) => {
143
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
try {
144
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
const message = JSON.parse(data.toString());
145
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
await this._handlePlaywrightMessage(message);
146
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
} catch (error) {
147
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger(`Error while handling Playwright message
148
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
${data.toString()}
149
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
`, error);
150
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
151
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
});
152
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ws2.on("close", () => {
153
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (this._playwrightConnection !== ws2)
154
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
return;
155
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._playwrightConnection = null;
156
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._closeExtensionConnection("Playwright client disconnected");
157
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger("Playwright WebSocket closed");
158
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
});
159
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ws2.on("error", (error) => {
160
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger("Playwright WebSocket error:", error);
161
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
});
162
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger("Playwright MCP connected");
163
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
164
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
_closeExtensionConnection(reason) {
165
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._extensionConnection?.close(reason);
166
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._extensionConnectionPromise.reject(new Error(reason));
167
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._resetExtensionConnection();
168
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
169
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
_resetExtensionConnection() {
170
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._connectedTabInfo = void 0;
171
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._extensionConnection = null;
172
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._extensionConnectionPromise = new import_utils.ManualPromise();
173
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
void this._extensionConnectionPromise.catch(import_log.logUnhandledError);
174
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
175
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
_closePlaywrightConnection(reason) {
176
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (this._playwrightConnection?.readyState === import_utilsBundle.ws.OPEN)
177
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._playwrightConnection.close(1e3, reason);
178
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._playwrightConnection = null;
179
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
180
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
_handleExtensionConnection(ws2) {
181
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (this._extensionConnection) {
182
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ws2.close(1e3, "Another extension connection already established");
183
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
return;
184
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
185
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._extensionConnection = new ExtensionConnection(ws2);
186
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._extensionConnection.onclose = (c, reason) => {
187
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger("Extension WebSocket closed:", reason, c === this._extensionConnection);
188
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (this._extensionConnection !== c)
189
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
return;
190
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._resetExtensionConnection();
191
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._closePlaywrightConnection(`Extension disconnected: ${reason}`);
192
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
};
193
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._extensionConnection.onmessage = this._handleExtensionMessage.bind(this);
194
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._extensionConnectionPromise.resolve();
195
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
196
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
_handleExtensionMessage(method, params) {
197
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
switch (method) {
198
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
case "forwardCDPEvent":
199
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
const sessionId = params.sessionId || this._connectedTabInfo?.sessionId;
200
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._sendToPlaywright({
201
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
sessionId,
202
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
method: params.method,
203
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
params: params.params
204
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
});
205
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
break;
206
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
207
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
208
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
async _handlePlaywrightMessage(message) {
209
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger("\u2190 Playwright:", `${message.method} (id=${message.id})`);
210
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
const { id, sessionId, method, params } = message;
211
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
try {
212
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
const result = await this._handleCDPCommand(method, params, sessionId);
213
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._sendToPlaywright({ id, sessionId, result });
214
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
} catch (e) {
215
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger("Error in the extension:", e);
216
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._sendToPlaywright({
217
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
id,
218
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
sessionId,
219
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
error: { message: e.message }
220
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
});
221
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
222
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
223
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
async _handleCDPCommand(method, params, sessionId) {
224
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
switch (method) {
225
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
case "Browser.getVersion": {
226
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
return {
227
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
protocolVersion: "1.3",
228
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
product: "Chrome/Extension-Bridge",
229
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
userAgent: "CDP-Bridge-Server/1.0.0"
230
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
};
231
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
232
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
case "Browser.setDownloadBehavior": {
233
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
return {};
234
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
235
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
case "Target.setAutoAttach": {
236
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (sessionId)
237
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
break;
238
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
const { targetInfo } = await this._extensionConnection.send("attachToTab", {});
239
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._connectedTabInfo = {
240
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
targetInfo,
241
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
sessionId: `pw-tab-${this._nextSessionId++}`
242
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
};
243
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger("Simulating auto-attach");
244
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._sendToPlaywright({
245
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
method: "Target.attachedToTarget",
246
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
params: {
247
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
sessionId: this._connectedTabInfo.sessionId,
248
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
targetInfo: {
249
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
...this._connectedTabInfo.targetInfo,
250
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
attached: true
251
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
},
252
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
waitingForDebugger: false
253
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
254
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
});
255
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
return {};
256
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
257
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
case "Target.getTargetInfo": {
258
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
return this._connectedTabInfo?.targetInfo;
259
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
260
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
261
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
return await this._forwardToExtension(method, params, sessionId);
262
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
263
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
async _forwardToExtension(method, params, sessionId) {
264
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (!this._extensionConnection)
265
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
throw new Error("Extension not connected");
266
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (this._connectedTabInfo?.sessionId === sessionId)
267
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
sessionId = void 0;
268
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
return await this._extensionConnection.send("forwardCDPCommand", { sessionId, method, params });
269
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
270
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
_sendToPlaywright(message) {
271
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger("\u2192 Playwright:", `${message.method ?? `response(id=${message.id})`}`);
272
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._playwrightConnection?.send(JSON.stringify(message));
273
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
274
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
275
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
class ExtensionConnection {
276
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
constructor(ws2) {
277
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._callbacks = /* @__PURE__ */ new Map();
278
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._lastId = 0;
279
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._ws = ws2;
280
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._ws.on("message", this._onMessage.bind(this));
281
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._ws.on("close", this._onClose.bind(this));
282
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._ws.on("error", this._onError.bind(this));
283
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
284
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
async send(method, params) {
285
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (this._ws.readyState !== import_utilsBundle.ws.OPEN)
286
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
throw new Error(`Unexpected WebSocket state: ${this._ws.readyState}`);
287
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
const id = ++this._lastId;
288
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._ws.send(JSON.stringify({ id, method, params }));
289
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
const error = new Error(`Protocol error: ${method}`);
290
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
return new Promise((resolve, reject) => {
291
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._callbacks.set(id, { resolve, reject, error });
292
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
});
293
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
294
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
close(message) {
295
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger("closing extension connection:", message);
296
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (this._ws.readyState === import_utilsBundle.ws.OPEN)
297
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._ws.close(1e3, message);
298
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
299
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
_onMessage(event) {
300
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
const eventData = event.toString();
301
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
let parsedJson;
302
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
try {
303
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
parsedJson = JSON.parse(eventData);
304
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
} catch (e) {
305
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger(`<closing ws> Closing websocket due to malformed JSON. eventData=${eventData} e=${e?.message}`);
306
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._ws.close();
307
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
return;
308
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
309
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
try {
310
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._handleParsedMessage(parsedJson);
311
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
} catch (e) {
312
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger(`<closing ws> Closing websocket due to failed onmessage callback. eventData=${eventData} e=${e?.message}`);
313
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._ws.close();
314
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
315
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
316
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
_handleParsedMessage(object) {
317
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (object.id && this._callbacks.has(object.id)) {
318
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
const callback = this._callbacks.get(object.id);
319
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._callbacks.delete(object.id);
320
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
if (object.error) {
321
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
const error = callback.error;
322
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
error.message = object.error;
323
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
callback.reject(error);
324
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
} else {
325
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
callback.resolve(object.result);
326
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
327
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
} else if (object.id) {
328
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger("\u2190 Extension: unexpected response", object);
329
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
} else {
330
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this.onmessage?.(object.method, object.params);
331
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
332
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
333
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
_onClose(event) {
334
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger(`<ws closed> code=${event.code} reason=${event.reason}`);
335
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._dispose();
336
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this.onclose?.(this, event.reason);
337
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
338
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
_onError(event) {
339
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
debugLogger(`<ws error> message=${event.message} type=${event.type} target=${event.target}`);
340
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._dispose();
341
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
342
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
_dispose() {
343
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
for (const callback of this._callbacks.values())
344
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
callback.reject(new Error("WebSocket closed"));
345
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
this._callbacks.clear();
346
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
347
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
348
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
// Annotate the CommonJS export names for ESM import in node:
349
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
0 && (module.exports = {
350
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
CDPRelayServer
351
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
});
352
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!