CRDT Guidelines
Critical: Draft-Style Mutations Only
typescript
// CORRECT - mutate in place
setState((state) => {
state.transactions[id] = transaction;
});
// WRONG - returning new objects breaks change tracking
setState((state) => ({
...state,
transactions: { ...state.transactions, [id]: transaction },
}));
Rules
- •Import types from
schema.ts, don't redeclare - •Soft deletes: Set
deletedAttimestamp, never remove from document - •Use
crypto.randomUUID()for IDs,Date.now()for timestamps
Schema Pattern
typescript
export const entitySchema = schema.LoroMap({
id: schema.String({ required: true }),
// ... fields
deletedAt: schema.Number(), // 0 = not deleted, >0 = timestamp
});
React Hooks
- •
useActiveTransactions()- excludes soft-deleted - •
useTransactions()- includes soft-deleted - •
useVaultAction()- for mutations
Sync
- •Updates encrypted before leaving client
- •Loro handles versioning via version vectors
- •Conflicts: last-write-wins per field