import { BaseEvent, EventBus, events_suck } from 'bubus'
import { z } from 'zod'
const CreateUserEvent = BaseEvent.extend('CreateUserEvent', {
name: z.string(),
age: z.number(),
event_result_type: z.string(),
})
const UpdateUserEvent = BaseEvent.extend('UpdateUserEvent', {
id: z.string(),
age: z.number().nullable().optional(),
event_result_type: z.boolean(),
})
type UserRecord = { id: string; name: string; age: number }
const users = new Map<string, UserRecord>()
const onCreate = async (event: InstanceType<typeof CreateUserEvent>) => {
const user_id = `user-${event.age}`
users.set(user_id, { id: user_id, name: event.name, age: event.age })
return user_id
}
const onUpdate = async (event: InstanceType<typeof UpdateUserEvent>) => {
const existing = users.get(event.id)
if (!existing) return false
if (event.age !== undefined && event.age !== null) existing.age = event.age
users.set(event.id, existing)
return true
}
const bus = new EventBus('SDKBus')
bus.on(CreateUserEvent, onCreate)
bus.on(UpdateUserEvent, onUpdate)
const SDKClient = events_suck.wrap('SDKClient', {
create: CreateUserEvent,
update: UpdateUserEvent,
})
const client = new SDKClient(bus)
const user_id = await client.create({ name: 'bob', age: 45 }, { nickname: 'bobby' })
const updated = await client.update({ id: user_id ?? 'fallback-id', age: 46 }, { source: 'sync' })