import { BaseEvent, EventBus } from 'bubus'
import { z } from 'zod'
const ParallelEvent = BaseEvent.extend('ParallelEvent', { order: z.number() })
const bus = new EventBus('ParallelEventBus', {
event_concurrency: 'parallel',
event_handler_concurrency: 'parallel',
})
let inFlight = 0
let maxInFlight = 0
let release!: () => void
const gate = new Promise<void>((resolve) => {
release = resolve
})
bus.on(ParallelEvent, async () => {
inFlight += 1
maxInFlight = Math.max(maxInFlight, inFlight)
await gate
await new Promise((resolve) => setTimeout(resolve, 10))
inFlight -= 1
})
bus.emit(ParallelEvent({ order: 0 }))
bus.emit(ParallelEvent({ order: 1 }))
await new Promise((resolve) => setTimeout(resolve, 0))
release()
await bus.waitUntilIdle()
if (maxInFlight < 2) throw new Error('expected overlapping events')