Skip to content

El protocolo binario esta duplicado entre cliente y servidor #28

Description

@leocagli

Problema

El protocolo binario del juego está implementado dos veces, sin nada que garantice que las dos versiones coincidan:

Archivo Líneas
frontend/lib/aowProtocol.ts 2.275
server/src/protocol.ts 4.430

Son dos definiciones separadas del mismo formato de bytes. Si alguien agrega un paquete o cambia el orden de un campo en un lado y se olvida del otro, el juego no falla al compilar: falla en runtime, con datos corruptos y comportamiento raro que es muy difícil de rastrear hasta la causa.

Es el tipo de bug que le va a pasar a cualquier contribuidor nuevo que toque el protocolo.

Referencia

El proyecto elpatoenlasolas/argentum-web (MIT) resolvió esto con un packages/protocol compartido dentro de un monorepo pnpm: los tipos y la definición del protocolo viven en un solo lugar y los importan tanto el cliente como el servidor.

Alcance

  1. Extraer a un paquete compartido lo que hoy está duplicado:
    • identificadores de paquete (opcodes)
    • forma de cada mensaje
    • constantes compartidas (rangos de visión, tamaños)
  2. Que cliente y servidor importen de ahí, en vez de tener cada uno su copia.
  3. Que un cambio incompatible rompa la compilación, que es exactamente lo que hoy no pasa.
  4. Tests de ida y vuelta: serializar y deserializar cada tipo de paquete y verificar que se recupera lo mismo.

Lo difícil

No es un copiar y pegar. Las dos implementaciones probablemente divergieron en detalles, y hay que reconciliarlas antes de unificar. Conviene:

  • Empezar por los opcodes y las constantes, que es lo más fácil y lo que más se desincroniza
  • Migrar los paquetes de a uno, no todos juntos
  • Dejar tests de ida y vuelta antes de tocar nada, para tener red

Criterios de aceptación

  • Existe un paquete compartido con la definición del protocolo
  • Cliente y servidor lo importan, sin copias locales de lo migrado
  • Cambiar un opcode en el paquete compartido rompe la compilación de ambos lados
  • Hay tests de serialización y deserialización
  • El juego sigue funcionando igual (verificar entrando y jugando)

Nota

Se puede hacer por partes y cada parte deja el juego funcionando. No hace falta migrar los 6.700 renglones de una vez.

Metadata

Metadata

Assignees

Labels

GrantFox OSSIssue tracked in GrantFox OSSMaybe RewardedIssue may be eligible for a GrantFox rewardThird CampaignCampaign: Third CampaignbountyIssue con recompensa asignadaenhancementNew feature or requestgrantfoxPublicada en la campana de GrantFoxreward-100-usdRecompensa 100 USD - complejidad alta o fundacional

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions