# PLAY CHANNELS — Módulo VPN nativo (Android)

O app JS já está pronto (`src/vpn/native.ts` + `src/vpn/VpnContext.tsx`) e procura um módulo nativo chamado
**`PlayChannelsVpn`**. Enquanto ele não existir no build (Expo Go / Web), a VPN aparece como *indisponível* — nada é simulado.

## Contrato (Expo Module em Kotlin)
| Método | Descrição |
|---|---|
| `prepare(): Promise<boolean>` | Chama `VpnService.prepare()`; abre o diálogo de consentimento do Android. |
| `connect({protocol, config, dnsServers, killSwitch, dnsLeakProtection})` | Sobe o túnel. `config` = conteúdo `.conf` (WireGuard) ou `.ovpn` (OpenVPN) vindo de `GET /api/vpn/servers/{id}/config`. |
| `disconnect()` | Derruba o túnel. |
| `getStatus()` | `{status, publicIp?, error?}` |
| evento `onStatusChange` | `{status: connecting|connected|disconnected|error, error?}` — o JS faz reconexão automática com backoff. |

## Implementação recomendada
1. Criar módulo local: `npx create-expo-module@latest --local play-channels-vpn`.
2. WireGuard: dependência `com.wireguard.android:tunnel` (GoBackend, que estende `VpnService`).
   OpenVPN: `ics-openvpn` (GPL — avaliar licença).
3. Proteção DNS: `Builder.addDnsServer()` apenas com os DNS do túnel + `AllowedIPs = 0.0.0.0/0, ::/0`.
4. Kill switch: orientar o usuário a ativar *VPN sempre ativa* + *Bloquear conexões sem VPN* (botão "Configurações do sistema" na tela VPN) e manter o túnel em Foreground Service.
5. Manifest (via config plugin): serviço com `android:permission="android.permission.BIND_VPN_SERVICE"` e intent-filter `android.net.VpnService`; permissões `INTERNET`, `FOREGROUND_SERVICE`, `FOREGROUND_SERVICE_SYSTEM_EXEMPTED`.
6. Gerar build Android (Publish → build) — não funciona no Expo Go.

## Infraestrutura
Servidor WireGuard próprio (ex.: `wg-quick` em VPS sua) ou provedor autorizado. Cadastre cada servidor no painel `/admin → Servidores VPN`, colando a configuração do peer.
Próximo passo sugerido: gerar chaves/peers por usuário no backend em vez de uma config compartilhada.
