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 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.
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();
}
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 e testes e mocks para usar o mesmo contrato em CI e desenvolvimento.
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.