Code Monkey home page Code Monkey logo

Comments (5)

acurrieclark avatar acurrieclark commented on August 18, 2024

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.

RigoTamas avatar RigoTamas commented on August 18, 2024

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.

acurrieclark avatar acurrieclark commented on August 18, 2024

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.

RigoTamas avatar RigoTamas commented on August 18, 2024

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.

pvh avatar pvh commented on August 18, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.