import { BaseEvent, EventBus } from 'bubus'
import { z } from 'zod'
const JobEvent = BaseEvent.extend('JobEvent', {
order: z.number(),
delay_ms: z.number(),
})
const bus = new EventBus('FifoBus')
const startedOrder: number[] = []
const completedOrder: number[] = []
bus.on(JobEvent, async (event) => {
startedOrder.push(event.order)
await new Promise((resolve) => setTimeout(resolve, event.delay_ms))
completedOrder.push(event.order)
})
const emitted = [
bus.emit(JobEvent({ order: 0, delay_ms: 30 })),
bus.emit(JobEvent({ order: 1, delay_ms: 1 })),
bus.emit(JobEvent({ order: 2, delay_ms: 20 })),
]
await bus.waitUntilIdle()
console.log(startedOrder)
// [0, 1, 2]
console.log(completedOrder)
// [0, 1, 2]
console.log(emitted.map((event) => Boolean(event.event_started_at)))
// [true, true, true]
console.log(emitted.map((event) => Boolean(event.event_completed_at)))
// [true, true, true]
console.log(
Date.parse(emitted[0].event_started_at!) <=
Date.parse(emitted[1].event_started_at!) &&
Date.parse(emitted[1].event_started_at!) <= Date.parse(emitted[2].event_started_at!)
)
// true
console.log(
Date.parse(emitted[0].event_completed_at!) <=
Date.parse(emitted[1].event_completed_at!) &&
Date.parse(emitted[1].event_completed_at!) <= Date.parse(emitted[2].event_completed_at!)
)
// true