(A) Intermittent pure-white startup window. On a Windows VM viewed over RemoteDesktop the app sometimes opened to a blank white window — no error banner, not even the static menu bar. A multi-agent investigation + adversarial review pinned it by one airtight deduction: the BrowserWindow is created with backgroundColor '#16181c' (dark), so "white" can never be an un-painted, loading, or failed state — all of those show dark. Pure white, with no banner and no static menu bar, and silent in the logs, eliminates every DOM/init/CSS/load failure mode (each would leave the dark styled shell, unstyled black-on-white menu text, or the red init().catch banner) and leaves exactly one: a GPU/compositor surface failure on the RDP virtual display adapter. The code ran hardware acceleration full-default with no fallback (no disableHardwareAcceleration, no GPU switch anywhere), and the GPU child-process-gone handler is log-only — matching the silent symptom. Fix (the reviewed safe subset): - app.disableHardwareAcceleration() at module top (before app.whenReady), gated on an RDP session (process.env.SESSIONNAME matches /^RDP/) OR a persisted gpu-disabled.flag in userData. The renderer has no WebGL/canvas/video, so software compositing costs effectively nothing here and does not undo the recent renderer perf work; local/console users keep hardware acceleration. - Auto-heal: when a GPU child-process-gone fires, write gpu-disabled.flag so the next launch disables acceleration even if the RDP gate didn't match (covers a VM reached via console or a flaky virtual GPU). Self-heals after at most one white screen. - The existing child-process-gone / render-process-gone / did-fail-load logging is kept so the affected server's next white-start log can confirm the cause (CHILD PROCESS GONE type=GPU). A webContents reload would not disrupt uploads (uploadManager lives in the main process and is torn down only on quit), but no watchdog is added because in this GPU mode init completes — an init-complete signal would not detect the blank surface. (B) Backup export default filename changed from multi-hoster-backup-YYYY-MM-DD.mhu to DD-MM-YYYY-multihoster-backup.mhu. 409 tests pass; clean boot (the guard is inert off-RDP). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
57 lines
1.4 KiB
JSON
57 lines
1.4 KiB
JSON
{
|
|
"name": "multi-hoster-uploader",
|
|
"version": "3.3.106",
|
|
"description": "Upload files to doodstream, voe, vidmoly, byse simultaneously",
|
|
"main": "main.js",
|
|
"scripts": {
|
|
"start": "electron .",
|
|
"test": "node --test tests/*.test.js tests/ui-smoke.js",
|
|
"dist": "electron-builder --win",
|
|
"release:win": "electron-builder --publish never --win nsis portable",
|
|
"release:gitea": "node scripts/release_gitea.mjs"
|
|
},
|
|
"dependencies": {
|
|
"chokidar": "^3.6.0",
|
|
"undici": "^7.16.0",
|
|
"ws": "^8.19.0"
|
|
},
|
|
"devDependencies": {
|
|
"electron": "^41.3.0",
|
|
"electron-builder": "^26.8.1",
|
|
"eslint": "^10.1.0",
|
|
"eslint-plugin-security": "^4.0.0",
|
|
"rcedit": "^4.0.1"
|
|
},
|
|
"build": {
|
|
"appId": "com.multihoster.uploader",
|
|
"productName": "Multi-Hoster-Upload",
|
|
"directories": {
|
|
"buildResources": "assets",
|
|
"output": "release"
|
|
},
|
|
"files": [
|
|
"main.js",
|
|
"preload.js",
|
|
"lib/**/*",
|
|
"renderer/**/*",
|
|
"assets/app_icon.ico",
|
|
"assets/app_icon.png"
|
|
],
|
|
"win": {
|
|
"target": [
|
|
"nsis",
|
|
"portable"
|
|
],
|
|
"icon": "assets/app_icon.ico",
|
|
"signAndEditExecutable": false
|
|
},
|
|
"nsis": {
|
|
"oneClick": false,
|
|
"perMachine": false,
|
|
"allowToChangeInstallationDirectory": true,
|
|
"createDesktopShortcut": true
|
|
},
|
|
"afterPack": "scripts/afterPack.cjs"
|
|
}
|
|
}
|