/** * Kennungen fuer Datensaetze. * * Der Altbestand verwendete Date.now() als Kennung. Werden zwei Signalgruppen * im selben Millisekundenfenster angelegt - was beim Einfuegen aus einer Vorlage * regelmaessig vorkommt - erhalten beide dieselbe Kennung, und alle Verweise * darauf werden mehrdeutig. */ let counter = 0; /** Erzeugt eine eindeutige, stabile Kennung. */ export function createId(prefix = 'id'): string { counter += 1; // Eine Faehigkeitsprobe, keine Typfrage: lib.dom fuehrt `crypto` als immer // vorhanden, der Linter beanstandet das Fragezeichen deshalb. Zur Laufzeit // gilt das nicht ueberall - im Browser gibt es `crypto.randomUUID` nur in // einem als sicher geltenden Zusammenhang, und als globales Objekt kennt // Node `crypto` erst ab Fassung 19. Der Rueckfall darunter ist genau dafuer // da; ohne die Probe erreicht ihn niemand mehr. const random = // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- crypto ist nicht in jedem Zusammenhang global; siehe darueber typeof globalThis.crypto?.randomUUID === 'function' ? globalThis.crypto.randomUUID().slice(0, 8) : Math.floor(Math.random() * 0xffffffff) .toString(16) .padStart(8, '0'); return `${prefix}-${counter.toString(36)}-${random}`; } /** Nur fuer Tests: setzt den Zaehler zurueck. */ export function resetIdCounter(): void { counter = 0; }