Hub - Entwickler
Interner Laufzeitfluss
Der Hub orchestriert registrierte Module, Datenupdates und Publishing in einem festen Ablauf:
ce.ControlExtensionist der stabile Einstiegspunkt für EEP-Skripte.ModuleRegistryregistriert die verwendeten Lua-Module.MainLoopRunnerführt Initialisierung und Zyklus aus.CeHubModule.init()registriert Hub-Publisher und Hub-Funktionen und startet die Initial-Discovery und Initial-Updates.CeHubModule.run()führt die laufende Discovery und die laufenden Updates aus.- Die registrierten Publisher veröffentlichen Änderungen über
DataChangeBus. InternalDataStorekann daraus einen materialisierten Snapshot halten.ServerEventBuffernimmt veröffentlichte Events für die Bridge entgegen.- Die Bridge schreibt Austauschdateien und liest Remote-Kommandos.
Design-Entscheidung: Die öffentliche API beschränkt sich auf ce.ControlExtension. Interne Pfade unter ce.hub.* sind Infrastruktur und gelten nicht als stabile öffentliche API.
Rollen im Hub-Datenpfad
Für die Hub-Daten gilt heute eine klare Aufteilung der Verantwortlichkeiten:
DomainZustand, Getter/Setter und Dirty-TrackingRegistryzentrale Map der bekannten Objekte nach IDDiscoveryerkennt neue und entfernte ObjekteUpdaterliest EEP-Zustand und schreibt per Setter in die Domain-ObjektePublisherwertet Sync-Optionen aus und sendet Add/Change/Remove-EventsDtoFactorybaut serialisierbare DTOs
Einfachere Singleton-CeTypes wie Zeit, Wetter, Version oder Runtime nutzen meist nur Registry + Updater + Publisher, folgen aber denselben Zuständigkeitsgrenzen:
- Fetch-Logik liegt im
Updater - Sync-Logik liegt im
Publisher
Rolle von CeHubModule
CeHubModule ist heute der zentrale Orchestrator des Hub-Datenpfads.
Es übernimmt insbesondere:
- Anwenden der Hub-Optionen aus
HubOptionDefaultsund Schreiben der wirksamen Optionen inHubOptionsRegistry - Initial-Discovery und Initial-Updates in
init() - laufende Discovery und Updates in
run()
Typische Aufrufe im aktiven Pfad sind zum Beispiel:
StructureDiscovery.runInitialDiscovery()StructureUpdater.runInitialUpdate(...)SignalDiscovery.runDiscovery()SignalUpdater.runUpdate(...)TrainDiscovery.runDiscovery(...)TrainUpdater.runUpdate(...)RollingStockUpdater.runUpdate(...)
Rolle der *StatePublisher
Die historischen *StatePublisher.lua-Dateien existieren weiterhin, aber ihre Verantwortung ist heute kleiner:
- sie bleiben die registrierbaren Objekte für
StatePublisherRegistry - sie halten kompatible Felder wie
name,enabled,initialize()undsyncState() - auf dem aktiven Pfad rufen sie nur noch den zugehörigen
Publisher.syncState(...)auf
Das bedeutet:
- Discovery gehört nicht mehr in die StatePublisher
- Fetch-Logik gehört nicht mehr in die StatePublisher
- die eigentliche Synchronisationsentscheidung bleibt beim
Publisher
Bridge-Anbindung
Der HubBridgeConnector registriert die Hub-Publisher an der StatePublisherRegistry, damit sie über den DataChangeBus veröffentlichen können.
Diese Trennung bleibt bewusst bestehen:
- Fachlogik kennt den BridgeConnector nicht
- der BridgeConnector kennt die registrierbaren Publisher
DataChangeBusbleibt generische Event-Infrastruktur
MainLoopRunner und Publisher-Lebenszyklus
Der MainLoopRunner arbeitet weiterhin mit Modulen und registrierten Publisher-Adaptern:
module.init()module.run()statePublisher.initialize()statePublisher.syncState()
Wichtig ist aber die neue Verantwortung innerhalb dieses Schemas:
- die relevante Datenarbeit liegt bei den Modulen, insbesondere bei
CeHubModule statePublisher.initialize()ist meist nur noch leichtgewichtig oder ein KompatibilitätshakenstatePublisher.syncState()delegiert an den eigentlichenPublisher
Discovery mit gekoppelten CeTypes
Nicht jeder CeType scannt die Welt unabhängig. Der wichtigste gekoppelte Pfad ist der Zugpfad:
TrainDiscoveryerkennt Tracks, Züge und RollingStock-Existenz gemeinsamTrainUpdateraktualisiert ZugobjekteRollingStockUpdateraktualisiert RollingStock-ObjekteTrackPublisher,TrainPublisherundRollingStockPublisherveröffentlichen ihre Änderungen getrennt
Dadurch bleibt die Discovery zentral, während Registry, Updater und Publisher weiter je CeType getrennt bleiben.
Events
Die aktiven Hub-Publisher transportieren ihre Nutzdaten primär über DataChangeBus.fire*().
syncState() ist side-effect-only und liefert keine Nutzdaten zurück.
Weiterführende Dokumentation
- options/OPTIONS.md - Hub-Optionen, Fetch-Policy und Sync-Policy
- data/README_DEV.md - Rollen und DTO-Fluss der Hub-Daten
- data/DTO.md - aktive CeTypes und DTO-Felder
- docs/Architecture.md - Hub-Architektur und aktuelle Zielstruktur
Informationen für Anwender: README.md