diff --git a/packages/core-events/src/event-bus.interface.ts b/packages/core-events/src/event-bus.interface.ts new file mode 100644 index 0000000..ffc5721 --- /dev/null +++ b/packages/core-events/src/event-bus.interface.ts @@ -0,0 +1,23 @@ +import type { z } from "zod"; +import type { EventDescriptor } from "./event-descriptor"; + +export type EventHandler = (event: T) => Promise; + +export interface IEventBus { + publish( + descriptor: EventDescriptor>, + payload: T, + ): Promise; + + /** + * Subscribe a handler. `consumerFeature` is the kebab-case name of the + * subscribing feature (e.g., "marketing-pages"). InMemoryEventBus uses it + * only as a debug tag; PayloadJobsEventBus uses it to name the fan-out task + * slug deterministically (`__events..`). + */ + subscribe( + descriptor: EventDescriptor>, + consumerFeature: string, + handler: EventHandler, + ): void; +} diff --git a/packages/core-events/src/symbols.ts b/packages/core-events/src/symbols.ts new file mode 100644 index 0000000..10bb1a7 --- /dev/null +++ b/packages/core-events/src/symbols.ts @@ -0,0 +1,3 @@ +export const CORE_EVENTS_SYMBOLS = { + IEventBus: Symbol.for("@repo/core-events/IEventBus"), +} as const;