gestion_table_tournante_libre/electron/main.js

49 lines
2.2 KiB
JavaScript
Raw Normal View History

[ADD] electron: own shell, portable Windows exe built under podman The deliverable is a single-file portable executable whose Electron the project updates itself. The shell keeps context isolation on, Node integration off and the page sandboxed; one IPC channel returns the folder the portable launcher publishes. The build runs in a no-Wine image pinned by digest, relays no host variable, refuses to overwrite a built number, removes what a failed build leaves, and accepts only the name version.json gives. The spec stops claiming the portable target needs Wine. Checked: exe built in 86 s, resource FileVersion 2026.1005.1.0 and © 2026 TechnoLibre; 109 node tests pass; two end-of-build mutations fail. --- FR --- [ADD] electron : coquille propre, exécutable portable construit sous podman Le livrable est un exécutable portable à fichier unique, dont le projet met lui-même Electron à jour. La coquille garde l'isolation de contexte, coupe l'intégration de Node et isole la page ; un seul canal IPC rend le dossier que publie le lanceur portable. La construction s'exécute dans une image sans Wine épinglée par empreinte, ne relaie aucune variable de l'hôte, refuse d'écraser un numéro construit, retire ce qu'un échec laisse, et n'accepte que le nom que donne version.json. Le spec cesse d'affirmer que la cible portable exige Wine. Vérifié : exécutable construit en 86 s, ressource FileVersion 2026.1005.1.0 et © 2026 TechnoLibre ; 109 épreuves node passent ; deux mutations du contrôle de fin échouent. Assisted-by: Claude Opus 5.5
2026-10-05 13:13:32 -04:00
// © 2026 TechnoLibre (http://www.technolibre.ca)
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
// Processus principal de la coquille Electron (§ 13.1) : une fenêtre qui
// charge la page construite par Vite dans www/, et un seul canal IPC, que
// electron/preload.cjs expose à la page sous window.gtt.
//
// La page n'a ni Node ni accès au disque : isolation de contexte active,
// intégration de Node coupée, rendu en bac à sable. Elle n'atteint le
// processus principal que par les canaux que ce module traite. Un nom importé
// interprété comme du balisage reste ainsi une faute d'affichage, et non un
// accès au disque.
import { app, BrowserWindow, ipcMain } from 'electron';
import { fileURLToPath } from 'node:url';
// Chemins relatifs à ce module : ils valent dans le dépôt comme dans
// l'archive app.asar de l'exécutable, qui reproduit electron/ et www/.
const PRECHARGEMENT = fileURLToPath(new URL('./preload.cjs', import.meta.url));
const PAGE = fileURLToPath(new URL('../www/index.html', import.meta.url));
// Dossier de l'exécutable livré (§ 8.6, point 1). L'exécutable portable est
// une archive auto-extractible : l'application tourne depuis un dossier
// temporaire effacé à la sortie, et le lanceur publie son propre dossier dans
// PORTABLE_EXECUTABLE_DIR avant de la lancer. Hors de ce lanceur, la variable
// est absente ; vide, elle ne désigne aucun dossier. Dans les deux cas, le
// canal rend null. Le gestionnaire est posé avant le chargement de la page,
// qui peut l'appeler dès son premier script.
ipcMain.handle('gtt:dossier-executable', () => process.env.PORTABLE_EXECUTABLE_DIR || null);
function creerFenetre() {
const fenetre = new BrowserWindow({
width: 1366,
height: 768,
webPreferences: {
preload: PRECHARGEMENT,
contextIsolation: true,
nodeIntegration: false,
sandbox: true,
},
});
// La page ne quitte jamais www/ : toute nouvelle fenêtre est refusée, toute
// navigation annulée, quelle que soit sa cible.
fenetre.webContents.setWindowOpenHandler(() => ({ action: 'deny' }));
fenetre.webContents.on('will-navigate', (evenement) => evenement.preventDefault());
fenetre.loadFile(PAGE);
}
app.whenReady().then(creerFenetre);