Back to flin
flin

Le patron de trait StorageBackend

Une plongée en profondeur dans le trait StorageBackend de FLIN -- l'abstraction Rust qui rend quatre backends de stockage de fichiers interchangeables sans changer une seule ligne de code applicatif.

Juste A. Gnimavo (Thales) & Claude | March 26, 2026 3 min flin
EN/ FR/ ES
flinrusttraitsstorageabstractionarchitecture

Les abstractions sont faciles à mal concevoir. Vous les rendez soit trop fines -- exposant des détails spécifiques au backend qui fuient à travers chaque site d'appel -- soit trop épaisses, cachant des capacités dont le code en aval a légitimement besoin. Le trait StorageBackend dans FLIN devait naviguer précisément cet fil : suffisamment abstrait pour que les systèmes de fichiers locaux, S3, Cloudflare R2 et Google Cloud Storage s'intègrent tous derrière la même interface, et suffisamment concret pour que chaque backend puisse optimiser ses opérations sans contorsions.

La définition du trait

Le trait complet a neuf méthodes. Chacune a été choisie parce que les quatre backends en ont besoin, et aucune ne pouvait être exprimée purement en termes des autres :

rustpub trait StorageBackend: Send + Sync {
    fn put(&self, hash: &str, data: &[u8], extension: &str) -> StorageResult<String>;
    fn put_from_path(&self, hash: &str, temp_path: &str, extension: &str) -> StorageResult<String>;
    fn get(&self, path: &str) -> StorageResult<Vec<u8>>;
    fn delete(&self, path: &str) -> StorageResult<()>;
    fn exists(&self, hash: &str, extension: &str) -> StorageResult<bool>;
    fn url(&self, hash: &str, extension: &str) -> String;
    fn signed_url(&self, hash: &str, extension: &str, duration: Duration) -> StorageResult<String>;
    fn backend_type(&self) -> &'static str;
    fn base_path(&self) -> &str;
}

Pourquoi Send + Sync

Les deux mots les plus importants dans la définition du trait ne sont pas des noms de méthodes -- ce sont Send + Sync. Ces traits marqueurs Rust garantissent que tout type implémentant StorageBackend peut être partagé entre les threads et envoyé à travers les frontières de threads de manière sûre.

Le patron Arc<dyn StorageBackend> -- un objet trait à comptage de références atomique -- est la façon dont FLIN partage une seule instance de backend entre tous les gestionnaires de requêtes. La contrainte Send + Sync rend ce patron possible au moment de la compilation.

Invariants de sécurité

La conception du trait encode plusieurs invariants de sécurité que chaque backend doit respecter :

Validation du hash. Chaque backend valide le paramètre hash avant de construire un chemin, empêchant les attaques de traversée de chemin.

Comparaison en temps constant. La vérification des URL signées utilise la comparaison d'octets en temps constant pour empêcher les attaques par timing.

Assainissement des extensions. Les extensions de fichiers sont débarrassées des séparateurs de chemin et validées contre une liste blanche de caractères.

Ce que le trait n'inclut pas

Il n'y a pas de méthodes pour lister tous les fichiers, diffuser de gros téléchargements ou gérer des listes de contrôle d'accès. Ceux-ci sont gérés par des systèmes séparés qui se composent avec le backend de stockage plutôt que de l'étendre. Cela garde le trait focalisé -- neuf méthodes, chacune avec un but clair, chacune implémentable par tout système de stockage capable de stocker et récupérer des octets par clé.


Ceci est la partie 127 de la série « Comment nous avons construit FLIN », documentant comment un CEO à Abidjan et un CTO IA ont conçu et construit un langage de programmation à partir de zéro.

Navigation de la série : - [126] Stockage de fichiers avec 4 backends - [127] Le patron de trait StorageBackend (vous êtes ici) - [128] Backends R2 et Google Cloud Storage

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles

Thales & Claude thales

Treize agents, quarante-trois minutes : la première session Workflow de Claude Fable 5, et ce qu'un script d'orchestration déterministe change aux builds multi-agents

Un prompt, treize agents, quarante-trois minutes : la première session de production avec Claude Fable 5 et l'outil Workflow de Claude Code a livré un site web de production complet de sept pages plus un endpoint backend de capture de leads, en un seul commit. Le carnet de bord : le script d'orchestration déterministe, le patron d'injection de contrat entre les phases, l'économie par agent du fan-out parallèle, et le suspense de la limite de session que le journal de reprise a transformé en non-événement.

23 min Jun 12, 2026
claude-fable-5claude-codeworkflow-toolmulti-agent +10
Thales & Claude casp

La porte a détecté sa propre dérive : une journée dans CASP avec Claude Fable 5

Nous avons confié au modèle Claude le plus autonome à ce jour les clés de CASP — le CLI open source qui garde les agents de code IA honnêtes face à git — avec l'autorité de rejeter notre propre roadmap. Il a rejeté cinq choses, trouvé deux vrais bugs dans le validateur en le dogfoodant, les a corrigés sous une porte à deux auditeurs, et a laissé casp check entièrement vert sur son propre dépôt pour la première fois. CASP 0.3.0 en est le résultat.

16 min Jun 10, 2026
caspzerosuiteworkflowai-cto +9
Thales & Claude zerosuite

La transplantation du CASP : comment la discipline des six fichiers est passée de Conductor à un ERP transport anti-fraude, ce que la compétence /next ajoute quand l'opérateur tape juste « next », et pourquoi le coût d'une dérive du CASP grimpe quand le projet, c'est l'argent des autres

La discipline du CASP qui a piloté trente-cinq sessions de Conductor est agnostique au produit. Le carnet de bord de sa transplantation sur KASSIA, un ERP transport anti-fraude pour un exploitant de flotte en Côte d'Ivoire : ce qui a migré, ce qui n'a pas migré (le validateur sur mesure — et ce que son absence coûte), ce que la compétence /next ajoute quand l'opérateur tape un seul mot, et là où le CASP s'arrête — le bug de déploiement qu'il ne pouvait pas voir parce qu'il enregistre l'intention, pas la réalité de l'infrastructure.

23 min Jun 8, 2026
kassiaerp-kassia-transport-logistiquezerosuiteCASP +15