# Exemples

> Des exemples s3nd exécutables : une app de notes Next.js qui déplace son IndexedDB entre navigateurs avec un code, et un script Node qui fait l’aller-retour d’un snapshot et prouve les écritures conditionnelles. Plus les guides pas à pas de la documentation.

Canonical: https://s3nd.sh/fr/examples · Markdown: https://s3nd.sh/fr/examples.md · English: https://s3nd.sh/examples

Deux exemples à cloner et lancer, et les guides pas à pas de la documentation. Les deux exemples pointent sur un MinIO local par défaut, donc le vrai chemin de code tourne sur votre laptop sans inscription nulle part.

**un bucket sur votre laptop**
```sh
docker run -p 9000:9000 -p 9001:9001 \
  -e MINIO_ROOT_USER=minioadmin -e MINIO_ROOT_PASSWORD=minioadmin \
  quay.io/minio/minio server /data --console-address ":9001"
```

## Synchronisation IndexedDB (examples/indexeddb-sync)
Une app de notes qui garde tout dans IndexedDB et le déplace vers un autre appareil avec un code. Ouvrez-la dans deux navigateurs : le second est vide jusqu’à ce que le code transporte la base.

- Une paire exportDatabase / importDatabase complète contre un vrai object store
- Le code affiché groupé par quatre, et normalisé côté serveur avec ou sans les espaces
- Rien n’est importé avant que l’utilisateur confirme ce qu’il s’apprête à restaurer
- ifAbsent à l’écriture, une expiration d’une heure, et le DELETE après un import réussi
- Une seule transaction à l’import, pour qu’un échec à mi-chemin laisse les données précédentes intactes

Le code sur GitHub: https://github.com/AbderrahmaneMouzoune/s3nd/tree/main/examples/indexeddb-sync

```sh
cp .env.example .env.local
bun install
bun run dev   # localhost:3200, in two different browsers
```

## Aller-retour en Node (examples/node-script)
Un transfert entier dans un seul fichier : écrire un snapshot sous un code, le relire via une version mal tapée de ce code, prouver que les écritures conditionnelles fonctionnent, puis le brûler. Un smoke test pour un nouveau bucket ou fournisseur.

- Le taux de compression sur un dump réaliste, affiché en titre
- Un code tapé en minuscules avec un tiret, résolu par codes.normalize()
- ifAbsent qui rejette une seconde réservation, ifMatch qui rejette une écriture périmée
- destroy() dans un finally, pour que le script sorte sans attendre les sockets keep-alive

Le code sur GitHub: https://github.com/AbderrahmaneMouzoune/s3nd/tree/main/examples/node-script

```sh
cp .env.example .env
bun install
node --env-file=.env --import tsx src/round-trip.ts
```
**sortie attendue**
```text
code      ZZWMBSTD
stored    1826 bytes gzipped, from 22991 raw (12.6x)
typed     "zzwm-bstd" → ZZWMBSTD
restored  200 notes from node-script, written 2026-08-27T14:29:20.442Z
identical true
claim     rejected as PRECONDITION_FAILED
ifMatch   rejected as PRECONDITION_FAILED
burned    gone
```

## Des exemples pas à pas dans la documentation.
Chaque guide se copie-colle de bout en bout : le store, les routes, la moitié cliente, et ce qui casse si vous sautez une étape.

- [Migrer sur un nouvel appareil: Deux routes, deux appels, une étape de confirmation.](https://doc.s3nd.sh/docs/use-cases/new-device)
- [Sauvegarde continue: Un snapshot par compte, des écritures conditionnelles.](https://doc.s3nd.sh/docs/use-cases/continuous-backup)
- [Synchronisation chiffrée de bout en bout: WebCrypto dans le navigateur, du texte chiffré dans le bucket.](https://doc.s3nd.sh/docs/use-cases/encrypted-sync)
- [Des pièces jointes à côté des données: Des blobs en objets, des références dans le snapshot.](https://doc.s3nd.sh/docs/use-cases/attachments)
- [Sans serveur: La CLI directement vers Cloudflare R2, de bout en bout.](https://doc.s3nd.sh/docs/no-server)
- [Mettre en place un serveur: Routes, autorisation, expiration, CORS, smoke test.](https://doc.s3nd.sh/docs/server)
- [Tester: Un bucket en mémoire : pas d’identifiants, pas de réseau.](https://doc.s3nd.sh/docs/testing)

## Sans rien cloner.
1. Lancez MinIO avec la commande ci-dessus et créez un bucket.
2. Écrivez une configuration de départ et vérifiez-la.
3. Déplacez un fichier, et récupérez-le avec un code tapé n’importe comment.

```sh
npx @s3nd/cli init --provider minio --bucket transfers
npx @s3nd/cli doctor
npx @s3nd/cli put ./anything.pdf
npx @s3nd/cli get k7qp-2m4x
```
