gestion_table_tournante_libre/electron/preload.cjs
Mathieu Benoit 8b7c732399 [ADD] platform: print bridge, atomic byte writes, badge sheet file name
Printed views and the badge sheet leave the app through the platform. Under
Electron a gtt:imprimer channel prints with the paper and orientation asked
for and reports sent, cancelled, failed or unknown; an exception is logged
to the console and never shown raw to the operator. Every file system,
real or simulated, writes bytes atomically from a copy taken at the call.
The sheet name carries event, date and imposition, and a failed print
becomes IMPRESSION_ECHEC.
Checked: red first, twelve mutations caught; 3502 node, 659 browser and 79
long tests green from the index alone.

--- FR ---

[ADD] plateforme : pont d'impression, octets atomiques, nom de planche

Les vues imprimables et la planche sortent de l'application par la
plateforme. Sous Electron, un canal gtt:imprimer imprime au papier et à
l'orientation demandés et rend envoyé, annulé, échec ou inconnu ; une
exception va à la console, jamais brute à l'opérateur. Chaque système de
fichiers, réel ou simulé, écrit des octets de façon atomique, depuis une
copie prise à l'appel. Le nom de la planche porte événement, date et
imposition, et une impression échouée devient IMPRESSION_ECHEC.
Vérifié : rouge d'abord, douze mutations attrapées ; 3502 node, 659
navigateur et 79 longues vertes depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-09 15:26:13 -04:00

54 lines
2 KiB
JavaScript

// © 2026 TechnoLibre (http://www.technolibre.ca)
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
// Préchargement de la coquille (§ 13.1) : le seul pont entre la page et le
// processus principal. Il expose window.gtt et rien d'autre : sous
// gtt.fichiers, une fonction par primitive du système de fichiers, qui
// invoque le canal de cette primitive, gtt:fichiers:<primitive>, et rend la
// réponse du processus principal (electron/fichiers.js) ; gtt.copier(texte),
// qui invoque le canal gtt:copier et remet le texte au presse-papiers du
// système ; gtt.imprimer({papier, orientation}), qui invoque le canal
// gtt:imprimer et rend l'issue de l'impression (electron/impression.js). La
// page ne reçoit jamais ipcRenderer lui-même, ni une fonction qui
// invoquerait un canal de son choix.
//
// Un préchargement exécuté en bac à sable est un script CommonJS, d'où
// l'extension .cjs dans un paquet de type module. Son require ne connaît
// qu'electron et quelques modules de Node, et non les fichiers du projet :
// les primitives et les noms des canaux s'écrivent donc ici, les primitives
// dans l'ordre de l'interface, et test/coquille.test.js éprouve qu'ils sont
// ceux des canaux que pose le processus principal.
const { contextBridge, ipcRenderer } = require('electron');
const PRIMITIVES = [
'emplacements',
'racines',
'choisirDossier',
'sonder',
'typeSupport',
'lireTexte',
'ecrireAtomique',
'ecrireOctetsAtomique',
'ajouterLigne',
'lister',
'creerDossier',
'deplacer',
'supprimer',
'verrouiller',
'deverrouiller',
'ouvrirDansExplorateur',
'choisirFichierAImporter',
'enregistrerSous',
];
const fichiers = {};
for (const primitive of PRIMITIVES) {
const canal = `gtt:fichiers:${primitive}`;
fichiers[primitive] = (...parametres) => ipcRenderer.invoke(canal, ...parametres);
}
const copier = (texte) => ipcRenderer.invoke('gtt:copier', texte);
const imprimer = (demande) => ipcRenderer.invoke('gtt:imprimer', demande);
contextBridge.exposeInMainWorld('gtt', { fichiers, copier, imprimer });