Skip to content
🔵Entwurf (gut)70%
Vollständigkeit:
85%
Korrektheit:
90%
⏳ Noch nicht geprüft

Event System – API-Referenz

Dieses Dokument ist die API-orientierte Referenz zu src/utils/events.ts. Es beschreibt die öffentlichen Exporte, Event-Typen, Dispatcher, Listener, Queue-/Retry-Mechanik und Persistenzfunktionen. Die Architektur und die Abgrenzung der drei Event-Ebenen (lokal, Hauptfenster, Cross-Window) sind im Dokument Event Handling & Cross-Window Kommunikation beschrieben.

Übersicht

events.ts ist die Ebene B des p2d2-Event-Systems: die fachlichen Hauptfenster-Events. Das Modul ist vollständig typsicher aufgebaut:

  • P2D2EventType definiert alle fachlichen Event-Namen (Präfix p2d2:).
  • P2D2EventMap verknüpft jeden Event-Typ mit einem Detail-Interface.
  • dispatchP2D2Event() dispatcht typisierte Events mit Throttling.
  • Eine interne Queue mit Retry-Mechanik macht das Dispatchen robust gegenüber einem noch nicht bereiten Event-System.
  • logToEventConsole() integriert die EventConsole, sofern sie als window.__P2D2_EVENT_CONSOLE__ verfügbar ist.
  • Kleine Persistenzhelfer verwalten ausgewählte Kommune und CRS in localStorage.

Konstanten:

ts
const THROTTLE_MS = 200;              // Standard-Throttling in ms
const MAX_RETRIES = 3;                // Maximale Wiederholungen der Queue
const RETRY_DELAY = 250;              // definiert, derzeit im sichtbaren Queue-Pfad nicht verwendet
const QUEUE_PROCESS_INTERVAL = 100;   // Intervall der Queue-Verarbeitung in ms

P2D2EventType

Das Enum P2D2EventType ist der zentrale Event-Katalog. Alle Werte tragen das Präfix p2d2:.

Enum-KonstanteEvent-StringDomäne
KOMMUNEN_FOCUSp2d2:kommunen:focusKommune fokussieren (Karte/Zoom)
KOMMUNEN_SELECTEDp2d2:kommunen:selectedKommune ausgewählt
CATEGORY_SELECTEDp2d2:category:selectedKategorie ausgewählt
MAP_READYp2d2:map:readyKarte initialisiert
MAP_MOVEENDp2d2:map:moveendKartenbewegung abgeschlossen
MAP_ZOOMENDp2d2:map:zoomendZoom abgeschlossen
MAP_CLICKp2d2:map:clickKlick auf die Karte
LAYER_TOGGLEp2d2:layer:toggleLayer umgeschaltet
LAYER_VISIBILITY_CHANGEp2d2:layer:visibility:changeLayer-Sichtbarkeit geändert
WFS_LOAD_STARTp2d2:wfs:load:startWFS-Ladevorgang gestartet
WFS_LOAD_COMPLETEp2d2:wfs:load:completeWFS-Ladevorgang erfolgreich
WFS_LOAD_ERRORp2d2:wfs:load:errorWFS-Ladevorgang fehlgeschlagen
WFS_FEATURE_CREATEDp2d2:wfs:feature:createdWFS-Feature erstellt
WFS_FEATURE_UPDATEDp2d2:wfs:feature:updatedWFS-Feature aktualisiert
WFS_FEATURE_DELETEDp2d2:wfs:feature:deletedWFS-Feature gelöscht
EDITOR_READYp2d2:editor:readyEditor initialisiert
EDITOR_FEATURE_MODIFIEDp2d2:editor:feature:modifiedFeature im Editor modifiziert
EDITOR_TOOL_SWITCHp2d2:editor:tool:switchWerkzeug gewechselt
EDITOR_MODE_CHANGEp2d2:editor:mode:changeEditor-Modus geändert
EDITOR_FEATURE_SELECTEDp2d2:editor:feature:selectedFeature ausgewählt
EDITOR_FEATURE_DESELECTEDp2d2:editor:feature:deselectedFeature abgewählt
EDITOR_SAVE_STARTp2d2:editor:save:startSpeichern begonnen
EDITOR_SAVE_COMPLETEp2d2:editor:save:completeSpeichern erfolgreich
EDITOR_SAVE_ERRORp2d2:editor:save:errorSpeichern fehlgeschlagen
CRS_CHANGEp2d2:crs:changeKoordinatensystem gewechselt
UI_PANEL_TOGGLEp2d2:ui:panel:toggleUI-Panel umgeschaltet

Zusätzlich wird ein Kompatibilitäts-Alias exportiert:

ts
export const EVENT_KOMMUNEN_FOCUS = P2D2EventType.KOMMUNEN_FOCUS;

P2D2EventMap

P2D2EventMap bildet jeden Event-Typ typsicher auf sein Detail-Interface ab. Sie wird von Dispatcher und Listenern verwendet, damit beim Aufruf bereits zur Compile-Zeit die korrekten Details erzwungen werden.

ts
export interface P2D2EventMap {
  [P2D2EventType.KOMMUNEN_FOCUS]: KommunenFocusDetail;
  [P2D2EventType.KOMMUNEN_SELECTED]: KommunenSelectedDetail;
  [P2D2EventType.CATEGORY_SELECTED]: CategorySelectedDetail;
  // ... alle übrigen Event-Typen analog
}

Belegte Detail-Interfaces (Auszug der gelesenen Felder):

ts
export interface KommunenFocusDetail {
  center?: [number, number];
  extent?: [number, number, number, number];
  zoom?: number;
  projection?: string;
  extra?: any;
  slug?: string;
  wpName?: string;
  osmAdminLevels?: number[];
}

export interface KommunenSelectedDetail {
  slug: string;
  wpName: string;
  osmAdminLevels?: number[];
  timestamp: number;
}

export interface CategorySelectedDetail {
  categorySlug: string;
  timestamp: number;
}

export interface MapReadyDetail {
  mapId?: string;
  view?: any;
  projection?: string;
  timestamp: number;
  center: number[];
  zoom: number | undefined;
}

export interface WFSLoadStartDetail {
  layerName: string;
  kommuneSlug?: string;
  categorySlug?: string;
  timestamp: number;
}

export interface WFSLoadCompleteDetail {
  layerName: string;
  kommuneSlug?: string;
  categorySlug?: string;
  featureCount: number;
  timestamp: number;
  success: boolean;
  error?: string;
}

export interface WFSLoadErrorDetail {
  layerName: string;
  kommuneSlug?: string;
  categorySlug?: string;
  error: string;
  timestamp: number;
}

Weitere Interfaces in P2D2EventMap: LayerToggleDetail, MapMoveEndDetail, MapZoomEndDetail, MapClickDetail, LayerVisibilityChangeDetail, WFSFeatureCreatedDetail, WFSFeatureUpdatedDetail, WFSFeatureDeletedDetail, EditorReadyDetail, EditorFeatureModifiedDetail, EditorToolSwitchDetail, EditorModeChangeDetail, EditorFeatureSelectedDetail, EditorFeatureDeselectedDetail, EditorSaveStartDetail, EditorSaveCompleteDetail, EditorSaveErrorDetail, CRSChangeDetail, UIPanelToggleDetail.

dispatchP2D2Event()

Der typsichere Standard-Dispatcher für fachliche Hauptfenster-Events.

ts
export function dispatchP2D2Event<T extends P2D2EventType>(
  eventType: T,
  detail: P2D2EventMap[T],
  options?: { throttleMs?: number },
): void
  • Standard-Throttling: THROTTLE_MS (200 ms) pro Event-Typ.
  • Mit options.throttleMs: 0 kann das Throttling für einen einzelnen Aufruf deaktiviert werden (verwendet zum Beispiel im KommunenClickHandler und im KategorienGrid).
  • Der Dispatch durchläuft intern dispatchThrottledEvent(), das bei Bedarf die Queue- und Retry-Mechanik anstößt.

addP2D2EventListener()

Typsicherer Listener zum Registrieren eines Event-Handlers.

ts
export function addP2D2EventListener<T extends P2D2EventType>(
  eventType: T,
  handler: (event: CustomEvent<P2D2EventMap[T]>) => void,
  options?: AddEventListenerOptions,
): void

Beispiel aus MapCanvas.astro:

ts
addP2D2EventListener(P2D2EventType.KOMMUNEN_FOCUS, (e) => {
  const d = (e as CustomEvent)?.detail || {};
  // ...
}, { passive: true });

addEventListener()

addEventListener() kapselt die Registrierung von window-Event-Listenern und legt Handler-Referenzen auf window ab. Die Funktion enthält einen Versuch zur HMR-Absicherung. Wegen der dynamischen Schlüsselbildung mit Date.now() ist aus dem aktuellen Code jedoch keine verlässliche Deduplizierung gleichartiger vorheriger Registrierungen ableitbar.

ts
export function addEventListener(
  eventName: string,
  handler: (event: any) => void,
  options?: AddEventListenerOptions,
): void

logToEventConsole()

Protokolliert ein Event in der EventConsole, sofern diese verfügbar ist.

ts
export function logToEventConsole(
  eventName: string,
  detail: any,
  meta?: {
    retryCount?: number;
    throttled?: boolean;
    success?: boolean;
    error?: string;
    source?: string;
    windowId?: string;
    crossWindow?: boolean;
    timestamp?: number;
  },
): void

Die Funktion prüft das globale Objekt window.__P2D2_EVENT_CONSOLE__; nur wenn es existiert, wird logEvent() aufgerufen. Sie schlägt bei Fehlern still fehl (Debug-Funktionalität). Die EventConsole protokolliert ausschließlich Vorgänge, die diese Funktion erreichen – sie beobachtet keine beliebigen DOM-Events.

Event-Queue und Retry

Bei nicht bereitem Event-System (document.readyState === "loading" oder window.dispatchEvent nicht vorhanden) werden Events in eine interne Queue gelegt und mit Retry verarbeitet:

  • MAX_RETRIES = 3
  • RETRY_DELAY ist als Konstante definiert (250 ms), wird im aktuell sichtbaren Queue-/Retry-Pfad jedoch nicht verwendet – es wird keine garantierte Retry-Verzögerung dokumentiert.
  • QUEUE_PROCESS_INTERVAL = 100 ms
  • isEventSystemReady() prüft die Bereitschaft des Event-Systems.

Die Queue wird über processEventQueue() abgearbeitet; ein Flag verhindert rekursive Verarbeitung. Fehlgeschlagene Dispatches werden bis zur MAX_RETRIES-Grenze erneut eingereiht.

Die folgenden Funktionen sind intern und nicht öffentlicher Teil der API: throttle(), isEventSystemReady(), processEventQueue(), queueEvent(), dispatchThrottledEvent(), isValidWgs84Coordinate(), isValidWgs84Extent().

Persistenz

events.ts stellt kleine Helfer für ausgewählte Einstellungen in localStorage bereit:

ts
const STORAGE_KEYS = {
  SELECTED_CRS: "p2d2_selected_crs",
  SELECTED_KOMMUNE: "p2d2_selected_kommune",
};
FunktionBeschreibung
getSelectedCRS(): string | nullLiest den zuletzt gewählten CRS-Schlüssel.
setSelectedCRS(crs: string): voidSchreibt den CRS-Schlüssel.
getSelectedKommune(): string | nullLiest den zuletzt gewählten Kommunen-Schlüssel.
setSelectedKommune(slug: string): voidSchreibt den Kommunen-Schlüssel.
clearSelections(): voidEntfernt beide Schlüssel.

Hinweis: Neben events.ts verwenden weitere Dateien eigene Persistenzschlüssel (unter anderem map-state.ts, kommunen-click-handler.ts, index.astro). Die Schlüssel sind derzeit nicht einheitlich benannt. Dies wird in der Dokumentation als Ist-Zustand beobachtet, aber nicht behoben.

Nicht Teil dieser Datei

events.ts enthält kein Logger-Modul (logger.ts), keine WFS-Client-Funktionen, kein Request-Caching und keine Klartext-Zugangsdaten. Frühere Dokumentfassungen haben solche Inhalte dieser Datei zugeschrieben; sie sind nicht durch den Quellcode belegt und wurden entfernt. Die WFS-Integration ist in WFS-Layer-Architektur dokumentiert, die Cross-Window-Kommunikation in Event Handling & Cross-Window Kommunikation.

Änderungshistorie

VersionDatumÄnderung
1.02026-08-06Dokumentation am aktuellen Quellcode ausgerichtet; frühere, nicht mehr belegbare Aussagen entfernt oder als historisch markiert.
1.12026-08-06RETRY_DELAY-Nutzung und HMR-Deduplizierung von addEventListener präzisiert (externer Review).