---
title: "@vonvon-kit/electron"
description: "Electron-SDK mit PKCE-Flow im Hauptprozess, contextBridge-Preload,OS-Keychain-Token-Speicherung und Loopback- oderCustom-Scheme-Callback-Strategien."
locale: "de"
---

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

# @vonvon-kit/electron

## Zustand

Registry-Status: UNPUBLISHED. Installieren Sie dieses SDK nur aus einem Checkout des Repository-Quellcodes; verwenden Sie keine externe Paket-Registry.

Paketstatus: **Aktuelles Paket**. Hauptprozess-App,contextBridge-Preload und renderer-seitige Bridge sind implementiert. Einechter IdP-Round-Trip auf Produktionsinfrastruktur steht noch manuell aus.

## Einstiegspunkte

| Eintrag | Zweck |
| --- | --- |
| `@vonvon-kit/electron` | Standardexport: Renderer-Oberfläche und Typen |
| `@vonvon-kit/electron/main` | Nur Hauptprozess: VonvonElectronApp |
| `@vonvon-kit/electron/renderer` | Renderer-Prozess: getVonvonBridge, VonvonClient |
| `@vonvon-kit/electron/preload` | Vorgefertigtes Preload-Skript, das window.vonvonBridge verfügbar macht |

## Hauptprozess-Einrichtung

```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))
})
```

## Preload-Skript

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

## Renderer-Prozess

```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()
```

## Benutzerdefiniertes Schema (Alternative zu 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)
```

## Token-Speicher

- Tokens werden mit `safeStorage.encryptString()` (OS-Keychain)verschlüsselt und standardmäßig als Binärdateien in`app.getPath('userData')/vonvon-tokens/` gespeichert.
- Wenn `safeStorage.isEncryptionAvailable()` `false` zurückgibt(headless Linux ohne Keyring), löst `setItem()` einen`ElectronStorageError` mit Code `encryption_unavailable` aus,anstatt stillschweigend Klartext zu schreiben.
- Das Speicherverzeichnis mit `storageDir` in`VonvonElectronMainOptions` überschreiben.

## Gemeinsamer nativer Vertrag

| Methode | Beschreibung |
| --- | --- |
| `signIn(options?)` | Öffnet Systembrowser, tauscht Code ein, speichert Tokens |
| `signOut()` | Löscht lokale Tokens |
| `getAccessToken()` | Gibt das aktuelle, nicht abgelaufene Zugriffstoken ohne Refresh zurück; löscht abgelaufenen lokalen Status und gibt null zurück. Das SDK lehnt offline\_access ab, bis DPoP implementiert ist. |
| `getSession()` | Gibt den aktuellen, nicht abgelaufenen accessToken und expiresAt oder null zurück |

Source: https://vonvon.id/de/sdks/electron/index.mdx
