lsa-planer

LSA-Planer Professional – Planungssoftware für Lichtsignalanlagen nach RiLSA 2015 und § 45 StVO. EUPL-1.2.

/ src platform bridge.ts

3,0 KB Rohdatei
src/platform/bridge.ts — 88 Zeilen
1 import type {
2 ErrorReport,
3 KartenAnfrage,
4 KartenAntwort,
5 FileDialogFilter,
6 MenuCommand,
7 OpenFileResult,
8 SaveFileRequest,
9 SaveFileResult,
10 Verweisziel,
11 } from '@shared/ipc';
12
13 /**
14 * Bruecke zum Electron-Hauptprozess.
15 *
16 * Die Anwendung laeuft sowohl als Desktop-Programm (Electron) als auch im
17 * Browser. Alles, was nur im Desktop-Betrieb moeglich ist, geht ueber diese
18 * eine Schnittstelle; jede Stelle prueft ueber `desktopBridge()`, ob sie
19 * verfuegbar ist, statt auf `window.require` oder `process` zu raten.
20 *
21 * Die Typen stammen aus shared/ipc.ts und werden vom Preload-Skript
22 * (electron/preload.ts) implementiert. Eine Aenderung an einem Kanal faellt
23 * dadurch beim Uebersetzen auf und nicht erst zur Laufzeit.
24 */
25
26 export type {
27 ErrorReport,
28 KartenAnfrage,
29 KartenAntwort,
30 FileDialogFilter,
31 MenuCommand,
32 OpenFileResult,
33 SaveFileRequest,
34 SaveFileResult,
35 } from '@shared/ipc';
36
37 export interface DesktopBridge {
38 readonly platform: 'electron';
39 readonly appVersion: string;
40 saveFile(request: SaveFileRequest): Promise<SaveFileResult>;
41 openFile(filters: readonly FileDialogFilter[]): Promise<OpenFileResult>;
42 /** Schreibt in eine zuvor ueber einen Dialog bestaetigte Datei. */
43 writeFile(filePath: string, data: string | Uint8Array): Promise<SaveFileResult>;
44 readFile(filePath: string): Promise<OpenFileResult>;
45 /** Meldet dem Hauptprozess, ob ungespeicherte Aenderungen bestehen. */
46 setDirty(dirty: boolean): void;
47 /** Traegt einen Fehler in das Fehlerprotokoll ein. */
48 reportError(bericht: ErrorReport): void;
49 /** Pfad der Protokolldatei, zum Anzeigen in der Hilfe. */
50 logPath(): Promise<string>;
51 /**
52 * Holt ein Kartenbild ueber den Hauptprozess.
53 *
54 * Der Renderer baut selbst keine Verbindung nach aussen auf - seine
55 * Inhaltssicherheitsrichtlinie verbietet das. Der Abruf erfolgt im
56 * Hauptprozess gegen eine feste Liste erlaubter Rechnernamen.
57 */
58 fetchMapImage(anfrage: KartenAnfrage): Promise<KartenAntwort>;
59 /**
60 * Oeffnet eines von drei festen Zielen im Standardbrowser.
61 *
62 * Ein SCHLUESSEL, keine Adresse: Die Adresse dahinter steht im Hauptprozess
63 * (`electron/verweise.ts`) und laesst sich von hier aus nicht setzen. Sonst
64 * bestimmte am Ende jeder, der etwas in die Oberflaeche traegt, wohin
65 * `shell.openExternal` zeigt - und das ist im Zweifel eine Projektdatei aus
66 * fremder Hand.
67 */
68 oeffneVerweis(ziel: Verweisziel): void;
69 /** Empfaengt Menuebefehle des Hauptprozesses. */
70 onMenuCommand(handler: (command: MenuCommand) => void): () => void;
71 /** Der Hauptprozess fragt vor dem Schliessen nach. */
72 onBeforeClose(handler: () => Promise<boolean>): void;
73 }
74
75 declare global {
76 interface Window {
77 lsaPlaner?: DesktopBridge;
78 }
79 }
80
81 /** Gibt die Desktop-Bruecke zurueck, sofern die Anwendung in Electron laeuft. */
82 export function desktopBridge(): DesktopBridge | undefined {
83 return typeof window !== 'undefined' ? window.lsaPlaner : undefined;
84 }
85
86 export function hasDesktopBridge(): boolean {
87 return desktopBridge() !== undefined;
88 }