# Referencia de eventos, RPC y contratos

Historial, consultas, proveedores versionados y límites de comunicación entre aplicaciones.

Utiliza eventos para notificar hechos, RPC para esperar una respuesta y contratos para compartir métodos versionados. Los tres mecanismos operan dentro del runtime: una petición RPC no crea por sí misma transporte HTTP.

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

## Receptores y retorno

El callback de evento recibe `WuEvent`; un handler RPC recibe el payload y un segundo argumento de correlación, identidad y cancelación. Un contrato entrega un proxy vivo hacia los métodos del proveedor. Consulta [comunicación](/es/docs/framework/communication/) para los primeros ejemplos de `emit`, `on`, `request`, `handle`, `provide` y `consume`.

`wu.handle(channel, handler, options)` conserva `version`, `allow` y `replace`. Dentro del lifecycle, `context.wu.handle` añade además la identidad y los grants de la app; utiliza esa facade para handlers de una microapp.

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

## Vida del proveedor

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

Un proveedor se libera cuando su dueño deja de estar disponible. Rechazar o cancelar la espera no deshace un efecto ya ejecutado; el handler debe cooperar con `context.signal`. El historial y replay sirven para observación, no para repetir operaciones de negocio.

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

## wu.hasHandler / eventBus.hasHandler

Comprueba si existe un proveedor RPC activo para un canal.

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

- **Parámetros:** channel: nombre exacto del canal.
- **Retorno:** Booleano de presencia.
- **Errores:** Presencia no garantiza que tu identidad esté autorizada ni que la versión coincida.
- **Permisos:** Host; la facade scoped no expone administración global.
- **Limpieza:** No instala recursos nuevos.

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

Referencia: `src/core/wu-event-bus.js`.

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

## wu.eventBus.history

Lee el historial de envelopes conservado por el bus.

`wu.eventBus.history: WuEvent[]`

- **Parámetros:** Getter sin argumentos; excluye emisiones history:false.
- **Retorno:** Snapshot de eventos; límite por defecto 100.
- **Errores:** No incluye necesariamente todo el historial de la sesión.
- **Permisos:** Host; la facade scoped no expone administración global.
- **Limpieza:** No instala recursos nuevos.

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

Referencia: `src/core/wu-event-bus.js`.

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

## wu.eventBus.replay

Entrega al callback eventos históricos coincidentes.

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

- **Parámetros:** Patrón y callback de envelope WuEvent.
- **Retorno:** void; no vuelve a publicar los eventos en el bus.
- **Errores:** No reejecuta handlers RPC ni recupera efectos externos.
- **Permisos:** Host; la facade scoped no expone administración global.
- **Limpieza:** No deja una suscripción; usa on para recibir eventos futuros.

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

Referencia: `src/core/wu-event-bus.js`.

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

## wu.eventBus.clearHistory

Retira eventos del historial, conservando listeners y proveedores.

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

- **Parámetros:** Patrón opcional; omitirlo vacía todo el historial.
- **Retorno:** void.
- **Errores:** No borra proyecciones que un consumidor ya guardó.
- **Permisos:** Host; la facade scoped no expone administración global.
- **Limpieza:** No instala recursos nuevos.

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

Referencia: `src/core/wu-event-bus.js`.

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

## wu.eventBus.getStats

Lee métricas de eventos, suscripciones y proveedores del bus.

`wu.eventBus.getStats(): object`

- **Parámetros:** Sin argumentos.
- **Retorno:** Objeto de contadores y configuración.
- **Errores:** No mide aceptación de negocio de los eventos.
- **Permisos:** Host; la facade scoped no expone administración global.
- **Limpieza:** No instala recursos nuevos.

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

Referencia: `src/core/wu-event-bus.js`.

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

## wu.eventBus.matchesWildcard

Comprueba un patrón de evento sin registrar una suscripción.

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

- **Parámetros:** Nombre del evento primero, patrón después.
- **Retorno:** Booleano.
- **Errores:** Coincidencia no concede permiso para usar ese recurso.
- **Permisos:** Host; la facade scoped no expone administración global.
- **Limpieza:** No instala recursos nuevos.

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

Referencia: `src/core/wu-event-bus.js`.

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

## wu.contracts.has

Consulta presencia y compatibilidad semver de un contrato.

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

- **Parámetros:** Nombre y rango; * por defecto.
- **Retorno:** boolean
- **Errores:** Comprueba el resultado; no prueba la disponibilidad de servicios externos.
- **Permisos:** Host; la facade scoped no expone administración global.
- **Limpieza:** No instala recursos nuevos.

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

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

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

## wu.contracts.list

Enumera los proveedores de contratos activos.

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

- **Parámetros:** Sin argumentos.
- **Retorno:** Array<{name,version,app}>
- **Errores:** Comprueba el resultado; no prueba la disponibilidad de servicios externos.
- **Permisos:** Host; la facade scoped no expone administración global.
- **Limpieza:** No instala recursos nuevos.

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

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

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

## wu.contracts.revoke

Retira un proveedor por nombre desde el registro host.

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

- **Parámetros:** Nombre exacto; false cuando no existe.
- **Retorno:** boolean
- **Errores:** Comprueba el resultado; no prueba la disponibilidad de servicios externos.
- **Permisos:** Host; la facade scoped no expone administración global.
- **Limpieza:** Invalida el acceso posterior de proxies consumidores.

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

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

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

## wu.contracts.cleanup

Revoca todos los proveedores de esta instancia de contratos.

`wu.contracts.cleanup(): void`

- **Parámetros:** Sin argumentos.
- **Retorno:** void
- **Errores:** Comprueba el resultado; no prueba la disponibilidad de servicios externos.
- **Permisos:** Host; la facade scoped no expone administración global.
- **Limpieza:** Afecta a todos los consumidores del registro.

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

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

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

## WuEventBus.tap

Observa eventos del bus para instrumentación del host.

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

- **Parámetros:** Callback de eventos; no es un listener scoped de aplicación.
- **Retorno:** Función para cancelar el tap.
- **Errores:** Un valor no función produce cleanup vacío.
- **Permisos:** La instancia independiente pertenece al host que la crea; no modifica la facade del bus del singleton WU.
- **Limpieza:** Conserva y ejecuta el disposer: removeAll no borra taps.

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

Estos métodos pertenecen a una instancia independiente de WuEventBus. La facade wu.eventBus no los expone.

Referencia: `src/core/wu-event-bus.js`.

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

## WuEventBus.configure

Actualiza configuración del bus y recorta el historial si cambia maxHistory.

`bus.configure(config): void`

- **Parámetros:** maxHistory, enableReplay, enableWildcards, logEvents, strictMode y validateOrigin.
- **Retorno:** void.
- **Errores:** maxHistory debe ser un entero seguro no negativo; lanza RangeError si no lo es.
- **Permisos:** La instancia independiente pertenece al host que la crea; no modifica la facade del bus del singleton WU.
- **Limpieza:** El propietario del runtime administra los recursos y sus funciones de cleanup.

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

Estos métodos pertenecen a una instancia independiente de WuEventBus. La facade wu.eventBus no los expone.

Referencia: `src/core/wu-event-bus.js`.

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

## WuEventBus.enableStrictMode

Activa controles estrictos del bus para nuevas operaciones.

`bus.enableStrictMode(): void`

- **Parámetros:** Sin argumentos.
- **Retorno:** void.
- **Errores:** La llamada solo cambia la configuración; operaciones posteriores pueden fallar por validación.
- **Permisos:** La instancia independiente pertenece al host que la crea; no modifica la facade del bus del singleton WU.
- **Limpieza:** El propietario del runtime administra los recursos y sus funciones de cleanup.

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

Estos métodos pertenecen a una instancia independiente de WuEventBus. La facade wu.eventBus no los expone.

Referencia: `src/core/wu-event-bus.js`.

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

## WuEventBus.disableStrictMode

Desactiva el flag strictMode del bus.

`bus.disableStrictMode(): void`

- **Parámetros:** Sin argumentos.
- **Retorno:** void.
- **Errores:** La llamada no devuelve un diagnóstico de las suscripciones existentes.
- **Permisos:** La instancia independiente pertenece al host que la crea; no modifica la facade del bus del singleton WU.
- **Limpieza:** El propietario del runtime administra los recursos y sus funciones de cleanup.

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

Estos métodos pertenecen a una instancia independiente de WuEventBus. La facade wu.eventBus no los expone. Es una decisión del host, no un mecanismo para eludir grants de la facade scoped.

Referencia: `src/core/wu-event-bus.js`.

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

## WuEventBus.removeAll

Retira listeners y handlers RPC y rechaza requests pendientes.

`bus.removeAll(): void`

- **Parámetros:** Sin argumentos.
- **Retorno:** void.
- **Errores:** Las solicitudes pendientes rechazan con WU_RPC_BUS_CLEARED.
- **Permisos:** La instancia independiente pertenece al host que la crea; no modifica la facade del bus del singleton WU.
- **Limpieza:** No vacía historial ni taps; usa clearHistory y canceladores de taps por separado.

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

Estos métodos pertenecen a una instancia independiente de WuEventBus. La facade wu.eventBus no los expone.

Referencia: `src/core/wu-event-bus.js`.