pub struct IdempotentHandler { /* private fields */ }Expand description
Wrapper around an EventHandler that adds idempotency tracking.
The IdempotentHandler wraps an inner handler and:
- Generates a deterministic event ID before calling the inner handler.
- Tracks which events have been processed (by their deterministic ID).
- In normal mode, always calls the inner handler (for upsert semantics).
- Provides the
ReplayContextfor the inner handler to use.
Note: the inner handler is always called even for already-seen events, because entity upsert is the correct idempotent behavior. The tracking is for observability and metrics, not for skipping events.
Implementations§
Source§impl IdempotentHandler
impl IdempotentHandler
Sourcepub fn new(inner: Arc<dyn EventHandler>, replay_ctx: ReplayContext) -> Self
pub fn new(inner: Arc<dyn EventHandler>, replay_ctx: ReplayContext) -> Self
Create a new idempotent handler wrapping the given event handler.
Sourcepub fn replay_context(&self) -> &ReplayContext
pub fn replay_context(&self) -> &ReplayContext
Returns the current replay context.
Sourcepub fn processed_count(&self) -> usize
pub fn processed_count(&self) -> usize
Returns the number of events processed by this handler.
Sourcepub fn has_processed(&self, event_id: &str) -> bool
pub fn has_processed(&self, event_id: &str) -> bool
Returns true if an event with the given deterministic ID has been processed.
Sourcepub fn side_effect_guard(&self) -> SideEffectGuard
pub fn side_effect_guard(&self) -> SideEffectGuard
Create a SideEffectGuard for this handler’s replay context.
Trait Implementations§
Source§impl EventHandler for IdempotentHandler
impl EventHandler for IdempotentHandler
Source§fn handle<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
event: &'life1 DecodedEvent,
ctx: &'life2 IndexContext,
) -> Pin<Box<dyn Future<Output = Result<(), IndexerError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn handle<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
event: &'life1 DecodedEvent,
ctx: &'life2 IndexContext,
) -> Pin<Box<dyn Future<Output = Result<(), IndexerError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Called for each decoded event that matches the handler’s schema.
Source§fn schema_name(&self) -> &str
fn schema_name(&self) -> &str
The event schema name this handler processes (e.g.
"ERC20Transfer").Auto Trait Implementations§
impl !Freeze for IdempotentHandler
impl !RefUnwindSafe for IdempotentHandler
impl Send for IdempotentHandler
impl Sync for IdempotentHandler
impl Unpin for IdempotentHandler
impl UnsafeUnpin for IdempotentHandler
impl !UnwindSafe for IdempotentHandler
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more