TRILHA 4

⚡ Técnicas Avançadas

RPC, event bus, CEF e o cliente iOS experimental. As três pontes que ligam o core Rust ao mundo: renderer, webview de terceiros e dispositivo remoto. Onde a engenharia começa a doer e começa a render.

3
Módulos
18
Tópicos
~2h30
Duração
Avançado
Nível

Mapa da trilha

Conteúdo detalhado

4.1 ~50 min

🔌 RPC e event bus

Como o core expõe funcionalidades via controller registry, fala com o renderer sem CORS e coordena módulos internos por broadcast tipado.

O que é:

Cada domínio em src/openhuman/<dom>/ declara handlers em rpc.rs e expõe schemas em schemas.rs — registrados num registry central.

Por que aprender:

É a regra única para adicionar um método. Sem isso você não consegue chamar nada do TypeScript nem do CLI.

Conceitos-chave:

ControllerSchema, RegisteredController, all_*_registered_controllers, wiring em src/core/all.rs.

O que é:

Tipo de retorno padrão dos controllers que carrega valor de sucesso OU erro estruturado — sempre serializável para JSON-RPC.

Por que aprender:

Sem ele cada handler inventa formato próprio e o frontend explode. RpcOutcome é o "Result" do core.

Conceitos-chave:

Variantes Ok/Err, erro tipado, propagação até o renderer, mapeamento em coreRpcClient.

O que é:

Metadados sobre cada método (campos, tipos, descrição) declarados no schemas.rs e consumidos por CLI e JSON-RPC genéricos.

Por que aprender:

Permite que adapters não cresçam ramos por domínio — toda exposição é dirigida por dados.

Conceitos-chave:

all_controller_schemas(), all_registered_controllers(), ControllerFuture, handle_* fns delegando para rpc.rs.

O que é:

Comando Tauri que roteia chamadas RPC do renderer para http://127.0.0.1:<port>/rpc com bearer auth, evitando preflight CORS.

Por que aprender:

fetch() direto força OPTIONS preflight — quebra silenciosamente em produção. invoke contorna isso e ainda autentica.

Conceitos-chave:

OPENHUMAN_CORE_TOKEN, core_rpc_token, coreRpcClient, IPC nativo vs HTTP do renderer.

O que é:

Pub/sub tipado em cima de tokio::broadcast. Muitos subscribers, sem retorno, eventos descritos por DomainEvent.

Por que aprender:

Desacopla domínios. Cron publica, webhook escuta, memory observa — sem ninguém importar ninguém.

Conceitos-chave:

DomainEvent #[non_exhaustive], EventHandler trait, SubscriptionHandle RAII, domain() filter.

O que é:

Dispatch 1-para-1 por método string, zero serialização. Tipos Send + 'static, mas não Serialize — trafega trait objects, Senders, Arcs.

Por que aprender:

Quando dois módulos precisam conversar in-process com handles vivos (mpsc, oneshot), JSON quebra. Native registry resolve.

Conceitos-chave:

register_native_global, request_native_global, NativeRequestError, override em testes.

Ver Completo
4.2 ~55 min

🖼️ CEF e webview accounts

Por que o app embute Chromium, o que CDP destrava, e a regra de ouro que mantém os webviews de terceiros seguros: zero JS injection.

O que é:

Chromium Embedded Framework — runtime de browser empacotado no app, em vez do webview nativo do SO.

Por que aprender:

WKWebView, WebView2 e WebKitGTK não expõem Chrome DevTools Protocol. Sem CDP, nada de "saber o que tá rolando no Slack/Whatsapp".

Conceitos-chave:

Target.getTargets, IndexedDB.requestData, DOMSnapshot, Page.addScriptToEvaluateOnNewDocument, --remote-debugging-port=19222.

O que é:

CLI customizada em app/src-tauri/vendor/tauri-cef/crates/tauri-cli que empacota Chromium em Contents/Frameworks/.

Por que aprender:

Stock @tauri-apps/cli produz bundle quebrado: panic em LibraryLoader::new. Diagnóstico desse erro custa horas.

Conceitos-chave:

scripts/ensure-tauri-cli.sh, pnpm tauri:ensure, [patch.crates-io], fork em tinyhumansai/tauri-cef.

O que é:

Um módulo Rust por provider (whatsapp, telegram, slack, discord, meet, imessage) com WebSocket para CDP em cadência fixa.

Por que aprender:

Toda a inteligência de "ler o que está acontecendo lá dentro" mora aqui — não no renderer, não no servidor.

Conceitos-chave:

Tick 2s DOM + 30s IDB walk, openhuman.memory_doc_ingest, webview:event payloads.

O que é:

Webviews acct_* (Slack, WhatsApp, Telegram, Discord, browserscan) carregam com ZERO JS injetado por design.

Por que aprender:

Qualquer script que roda dentro de origem terceira é superfície de ataque e contamina o estado da página.

Conceitos-chave:

CEF handlers nativos, CDP a partir do scanner, providers grandfathered (gmail, linkedin, meet), audit obrigatório.

O que é:

Domínios do Chrome DevTools Protocol usados para observar e dirigir os webviews sem rodar JS na página.

Por que aprender:

É a interface oficial. Se você quer interceptar request, mudar user-agent, simular clique — tudo aqui.

Conceitos-chave:

Network.* fetch, Emulation.setUserAgentOverride, Input.dispatchMouseEvent, Page.navigate, CefRequestHandler.

O que é:

Plugins Tauri podem injetar init scripts globais por padrão. tauri-plugin-opener instala click listener via init-iife.js.

Por que aprender:

É vetor silencioso: adiciona JS em TODOS os webviews, incluindo os de terceiros. Quebra a regra zero-injection sem aviso.

Conceitos-chave:

js_init_script, .open_js_links_on_click(false), audit ao adicionar plugin em app/src-tauri/src/lib.rs.

Ver Completo
4.3 ~45 min

📱 Cliente iOS (experimental)

Como o iOS conversa com o core desktop por três transportes diferentes, com criptografia E2E, PTT nativo e pareamento via QR.

O que é:

Target iOS coexiste no repo mas não é produto entregável. Não roda core Rust on-device — conecta ao desktop.

Por que aprender:

Saber o que existe e o que NÃO existe evita expectativas erradas e PRs que tentam shipar o que não está pronto.

Conceitos-chave:

app/src/pages/ios/, components/ios/, dependência do backend #709, sem core local.

O que é:

Quando iPhone e desktop estão na mesma rede, vai direto: HTTP ao core na porta dele.

Por que aprender:

Latência mínima, zero dependência de backend. É o caminho feliz quando a rede coopera.

Conceitos-chave:

ConnectionProfile, descoberta de IP, fallback automático quando LAN falha.

O que é:

Relay socket.io no backend, mas o conteúdo é criptografado E2E com XChaCha20-Poly1305 sobre key agreement X25519.

Por que aprender:

Resolve NAT/CGNAT sem servidor ver mensagem. Backend é só carteiro cego.

Conceitos-chave:

app/src/lib/tunnel/, channelId, pairingToken, sessionToken, ephemeral keypair, nonce.

O que é:

Último recurso: HTTP ao backend cloud quando LAN falha E tunnel está fora do ar.

Por que aprender:

Garante que o app não fica preto. Cobertura de cenário, mesmo que com features reduzidas.

Conceitos-chave:

Backend API endpoints, autenticação por sessionToken, ordem de fallback LAN → Tunnel → Cloud.

O que é:

Plugin Tauri iOS-only em packages/tauri-plugin-ptt/ que usa APIs Apple de PushToTalk para áudio com tela bloqueada.

Por que aprender:

PTT no iOS exige entitlement especial e ciclo de vida diferente. Não dá pra hackear com microfone genérico.

Conceitos-chave:

Swift bridge, AVAudioSession, Push to Talk framework, entitlement com.apple.developer.push-to-talk.

O que é:

Desktop gera QR com cid + pairingToken + chave pública. iOS escaneia e abre tunnel ao backend assumindo role:client.

Por que aprender:

É o único momento em que as duas pontas trocam chaves. Errar aqui = sessão sem E2E.

Conceitos-chave:

channelId, NSCameraUsageDescription, devices RPC domain, dependência backend tinyhumansai/backend#709.

Ver Completo
← Trilha 3: Domínios Trilha 5: Operação →