import { BaseEvent, EventBus } from 'bubus'
import { z } from 'zod'
const CheckoutEvent = BaseEvent.extend('CheckoutEvent', {
order_id: z.string(),
event_result_type: z.string(),
})
const ReserveInventoryEvent = BaseEvent.extend('ReserveInventoryEvent', {
order_id: z.string(),
event_result_type: z.string(),
})
const ChargeCardEvent = BaseEvent.extend('ChargeCardEvent', {
order_id: z.string(),
event_result_type: z.string(),
})
const FraudCheckEvent = BaseEvent.extend('FraudCheckEvent', {
order_id: z.string(),
event_result_type: z.string(),
})
const SendReceiptEvent = BaseEvent.extend('SendReceiptEvent', {
order_id: z.string(),
event_result_type: z.string(),
})
const bus = new EventBus('TreeBus')
bus.on(CheckoutEvent, async (event) => {
const reserve = event.bus!.emit(ReserveInventoryEvent({ order_id: event.order_id }))
await reserve.done()
const charge = event.bus!.emit(ChargeCardEvent({ order_id: event.order_id }))
await charge.done()
const receipt = event.bus!.emit(SendReceiptEvent({ order_id: event.order_id }))
await receipt.done()
return `${reserve.event_result}|${charge.event_result}|${receipt.event_result}`
})
bus.on(ReserveInventoryEvent, async (event) => `reserve:${event.order_id}`)
bus.on(ChargeCardEvent, async (event) => {
const fraud = event.bus!.emit(FraudCheckEvent({ order_id: event.order_id }))
await fraud.done()
return `charge:${event.order_id}:${fraud.event_result}`
})
bus.on(FraudCheckEvent, async (event) => `fraud-ok:${event.order_id}`)
bus.on(SendReceiptEvent, async (event) => `receipt:${event.order_id}`)
const root = bus.emit(CheckoutEvent({ order_id: 'ord-123' }))
await root.done()
await bus.waitUntilIdle()
console.log(root.event_result)
console.log(bus.logTree())