---
title: "@vonvon-kit/electron"
description: "SDK Electron com fluxo PKCE no processo principal, preload viacontextBridge, armazenamento de tokens no keychain do SO eestratégias de callback loopback ou esquema personalizado."
locale: "pt-BR"
---

> Documentation Index
> Fetch the relevant documentation index at: https://vonvon.id/pt-br/sdks/llms.txt
> Use this file to discover all available pages before exploring further.

# @vonvon-kit/electron

## Estado

Status do registry: UNPUBLISHED. Instale este SDK somente a partir do checkout do código-fonte do repositório; não use um registry de pacotes externo.

O status do pacote é **Pacote atual**. App do processo principal,preload via contextBridge e bridge do lado do renderer estãoimplementados. Uma ida e volta real com o IdP em infraestrutura deprodução ainda está pendente de verificação manual.

## Pontos de entrada

| Entry | Finalidade |
| --- | --- |
| `@vonvon-kit/electron` | Export padrão: superfície de renderer e tipos |
| `@vonvon-kit/electron/main` | Somente processo principal: VonvonElectronApp |
| `@vonvon-kit/electron/renderer` | Processo de renderer: getVonvonBridge, VonvonClient |
| `@vonvon-kit/electron/preload` | Script de preload pronto que expõe window.vonvonBridge |

## Configuração do processo principal

```ts
// main.ts
import { app, ipcMain } from 'electron'
import { VonvonElectronApp } from '@vonvon-kit/electron/main'

const vonvonApp = new VonvonElectronApp({
  issuer: 'https://vonvon.id',
  clientId: 'client_abc123',
  // callbackStrategy: 'loopback' (default, RFC 8252 s.7.3) | 'custom-scheme'
})

app.whenReady().then(async () => {
  await vonvonApp.init(ipcMain)
  const win = new BrowserWindow({
webPreferences: {
  contextIsolation: true,
  preload: path.join(__dirname, 'preload.js'),
},
  })
  win.on('closed', () => vonvonApp.dispose(ipcMain))
})
```

## Script de preload

```ts
// preload.ts
import '@vonvon-kit/electron/preload'
// Exposes window.vonvonBridge with storage, signIn, signOut,
// getAccessToken, getSession, setTokenStorage
```

## Processo de renderer

```ts
import { getVonvonBridge } from '@vonvon-kit/electron/renderer'

const bridge = getVonvonBridge()

// Opens system browser, waits for loopback callback, exchanges code.
const accessToken = await bridge.signIn()

// Get the current unexpired access token. Expiry requires a new sign-in.
const token = await bridge.getAccessToken() // null when signed out or expired

// Get the current unexpired session (accessToken + expiresAt in epoch seconds).
const session = await bridge.getSession()

// Clear local tokens. No refresh or revoke request is sent.
await bridge.signOut()
```

## Esquema personalizado (alternativa ao loopback)

```ts
// main.ts
import { app } from 'electron'
import { VonvonElectronApp } from '@vonvon-kit/electron/main'

app.setAsDefaultProtocolClient('myapp')

const vonvonApp = new VonvonElectronApp({
  issuer: 'https://vonvon.id',
  clientId: 'client_abc123',
  callbackStrategy: 'custom-scheme',
  customScheme: 'myapp',  // redirect_uri = myapp://callback
})

vonvonApp.registerDeepLinkHandler(app)
```

## Armazenamento de tokens

- Os tokens são criptografados com `safeStorage.encryptString()`(keychain do SO) e armazenados como arquivos binários em`app.getPath('userData')/vonvon-tokens/` por padrão.
- Se `safeStorage.isEncryptionAvailable()` retornar `false`(Linux headless sem keyring), `setItem()` lança`ElectronStorageError` com código `encryption_unavailable`em vez de gravar texto simples silenciosamente.
- Substitua o diretório de armazenamento com `storageDir` em`VonvonElectronMainOptions`.

## Contrato nativo compartilhado

| Método | Descrição |
| --- | --- |
| `signIn(options?)` | Abre o navegador do sistema, troca o código, armazena os tokens |
| `signOut()` | Limpa os tokens locais |
| `getAccessToken()` | Retorna o token de acesso atual não expirado sem renovação; limpa o estado local expirado e retorna null. O SDK rejeita offline\_access até que DPoP seja implementado. |
| `getSession()` | Retorna os valores atuais accessToken e expiresAt se o token não tiver expirado, ou null |

Source: https://vonvon.id/pt-br/sdks/electron/index.mdx
