# Evolucionar contratos sin romper clientes

Publica servicios versionados, traduce contratos anteriores y valida entradas y resultados.

Esta página describe WU Framework `4.0.0`. Consulta la [migración a Framework 4.0 y CLI 1.2](/es/docs/guides/releases/) antes de actualizar un proyecto existente.

`wu-framework/services` define contratos con schemas, valida llamadas y genera clientes. `provideService` devuelve `{ dispose }`; `consumeService` devuelve métodos asíncronos. En una app usa `context.wu` y concede `rpc.provide` o `rpc.call` para los canales del servicio. Este ejemplo usa el runtime del host para concentrarse en la traducción.

```js
import { wu } from 'wu-framework';
import { schema, defineService, provideService, consumeService,
  checkServiceCompatibility } from 'wu-framework/services';

const v1 = defineService({ name: 'price', version: '1.0.0', methods: {
  quote: { input: schema.number(), output: schema.number() },
} });
const v2 = defineService({ name: 'price', version: '2.0.0', methods: {
  quote: { input: schema.object({ quantity: schema.number() }),
    output: schema.object({ total: schema.number() }) },
} });
const translators = [{ definition: v1, methods: {
  quote: { input: quantity => ({ quantity }), output: result => result.total },
} }];
const provider = provideService(wu, v2, {
  quote: ({ quantity }) => ({ total: quantity * 12 }),
}, { translators });
try {
  const oldClient = consumeService(wu, v1);
  const newClient = consumeService(wu, v2);
  console.log(await oldClient.quote(2)); // 24
  console.log(await newClient.quote({ quantity: 2 })); // { total: 24 }
  console.log(checkServiceCompatibility(v1, v2, { translators }));
} finally {
  provider.dispose();
}
```

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

## Qué se valida

Cada traductor declara `definition` y adaptaciones por método: `input`, `output` o `implement` para atender por completo un método retirado. Los métodos sin cambios no necesitan conversión. WU verifica cobertura al registrar y valida cada entrada y salida con el schema de su versión. Una cobertura incompleta produce `WU_SERVICE_TRANSLATOR`; el chequeo estructural no demuestra que las funciones traduzcan correctamente tu negocio.

`checkServiceCompatibility(previous, next, { translators })` devuelve `compatible`, `changes` y `translated`. `generateServiceTypes` produce declaraciones de cliente y `sampleValue(schema)` crea un dato determinista para fixtures. Consulta [contratos en la CLI](/es/docs/cli/contracts/) y [pruebas y mocks](/es/docs/cli/testing-mocks/) para usar el mismo contrato en CI y desarrollo.

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

## RPC y objetos versionados

`wu.handle(channel, handler, { version, translators })` también admite traducción directa. Cada clave de `translators` es una versión servida, con `request` y `response`. El contexto identifica `version`, `servedVersion` y `translated`; `WU_RPC_TRANSLATION_FAILED` identifica la etapa que falló. En servicios compartidos, `wu.provide` acepta traductores que construyen una vista antigua del objeto; `wu.consume` expone la versión servida en `__wuVersion`.