diff --git a/automerge-js/src/index.ts b/automerge-js/src/index.ts index 3a5316c9..585a3e6c 100644 --- a/automerge-js/src/index.ts +++ b/automerge-js/src/index.ts @@ -231,6 +231,20 @@ export function load(data: Uint8Array, _opts?: ActorId | InitOptions) : Do return doc } +export function loadIncremental(doc: Doc, data: Uint8Array, opts?: ApplyOptions) : Doc { + if (!opts) { opts = {} } + const state = _state(doc) + if (state.heads) { + throw new RangeError("Attempting to change an out of date document - set at: " + _trace(doc)); + } + if (_readonly(doc) === false) { + throw new RangeError("Calls to Automerge.change cannot be nested") + } + const heads = state.handle.getHeads() + state.handle.loadIncremental(data) + return progressDocument(doc, heads, opts.patchCallback || state.patchCallback) +} + export function save(doc: Doc) : Uint8Array { return _state(doc).handle.save() } diff --git a/automerge-js/test/extra_api_tests.ts b/automerge-js/test/extra_api_tests.ts new file mode 100644 index 00000000..ce0438d5 --- /dev/null +++ b/automerge-js/test/extra_api_tests.ts @@ -0,0 +1,20 @@ + +import * as assert from 'assert' +import * as Automerge from '../src' + +describe('Automerge', () => { + describe('basics', () => { + it('should allow you to load incrementally', () => { + let doc1 = Automerge.from({ foo: "bar" }) + let doc2 = Automerge.init(); + doc2 = Automerge.loadIncremental(doc2, Automerge.save(doc1)) + doc1 = Automerge.change(doc1, (d) => d.foo2 = "bar2") + doc2 = Automerge.loadIncremental(doc2, Automerge.getBackend(doc1).saveIncremental() ) + doc1 = Automerge.change(doc1, (d) => d.foo = "bar2") + doc2 = Automerge.loadIncremental(doc2, Automerge.getBackend(doc1).saveIncremental() ) + doc1 = Automerge.change(doc1, (d) => d.x = "y") + doc2 = Automerge.loadIncremental(doc2, Automerge.getBackend(doc1).saveIncremental() ) + assert.deepEqual(doc1,doc2) + }) + }) +})