# 事件、RPC 与契约参考

历史、查询、版本化提供方与应用间通信限制。

事件用于通知事实，RPC 用于等待响应，契约用于共享带版本的方法。三种机制都在运行时内部工作；RPC 请求本身不会创建 HTTP 传输。

<span id="receptores-y-retorno"></span>

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

## 接收对象与返回值

事件回调接收 `WuEvent`；RPC 处理函数接收 payload 和包含关联、身份及取消信息的第二个参数。契约返回指向提供方方法的动态 proxy。`emit`、`on`、`request`、`handle`、`provide` 和 `consume` 的入门示例请参阅[通信](/zh-cn/docs/framework/communication/)。

`wu.handle(channel, handler, options)` 保留 `version`、`allow` 和 `replace`。在生命周期中，`context.wu.handle` 还加入应用身份和 grants；微应用 handlers 应使用该 facade。

<span id="vida-del-proveedor"></span>

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

## 提供方生命周期

```js
const release = wu.eventBus.handle('catalog:lookup', ({ productId }) => {
  return { productId, available: true };
}, { version: '1.0.0' });

const product = await wu.request('catalog:lookup', { productId: 'p-42' }, {
  version: '^1.0.0', timeout: 2500,
});
console.log(product.available);
release();
```

提供方所属者不可用时会释放提供方。拒绝或取消等待不会撤销已执行的副作用；处理函数必须协作处理 `context.signal`。历史和 replay 用于观察，不用于重复业务操作。

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

## wu.hasHandler / eventBus.hasHandler

检查通道是否存在活动 RPC 提供方。

`wu.hasHandler(channel: string): boolean`

- **参数：** channel：精确通道名称。
- **返回值：** 表示是否存在的布尔值。
- **错误：** 存在不保证当前身份已授权，也不保证版本匹配。
- **权限：** 宿主；scoped facade 不暴露全局管理。
- **清理：** 不安装新资源。

```js
if (wu.hasHandler('catalog:lookup')) console.log('Proveedor disponible');
```

参考：`src/core/wu-event-bus.js`.

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

## wu.eventBus.history

读取总线保留的 envelope 历史。

`wu.eventBus.history: WuEvent[]`

- **参数：** 无参数 getter；排除 history:false 的发布。
- **返回值：** 事件快照，默认上限 100。
- **错误：** 不一定包含会话全部历史。
- **权限：** 宿主；scoped facade 不暴露全局管理。
- **清理：** 不安装新资源。

```js
console.table(wu.eventBus.history.map(event => ({ name: event.name, app: event.appName })));
```

参考：`src/core/wu-event-bus.js`.

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

## wu.eventBus.replay

向回调提供匹配的历史事件。

`wu.eventBus.replay(pattern, callback): void`

- **参数：** 模式与接收 WuEvent envelope 的回调。
- **返回值：** void；不会在总线重新发布事件。
- **错误：** 不重新执行 RPC 处理函数，也不恢复外部副作用。
- **权限：** 宿主；scoped facade 不暴露全局管理。
- **清理：** 不保留订阅；接收未来事件请使用 on。

```js
wu.eventBus.replay('catalog:*', event => console.log(event.data));
```

参考：`src/core/wu-event-bus.js`.

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

## wu.eventBus.clearHistory

从历史移除事件，保留监听器和提供方。

`wu.eventBus.clearHistory(pattern?): void`

- **参数：** 可选模式；省略则清空全部历史。
- **返回值：** void。
- **错误：** 不删除消费者已保存的投影。
- **权限：** 宿主；scoped facade 不暴露全局管理。
- **清理：** 不安装新资源。

```js
wu.eventBus.clearHistory('catalog:*');
```

参考：`src/core/wu-event-bus.js`.

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

## wu.eventBus.getStats

读取总线事件、订阅和提供方指标。

`wu.eventBus.getStats(): object`

- **参数：** 无参数。
- **返回值：** 计数器和配置对象。
- **错误：** 不衡量事件是否被业务接受。
- **权限：** 宿主；scoped facade 不暴露全局管理。
- **清理：** 不安装新资源。

```js
console.log(wu.eventBus.getStats());
```

参考：`src/core/wu-event-bus.js`.

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

## wu.eventBus.matchesWildcard

检查事件模式，不注册订阅。

`wu.eventBus.matchesWildcard(eventName, pattern): boolean`

- **参数：** 先事件名称，后模式。
- **返回值：** 布尔值。
- **错误：** 匹配不授予使用资源的权限。
- **权限：** 宿主；scoped facade 不暴露全局管理。
- **清理：** 不安装新资源。

```js
console.log(wu.eventBus.matchesWildcard('catalog:selected', 'catalog:*'));
```

参考：`src/core/wu-event-bus.js`.

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

## wu.contracts.has

查询契约是否存在及其 semver 兼容性。

`wu.contracts.has(name: string, range?: string): boolean`

- **参数：** 名称和范围，默认 *。
- **返回值：** boolean
- **错误：** 请检查结果；不测试外部服务可用性。
- **权限：** 宿主；scoped facade 不暴露全局管理。
- **清理：** 不安装新资源。

```js
console.log(wu.contracts.has('formatters', '^1.0.0'));
```

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

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

## wu.contracts.list

列出活动契约提供方。

`wu.contracts.list(): Array<{name,version,app}>`

- **参数：** 无参数。
- **返回值：** Array<{name,version,app}>
- **错误：** 请检查结果；不测试外部服务可用性。
- **权限：** 宿主；scoped facade 不暴露全局管理。
- **清理：** 不安装新资源。

```js
console.table(wu.contracts.list());
```

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

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

## wu.contracts.revoke

从宿主注册表按名称移除提供方。

`wu.contracts.revoke(name: string): boolean`

- **参数：** 精确名称；不存在时返回 false。
- **返回值：** boolean
- **错误：** 请检查结果；不测试外部服务可用性。
- **权限：** 宿主；scoped facade 不暴露全局管理。
- **清理：** 使消费者 proxy 后续访问失效。

```js
wu.contracts.revoke('formatters');
```

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

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

## wu.contracts.cleanup

撤销此契约实例的全部提供方。

`wu.contracts.cleanup(): void`

- **参数：** 无参数。
- **返回值：** void
- **错误：** 请检查结果；不测试外部服务可用性。
- **权限：** 宿主；scoped facade 不暴露全局管理。
- **清理：** 影响注册表的所有消费者。

```js
wu.contracts.cleanup();
```

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

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

## WuEventBus.tap

观察总线事件，用于宿主监测。

`bus.tap(callback): () => void`

- **参数：** 事件回调；不是应用 scoped 监听器。
- **返回值：** 取消 tap 的函数。
- **错误：** 非函数值产生空 cleanup。
- **权限：** 独立实例属于创建它的宿主，不修改 WU singleton 的总线 facade。
- **清理：** 保存并执行 disposer；removeAll 不删除 taps。

```js
import { WuEventBus } from 'wu-framework';
const bus = new WuEventBus();
const stop = bus.tap(event => console.log(event));
stop();
```

这些方法属于独立 WuEventBus 实例，wu.eventBus facade 不暴露它们。

参考：`src/core/wu-event-bus.js`.

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

## WuEventBus.configure

更新总线配置，maxHistory 变化时裁剪历史。

`bus.configure(config): void`

- **参数：** maxHistory、enableReplay、enableWildcards、logEvents、strictMode 和 validateOrigin。
- **返回值：** void。
- **错误：** maxHistory 必须为非负安全整数，否则抛出 RangeError。
- **权限：** 独立实例属于创建它的宿主，不修改 WU singleton 的总线 facade。
- **清理：** 运行时所属者管理资源及其 cleanup 函数。

```js
import { WuEventBus } from 'wu-framework';
const bus = new WuEventBus();
bus.configure({ maxHistory: 100 });
```

这些方法属于独立 WuEventBus 实例，wu.eventBus facade 不暴露它们。

参考：`src/core/wu-event-bus.js`.

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

## WuEventBus.enableStrictMode

为后续总线操作启用严格检查。

`bus.enableStrictMode(): void`

- **参数：** 无参数。
- **返回值：** void。
- **错误：** 调用只修改配置；后续操作可能因验证失败。
- **权限：** 独立实例属于创建它的宿主，不修改 WU singleton 的总线 facade。
- **清理：** 运行时所属者管理资源及其 cleanup 函数。

```js
import { WuEventBus } from 'wu-framework';
const bus = new WuEventBus();
bus.enableStrictMode();
```

这些方法属于独立 WuEventBus 实例，wu.eventBus facade 不暴露它们。

参考：`src/core/wu-event-bus.js`.

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

## WuEventBus.disableStrictMode

禁用总线 strictMode 标志。

`bus.disableStrictMode(): void`

- **参数：** 无参数。
- **返回值：** void。
- **错误：** 调用不返回现有订阅诊断。
- **权限：** 独立实例属于创建它的宿主，不修改 WU singleton 的总线 facade。
- **清理：** 运行时所属者管理资源及其 cleanup 函数。

```js
import { WuEventBus } from 'wu-framework';
const bus = new WuEventBus();
bus.disableStrictMode();
```

这些方法属于独立 WuEventBus 实例，wu.eventBus facade 不暴露它们。这是宿主决定，不是绕过 scoped facade grants 的机制。

参考：`src/core/wu-event-bus.js`.

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

## WuEventBus.removeAll

移除监听器和 RPC 处理函数，并拒绝待处理 requests。

`bus.removeAll(): void`

- **参数：** 无参数。
- **返回值：** void。
- **错误：** 待处理请求以 WU_RPC_BUS_CLEARED 拒绝。
- **权限：** 独立实例属于创建它的宿主，不修改 WU singleton 的总线 facade。
- **清理：** 不清空历史或 taps；分别使用 clearHistory 和 tap 取消函数。

```js
import { WuEventBus } from 'wu-framework';
const bus = new WuEventBus();
bus.removeAll();
```

这些方法属于独立 WuEventBus 实例，wu.eventBus facade 不暴露它们。

参考：`src/core/wu-event-bus.js`.