- 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
73 lines
3.0 KiB
Markdown
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.
|