/** * module: event —— 本模块要外界提供的能力(编码规范 §10.1 / §5.3)。 * * 注意层级:event 是 L1,而任务(L6)、触发器(L7)、消息(L2)都在其上 —— 三级消费的 * 三个下游一律以**端口**声明、由 app 装配注入,event 不反向依赖上层(§4 / §5.2)。 */ import type { Delivery, Envelope, EventId, RegisteredListener, TaskId } from '@contracts'; import type { OutboundRef } from './internal/domain/ownership.ts'; import type { ConditionEvaluator } from './internal/domain/listener-match.ts'; export type Clock = { now(): Date }; export type IdGenerator = { next(): string }; export type { ConditionEvaluator }; /** 事件存储 —— 「先持久后投递」的底座 */ export type EventStore = { /** 信封落库与入队同一事务 */ persistAndEnqueue(envelope: Envelope, targets: readonly Delivery[]): Promise; get(id: EventId): Promise; listByTask(taskId: TaskId, limit: number): Promise; listenersOf(taskId: TaskId): Promise; /** 全部 armed 监听 —— 事件到达时的匹配面 */ armedListeners(): Promise; saveListener(listener: RegisteredListener): Promise; setListenerState(id: string, state: RegisteredListener['state']): Promise; expiredListeners(now: Date): Promise; saveOutbound(ref: OutboundRef): Promise; recentOutbound(sinceMs: number, now: Date): Promise; /** 消费幂等表:唯一约束成功返回 true,冲突返回 false */ claimConsumption(eventId: EventId, consumer: string): Promise; getDelivery(id: string): Promise; updateDelivery(delivery: Delivery): Promise; scheduleRetry(deliveryId: string, delayMs: number): Promise; }; /** 触发器判定 —— app 注入 `trigger`(L7)的只读用例;返回命中的触发器 ID */ export type TriggerMatcher = { match(envelope: Envelope): Promise }; /** 死信与无主兜底 —— app 注入 `message`(L2) */ export type MessageFallback = { deadLetter(envelope: Envelope, error: string): Promise; unowned(envelope: Envelope, fallbackPosition: string | undefined): Promise; };