Skip to main content

bpm_engine_runtime/
handler.rs

1//! EventHandler trait and EngineContext (design: handler.md §5, §6).
2//! Context holds async storage store references.
3
4use async_trait::async_trait;
5use bpm_engine_core::EngineEvent;
6use bpm_engine_storage::{
7    CompensationRecordRepo, ExternalTaskStore, HistoryRepo, OutboxRepo, ParallelJoinRepo,
8    ProcessDefinitionStore, ProcessInstanceStore, TimerStore, TokenStore,
9};
10use std::sync::Arc;
11
12/// Design: handler.md §5 — handle(event, ctx) -> Vec<EngineEvent>. Async for storage access.
13#[async_trait]
14pub trait EventHandler: Send + Sync {
15    async fn handle(&self, event: &EngineEvent, ctx: &mut EngineContext) -> Vec<EngineEvent>;
16}
17
18/// Design: handler.md §6 — execution environment for handlers (stores from storage).
19#[derive(Default)]
20pub struct EngineContext {
21    pub process_store: Option<Arc<dyn ProcessInstanceStore>>,
22    pub token_store: Option<Arc<dyn TokenStore>>,
23    pub process_def_store: Option<Arc<dyn ProcessDefinitionStore>>,
24    pub parallel_join_repo: Option<Arc<dyn ParallelJoinRepo>>,
25    pub timer_store: Option<Arc<dyn TimerStore>>,
26    pub compensation_repo: Option<Arc<dyn CompensationRecordRepo>>,
27    pub outbox_repo: Option<Arc<dyn OutboxRepo>>,
28    pub external_task_store: Option<Arc<dyn ExternalTaskStore>>,
29    pub history_repo: Option<Arc<dyn HistoryRepo>>,
30    pub tenant_id: Option<String>,
31}