lsa-planer

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

/ src domain id.ts

1,4 KB Rohdatei
src/domain/id.ts — 34 Zeilen
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 }