-
Notifications
You must be signed in to change notification settings - Fork 3
transformer refactor
Este documento descreve como modularizar src/services/transformer.ts sem quebrar contratos existentes, imports atuais ou testes.
Reduzir o tamanho e a concentracao de responsabilidades de src/services/transformer.ts, mantendo o mesmo comportamento externo.
A refatoracao deve ser incremental. Nao misture mudanca estrutural com feature nova ou alteracao de regra de negocio.
Concluido em 2026-05-04:
-
BindTemplateErroreDecryptErrorforam extraidos parasrc/services/transformer/errors.ts. - Constantes de tipos de mensagem foram extraidas para
src/services/transformer/message_constants.ts. - Helpers puros de JID/telefone foram extraidos para
src/services/transformer/jid.ts. -
src/services/transformer.tscontinua como fachada publica, importando os modulos extraidos para uso interno e reexportando os mesmos simbolos para imports antigos. - Teste focado executado com sucesso:
"/mnt/c/Program Files/nodejs/node.exe" node_modules/jest/bin/jest.js __tests__/services/transformer.ts --runInBand. - Suite completa executada com sucesso:
NODE_OPTIONS=--max-old-space-size=4096 "/mnt/c/Program Files/nodejs/node.exe" node_modules/jest/bin/jest.js --coverage.
Concluido em 2026-05-06:
- Helpers de tipo de mensagem foram extraidos para
src/services/transformer/message_type.ts. -
src/services/transformer.tscontinua importando os helpers extraidos para uso interno e reexportando os mesmos simbolos para imports antigos. - Teste focado executado com sucesso:
"/mnt/c/Program Files/nodejs/node.exe" node_modules/jest/bin/jest.js __tests__/services/transformer.ts --runInBand.
Proximos candidatos seguros:
- Extrair helpers de grupo/direcao para
src/services/transformer/groups.ts. - Manter
toBaileysMessageContentefromBaileysMessageContentpara uma etapa posterior.
Orientacao operacional antes da proxima refatoracao:
- Publicar primeiro a etapa ja concluida em producao.
- Observar logs reais de envio, recebimento, grupos, midia, status, edicao de mensagem e fallback de decrypt por um ciclo curto.
- So continuar a refatoracao se a producao ficar limpa, sem regressao nos contratos de webhook.
- Nao mexer em
toBaileysMessageContentoufromBaileysMessageContentantes dessa observacao em producao. - A proxima etapa, apos validacao em producao, deve continuar pequena: mover helpers de tipo de mensagem e/ou helpers de grupo/direcao, ainda mantendo os conversores grandes no arquivo principal.
src/services/transformer.ts deve continuar funcionando como fachada publica enquanto houver imports existentes usando esse caminho.
Imports como este nao devem quebrar:
import {
fromBaileysMessageContent,
toBaileysMessageContent,
getMessageType,
} from './transformer'Quando mover funcoes para arquivos menores, reexporte pelo arquivo original:
export { fromBaileysMessageContent } from './transformer/from_baileys'
export { toBaileysMessageContent } from './transformer/to_baileys'
export { getMessageType } from './transformer/message_type'Use nomes em snake_case, seguindo o padrao do repositorio.
Uma estrutura recomendada:
src/services/transformer/
index.ts
errors.ts
message_type.ts
jid.ts
groups.ts
media.ts
contacts.ts
interactive.ts
to_baileys.ts
from_baileys.ts
types.ts
Enquanto houver compatibilidade com imports antigos, mantenha:
src/services/transformer.ts
como fachada/reexportador.
Comece por funcoes menores e mais isoladas. A ordem recomendada e:
-
Erros e constantes simples:
BindTemplateErrorDecryptError- listas de tipos de mensagem
- Status: concluido em
errors.tsemessage_constants.ts.
-
Helpers puros de JID e telefone:
phoneNumberToJidnormalizeGroupIdnormalizeParticipantIdtoRawPnJidjidToRawPhoneNumbernormalizeTransportJidisIndividualJidensurePnformatJidjidToPhoneNumberjidToPhoneNumberIfUsernormalizeUserOrGroupIdForWebhook- Status: concluido em
jid.ts.
-
Helpers de tipo de mensagem:
getMessageTypegetBinMessagegetNormalizedMessagenormalizeMessageContentisSaveMediaextractTypeMessageisAudioMessage- Status: concluido em
message_type.ts.
-
Helpers de grupo e direcao:
getGroupIdisGroupMessageisNewsletterMessageisIndividualMessageisOutgoingMessageisIncomingMessageisUpdateMessageextractSessionPhoneextractDestinyPhoneextractFromPhonegetChatAndNumberAndIdgetNumberAndId
-
Helpers de media/contato/interativo:
getMimetypetoBuffer- funcoes internas de vCard/contatos
- funcoes internas de resposta interativa
-
Somente depois mova os conversores grandes:
toBaileysMessageContentfromBaileysMessageContent
Esses dois conversores devem ser os ultimos, porque concentram a maior parte dos contratos com Baileys, Meta-like webhook, grupos, midia, status e mensagens interativas.
- Nao altere o payload de entrada ou saida durante uma refatoracao estrutural.
- Nao renomeie exports publicos no mesmo passo em que move arquivos.
- Nao altere normalizacao de grupo junto com normalizacao de usuario.
- Preserve grupos
@g.usintactos nos payloads de webhook. - Preserve
messages[].group_idestatuses[].recipient_type = 'group'quando aplicavel. - Preserve a conversao de usuarios para PN/LID conforme a regra existente.
- Se uma funcao usa config, Redis, Baileys, S3, logger ou defaults, trate como menos isolada e mova depois.
- Ao extrair helpers internos, prefira manter a assinatura identica.
Depois de cada etapa pequena, rode ao menos o teste focado:
yarn jest __tests__/services/transformer.ts --runInBandSe o ambiente Linux nao tiver node funcionando, use o Node do Windows ja usado neste checkout:
"/mnt/c/Program Files/nodejs/node.exe" node_modules/jest/bin/jest.js __tests__/services/transformer.ts --runInBandAntes de concluir uma refatoracao maior, rode tambem:
yarn testou, neste ambiente quando necessario:
NODE_OPTIONS=--max-old-space-size=4096 "/mnt/c/Program Files/nodejs/node.exe" node_modules/jest/bin/jest.js --coverageRegistre na resposta final quais testes foram executados e quais nao puderam ser executados.
-
src/services/transformer.tsainda exporta os mesmos simbolos usados pelo projeto. -
__tests__/services/transformer.tspassa. - Imports relativos continuam validos depois da movimentacao.
- Nao houve mudanca de contrato misturada com a refatoracao.
- Comportamentos de grupo continuam preservando
@g.us. - Payloads Meta-like de grupo continuam mantendo
group_iderecipient_type. - O diff ficou dividido por responsabilidade, sem refatoracao ampla demais em um unico passo.