lsa-planer

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

/ shared ipc.ts

3,3 KB Rohdatei
shared/ipc.ts — 98 Zeilen
1 /**
2 * Vertrag zwischen Renderer und Electron-Hauptprozess.
3 *
4 * Diese Datei wird von BEIDEN Seiten eingebunden - vom Hauptprozess ueber
5 * tsconfig.electron.json und vom Renderer ueber den Alias "@shared". Dadurch
6 * kann ein Kanal nicht mehr auf einer Seite umbenannt werden, ohne dass die
7 * andere Seite beim Uebersetzen bricht.
8 *
9 * Im Altbestand waren die Kanalnamen an drei Stellen als Zeichenketten
10 * hinterlegt (Renderer, preload.js, main.js). Der Renderer rief unter anderem
11 * Kanaele auf, die im preload gar nicht angeboten wurden; der Aufruf lief still
12 * ins Leere, und die zugehoerige Schaltflaeche tat nichts.
13 */
14
15 export const IPC = {
16 saveFile: 'lsa:save-file',
17 openFile: 'lsa:open-file',
18 writeFile: 'lsa:write-file',
19 readFile: 'lsa:read-file',
20 setDirty: 'lsa:set-dirty',
21 menuCommand: 'lsa:menu-command',
22 requestClose: 'lsa:request-close',
23 closeResponse: 'lsa:close-response',
24 logError: 'lsa:log-error',
25 logPath: 'lsa:log-path',
26 fetchMapImage: 'lsa:fetch-map-image',
27 oeffneVerweis: 'lsa:oeffne-verweis',
28 } as const;
29
30 /**
31 * Die Ziele, die sich aus dem Programm heraus oeffnen lassen.
32 *
33 * EIN SCHLUESSEL UND KEINE ADRESSE - das ist der ganze Punkt dieses Kanals.
34 * `shell.openExternal` gibt eine Zeichenkette an das Betriebssystem; naehme
35 * dieser Kanal eine Adresse entgegen, koennte eine praeparierte Projektdatei
36 * ueber jeden Weg, der Projektdaten in die Oberflaeche traegt, bestimmen, was
37 * sich oeffnet. Genau so liess sich im Altbestand ueber den Dateipfad
38 * beliebiger Code ausfuehren.
39 *
40 * Der Hauptprozess bildet den Schluessel auf eine dort fest hinterlegte Adresse
41 * ab. Aus dem Renderer kommt nie mehr als eines dieser drei Woerter, und ein
42 * viertes bricht schon beim Uebersetzen.
43 */
44 export type Verweisziel = 'internetseite' | 'quellcode' | 'unterstuetzung';
45
46 /** Abruf eines Kartenbilds beim amtlichen Dienst. */
47 export interface KartenAnfrage {
48 readonly url: string;
49 }
50
51 export interface KartenAntwort {
52 readonly ok: boolean;
53 /** Bilddaten als Daten-URL; nur bei ok === true belegt. */
54 readonly datenUrl: string | null;
55 readonly fehler: string | null;
56 }
57
58 /** Meldung an das Fehlerprotokoll. */
59 export interface ErrorReport {
60 /** Wo ist der Fehler aufgetreten? */
61 readonly quelle: string;
62 readonly nachricht: string;
63 readonly stapel?: string;
64 /** Zustand der Anwendung zum Zeitpunkt des Fehlers, fuer die Einordnung. */
65 readonly zustand?: Record<string, string | number | boolean>;
66 }
67
68 export type IpcChannel = (typeof IPC)[keyof typeof IPC];
69
70 export interface FileDialogFilter {
71 readonly name: string;
72 readonly extensions: readonly string[];
73 }
74
75 export interface SaveFileRequest {
76 readonly defaultName: string;
77 readonly filters: readonly FileDialogFilter[];
78 readonly data: string | Uint8Array;
79 }
80
81 export interface SaveFileResult {
82 readonly ok: boolean;
83 readonly canceled: boolean;
84 readonly filePath: string | null;
85 readonly error: string | null;
86 }
87
88 export interface OpenFileResult {
89 readonly ok: boolean;
90 readonly canceled: boolean;
91 readonly filePath: string | null;
92 readonly content: string | null;
93 readonly error: string | null;
94 }
95
96 /** Befehle, die das Anwendungsmenue an den Renderer sendet. */
97 export type MenuCommand =
98 'neu' | 'oeffnen' | 'speichern' | 'speichern-unter' | 'export' | 'hilfe' | 'ueber';