lsa-planer

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

/ electron verweise.ts

1,9 KB Rohdatei
electron/verweise.ts — 43 Zeilen
1 import type { Verweisziel } from '../shared/ipc';
2 import { VERWEISADRESSEN } from '../shared/verweise';
3
4 /**
5 * Vom Schluessel zur Adresse - die Tafel selbst steht in `shared/verweise.ts`.
6 *
7 * WARUM DIESE STELLE UEBERHAUPT: Der Renderer schickt ueber
8 * `IPC.oeffneVerweis` einen SCHLUESSEL und keine Adresse. Was geoeffnet wird,
9 * entscheidet allein der Hauptprozess - hier. Naehme der Kanal eine Adresse
10 * entgegen, bestimmte am Ende jeder, der etwas in die Oberflaeche traegt,
11 * wohin `shell.openExternal` zeigt, und das ist im Zweifel eine Projektdatei
12 * aus fremder Hand. Ueber genau dieses Muster liess sich im Altbestand
13 * beliebiger Kode ausfuehren.
14 *
15 * Dass die Oberflaeche die Adresse KENNT, ist etwas anderes und unbedenklich:
16 * Sie muss den Quellcodevermerk nach Artikel 3 der EUPL lesbar anzeigen. Lesen
17 * darf sie, bestimmen nicht.
18 */
19
20 /** Alle Schluessel - fuer die Pruefung, dass keiner ohne Adresse dasteht. */
21 export const VERWEISZIELE = Object.keys(VERWEISADRESSEN) as readonly Verweisziel[];
22
23 /**
24 * Die Adresse zu einem Schluessel, oder `null`.
25 *
26 * `null` statt eines Ausnahmefehlers und statt eines Rueckfalls: Was hier
27 * ankommt, kommt aus dem Renderer, und der Typ ist dort eine Behauptung und
28 * keine Messung. Ein Rueckfall auf irgendeine Adresse waere die falsche
29 * Richtung - was nicht in der Tafel steht, oeffnet nichts.
30 *
31 * Durchgehen statt nachschlagen, und ohne Zusicherung: Ein
32 * `VERWEISADRESSEN[ziel as Verweisziel]` verlangte eine Zusicherung auf einen
33 * Typ, den der Wert vielleicht gar nicht hat - genau die Behauptung, gegen die
34 * diese Funktion geschrieben ist. Drei Eintraege durchzugehen kostet nichts,
35 * und `Object.entries` fasst keine geerbten Eigennamen an: `__proto__` oder
36 * `toString` ergeben damit keine Adresse.
37 */
38 export function verweisadresse(ziel: unknown): string | null {
39 for (const [schluessel, adresse] of Object.entries(VERWEISADRESSEN)) {
40 if (schluessel === ziel) return adresse;
41 }
42 return null;
43 }