Merge pull request #4 from Pandipipas/create-electron-wrapper-for-scoreko-dev-qehywe

Codex-generated pull request
This commit is contained in:
Pandipipas
2026-02-10 14:18:21 +01:00
committed by GitHub
4 changed files with 23 additions and 46 deletions
+14 -27
View File
@@ -2,7 +2,7 @@
Wrapper de Electron para empaquetar una instalación de NodeCG que incluya el bundle `scoreko-dev`, inspirado en `opeik/runback-electron` pero actualizado a Electron + TypeScript moderno.
Por defecto, el wrapper arranca NodeCG con **Node del sistema** (`node`), pensado para que uses Node 22 de forma consistente en todo el stack.
Este wrapper está pensado para funcionar **standalone**: por defecto NodeCG corre con el **Node interno de Electron** (no requiere Node instalado en la máquina final).
## Qué hace
@@ -42,13 +42,15 @@ cd ../..
> Si no haces `npm install` dentro de `lib/nodecg`, verás errores como `Cannot find module ... node_modules/nodecg/dist/server/bootstrap.js`.
## ¿Existe Electron con Node 22 para standalone?
## Error típico: NODE_MODULE_VERSION (Node 22 vs Electron Node 20)
Sí. Este proyecto usa Electron `35.x`, que permite mantener un runtime moderno y ejecutar NodeCG con el Node embebido de Electron para app standalone.
## Error típico: NODE_MODULE_VERSION
Si ves un error como `better-sqlite3 ... NODE_MODULE_VERSION`, tienes módulos nativos compilados para una versión distinta de Node.
1. Entra a `lib/nodecg`.
2. Reinstala/recompila dependencias nativas:
En ese caso recompila dentro de `lib/nodecg` con el runtime objetivo:
```bash
cd lib/nodecg
@@ -56,30 +58,23 @@ npm install
npm rebuild better-sqlite3 --update-binary
```
3. Si persiste, elimina `node_modules` del workspace que falla y vuelve a instalar.
Si sigues en modo standalone (default), asegúrate de no mezclar binarios compilados con otro Node fuera de tu versión de Electron.
## Runtime de NodeCG
## Runtime de NodeCG (Node 22 recomendado)
Por defecto (standalone):
- `NODECG_USE_SYSTEM_NODE=false`
Por defecto:
Opcionalmente, puedes forzar Node del sistema:
- `NODECG_USE_SYSTEM_NODE=true`
- `NODECG_NODE_BINARY=node`
Así NodeCG se ejecuta con tu Node del sistema (recomendado: Node 22).
Ejemplo en PowerShell para forzar Node 22:
Ejemplo en PowerShell para usar Node del sistema (si lo necesitas):
```powershell
$env:NODECG_USE_SYSTEM_NODE="true"
$env:NODECG_NODE_BINARY="C:\Program Files\nodejs\node.exe"
node -v # debería mostrar v22.x
npm run dev
```
Si quieres volver al Node interno de Electron:
```powershell
$env:NODECG_USE_SYSTEM_NODE="false"
node -v
npm run dev
```
@@ -92,17 +87,9 @@ Estas variables se leen en `src/main/main.ts`.
- `SCOREKO_DASHBOARD_ROUTE` (default: `dashboard/index.html`)
- `ELECTRON_LOAD_DELAY_MS` (default: `2500`)
- `NODECG_STARTUP_TIMEOUT_MS` (default: `30000`)
- `NODECG_USE_SYSTEM_NODE` (default: `true`)
- `NODECG_USE_SYSTEM_NODE` (default: `false`)
- `NODECG_NODE_BINARY` (default: `node`)
Ejemplo (PowerShell):
```powershell
$env:NODECG_PORT="9191"
$env:NODECG_BUNDLE_NAME="scoreko-dev"
npm run dev
```
## Scripts
- `npm run dev`: modo desarrollo (watch + relanzado de Electron).
+6 -16
View File
@@ -14,14 +14,14 @@
"devDependencies": {
"@types/node": "^22.10.5",
"concurrently": "^9.1.2",
"electron": "^34.2.0",
"electron": "^35.7.5",
"electron-builder": "^25.1.8",
"rimraf": "^6.0.1",
"typescript": "^5.7.3",
"wait-on": "^8.0.1"
},
"engines": {
"node": ">=20"
"node": ">=22"
}
},
"node_modules/@develar/schema-utils": {
@@ -2375,15 +2375,15 @@
}
},
"node_modules/electron": {
"version": "34.5.8",
"resolved": "https://registry.npmjs.org/electron/-/electron-34.5.8.tgz",
"integrity": "sha512-vxLD65mabTzYmEVa9KceMHM0+zO+vqgrhcyNVlmTd0IGV5J7XZ8v/qElm0o4YQ4wPeq7olZkUjZkBQQEdr23/g==",
"version": "35.7.5",
"resolved": "https://registry.npmjs.org/electron/-/electron-35.7.5.tgz",
"integrity": "sha512-dnL+JvLraKZl7iusXTVTGYs10TKfzUi30uEDTqsmTm0guN9V2tbOjTzyIZbh9n3ygUjgEYyo+igAwMRXIi3IPw==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
"@electron/get": "^2.0.0",
"@types/node": "^20.9.0",
"@types/node": "^22.7.7",
"extract-zip": "^2.0.1"
},
"bin": {
@@ -2566,16 +2566,6 @@
"node": ">= 10.0.0"
}
},
"node_modules/electron/node_modules/@types/node": {
"version": "20.19.33",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz",
"integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==",
"dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~6.21.0"
}
},
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+1 -1
View File
@@ -62,7 +62,7 @@
"devDependencies": {
"@types/node": "^22.10.5",
"concurrently": "^9.1.2",
"electron": "^34.2.0",
"electron": "^35.7.5",
"electron-builder": "^25.1.8",
"rimraf": "^6.0.1",
"typescript": "^5.7.3",
+2 -2
View File
@@ -9,7 +9,7 @@ const DEFAULT_BUNDLE_NAME = process.env.NODECG_BUNDLE_NAME ?? "scoreko-dev";
const DEFAULT_DASHBOARD_ROUTE = process.env.SCOREKO_DASHBOARD_ROUTE ?? "dashboard/index.html";
const LOAD_DELAY_MS = Number.parseInt(process.env.ELECTRON_LOAD_DELAY_MS ?? "2500", 10);
const STARTUP_TIMEOUT_MS = Number.parseInt(process.env.NODECG_STARTUP_TIMEOUT_MS ?? "30000", 10);
const USE_SYSTEM_NODE = (process.env.NODECG_USE_SYSTEM_NODE ?? "true").toLowerCase() !== "false";
const USE_SYSTEM_NODE = (process.env.NODECG_USE_SYSTEM_NODE ?? "false").toLowerCase() === "true";
const NODE_BINARY = process.env.NODECG_NODE_BINARY ?? "node";
const isDev = !app.isPackaged;
@@ -135,7 +135,7 @@ function enrichNodeCGFailureMessage(baseMessage: string): string {
"Detectado error de módulos nativos compilados para otra versión de Node (NODE_MODULE_VERSION).",
USE_SYSTEM_NODE
? "Estás en modo Node del sistema: asegúrate de lanzar con Node 22 y recompilar dependencias nativas."
: "Estás en modo Node de Electron: alinea versiones o cambia NODECG_USE_SYSTEM_NODE=true.",
: "Estás en modo standalone (Node interno de Electron). Reinstala/rebuild de dependencias con esta versión de Electron.",
"",
"Solución recomendada (en lib/nodecg):",
" 1) npm install",