Comments (5)
You won't be able to get the changes as an object from the change event callback, but anything which has been altered in a specific change is contained within the patches
array:
const documentHandle = repo.find(AUTOMERGE_URL);
documentHandle.on('change', ({doc, patches}) => {
console.log(doc, patches);
}
See Patch reference in the API docs
from automerge-repo.
Is there an easy way to tally up these patches
to get a single JS object that represents the changes between the previous and the current state?
from automerge-repo.
You could take the patches and walk the before
and after
documents to create a new document with any changed properties?
Can you give us a more concrete use case. There might be a better option here.
from automerge-repo.
My use case is currently very simple. The content that I'm sharing between peers is an array that contains the relevant data. Currently users can only create new data, and that data is pushed to the array. Therefore it's pretty simple to write code that gets the data that is new:
documentHandle.on('change', (document) => {
const dataToRender = document.patchInfo.after?.data?.slice(document.patchInfo.before?.data?.length) || [];
renderData(dataToRender)
});
However it could get more complicated. I might want to delete arbitrary data from the array, or even change the data structure completely, to not have a single array but an object that can hold multiple arrays.
That's why I was seeking a general solution to get only the difference between the new and the old document.
from automerge-repo.
Ah! What you want is a patch
, not a change
. (I realize this is confusing, sorry.) Changes are compact internal binary representations of data for shuttling around over the network and storing on disk. They represent a bundle of operations created by a single users' call to change()
(or whatever local-language equivalent.)
Patches are very similar to a JSONPatch data structure and describe exactly what you want -- the precise difference between one set of heads and another. They're used internally to maintain the materialized objects but we also use them in user-land to handle incremental updates of things like {Prose, Code}Mirror and TLDraw.
You get a patch in the on("change" () =>{})
callback on a DocHandle, but you also can create a patch between any two arbitrary sets of Heads with Automerge.diff()
.
Have a look at that and see if it gets you on a good path.
from automerge-repo.
Related Issues (20)
- NodeFSStorageAdapter lock exception on large number of updates. HOT 2
- An unavailable document may just not be found yet
- WebSocket Ready flag should only be set after Open event HOT 2
- Virus detected in github head! Windows Defender Trojan:Script/Wacatac.H!ml HOT 4
- WebSocket client disconnection HOT 1
- Access to RawString through automerge-repo? HOT 1
- pnpm run dev, pnpm run dev:demo not working HOT 3
- Out of memory errors after creating enough large documents in repo HOT 7
- network sync protocol leaks documentIds to peers HOT 2
- [Svelte] Counter works but Text doesn't HOT 2
- On Peers in Automerge-Repo: Design HOT 2
- When a change event is emitted by the handle the `handle.docSync()` is still the old value HOT 5
- Large enough messages block the main thread for a long time, which can lead to socket timeouts on blocked clients HOT 3
- svelte: provide a way to await the document becoming ready HOT 1
- Repo and WebSocket provider send two responses for a "request" - the first unavailable, the second a sync HOT 1
- Share policy prevents fetching document from sync server
- repo.clone error message suggests using "handle.waitForReady", which doesn't exist
- Add a way to properly close and cleanup automerge-repo HOT 1
- Inactive `DocHandle`s are not evicted from `handleCache`
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from automerge-repo.