diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a2c1b7c0..43862ebb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -116,7 +116,7 @@ jobs: pnpm exec vitest run --config vitest.electron.config.js ;; backend-tests) - uv run python -m pytest tests/backend -n auto \ + MESHCHAT_SKIP_STORAGE_LOCK=1 uv run python -m pytest tests/backend -n auto \ --cov=meshchatx/src/backend ;; lang-tests) diff --git a/package.json b/package.json index 571d5997..19ed8e2f 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "test:e2e": "playwright test", "test:e2e:ui": "playwright test --ui", "test:e2e:install": "playwright install chromium", - "electron-postinstall": "electron-builder install-app-deps && node scripts/ensure-micron-parser-package.js", + "electron-postinstall": "electron-builder install-app-deps && node scripts/ensure-micron-parser-package.js && node scripts/patch-electron-builder-fs.cjs", "electron": "pnpm run electron-postinstall && pnpm run build && electron .", "dist": "pnpm run electron-postinstall && pnpm run build && electron-builder --publish=never", "dist:linux": "pnpm run electron-postinstall && cross-env PLATFORM=linux pnpm run build && electron-builder --linux AppImage deb --publish=never", diff --git a/scripts/patch-electron-builder-fs.cjs b/scripts/patch-electron-builder-fs.cjs new file mode 100644 index 00000000..230fd0fe --- /dev/null +++ b/scripts/patch-electron-builder-fs.cjs @@ -0,0 +1,49 @@ +#!/usr/bin/env node + +const fs = require("node:fs"); +const path = require("node:path"); + +const root = path.join(__dirname, ".."); +const targets = [path.join(root, "node_modules", "app-builder-lib", "out", "binDownload.js")]; + +const preamble = `const __ebFsConstants = (() => { + try { + const c = require("fs").constants; + if (c && c.R_OK != null) { + return c; + } + } catch (_) {} + try { + const c = require("node:fs").constants; + if (c && c.R_OK != null) { + return c; + } + } catch (_) {} + return { R_OK: 4, W_OK: 2, X_OK: 1 }; +})(); + +`; + +function patchBinDownload(source) { + if (source.includes("__ebFsConstants")) { + return source; + } + let next = preamble + source; + next = next.replace(/fs_1\.constants\.R_OK/g, "__ebFsConstants.R_OK"); + next = next.replace(/fs_1\.constants\.W_OK/g, "__ebFsConstants.W_OK"); + next = next.replace(/fs\.constants\.R_OK/g, "__ebFsConstants.R_OK"); + next = next.replace(/fs\.constants\.W_OK/g, "__ebFsConstants.W_OK"); + return next; +} + +for (const target of targets) { + if (!fs.existsSync(target)) { + continue; + } + const original = fs.readFileSync(target, "utf8"); + const patched = patchBinDownload(original); + if (patched !== original) { + fs.writeFileSync(target, patched); + console.log(`patched ${path.relative(root, target)}`); + } +}