# Evoluir contratos sem quebrar clientes

Publique serviços versionados, traduza contratos anteriores e valide entradas e resultados.

Esta página descreve o WU Framework `4.0.0`. Consulte o [guia de migração para Framework 4.0 e CLI 1.2](/pt/docs/guides/releases/) antes de atualizar um projeto existente.

`wu-framework/services` define contratos com schemas, valida chamadas e gera clientes. `provideService` retorna `{ dispose }`; `consumeService` retorna métodos assíncronos. Em uma app use `context.wu` e conceda `rpc.provide` ou `rpc.call` para os canais do serviço. Este exemplo usa o runtime do host para focar na tradução.

```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 id="qué-se-valida"></span>

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

## O que é validado

Cada tradutor declara `definition` e adaptações por método: `input`, `output` ou `implement` para atender integralmente um método removido. Métodos sem mudanças não precisam de conversão. WU verifica a cobertura no registro e valida cada entrada e saída pelo schema de sua versão. Cobertura incompleta produz `WU_SERVICE_TRANSLATOR`; a checagem estrutural não prova que as funções preservem o significado de negócio.

`checkServiceCompatibility(previous, next, { translators })` retorna `compatible`, `changes` e `translated`. `generateServiceTypes` produz declarações de cliente e `sampleValue(schema)` cria dados deterministas para fixtures. Veja [contratos na CLI](/pt/docs/cli/contracts/) e [testes e mocks](/pt/docs/cli/testing-mocks/) para usar o mesmo contrato em CI e desenvolvimento.

<span id="rpc-y-objetos-versionados"></span>

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

## RPC e objetos versionados

`wu.handle(channel, handler, { version, translators })` também aceita tradução direta. Cada chave de `translators` é uma versão atendida com `request` e `response`. O contexto identifica `version`, `servedVersion` e `translated`; `WU_RPC_TRANSLATION_FAILED` identifica a etapa que falhou. Em serviços compartilhados, `wu.provide` aceita tradutores que criam uma visão antiga do objeto; `wu.consume` expõe a versão atendida em `__wuVersion`.