import fs from 'node:fs'; import os from 'node:os'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; // Playwriter extension IDs - used for validation and Chrome flag commands export const EXTENSION_IDS = [ 'jfeammnjpkecdekppnclgkkffahnhfhe', // Production (Chrome Web Store) 'pebbngnfojnignonigcnkdilknapkgid', // Dev extension (stable ID from manifest key) ]; /** * Parse a relay host string into HTTP and WebSocket base URLs. * Supports both plain hostnames (appends port) and full URLs (uses as-is). * * Examples: * "192.168.1.10" → http://192.168.1.10:19988, ws://192.168.1.10:19988 * "https://my-machine-tunnel.traforo.dev" → https://my-machine-tunnel.traforo.dev, wss://my-machine-tunnel.traforo.dev */ export function parseRelayHost(host, port = 19988) { if (host.startsWith('https://') || host.startsWith('http://')) { const url = new URL(host); const httpBaseUrl = url.origin; const wsProtocol = url.protocol === 'https:' ? 'wss:' : 'ws:'; const wsBaseUrl = `${wsProtocol}//${url.host}`; return { httpBaseUrl, wsBaseUrl }; } return { httpBaseUrl: `http://${host}:${port}`, wsBaseUrl: `ws://${host}:${port}`, }; } export function getCdpUrl({ port = 19988, host = '127.0.0.1', token, extensionId, } = {}) { const id = `${Math.random().toString(36).substring(2, 15)}_${Date.now()}`; const params = new URLSearchParams(); if (token) { params.set('token', token); } if (extensionId) { params.set('extensionId', extensionId); } const queryString = params.toString(); const suffix = queryString ? `?${queryString}` : ''; const { wsBaseUrl } = parseRelayHost(host, port); return `${wsBaseUrl}/cdp/${id}${suffix}`; } // Use ~/.playwriter for logs so each OS user gets their own dir (avoids permission errors on shared machines, see #44) const LOG_BASE_DIR = path.join(os.homedir(), '.playwriter'); export const LOG_FILE_PATH = process.env.PLAYWRITER_LOG_FILE_PATH || path.join(LOG_BASE_DIR, 'relay-server.log'); export const LOG_CDP_FILE_PATH = process.env.PLAYWRITER_CDP_LOG_FILE_PATH || path.join(path.dirname(LOG_FILE_PATH), 'cdp.jsonl'); const packageJsonPath = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', 'package.json'); export const VERSION = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')).version; export function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } //# sourceMappingURL=utils.js.map