Schéma a validace
Definujte typovaná schémata bucketů s omezením, automaticky generovanými poli, unikátními indexy a formátovými validátory. Záznamy se validují automaticky při každém zápisu.
Reaktivní store se schématem
In-memory store s automatickou validací schématu, reaktivními dotazy ve stylu Convex, ACID transakcemi a pluggable perzistencí. Postavený na noex GenServer primitivech pro odolnou správu dat.
Vše potřebné pro reaktivní správu dat v Node.js
Definujte typovaná schémata bucketů s omezením, automaticky generovanými poli, unikátními indexy a formátovými validátory. Záznamy se validují automaticky při každém zápisu.
Sledování závislostí ve stylu Convex automaticky přepočítává dotazy při změně podkladových dat. Granularita na úrovni záznamu i bucketu s deep-equality porovnáním.
Atomické zápisy přes více bucketů s optimistickým zamykáním. Čtení vlastních zápisů v rámci transakce, automatický rollback při konfliktu a události publikovány až po commitu.
Přepínejte mezi File, SQLite nebo Memory adaptéry. Debounced batching udržuje zápisy efektivní. Opt-out per bucket pro efemérní data.
Per-record TTL s čitelným formátem doby trvání a automatickým mazáním. Evikce při překročení maximální velikosti bucketu odstraní nejstarší záznamy.
Wildcard pub/sub na mutacích bucketů. Odebírejte konkrétní buckety, typy událostí nebo všechny změny jedním patternem. Pod kapotou pohání reaktivní dotazy i perzistenci.
Jeden GenServer na bucket, supervisovaný strategií one-for-one. Pokud bucket spadne, ostatní běží dál.
Každý bucket běží ve vlastním GenServeru — plná izolace procesů, sekvenční zpracování zpráv, žádné race conditions.
QueryManager odebírá EventBus pro notifikace o změnách. Persistence debouncuje zápisy přes EventBus. Veškerá koordinace je event-driven.
Reálné ukázky kódu: definice schématu, reaktivní dotazy a transakce
import { Store } from '@hamicek/noex-store';
const store = await Store.start();
await store.defineBucket('users', {
key: 'id',
schema: {
id: { type: 'string', generated: 'uuid' },
name: { type: 'string', required: true },
email: { type: 'string', format: 'email', unique: true },
role: { type: 'string', enum: ['admin', 'user'], default: 'user' },
},
});
const users = store.bucket('users');
// Insert — validated against schema, id auto-generated
const alice = await users.insert({
name: 'Alice',
email: '[email protected]',
});
// Read
const user = await users.get(alice.id);
// Update
await users.update(alice.id, { role: 'admin' });
// Query
const admins = await users.where({ role: 'admin' });noex-store vs populární reaktivní stores a klientské databáze
| Feature | noex-store | RxDB | TinyBase | SignalDB | LokiJS | Dexie.js | WatermelonDB |
|---|---|---|---|---|---|---|---|
| Reaktivní dotazy | Convex-style | RxJS Observables | Query engine | Signal-based | DynamicViews | liveQuery | observe() |
| Validace schématu | Vestavěné DSL | JSON Schema | Schematizers | Validate event | — | — | Column types |
| Multi-kolekční transakce | Optimistické zamykání | — | Single-store | — | Single-coll. | ACID | Writer blocks |
| Perzistence | Adapter-based | Swappable storage | Adapters | Adapters | Adapters | IndexedDB | SQLite |
| TTL / Auto-expirace | First-class | Cleanup only | — | — | Buggy | — | — |
| Event bus s wildcards | Topic pub/sub | RxJS streams | Granular listeners | Collection events | Collection events | Hooks | Observables |
| In-memory first | ✓ | — | ✓ | ✓ | ✓ | — | — |
| Supervision strom | OTP one_for_one | — | — | — | — | — | — |
| Sekundární indexy | Unique + non-unique | JSON Schema | Indexes API | Query selectors | Unique + binary | Core feature | isIndexed |
| Velikost (gzip) | ~5 kB | 60–150+ kB | 3.5–8 kB | ~5–8 kB | ~20 kB | ~26 kB | ~2 MB |
| Stav | Aktivní | Aktivní (freemium) | Aktivní | Aktivní | Archivovaný | Aktivní | Aktivní |
Každý bucket je izolovaný GenServer aktor. Pokud jeden spadne, supervisor ho restartuje, zatímco ostatní pokračují bez přerušení.
Deklarativní expirace per bucket s automatickým mazáním na pozadí a _expiresAt metadaty.
Běžné async funkce se stávají živými subskripcemi s automatickým sledováním závislostí na úrovni bucketu i záznamu.
Optimistické zamykání na základě verzí s atomickým commitem a best-effort rollbackem napříč kolekcemi.
Odebírejte patterny jako bucket.*.deleted nebo bucket.users.* napříč celým storem.
Přidejte noex-store do svého projektu během vteřin
$ npm install @hamicek/noex-store Líbí se vám noex? Pomozte nám pokračovat ve vývoji