# Referência de store e sincronização

Operações de estado, snapshots, notificações, histórico e sessões de sincronização com limpeza explícita.

O store opera com caminhos de dados e snapshots separados. Sua fachada de aplicação expõe `get`, `getSnapshot`, `set`, `update`, `on` e `batch`; as operações de administração, histórico e sincronização pertencem ao host.

<span id="elegir-la-operación"></span>

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

## Escolher a operação

Use `set` para substituir um dado, `update` para calculá-lo de forma síncrona e `batch` para validar várias escritas antes de realizar a primeira. `on` entrega notificações em microtasks; `tap` observa cada commit de forma síncrona. `hydrate` substitui a raiz sem criar entradas no buffer circular nem passar pelos taps.

Os valores aceitam dados simples, arrays densos e escalares do codec. Objetos de renderizador, funções, Date, Map, ciclos e promises não são valores de estado compartilhado. Um bigint escalar aceito no store não significa que seja serializável pelo sync.

<span id="una-sesión-con-dueño"></span>

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

## Uma sessão com proprietário

```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();
```

Apenas as escritas posteriores à ativação são registradas pelo sync. A ordem Last Writer Wins é aplicada por caminho; escritas concorrentes sobre pai e filho não oferecem a mesma convergência que escritas no mesmo caminho. Mantenha uma granularidade consistente e autentique o transporte quando necessário.

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

## new WuStore

Cria um store independente com histórico circular.

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

- **Parâmetros:** bufferSize 256 por padrão; escolhe a capacidade do histórico, não um limite de bytes do estado.
- **Retorno:** Instância; tamanho do buffer arredondado para uma potência de dois.
- **Erros:** Os valores escritos depois são validados com o codec do store.
- **Permissões:** Host; não está disponível na facade da aplicação.
- **Limpeza:** state.dispose() remove sync, listeners e taps.

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

Referência: `src/core/wu-store.js`.

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

## wu.store.tap

Observa cada commit de forma síncrona, antes das notificações on.

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

- **Parâmetros:** callback(sequence,path,value); serve para diário ou transporte.
- **Retorno:** Limpeza; um argumento que não seja função produz uma limpeza vazia.
- **Erros:** Não realiza filtros por caminho nem entrega um snapshot inicial.
- **Permissões:** Host; não está disponível na facade da aplicação.
- **Limpeza:** stop() remove o tap.

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

Referência: `src/core/wu-store.js`.

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

## wu.store.hydrate

Substitui o estado completo e notifica os caminhos selecionados.

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

- **Parâmetros:** state: objeto simples; notifyPaths usa por padrão as chaves superiores do novo estado.
- **Retorno:** void; não adiciona entradas ao buffer circular nem dispara taps.
- **Erros:** WU_STORE_INVALID_VALUE ou WU_STORE_INVALID_PATH antes de substituir o estado.
- **Permissões:** Host; não está disponível na facade da aplicação.
- **Limpeza:** Não cria recursos que precisem ser liberados.

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

Referência: `src/core/wu-store.js`.

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

## wu.store.getMetrics

Lê contagens de leituras, escritas, notificações, histórico e listeners.

`wu.store.getMetrics(): object`

- **Parâmetros:** Sem argumentos.
- **Retorno:** Snapshot de métricas.
- **Erros:** Não mede rede nem renderização.
- **Permissões:** Host; não está disponível na facade da aplicação.
- **Limpeza:** Não cria recursos que precisem ser liberados.

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

Referência: `src/core/wu-store.js`.

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

## wu.store.getRecentEvents

Consulta escritas recentes com sequência, caminho, valor e timestamp.

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

- **Parâmetros:** count finito positivo, 10 por padrão e limitado pelo buffer.
- **Retorno:** Lista com os mais recentes primeiro; valores separados do estado interno.
- **Erros:** Valores não positivos ou não finitos retornam [].
- **Permissões:** Host; não está disponível na facade da aplicação.
- **Limpeza:** Não cria recursos que precisem ser liberados.

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

Método do runtime não listado na declaração WuStore.

Referência: `src/core/wu-store.js`.

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

## wu.store.reset

Esvazia estado e histórico e mantém inscrições e taps.

`wu.store.reset(): void`

- **Parâmetros:** Sem argumentos.
- **Retorno:** void.
- **Erros:** Não constitui exclusão persistente fora desta instância.
- **Permissões:** Host; não está disponível na facade da aplicação.
- **Limpeza:** Não notifica automaticamente um valor inicial vazio; sync continua ativo.

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

Referência: `src/core/wu-store.js`.

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

## wu.store.dispose

Interrompe sync e remove estado, listeners e taps.

`wu.store.dispose(): void`

- **Parâmetros:** Sem argumentos.
- **Retorno:** void.
- **Erros:** Não constitui exclusão persistente fora desta instância.
- **Permissões:** Host; não está disponível na facade da aplicação.
- **Limpeza:** Use ao remover um store que você administra; não no store compartilhado por outro consumidor.

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

Referência: `src/core/wu-store.js`.

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

## wu.store.clear

Executa a mesma liberação completa de dispose.

`wu.store.clear(): void`

- **Parâmetros:** Sem argumentos.
- **Retorno:** void.
- **Erros:** Não constitui exclusão persistente fora desta instância.
- **Permissões:** Host; não está disponível na facade da aplicação.
- **Limpeza:** Também remove inscrições; não é apenas uma operação sobre valores.

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

Referência: `src/core/wu-store.js`.

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

## WuSyncHandle.ready

Aguarda o carregamento do módulo e o início do transporte.

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

- **Parâmetros:** Handle retornado por wu.store.sync(options).
- **Retorno:** Promise<unknown>
- **Erros:** ready pode rejeitar; status.error expõe carregamento/autorização/transporte.
- **Permissões:** Sessão do host; o relay deve autenticar os pares se WebSocket for usado.
- **Limpeza:** stop() cancela a sessão quando seu proprietário terminar.

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

Referência: `src/core/wu-store.js`.

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

## WuSyncHandle.status

Consulta conexão, relógios, pares e contadores de sincronização.

`sync.status(): WuSyncStatus`

- **Parâmetros:** Handle retornado por wu.store.sync(options).
- **Retorno:** WuSyncStatus
- **Erros:** ready pode rejeitar; status.error expõe carregamento/autorização/transporte.
- **Permissões:** Sessão do host; o relay deve autenticar os pares se WebSocket for usado.
- **Limpeza:** Leitura sem recursos adicionais.

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

Referência: `src/core/wu-store.js`.

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

## WuSyncHandle.stop

Interrompe a troca de mensagens e a observação de escritas.

`sync.stop(): void`

- **Parâmetros:** Handle retornado por wu.store.sync(options).
- **Retorno:** void
- **Erros:** ready pode rejeitar; status.error expõe carregamento/autorização/transporte.
- **Permissões:** Sessão do host; o relay deve autenticar os pares se WebSocket for usado.
- **Limpeza:** Remove o tap e fecha o transporte desta sessão.

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

Referência: `src/core/wu-store.js`.

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

## WuSyncHandle.connected

Consulta se o transporte da sessão está conectado.

`sync.connected: boolean`

- **Parâmetros:** Handle retornado por wu.store.sync(options).
- **Retorno:** boolean
- **Erros:** ready pode rejeitar; status.error expõe carregamento/autorização/transporte.
- **Permissões:** Sessão do host; o relay deve autenticar os pares se WebSocket for usado.
- **Limpeza:** Leitura de estado; a sessão é liberada com stop.

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

Referência: `src/core/wu-store.js`.