lsa-planer
LSA-Planer Professional – Planungssoftware für Lichtsignalanlagen nach RiLSA 2015 und § 45 StVO. EUPL-1.2.
| 1 | /** |
| 2 | * Kennungen fuer Datensaetze. |
| 3 | * |
| 4 | * Der Altbestand verwendete Date.now() als Kennung. Werden zwei Signalgruppen |
| 5 | * im selben Millisekundenfenster angelegt - was beim Einfuegen aus einer Vorlage |
| 6 | * regelmaessig vorkommt - erhalten beide dieselbe Kennung, und alle Verweise |
| 7 | * darauf werden mehrdeutig. |
| 8 | */ |
| 9 | |
| 10 | let counter = 0; |
| 11 | |
| 12 | /** Erzeugt eine eindeutige, stabile Kennung. */ |
| 13 | export function createId(prefix = 'id'): string { |
| 14 | counter += 1; |
| 15 | // Eine Faehigkeitsprobe, keine Typfrage: lib.dom fuehrt `crypto` als immer |
| 16 | // vorhanden, der Linter beanstandet das Fragezeichen deshalb. Zur Laufzeit |
| 17 | // gilt das nicht ueberall - im Browser gibt es `crypto.randomUUID` nur in |
| 18 | // einem als sicher geltenden Zusammenhang, und als globales Objekt kennt |
| 19 | // Node `crypto` erst ab Fassung 19. Der Rueckfall darunter ist genau dafuer |
| 20 | // da; ohne die Probe erreicht ihn niemand mehr. |
| 21 | const random = |
| 22 | // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- crypto ist nicht in jedem Zusammenhang global; siehe darueber |
| 23 | typeof globalThis.crypto?.randomUUID === 'function' |
| 24 | ? globalThis.crypto.randomUUID().slice(0, 8) |
| 25 | : Math.floor(Math.random() * 0xffffffff) |
| 26 | .toString(16) |
| 27 | .padStart(8, '0'); |
| 28 | return `${prefix}-${counter.toString(36)}-${random}`; |
| 29 | } |
| 30 | |
| 31 | /** Nur fuer Tests: setzt den Zaehler zurueck. */ |
| 32 | export function resetIdCounter(): void { |
| 33 | counter = 0; |
| 34 | } |