lsa-planer
LSA-Planer Professional – Planungssoftware für Lichtsignalanlagen nach RiLSA 2015 und § 45 StVO. EUPL-1.2.
| 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 | } |