@bimetal/alert-data
v0.39.0
Published
Event-sourced alert lifecycle aggregate: scheduled → requested → dispatched/failed/cancelled, keyed by a deterministic triggerKey so replay never re-delivers. Built on @bimetal/event-sourcing.
Downloads
476
Maintainers
Readme
@bimetal/alert-data
Der Alert-Zustellungs-Lebenszyklus als EIN Event-Sourcing-Aggregat, multi-entity. Built on @bimetal/event-sourcing. Vorbild: @bimetal/kanban-data, @bimetal/calendar-data.
Jeder Alert ist über einen deterministischen triggerKey keyed (entityId = triggerKey). Das ist die Idempotenz, die Replay/Rehydrate/Sync NIE erneut zustellen lässt — ein Re-ScheduleAlert auf einen existierenden Key und ein Re-RequestAlert eines bereits zugestellten Alerts sind No-ops.
Installation
npm install @bimetal/alert-data @bimetal/event-sourcingWhat's Inside
Domain
Alert—{ triggerKey, ruleId, subjectId, channel, recipient, payload, fireAt, status, attempts, lastError? }.triggerKeyist die Entity-ID;channel/recipientsind Strings → keine Abhängigkeit auf@bimetal/channel, der Host mappt den Channel-Namen auf einen echtenChannel.AlertStatus—scheduled | requested | dispatched | failed | cancelled.AlertSpec— wasScheduleAlertträgt.
Lebenszyklus (Commands → Events)
| Command | Event | Idempotenz |
|---|---|---|
| ScheduleAlert(spec) | AlertScheduled | existiert triggerKey schon → No-op |
| RequestAlert(key) | AlertRequested | auf requested/dispatched/cancelled → No-op (das Exactly-once-Gate) |
| MarkDispatched(key) | AlertDispatched | nur auf requested; doppelt → No-op |
| MarkFailed(key, error) | AlertFailed | nur auf requested; attempts++, errors-as-state |
| CancelAlert(key) | AlertCancelled | auf dispatched/cancelled → No-op |
failed → RequestAlert ist erlaubt (Retry). Command-Creators: scheduleAlert, requestAlert, markDispatched, markFailed, cancelAlert.
Store
createAlertStore(config?)— verdrahtet das Aggregat übercreateDomainStore. FacadeAlertStoremitgetAlerts(),getAlert(triggerKey),getByStatus(status)plus dem generischendispatch/rebuild.AlertReadModel—{ alerts: Record<triggerKey, Alert>, version }(prototype-sicher).
Designprinzipien
- Idempotenz strukturell, nicht nur über das Command-ID-Fenster. Schicht 1 =
processedCommandIds(50 tief, Optimierung); Schicht 2 =state.events.has(triggerKey)— unbegrenzt, trägt jeden sendrelevanten Übergang. - Opake Payload. Das Aggregat speichert die pre-renderte Nachricht als
unknown+ Channel-Name als String. Der Store-eigenestructuredCloneam dispatch-Eingang validiert (verwirft non-cloneable Payload) und detacht von der Caller-Referenz — das Aggregat braucht keinen eigenen Payload-Guard. - Keine externen Side-Effects. Senden gehört in
@bimetal/alerting; dieses Paket ist reines, replaybares Zustandsmanagement.
License
Apache License 2.0
