El flujo central de sincronización P2P en RutaPAE es:
DomainManager.P2PManager.start().flowchart TD
A[RutaPAE inicia] --> B[DomainManager.init()]
B --> C[P2PManager.start()]
C --> D[Descubrir peers y hotspots]
D --> E{Máquina conocida?}
E -->|Sí| F[connectMachine]
E -->|No| G[connectDiscoveredMachine]
G --> H[resolveConnectedPeerAddress]
F --> H
H --> I[SyncDeliveriesFromMachine]
I --> J[GET /p2p/machine/deliveries/<page>/<size>]
I --> K[GET /p2p/machine/delivery/<id>]
I --> L[GET /p2p/machine/delivery/synchronized/<id>]
L --> M[Eliminar entrega local sincronizada]
RutaPAE llama P2PManager.connectMachine(machineDatabaseId).P2PManager intenta resolver la dirección del peer conectado.discoveredPeers.connectHotspot.syncDeliveriesFromMachine() puede iniciar.discoveredPeers.P2PManager.connectDiscoveredMachine(address).machines.hotspotCandidates.machines.discoveredPeers: peers P2P que han sido detectados pero no necesariamente conectados.machines: peers ya reconocidos como máquinas (MACHINE-…).operators: peers reconocidos como operadores (OPERATOR-…).hotspotCandidates: redes Wi-Fi creadas por una máquina.P2PManager solicita DELIVERIES_PAGE(page, size).pageSize se fija en 1.deliveryIds y procesa cada DELIVERY(id).Para cada entrega remota:
P2PDeliveryData.Delivery local con idLocalDeliveryT = remoteDeliveryId.alreadyPresent.
Una vez que RutaPAE confirma una entrega remota sincronizada:
notifyDeliverySynchronized(machineDatabaseId, remoteDeliveryId).DELIVERY_SYNCHRONIZED(id).deleted: true, la entidad local puede borrarse.monitorMachineSyncConnection().DeliverySyncUiEmitter.getMachineConfiguration(machineDatabaseId) llama a GET /p2p/machine/configuration.updateMachineConfiguration(machineDatabaseId, configuration) hace PUT /p2p/machine/configuration.P2PMachineConfigurationUpdateResponse.