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