# Desktop (Tauri) - Sincronizacao RustDesk com Backend Este documento descreve o mecanismo de sincronizacao automatica do RustDesk com o backend apos o provisionamento no aplicativo desktop. ## Visao Geral O fluxo de sincronizacao do RustDesk garante que as credenciais de acesso remoto (ID e senha) sejam automaticamente registradas no backend assim que o RustDesk for provisionado na maquina. Isso elimina a necessidade de cadastro manual e permite acesso remoto imediato. ## Arquitetura ### Fluxo de Provisionamento ``` 1. Usuario clica "Registrar" no app desktop 2. TypeScript faz POST /api/machines/register 3. TypeScript salva token/config no store local 4. TypeScript inicia RustDesk em background (fire-and-forget) 5. TypeScript redireciona IMEDIATAMENTE para o sistema 6. [Background] Rust provisiona RustDesk (~30s) 7. [Background] Rust faz POST /api/machines/remote-access (SYNC) 8. [Background] Rust atualiza lastSyncedAt no store ``` ### Por que o Sync e feito no Rust? | Problema anterior | Solucao Rust | |-------------------|--------------| | CSP do Tauri bloqueava `fetch()` | Rust usa reqwest diretamente, sem CSP | | Race conditions com React state | Fluxo sincrono no Rust | | Fire-and-forget nao completava | Sync acontece antes do return | | Timeout do navegador | Rust tem controle total do HTTP | ## Implementacao ### Arquivo: `apps/desktop/src-tauri/src/rustdesk.rs` O sync e executado automaticamente apos o provisionamento bem-sucedido: ```rust // Apos salvar dados do RustDesk no store local sync_remote_access_with_backend(&result)?; ``` ### Payload da API ```json { "machineToken": "", "provider": "RustDesk", "identifier": "", "password": "", "notes": "Versao: 1.4.4. Provisionado em: 1765045637482" } ``` ### Headers - `Content-Type: application/json` - `Idempotency-Key: :RustDesk:` (previne duplicatas) ### Endpoint ``` POST /api/machines/remote-access ``` ## Arquivos de Configuracao ### Store Local Caminho: `%LOCALAPPDATA%\br.com.esdrasrenan.sistemadechamados\machine-agent.json` Estrutura relevante: ```json { "config": { "machineId": "...", "apiBaseUrl": "https://tickets.esdrasrenan.com.br" }, "token": "...", "rustdesk": { "id": "497869711", "password": "...", "installedVersion": "1.4.4", "lastProvisionedAt": 1765045637482, "lastSyncedAt": 1765045638173, "lastError": null } } ``` ### Logs Caminho: `%LOCALAPPDATA%\br.com.esdrasrenan.sistemadechamados\logs\rustdesk.log` Mensagens de sucesso: ``` [...] Iniciando sincronizacao com backend... [...] Sync com backend OK: status 200 OK [...] Acesso remoto sincronizado com backend ``` ## Diagnostico ### Verificar se o Sync Funcionou 1. Abrir `machine-agent.json`: ``` %LOCALAPPDATA%\br.com.esdrasrenan.sistemadechamados\machine-agent.json ``` 2. Verificar campo `rustdesk.lastSyncedAt`: - Se tem valor numerico: sync OK - Se `null`: sync falhou 3. Verificar logs: ``` %LOCALAPPDATA%\br.com.esdrasrenan.sistemadechamados\logs\rustdesk.log ``` ### Possiveis Erros | Erro | Causa | Solucao | |------|-------|---------| | `400 Bad Request` | Payload incorreto | Verificar schema da API | | `401 Unauthorized` | Token invalido/expirado | Re-registrar maquina | | `Connection refused` | Backend indisponivel | Verificar URL da API | | `lastSyncedAt: null` | Sync nao executou | Verificar logs do Rust | ### Fallback Manual Se o sync automatico falhar, o sistema tenta novamente a cada 30 segundos em background. Tambem e possivel forcar o re-provisionamento via: 1. Aba "Configuracoes" no app desktop 2. Clicar "Reprovisionar RustDesk" ## Historico de Mudancas ### Dezembro 2025 - Migracao do Sync para Rust **Problema:** O sync feito em TypeScript (`fetch()`) falhava com "Failed to fetch" devido ao CSP do Tauri v2 bloquear requisicoes externas do webview. **Solucao:** Mover o sync para o Rust, que faz HTTP diretamente via reqwest sem restricoes de CSP. **Arquivos modificados:** - `apps/desktop/src-tauri/src/rustdesk.rs` - Adicionado `sync_remote_access_with_backend()` - `apps/desktop/src/main.tsx` - Simplificado para fire-and-forget --- Ultima atualizacao: Dezembro 2025 - Sync automatico via Rust apos provisionamento.