# Referencia de store y sincronización

Operaciones de estado, snapshots, notificaciones, historial y sesiones de sincronización con limpieza explícita.

El store opera con paths de datos y snapshots separados. Su facade de aplicación expone `get`, `getSnapshot`, `set`, `update`, `on` y `batch`; las operaciones de administración, historial y sincronización pertenecen al host.

<span class="section-anchor" id="section-1"></span>

## Elegir la operación

Usa `set` para sustituir un dato, `update` para calcularlo de forma síncrona y `batch` para validar varias escrituras antes de realizar la primera. `on` entrega notificaciones en microtasks; `tap` observa cada commit de forma síncrona. `hydrate` reemplaza la raíz sin crear entradas en el ring buffer ni pasar por taps.

Los valores aceptan datos planos, arrays densos y escalares del codec. Objetos de renderer, funciones, Date, Map, ciclos y promesas no son valores de estado compartido. Un bigint escalar admitido en el store no implica que sea serializable por sync.

<span class="section-anchor" id="section-2"></span>

## Una sesión con dueño

```js
import { wu } from 'wu-framework';

const sync = wu.store.sync({ transport: 'broadcast', room: 'catalog' });
await sync.ready();
wu.store.set('catalog.selectedId', 'p-42');
console.log(sync.status());
// Al terminar la sesión:
sync.stop();
```

Solo las escrituras posteriores a la activación quedan registradas por sync. El orden Last Writer Wins se aplica por path; las escrituras concurrentes sobre padre e hijo no ofrecen la misma convergencia que escrituras al mismo path. Mantén una granularidad consistente y autentica el transporte cuando corresponda.

<span class="section-anchor" id="section-3"></span>

## new WuStore

Crea un store independiente con historial circular.

`new WuStore(bufferSize?: number): WuStore`

- **Parámetros:** bufferSize por defecto 256; elige capacidad del historial, no un límite de bytes del estado.
- **Retorno:** Instancia; tamaño de buffer redondeado a potencia de dos.
- **Errores:** Valores escritos después se validan con el codec del store.
- **Permisos:** Host; no está disponible en la facade de aplicación.
- **Limpieza:** state.dispose() retira sync, listeners y taps.

```js
import { WuStore } from 'wu-framework';
const state = new WuStore(512);
```

Referencia: `src/core/wu-store.js`.

<span class="section-anchor" id="section-4"></span>

## wu.store.tap

Observa cada commit síncronamente, antes de las notificaciones on.

`wu.store.tap(callback): () => void`

- **Parámetros:** callback(sequence,path,value); sirve para journal o transporte.
- **Retorno:** Cleanup; un argumento no función produce un cleanup vacío.
- **Errores:** No realiza filtros por path ni entrega snapshot inicial.
- **Permisos:** Host; no está disponible en la facade de aplicación.
- **Limpieza:** stop() retira el tap.

```js
const stop = wu.store.tap((sequence, path, value) => {
  console.log(sequence, path, value);
});
```

Referencia: `src/core/wu-store.js`.

<span class="section-anchor" id="section-5"></span>

## wu.store.hydrate

Sustituye el estado completo y notifica paths seleccionados.

`wu.store.hydrate(state, { notifyPaths? }?): void`

- **Parámetros:** state: objeto plano; notifyPaths por defecto claves superiores del nuevo estado.
- **Retorno:** void; no añade entradas al ring buffer ni dispara taps.
- **Errores:** WU_STORE_INVALID_VALUE o WU_STORE_INVALID_PATH antes de sustituir el estado.
- **Permisos:** Host; no está disponible en la facade de aplicación.
- **Limpieza:** No crea recursos que deban liberarse.

```js
wu.store.hydrate({ cart: { count: 2 } }, { notifyPaths: ['cart.count'] });
```

Referencia: `src/core/wu-store.js`.

<span class="section-anchor" id="section-6"></span>

## wu.store.getMetrics

Lee conteos de lecturas, escrituras, notificaciones, historial y listeners.

`wu.store.getMetrics(): object`

- **Parámetros:** Sin argumentos.
- **Retorno:** Snapshot de métricas.
- **Errores:** No mide red ni renderizado.
- **Permisos:** Host; no está disponible en la facade de aplicación.
- **Limpieza:** No crea recursos que deban liberarse.

```js
console.log(wu.store.getMetrics().listenerCount);
```

Referencia: `src/core/wu-store.js`.

<span class="section-anchor" id="section-7"></span>

## wu.store.getRecentEvents

Consulta escrituras recientes con secuencia, path, valor y timestamp.

`wu.store.getRecentEvents(count?: number): object[]`

- **Parámetros:** count finito positivo, por defecto 10 y limitado por el buffer.
- **Retorno:** Lista reciente primero; valores separados del estado interno.
- **Errores:** Valores no positivos o no finitos devuelven [].
- **Permisos:** Host; no está disponible en la facade de aplicación.
- **Limpieza:** No crea recursos que deban liberarse.

```js
console.table(wu.store.getRecentEvents(10));
```

Método runtime no enumerado en la declaración WuStore.

Referencia: `src/core/wu-store.js`.

<span class="section-anchor" id="section-8"></span>

## wu.store.reset

Vacía estado e historial y conserva suscripciones y taps.

`wu.store.reset(): void`

- **Parámetros:** Sin argumentos.
- **Retorno:** void.
- **Errores:** No constituye borrado persistente fuera de esta instancia.
- **Permisos:** Host; no está disponible en la facade de aplicación.
- **Limpieza:** No notifica automáticamente un valor inicial vacío; sync sigue activo.

```js
wu.store.reset();
```

Referencia: `src/core/wu-store.js`.

<span class="section-anchor" id="section-9"></span>

## wu.store.dispose

Detiene sync y retira estado, listeners y taps.

`wu.store.dispose(): void`

- **Parámetros:** Sin argumentos.
- **Retorno:** void.
- **Errores:** No constituye borrado persistente fuera de esta instancia.
- **Permisos:** Host; no está disponible en la facade de aplicación.
- **Limpieza:** Úsalo al retirar un store que administras; no sobre el store compartido por otro consumidor.

```js
wu.store.dispose();
```

Referencia: `src/core/wu-store.js`.

<span class="section-anchor" id="section-10"></span>

## wu.store.clear

Ejecuta la misma liberación completa que dispose.

`wu.store.clear(): void`

- **Parámetros:** Sin argumentos.
- **Retorno:** void.
- **Errores:** No constituye borrado persistente fuera de esta instancia.
- **Permisos:** Host; no está disponible en la facade de aplicación.
- **Limpieza:** También elimina suscripciones; no es solo una operación sobre valores.

```js
wu.store.clear();
```

Referencia: `src/core/wu-store.js`.

<span class="section-anchor" id="section-11"></span>

## WuSyncHandle.ready

Espera la carga del módulo y el inicio del transporte.

`sync.ready(): Promise<unknown>`

- **Parámetros:** Handle devuelto por wu.store.sync(options).
- **Retorno:** Promise<unknown>
- **Errores:** ready puede rechazar; status.error expone carga/autorización/transporte.
- **Permisos:** Sesión de host; el relay debe autenticar pares si se usa WebSocket.
- **Limpieza:** stop() cancela la sesión cuando termine su propietario.

```js
await sync.ready();
```

Referencia: `src/core/wu-store.js`.

<span class="section-anchor" id="section-12"></span>

## WuSyncHandle.status

Consulta conexión, relojes, pares y contadores de sincronización.

`sync.status(): WuSyncStatus`

- **Parámetros:** Handle devuelto por wu.store.sync(options).
- **Retorno:** WuSyncStatus
- **Errores:** ready puede rechazar; status.error expone carga/autorización/transporte.
- **Permisos:** Sesión de host; el relay debe autenticar pares si se usa WebSocket.
- **Limpieza:** Lectura sin recursos adicionales.

```js
console.log(sync.status());
```

Referencia: `src/core/wu-store.js`.

<span class="section-anchor" id="section-13"></span>

## WuSyncHandle.stop

Detiene intercambio de mensajes y observación de escrituras.

`sync.stop(): void`

- **Parámetros:** Handle devuelto por wu.store.sync(options).
- **Retorno:** void
- **Errores:** ready puede rechazar; status.error expone carga/autorización/transporte.
- **Permisos:** Sesión de host; el relay debe autenticar pares si se usa WebSocket.
- **Limpieza:** Retira tap y cierra el transporte de esta sesión.

```js
sync.stop();
```

Referencia: `src/core/wu-store.js`.

<span class="section-anchor" id="section-14"></span>

## WuSyncHandle.connected

Consulta si el transporte de la sesión está conectado.

`sync.connected: boolean`

- **Parámetros:** Handle devuelto por wu.store.sync(options).
- **Retorno:** boolean
- **Errores:** ready puede rechazar; status.error expone carga/autorización/transporte.
- **Permisos:** Sesión de host; el relay debe autenticar pares si se usa WebSocket.
- **Limpieza:** Lectura de estado; la sesión se libera con stop.

```js
console.log(sync.connected);
```

Referencia: `src/core/wu-store.js`.