mirror of
https://github.com/Pandipipas/scoreko-electron-dev.git
synced 2026-06-06 05:32:06 +00:00
Merge pull request #4 from Pandipipas/create-electron-wrapper-for-scoreko-dev-qehywe
Codex-generated pull request
This commit is contained in:
@@ -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.
|
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
|
## 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`.
|
> 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.
|
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`.
|
En ese caso recompila dentro de `lib/nodecg` con el runtime objetivo:
|
||||||
2. Reinstala/recompila dependencias nativas:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd lib/nodecg
|
cd lib/nodecg
|
||||||
@@ -56,30 +58,23 @@ npm install
|
|||||||
npm rebuild better-sqlite3 --update-binary
|
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_USE_SYSTEM_NODE=true`
|
||||||
- `NODECG_NODE_BINARY=node`
|
- `NODECG_NODE_BINARY=node`
|
||||||
|
|
||||||
Así NodeCG se ejecuta con tu Node del sistema (recomendado: Node 22).
|
Ejemplo en PowerShell para usar Node del sistema (si lo necesitas):
|
||||||
|
|
||||||
Ejemplo en PowerShell para forzar Node 22:
|
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
$env:NODECG_USE_SYSTEM_NODE="true"
|
$env:NODECG_USE_SYSTEM_NODE="true"
|
||||||
$env:NODECG_NODE_BINARY="C:\Program Files\nodejs\node.exe"
|
$env:NODECG_NODE_BINARY="C:\Program Files\nodejs\node.exe"
|
||||||
node -v # debería mostrar v22.x
|
node -v
|
||||||
npm run dev
|
|
||||||
```
|
|
||||||
|
|
||||||
Si quieres volver al Node interno de Electron:
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
$env:NODECG_USE_SYSTEM_NODE="false"
|
|
||||||
npm run dev
|
npm run dev
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -92,17 +87,9 @@ Estas variables se leen en `src/main/main.ts`.
|
|||||||
- `SCOREKO_DASHBOARD_ROUTE` (default: `dashboard/index.html`)
|
- `SCOREKO_DASHBOARD_ROUTE` (default: `dashboard/index.html`)
|
||||||
- `ELECTRON_LOAD_DELAY_MS` (default: `2500`)
|
- `ELECTRON_LOAD_DELAY_MS` (default: `2500`)
|
||||||
- `NODECG_STARTUP_TIMEOUT_MS` (default: `30000`)
|
- `NODECG_STARTUP_TIMEOUT_MS` (default: `30000`)
|
||||||
- `NODECG_USE_SYSTEM_NODE` (default: `true`)
|
- `NODECG_USE_SYSTEM_NODE` (default: `false`)
|
||||||
- `NODECG_NODE_BINARY` (default: `node`)
|
- `NODECG_NODE_BINARY` (default: `node`)
|
||||||
|
|
||||||
Ejemplo (PowerShell):
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
$env:NODECG_PORT="9191"
|
|
||||||
$env:NODECG_BUNDLE_NAME="scoreko-dev"
|
|
||||||
npm run dev
|
|
||||||
```
|
|
||||||
|
|
||||||
## Scripts
|
## Scripts
|
||||||
|
|
||||||
- `npm run dev`: modo desarrollo (watch + relanzado de Electron).
|
- `npm run dev`: modo desarrollo (watch + relanzado de Electron).
|
||||||
|
|||||||
Generated
+6
-16
@@ -14,14 +14,14 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^22.10.5",
|
"@types/node": "^22.10.5",
|
||||||
"concurrently": "^9.1.2",
|
"concurrently": "^9.1.2",
|
||||||
"electron": "^34.2.0",
|
"electron": "^35.7.5",
|
||||||
"electron-builder": "^25.1.8",
|
"electron-builder": "^25.1.8",
|
||||||
"rimraf": "^6.0.1",
|
"rimraf": "^6.0.1",
|
||||||
"typescript": "^5.7.3",
|
"typescript": "^5.7.3",
|
||||||
"wait-on": "^8.0.1"
|
"wait-on": "^8.0.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=20"
|
"node": ">=22"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@develar/schema-utils": {
|
"node_modules/@develar/schema-utils": {
|
||||||
@@ -2375,15 +2375,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/electron": {
|
"node_modules/electron": {
|
||||||
"version": "34.5.8",
|
"version": "35.7.5",
|
||||||
"resolved": "https://registry.npmjs.org/electron/-/electron-34.5.8.tgz",
|
"resolved": "https://registry.npmjs.org/electron/-/electron-35.7.5.tgz",
|
||||||
"integrity": "sha512-vxLD65mabTzYmEVa9KceMHM0+zO+vqgrhcyNVlmTd0IGV5J7XZ8v/qElm0o4YQ4wPeq7olZkUjZkBQQEdr23/g==",
|
"integrity": "sha512-dnL+JvLraKZl7iusXTVTGYs10TKfzUi30uEDTqsmTm0guN9V2tbOjTzyIZbh9n3ygUjgEYyo+igAwMRXIi3IPw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@electron/get": "^2.0.0",
|
"@electron/get": "^2.0.0",
|
||||||
"@types/node": "^20.9.0",
|
"@types/node": "^22.7.7",
|
||||||
"extract-zip": "^2.0.1"
|
"extract-zip": "^2.0.1"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
@@ -2566,16 +2566,6 @@
|
|||||||
"node": ">= 10.0.0"
|
"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": {
|
"node_modules/emoji-regex": {
|
||||||
"version": "8.0.0",
|
"version": "8.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
|
||||||
|
|||||||
+1
-1
@@ -62,7 +62,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^22.10.5",
|
"@types/node": "^22.10.5",
|
||||||
"concurrently": "^9.1.2",
|
"concurrently": "^9.1.2",
|
||||||
"electron": "^34.2.0",
|
"electron": "^35.7.5",
|
||||||
"electron-builder": "^25.1.8",
|
"electron-builder": "^25.1.8",
|
||||||
"rimraf": "^6.0.1",
|
"rimraf": "^6.0.1",
|
||||||
"typescript": "^5.7.3",
|
"typescript": "^5.7.3",
|
||||||
|
|||||||
+2
-2
@@ -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 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 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 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 NODE_BINARY = process.env.NODECG_NODE_BINARY ?? "node";
|
||||||
|
|
||||||
const isDev = !app.isPackaged;
|
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).",
|
"Detectado error de módulos nativos compilados para otra versión de Node (NODE_MODULE_VERSION).",
|
||||||
USE_SYSTEM_NODE
|
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 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):",
|
"Solución recomendada (en lib/nodecg):",
|
||||||
" 1) npm install",
|
" 1) npm install",
|
||||||
|
|||||||
Reference in New Issue
Block a user