Sync & Local-first
barrel-lite est un Barrel offline-first dans le navigateur. Lisez et ecrivez localement, synchronisez quand vous etes connecte, et recherchez les vecteurs sur l'appareil. TypeScript, zero dependance a l'execution.
Offline-first
Lectures et ecritures passent d'abord par un stockage OPFS local ; la synchronisation assure la durabilite, pas le chemin critique.
Sync correcte
Vecteurs de version HLC, compatibles octet par octet avec le serveur, ainsi la synchronisation converge et ne perd jamais silencieusement une ecriture.
Multi-onglets
Un onglet par origine possede le stockage via Web Locks ; les autres onglets lui deleguent et voient les memes changements.
Mises a jour continues
Polling adaptatif avec un flux SSE continu optionnel qui le reveille lors des changements serveur.
Recherche vectorielle locale
Recuperez les vecteurs par document et executez un top-k cosinus en force brute sur l'appareil, avec un filtre BQL optionnel.
Pieces jointes et BQL
Synchronisation des pieces jointes adressees par contenu et un sous-ensemble BQL local correspondant aux requetes documentaires du serveur.
Demarrage Rapide
%% Deux noeuds Barrel convergent via HTTP. Un seul passage, puis retour.
{ok, Stats} = barrel_rep:replicate(<<"notes">>,
<<"http://edge.example/db/notes">>, #{direction => push}).
%% Ou synchronisez en continu. La tache est persistee, elle reprend
%% depuis son point de reprise apres un redemarrage.
{ok, TaskId} = barrel_rep_tasks:start_task(#{
source => <<"notes">>,
target => <<"http://edge.example/db/notes">>,
mode => continuous,
direction => push
}).
ok = barrel_rep_tasks:pause_task(TaskId),
ok = barrel_rep_tasks:resume_task(TaskId),
Tasks = barrel_rep_tasks:list_tasks(). import { Database } from "barrel-lite";
// Open an offline-first database that syncs to a Barrel server
const db = await Database.open("notes", {
remote: { url: "https://edge.example", db: "notes", token: "bsp_..." },
});
// Local reads and writes; works offline
await db.put({ id: "n1", title: "Design review" });
const doc = await db.get("n1");
// Keep converging in the background, vectors included
db.liveSync({ continuous: true, vectors: true });
// Brute-force vector search over the synced records, in the browser
const hits = await db.searchLocal(queryVector, { k: 10 }); Quand l'Utiliser
Utilisez barrel-lite quand :
- + Votre app doit fonctionner hors ligne
- + Vous voulez une recherche sur l'appareil sur des donnees synchronisees
- + Vous avez besoin d'un cache local qui converge avec un serveur
- + Vous voulez le meme protocole et les memes codecs que Barrel
Considerez des alternatives quand :
- + Vous ne communiquez qu'avec un serveur en ligne
- + Vous avez besoin d'un index ANN dans le navigateur (la recherche s'execute cote serveur)
- + Vous n'utilisez pas le protocole Barrel