import { BaseEvent, EventBus } from 'bubus'
import { z } from 'zod'
const WorkEvent = BaseEvent.extend('WorkEvent', {
order: z.number(),
source: z.string(),
})
const busA = new EventBus('BusSerialA', { event_concurrency: 'bus-serial' })
const busB = new EventBus('BusSerialB', { event_concurrency: 'bus-serial' })
const startsA: number[] = []
const startsB: number[] = []
busA.on(WorkEvent, async (event) => {
startsA.push(event.order)
await new Promise((resolve) => setTimeout(resolve, 2))
})
busB.on(WorkEvent, async (event) => {
startsB.push(event.order)
await new Promise((resolve) => setTimeout(resolve, 2))
})
for (let i = 0; i < 4; i += 1) {
busA.emit(WorkEvent({ order: i, source: 'a' }))
busB.emit(WorkEvent({ order: i, source: 'b' }))
}
await busA.waitUntilIdle()
await busB.waitUntilIdle()
if (JSON.stringify(startsA) !== JSON.stringify([0, 1, 2, 3])) throw new Error('bus A FIFO failed')
if (JSON.stringify(startsB) !== JSON.stringify([0, 1, 2, 3])) throw new Error('bus B FIFO failed')