# Store 与同步参考

状态操作、快照、通知、历史，以及带显式清理的同步会话。

Store 使用数据 paths 和独立快照。应用 facade 暴露 `get`、`getSnapshot`、`set`、`update`、`on` 和 `batch`；管理、历史和同步操作属于宿主。

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

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

## 选择操作

`set` 替换数据，`update` 同步计算新值，`batch` 在第一次写入前验证多项写入。`on` 通过 microtask 通知，`tap` 同步观察每次 commit。`hydrate` 替换根，不创建 ring buffer 条目，也不经过 taps。

值支持普通数据、稠密数组和 codec 标量。renderer 对象、函数、Date、Map、循环引用和 Promise 不属于共享状态值。Store 支持 bigint 标量，不代表 sync 能序列化它。

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

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

## 明确所有者的会话

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

只有激活之后的写入才被 sync 记录。Last Writer Wins 按 path 排序；父子路径并发写入不提供与同一路径写入相同的收敛性。保持一致粒度，并在适用时认证传输。

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

## new WuStore

创建带环形历史的独立 store。

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

- **参数：** bufferSize 默认 256，选择历史容量，不是状态字节上限。
- **返回值：** 实例；buffer 大小向上取整为二的幂。
- **错误：** 后续写入的值由 store codec 验证。
- **权限：** 仅宿主；应用 facade 不提供。
- **清理：** state.dispose() 移除 sync、listeners 和 taps。

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

参考：`src/core/wu-store.js`.

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

## wu.store.tap

在 on 通知之前同步观察每次 commit。

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

- **参数：** callback(sequence,path,value)，适用于 journal 或传输。
- **返回值：** Cleanup；非函数参数返回空 cleanup。
- **错误：** 不按路径过滤，也不提供初始快照。
- **权限：** 仅宿主；应用 facade 不提供。
- **清理：** stop() 移除 tap。

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

参考：`src/core/wu-store.js`.

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

## wu.store.hydrate

替换完整状态，并通知所选 paths。

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

- **参数：** 普通对象 state；notifyPaths 默认为新状态顶层键。
- **返回值：** void；不增加 ring buffer 条目，不触发 taps。
- **错误：** 替换前可能产生 WU_STORE_INVALID_VALUE 或 WU_STORE_INVALID_PATH。
- **权限：** 仅宿主；应用 facade 不提供。
- **清理：** 不创建需要释放的资源。

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

参考：`src/core/wu-store.js`.

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

## wu.store.getMetrics

读取读写、通知、历史和 listeners 计数。

`wu.store.getMetrics(): object`

- **参数：** 无参数。
- **返回值：** 指标快照。
- **错误：** 不测量网络或渲染。
- **权限：** 仅宿主；应用 facade 不提供。
- **清理：** 不创建需要释放的资源。

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

参考：`src/core/wu-store.js`.

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

## wu.store.getRecentEvents

查询最近的写入，包括序号、路径、值和时间戳。

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

- **参数：** count 为有限正数，默认为 10，并受缓冲区大小限制。
- **返回值：** 按从新到旧的顺序排列；值与内部状态分离。
- **错误：** 非正数或非有限数返回 []。
- **权限：** 仅宿主；应用 facade 不提供。
- **清理：** 不创建需要释放的资源。

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

WuStore 声明未列出此运行时方法。

参考：`src/core/wu-store.js`.

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

## wu.store.reset

清空状态和历史记录，保留订阅和 taps。

`wu.store.reset(): void`

- **参数：** 无参数。
- **返回值：** void。
- **错误：** 不会删除此实例之外的持久化数据。
- **权限：** 仅宿主；应用 facade 不提供。
- **清理：** 不会自动通知初始空值；sync 仍处于活动状态。

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

参考：`src/core/wu-store.js`.

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

## wu.store.dispose

停止 sync，移除状态、监听器和 taps。

`wu.store.dispose(): void`

- **参数：** 无参数。
- **返回值：** void。
- **错误：** 不会删除此实例之外的持久化数据。
- **权限：** 仅宿主；应用 facade 不提供。
- **清理：** 在移除你所管理的 store 时使用；不要对其他使用方共享的 store 调用。

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

参考：`src/core/wu-store.js`.

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

## wu.store.clear

执行与 dispose 相同的完整释放操作。

`wu.store.clear(): void`

- **参数：** 无参数。
- **返回值：** void。
- **错误：** 不会删除此实例之外的持久化数据。
- **权限：** 仅宿主；应用 facade 不提供。
- **清理：** 同时移除订阅，并非仅操作值。

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

参考：`src/core/wu-store.js`.

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

## WuSyncHandle.ready

等待模块加载和传输启动。

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

- **参数：** wu.store.sync(options) 返回的句柄。
- **返回值：** Promise<unknown>
- **错误：** ready 可能拒绝；status.error 提供加载、授权或传输错误。
- **权限：** 宿主会话；使用 WebSocket 时，中继应验证对等端身份。
- **清理：** 所有者结束使用时，调用 stop() 取消会话。

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

参考：`src/core/wu-store.js`.

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

## WuSyncHandle.status

查询连接、时钟、对等端和同步计数。

`sync.status(): WuSyncStatus`

- **参数：** wu.store.sync(options) 返回的句柄。
- **返回值：** WuSyncStatus
- **错误：** ready 可能拒绝；status.error 提供加载、授权或传输错误。
- **权限：** 宿主会话；使用 WebSocket 时，中继应验证对等端身份。
- **清理：** 读取不会创建额外资源。

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

参考：`src/core/wu-store.js`.

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

## WuSyncHandle.stop

停止消息交换和写入观察。

`sync.stop(): void`

- **参数：** wu.store.sync(options) 返回的句柄。
- **返回值：** void
- **错误：** ready 可能拒绝；status.error 提供加载、授权或传输错误。
- **权限：** 宿主会话；使用 WebSocket 时，中继应验证对等端身份。
- **清理：** 移除 tap 并关闭此会话的传输。

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

参考：`src/core/wu-store.js`.

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

## WuSyncHandle.connected

查询会话的传输是否已连接。

`sync.connected: boolean`

- **参数：** wu.store.sync(options) 返回的句柄。
- **返回值：** boolean
- **错误：** ready 可能拒绝；status.error 提供加载、授权或传输错误。
- **权限：** 宿主会话；使用 WebSocket 时，中继应验证对等端身份。
- **清理：** 读取状态；使用 stop 释放会话。

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

参考：`src/core/wu-store.js`.