Repositories
@automerge/automerge
provides a JSON-like CRDT and a sync protocol, but this still leaves a lot of plumbing to do to use it in an application. @automerge/automerge-repo
is that plumbing.
The entry point for an automerge-repo
based application is to create a Repo
, passing it some form of StorageAdapter
- which knows how to save data locally - and zero or more NetworkAdapter
s, which know how to talk to other peers running automerge-repo
.
For example, this snippet creates a Repo
which listens for websocket connections and stores data in the local file system:
import { Repo } from "@automerge/automerge-repo";
import { WebSocketServer } from "ws";
import { NodeWSServerAdapter } from "@automerge/automerge-repo-network-websocket";
import { NodeFSStorageAdapter } from "@automerge/automerge-repo-storage-nodefs";
const wss = new WebSocketServer({ noServer: true });
const repo = new Repo({
network: [new NodeWSServerAdapter(wss)],
storage: new NodeFSStorageAdapter(dir),
});
A Repo
is a little like a database. It allows you to create and request DocHandle
s. Once you have a DocHandle
you can make changes to it and listen for changes received from other peers.
let doc = repo.create();
// Make a change ourselves and send that to everyone else
doc.change((d) => (d.text = "hello world"));
// Listen for changes from other peers
doc.on("change", ({ doc }) => {
console.log("new text is ", doc.text);
});
Any changes you make - or which are received from the network - will be stored in the attached storage adapter and distributed to other peers