Skip to main content
BaseEvent is the typed payload + runtime state object that flows through the bus. Use subclassing (Python) or BaseEvent.extend(...) (TypeScript) to define event payload fields.

Defining events

from bubus import BaseEvent

class FooCreateEvent(BaseEvent[str]):
    id: str | None = None
    name: str
    age: int

Core metadata fields

Common event metadata fields available in both runtimes:
  • event_id: unique UUIDv7
  • event_type: event name/type key
  • event_version: payload version marker
  • event_result_type: expected handler return schema/type
  • event_timeout: per-event timeout override
  • event_handler_timeout: per-handler timeout cap override
  • event_handler_slow_timeout: per-handler slow warning threshold
  • event_concurrency: event scheduling mode override
  • event_handler_concurrency: handler scheduling mode override
  • event_handler_completion: handler completion strategy override

Runtime fields

  • event_status: pending/started/completed
  • event_created_at, event_started_at, event_completed_at
  • event_parent_id: parent event link
  • event_path: buses traversed
  • event_results: per-handler result entries
  • Child-event tracking (event_children/descendants)

Completion model

Events are returned in pending state from emit()/emit(), then complete asynchronously.
pending = bus.emit(MyEvent())
completed = await pending
value = await completed.event_result()

Result access helpers

first()

value = await event.first()
# equivalent: await event.event_result(...) with first-completion mode

All results

by_handler = await event.event_results_by_handler_id()
items = await event.event_results_list()
flat_dict = await event.event_results_flat_dict(raise_if_conflicts=False)
flat_list = await event.event_results_flat_list()

reset()

You can create a fresh pending copy for re-emit.
fresh = event.reset()

Serialization

Events are JSON-serializable in both implementations for bridge and cross-runtime workflows.
payload = event.model_dump(mode='json')
restored = type(event).model_validate(payload)

Notes

  • Keep custom payload field names away from event_* reserved metadata names.
  • event_result_type drives handler return validation in both runtimes.
  • Parent-child tracking is automatic when events are emitted from handlers.