From daf01b8b6984cbea3d3b21fdd94e10d3e09ff6a8 Mon Sep 17 00:00:00 2001 From: "Tommy D. Rossi" Date: Thu, 18 Dec 2025 15:43:55 +0100 Subject: [PATCH] use XDG data directory for log files --- playwriter/package.json | 1 + playwriter/src/mcp.ts | 4 ++-- playwriter/src/start-relay-server.ts | 6 ++--- playwriter/src/utils.ts | 33 ++++++++++++++++++++++++++++ pnpm-lock.yaml | 9 ++++++++ 5 files changed, 48 insertions(+), 5 deletions(-) diff --git a/playwriter/package.json b/playwriter/package.json index c4d9a15..9a14855 100644 --- a/playwriter/package.json +++ b/playwriter/package.json @@ -48,6 +48,7 @@ "string-dedent": "^3.0.2", "user-agents": "^1.1.669", "ws": "^8.18.3", + "xdg-basedir": "^5.1.0", "zod": "^3" } } diff --git a/playwriter/src/mcp.ts b/playwriter/src/mcp.ts index da5e115..d4c79e2 100644 --- a/playwriter/src/mcp.ts +++ b/playwriter/src/mcp.ts @@ -11,7 +11,7 @@ import { fileURLToPath } from 'node:url' import vm from 'node:vm' import dedent from 'string-dedent' import { createPatch } from 'diff' -import { getCdpUrl } from './utils.js' +import { getCdpUrl, getLogFilePath } from './utils.js' import { waitForPageLoad, WaitForPageLoadOptions, WaitForPageLoadResult } from './wait-for-page-load.js' import { getCDPSessionForPage, CDPSession } from './cdp-session.js' @@ -92,7 +92,7 @@ const lastSnapshots: WeakMap = new WeakMap() const cdpSessionCache: WeakMap = new WeakMap() const RELAY_PORT = 19988 -const LOG_FILE_PATH = process.env.PLAYWRITER_LOG_PATH || path.join(os.tmpdir(), 'playwriter-relay-server.log') +const LOG_FILE_PATH = getLogFilePath() const NO_TABS_ERROR = `No browser tabs are connected. Please install and enable the Playwriter extension on at least one tab: https://chromewebstore.google.com/detail/playwriter-mcp/jfeammnjpkecdekppnclgkkffahnhfhe` diff --git a/playwriter/src/start-relay-server.ts b/playwriter/src/start-relay-server.ts index ecd3282..325c759 100644 --- a/playwriter/src/start-relay-server.ts +++ b/playwriter/src/start-relay-server.ts @@ -1,12 +1,12 @@ import { startPlayWriterCDPRelayServer } from './extension/cdp-relay.js' import fs from 'node:fs' -import path from 'node:path' -import os from 'node:os' import util from 'node:util' +import { ensureDataDir, getLogFilePath } from './utils.js' -const logFilePath = process.env.PLAYWRITER_LOG_PATH || path.join(os.tmpdir(), 'playwriter-relay-server.log') +const logFilePath = getLogFilePath() process.title = 'playwriter-ws-server' +ensureDataDir() fs.writeFileSync(logFilePath, '') const log = (...args: any[]) => { diff --git a/playwriter/src/utils.ts b/playwriter/src/utils.ts index ca51430..38e7471 100644 --- a/playwriter/src/utils.ts +++ b/playwriter/src/utils.ts @@ -1,4 +1,37 @@ +import fs from 'node:fs' +import path from 'node:path' +import { xdgData } from 'xdg-basedir' + export function getCdpUrl({ port = 19988, host = '127.0.0.1' }: { port?: number; host?: string } = {}) { const id = `${Math.random().toString(36).substring(2, 15)}_${Date.now()}` return `ws://${host}:${port}/cdp/${id}` } + +export function getDataDir(): string { + return path.join(xdgData!, 'playwriter') +} + +export function ensureDataDir(): string { + const dataDir = getDataDir() + if (!fs.existsSync(dataDir)) { + fs.mkdirSync(dataDir, { recursive: true }) + } + return dataDir +} + +export function getLogFilePath(): string { + return process.env.PLAYWRITER_LOG_PATH || path.join(getDataDir(), 'relay-server.log') +} + +// export function getDidPromptReviewPath(): string { +// return path.join(getDataDir(), 'did-prompt-review') +// } + +// export function hasReviewedPrompt(): boolean { +// return fs.existsSync(getDidPromptReviewPath()) +// } + +// export function markPromptReviewed(): void { +// ensureDataDir() +// fs.writeFileSync(getDidPromptReviewPath(), new Date().toISOString()) +// } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a94a07c..26ad6a9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -93,6 +93,9 @@ importers: ws: specifier: ^8.18.3 version: 8.18.3(bufferutil@4.0.9) + xdg-basedir: + specifier: ^5.1.0 + version: 5.1.0 zod: specifier: ^3 version: 3.25.76 @@ -2701,6 +2704,10 @@ packages: utf-8-validate: optional: true + xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} @@ -5479,6 +5486,8 @@ snapshots: optionalDependencies: bufferutil: 4.0.9 + xdg-basedir@5.1.0: {} + xml-name-validator@5.0.0: optional: true