Files
clip-sync/ARCHITECTURE.md
T
bruno 736c9024f3 feat: clip-sync v1.0 — daemon de sync clipboard bidirectional en Go
- Daemon Go ~150 lignes, zéro dépendance hors stdlib + toml
- Watch clipboard local (poll 500ms, hash-based dedup)
- Serveur HTTP POST /clip pour réception des pairs
- Anti-boucle d'écho (lastHash + host+TS filtering)
- Cross-platform: Linux (xclip/wl-paste), macOS, Windows
- Configuration TOML statique des pairs
- install.sh one-liner multi-OS
- ARCHITECTURE.md + ROADMAP.md + README.md
2026-08-08 12:02:58 -04:00

73 lines
3.0 KiB
Markdown

# clip-sync — Architecture
## Principe
Un daemon Go (~150 lignes, zéro dépendance hors stdlib) qui synchronise le presse-papier entre machines sur un LAN. Chaque machine tourne le même binaire, écoute sur `:9137`, et pousse les nouveaux clips vers toutes les autres.
```
┌──────────────┐ POST /clip ┌──────────────┐
│ deepin │◄──────────────►│ vivobook │
│ :9137 │ {text,ts} │ :9137 │
│ │ │ │
│ poll 500ms │ │ poll 500ms │
│ xclip -o │ │ Get-Clip │
└──────────────┘ └──────────────┘
```
## Boucles (tout dans `main.go`)
### Boucle 1 — Watch local
Toutes les 500ms, lit le clipboard local (`xclip -o` / `powershell Get-Clipboard`), le hashe (SHA-256). Si le hash diffère du dernier connu → broadcast HTTP POST à tous les pairs.
### Boucle 2 — Receive
Serveur HTTP `POST /clip`. Reçoit `{text, ts, host}`. Si le host est soi-même ou si le timestamp est ≤ au dernier reçu de ce host → ignore. Sinon, écrit dans le clipboard local ET met à jour `lastHash` pour que la boucle 1 ne rebroadcast pas.
### Anti-boucle d'écho
Après un `clipboard.Write()` déclenché par un clip reçu, `lastHash` est mis à jour avec le hash du texte reçu. Le poller local le voit comme "déjà connu" → pas de rebroadcast.
## Composants
| Fichier | Rôle | Lignes |
|---------|------|--------|
| `main.go` | Serveur HTTP + watch loop + dispatch | ~120 |
| `peers.toml` | Configuration des pairs | ~10 |
| `install.sh` | Installation one-liner cross-OS | ~40 |
## Plateformes
| OS | Clipboard read | Clipboard write |
|----|---------------|-----------------|
| Linux (X11) | `xclip -o -selection clipboard` | `xclip -selection clipboard` |
| Linux (Wayland) | `wl-paste` | `wl-copy` |
| macOS | `pbpaste` | `pbcopy` |
| Windows | `powershell -Command Get-Clipboard` | `powershell -Command Set-Clipboard -Value ...` |
Détection automatique au démarrage via `runtime.GOOS` + test de présence des binaires.
## Ce qui est volontairement omis
- **Chiffrement** — LAN de confiance. Si besoin → TLS entre pairs (v2).
- **Découverte automatique (mDNS)** — config statique = 5 lignes de TOML. Discovery = 200 lignes. v2.
- **Historique / ring buffer** — ce n'est pas un gestionnaire de presse-papier, c'est du live sync.
- **UI / tray icon** — daemon headless, `systemd --user` ou `nssm` pour Windows.
- **Auth token** — HTTP en clair sur LAN. Port 9137 non exposé à l'extérieur.
## Dépendances
Zéro. `net/http`, `crypto/sha256`, `encoding/json`, `os/exec`, `runtime`. Stdlib Go pure.
## Build
```bash
# Linux
GOOS=linux GOARCH=amd64 go build -o clip-sync .
# Windows
GOOS=windows GOARCH=amd64 go build -o clip-sync.exe .
# macOS
GOOS=darwin GOARCH=amd64 go build -o clip-sync .
```
Un binaire statique par OS. Pas de Docker, pas de runtime.