/** * Vertrag zwischen Renderer und Electron-Hauptprozess. * * Diese Datei wird von BEIDEN Seiten eingebunden - vom Hauptprozess ueber * tsconfig.electron.json und vom Renderer ueber den Alias "@shared". Dadurch * kann ein Kanal nicht mehr auf einer Seite umbenannt werden, ohne dass die * andere Seite beim Uebersetzen bricht. * * Im Altbestand waren die Kanalnamen an drei Stellen als Zeichenketten * hinterlegt (Renderer, preload.js, main.js). Der Renderer rief unter anderem * Kanaele auf, die im preload gar nicht angeboten wurden; der Aufruf lief still * ins Leere, und die zugehoerige Schaltflaeche tat nichts. */ export const IPC = { saveFile: 'lsa:save-file', openFile: 'lsa:open-file', writeFile: 'lsa:write-file', readFile: 'lsa:read-file', setDirty: 'lsa:set-dirty', menuCommand: 'lsa:menu-command', requestClose: 'lsa:request-close', closeResponse: 'lsa:close-response', logError: 'lsa:log-error', logPath: 'lsa:log-path', fetchMapImage: 'lsa:fetch-map-image', oeffneVerweis: 'lsa:oeffne-verweis', } as const; /** * Die Ziele, die sich aus dem Programm heraus oeffnen lassen. * * EIN SCHLUESSEL UND KEINE ADRESSE - das ist der ganze Punkt dieses Kanals. * `shell.openExternal` gibt eine Zeichenkette an das Betriebssystem; naehme * dieser Kanal eine Adresse entgegen, koennte eine praeparierte Projektdatei * ueber jeden Weg, der Projektdaten in die Oberflaeche traegt, bestimmen, was * sich oeffnet. Genau so liess sich im Altbestand ueber den Dateipfad * beliebiger Code ausfuehren. * * Der Hauptprozess bildet den Schluessel auf eine dort fest hinterlegte Adresse * ab. Aus dem Renderer kommt nie mehr als eines dieser drei Woerter, und ein * viertes bricht schon beim Uebersetzen. */ export type Verweisziel = 'internetseite' | 'quellcode' | 'unterstuetzung'; /** Abruf eines Kartenbilds beim amtlichen Dienst. */ export interface KartenAnfrage { readonly url: string; } export interface KartenAntwort { readonly ok: boolean; /** Bilddaten als Daten-URL; nur bei ok === true belegt. */ readonly datenUrl: string | null; readonly fehler: string | null; } /** Meldung an das Fehlerprotokoll. */ export interface ErrorReport { /** Wo ist der Fehler aufgetreten? */ readonly quelle: string; readonly nachricht: string; readonly stapel?: string; /** Zustand der Anwendung zum Zeitpunkt des Fehlers, fuer die Einordnung. */ readonly zustand?: Record; } export type IpcChannel = (typeof IPC)[keyof typeof IPC]; export interface FileDialogFilter { readonly name: string; readonly extensions: readonly string[]; } export interface SaveFileRequest { readonly defaultName: string; readonly filters: readonly FileDialogFilter[]; readonly data: string | Uint8Array; } export interface SaveFileResult { readonly ok: boolean; readonly canceled: boolean; readonly filePath: string | null; readonly error: string | null; } export interface OpenFileResult { readonly ok: boolean; readonly canceled: boolean; readonly filePath: string | null; readonly content: string | null; readonly error: string | null; } /** Befehle, die das Anwendungsmenue an den Renderer sendet. */ export type MenuCommand = 'neu' | 'oeffnen' | 'speichern' | 'speichern-unter' | 'export' | 'hilfe' | 'ueber';