From 376e81c9c71900b92c5b53adb360324137fa68d2 Mon Sep 17 00:00:00 2001 From: rever-tecnologia Date: Fri, 5 Dec 2025 16:52:05 -0300 Subject: [PATCH] Fix RustDesk remote access sync after agent install MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Reload config/token directly from store before syncing - Avoid race condition when register() calls ensureRustdesk before React state updates - Ensures machineId and token are always fresh from disk 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- apps/desktop/src/main.tsx | 42 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/apps/desktop/src/main.tsx b/apps/desktop/src/main.tsx index 6a2f199..4405a84 100644 --- a/apps/desktop/src/main.tsx +++ b/apps/desktop/src/main.tsx @@ -850,14 +850,50 @@ const resolvedAppUrl = useMemo(() => { throw error } setRustdeskInfo(normalized) + + // Recarrega o config diretamente do store para garantir que temos o machineId mais recente + // (evita race condition quando register() chama ensureRustdesk antes do state React atualizar) + const freshStore = await loadStore() + const freshConfig = await readConfig(freshStore) + const freshToken = await readToken(freshStore) + if (!freshConfig?.machineId) { + logDesktop("rustdesk:provision:sync-skipped", { reason: "no-machineId-in-store" }) + return + } + if (!freshToken) { + logDesktop("rustdesk:provision:sync-skipped", { reason: "no-token-in-store" }) + return + } + + // Faz o sync diretamente com os dados frescos do store try { - await syncRemoteAccessNow(normalized) - logDesktop("rustdesk:provision:synced", { id: normalized.id }) + const syncPayload = buildRemoteAccessPayload(normalized) + if (!syncPayload) { + logDesktop("rustdesk:provision:sync-skipped", { reason: "invalid-payload" }) + return + } + const response = await fetch(`${apiBaseUrl}/api/machines/remote-access`, { + method: "POST", + headers: { + "Content-Type": "application/json", + "Idempotency-Key": `${freshConfig.machineId}:RustDesk:${normalized.id}`, + }, + body: JSON.stringify({ machineToken: freshToken, ...syncPayload }), + }) + if (response.ok) { + const nextInfo: RustdeskInfo = { ...normalized, lastSyncedAt: Date.now(), lastError: null } + await writeRustdeskInfo(freshStore, nextInfo) + setRustdeskInfo(nextInfo) + logDesktop("rustdesk:provision:synced", { id: normalized.id }) + } else { + const errorText = await response.text().catch(() => "") + logDesktop("rustdesk:provision:sync-error", { status: response.status, error: errorText.slice(0, 200) }) + } } catch (error) { logDesktop("rustdesk:provision:sync-error", { error: String(error) }) } }, - [store, syncRemoteAccessNow] + [store] ) const ensureRustdesk = useCallback(async () => {