import { bindPersistence, forgeDomain, memoryPersistence, telemetryModule } from 'zudux-state'; type OrderState = { status: 'draft' | 'confirmed'; items: Array<{ sku: string; quantity: number; price: number }>; }; export const orders = forgeDomain({ name: 'orders', seed: (): OrderState => ({ status: 'draft', items: [] }), commands: { addItem(context, item: { sku: string; quantity: number; price: number }) { context.edit((draft) => draft.items.push(item)); }, confirm(context) { context.edit((draft) => { draft.status = 'confirmed'; }); }, }, policy: ({ command, actor }) => command !== 'confirm' || actor === 'checkout-service', invariants: [ (state) => { if (state.items.some((item) => item.quantity < 1 || item.price < 0)) { throw new Error('Invalid line item'); } if (state.status === 'confirmed' && state.items.length === 0) { throw new Error('An empty order cannot be confirmed'); } }, ], modules: [telemetryModule({ commit: (entry) => console.info(`[order] ${entry.command} committed in ${entry.durationMs}ms`), })], freeze: true, }); await orders.atomic('checkout', async (flow) => { await flow.invoke('addItem', { sku: 'ZD-100', quantity: 2, price: 49 }); await flow.invoke('confirm', undefined, { actor: 'checkout-service' }); }); const persistence = bindPersistence(orders, memoryPersistence(), { key: 'orders', version: 1, }); await persistence.ready; await persistence.flush();