Commit graph

788 commits

Author SHA1 Message Date
Orion Henry
12308206ff
Merge pull request #438 from automerge/opobserver-type-trickery
Opobserver type trickery
2022-10-06 14:40:58 -07:00
Alex Good
dbf438f7cb
Track whether a transaction is observed in types
With the `OpObserver` moving to the transaction rather than being passed
in to the `Transaction::commit` method we have needed to add a way to
get the observer back out of the transaction (via
`Transaction::observer` and `AutoCommit::observer`). This `Observer`
type is then used to handle patch generation logic. However, there are
cases where we might not want an `OpObserver` and in these cases we can
execute various things fast - so we need to have something like an
`Option<OpObserver>`. In order to track the presence or otherwise of the
observer at the type level introduce
`automerge::transaction::observation`, which is a type level `Option`.
This allows us to efficiently choose the right code paths whilst
maintaining correct types for `Transaction::observer` and
`AutoCommit::observer`
2022-10-06 22:38:37 +01:00
Peter van Hardenberg
846f7bb181 this crept back in somehow... the child of a document is not a document 2022-10-04 16:01:57 -07:00
Orion Henry
8b7fa5d33f typescript fixes 2022-10-04 14:09:38 -05:00
Orion Henry
4e17d798be
move automerge-js onto the applyPatches model 2022-10-04 18:17:03 +01:00
Orion Henry
210e9648bf
The patch interface needs an accurate path per patch op
For the path to be accurate it needs to be calculated at the moment of op insert
not at commit.  This is because the path may contain list indexes in parent
objects that could change by inserts and deletes later in the transaction.

The primary change was adding op_observer to the transaction object and
removing it from commit options.  The beginnings of a wasm level
`applyPatch` system is laid out here.
2022-10-04 18:15:49 +01:00
Alex Good
29f2c9945e query::Prop: don't scan past end of OpTree
The logic in `query::Prop` works by first doing a binary search in the
OpTree for the node where the key we are looking for starts, and then
proceeding from this point forwards skipping over nodes which contain
only invisible ops. This logic was incorrect if the start index returned
by the binary search was in the last child of the optree and the last
child only contains invisible ops. In this case the index returned by
the query would be greater than the length of the optree.

Clamp the index returned by the query to the total length of the opset.
2022-10-04 17:25:56 +01:00
Alex Good
d6a8d41e0a Update JS README 2022-10-04 17:23:37 +01:00
Alex Good
b6c375efb9 Fix a few small typescript complaints 2022-10-04 17:23:37 +01:00
Alex Good
16f2272b5b Generate index.d.ts from source
The JS package is now written in typescript so we don't need to manually
maintain an index.d.ts file. Generate the index.d.ts file from source
and ship it with the JS package.
2022-10-04 17:23:37 +01:00
Alex Good
da51492327 build both nodejs and bundler packages in yarn build 2022-10-04 17:23:37 +01:00
Alex Good
577bda3e7f update wasm-bindgen 2022-10-04 17:23:37 +01:00
Alex Good
20dc0fb54e Set optimization levels to 'Z' for release profile
This reduces the size of the WASM bundle which is generated to around
800kb. Unfortunately wasm-pack doesn't allow us to use arbitrary
profiles when building and the optimization level has to be set at the
workspace root - consequently this flag is set for all packages in the
workspace. This shouldn't be an issue really as all our dependents in
the Rust world will be setting their own optimization flags anyway.
2022-10-04 17:23:37 +01:00
Alex Good
4f03cd2a37 Add an e2e testing tool for the JS packaging
JS packaging is complicated and testing it manually is irritating. Add a
tool in `automerge-js/e2e` which stands up a local NPM registry and
publishes the various packages to that registry for use in automated and
manual tests. Update the test script in `scripts/ci/js_tests` to run the
tests using this tool
2022-10-04 17:23:37 +01:00
Alex Good
7825da3ab9 Add examples of using automerge with bundlers 2022-10-04 17:23:37 +01:00
Alex Good
8557ce0b69 Rename automerge-js to automerge
Now that automerge-js is ready to go we rename it to `automerge-js` and
set the version to `2.0.0-alpha.1`
2022-10-04 17:23:37 +01:00
Alex Good
a9e23308ce Remove async automerge-wasm wrapper
By moving to wasm-bindgens `bundler` target rather than using the `web`
target we remove the need for an async initialization step on the
automerge-wasm package. This means that the automerge-js package can now
depend directly on automerge-wasm and perform initialization itself,
thus making automerge-js a drop in replacement for the `automerge` JS
package (hopefully).

We bump the versions of automerge-wasm
2022-10-04 17:23:37 +01:00
Alex Good
837c07b23a
Correctly encode compressed changes in sync messages
Sync messages encode changes as length prefixed byte arrays. We were
calculating the length using the uncompressed bytes of a change but
encoding the bytes of the change using the (possibly) compressed bytes.
This meant that if a change was large enough to compress then it  would
fail to decode. Switch to using uncompressed bytes in sync messages.
2022-10-02 18:59:41 +01:00
Alex Good
3d59e61cd6
Allow empty changes when loading document format
The logic for loading compressed document chunks has a check that the
`max_op` of a change is valid. This check was overly strict in that it
checked that the max op was strictly larger than the max op of a
previous strange - this rejects valid documents which contain changes
with no ops in them, in which case the max op can be equal to the max op
of the previous change. Loosen the logic to allow empty changes.
2022-09-30 19:00:48 +01:00
Alex Good
e57548f6e2
Fix broken encode/decode change
Previous ceremonies to appease clippy resulted in the
encodeChange/decodeChange wasm functions being slightly broken. Here we
fix them.
2022-09-29 15:49:31 -05:00
Alex Good
c7e370a1df
Appease clippy 2022-09-28 17:18:37 -05:00
Alex Good
427002caf3 Correctly load documents with deleted objects
The logic for reconstructing changes from the compressed document format
records operations which set a key in an object so that it can later
reconstruct delete operations from the successor list of the document
format operations. The logic to do this was only recording set
operations and not `make*` operations. This meant that delete operations
targeting `make*` operations could not be loaded correctly.

Correctly record `make*` operations for later use in constructing delete
operations.
2022-09-12 12:38:57 +01:00
Alex Good
f586c82557 OpSet::visualise: add argument to filter by obj ID
Occasionally one needs to debug problems in a document with a large
number of objects. In this case it is unhelpful to print a graphviz of
the whole opset because there are too many objects. Add a
`Option<Vec<ObjId>>` argument to `OpSet::visualise` to filter the
objects which are visualised.
2022-09-08 12:48:53 +01:00
+merlan #flirora
649b75deb1 Correct documentation for AutoSerde 2022-09-05 21:11:13 +01:00
Alex Good
eba7038bd2 Allow for empty head indices when decoding doc
The compressed document format includes at the end of the document chunk
the indicies of the heads of the document. Older versions of the
javascript implementation do not include these indicies so we allow them
to be omitted when decoding.

Whilst we're here add some tracing::trace logs to make it easier to
understand where parsing is failing.
2022-09-02 14:59:51 +01:00
Alex Good
dd69f6f7b4
Add readme field to automerge/Cargo.toml 2022-09-01 12:27:34 +01:00
Alex Good
e295a55b41 Add #[derive(Eq)] to satisfy clippy
The latest clippy (90.1.65 for me) added a lint which checks for types
that implement `PartialEq` and could implement `Eq`
(`derive_partial_eq_without_eq`). Add a `derive(Eq)` in a bunch of
places to satisfy this lint.
2022-09-01 12:24:00 +01:00
Orion Henry
c2ed212dbc
Merge pull request #422 from automerge/fix-transaction-put-doc
Update docs for Transaction::put
2022-08-29 13:35:42 -05:00
Orion Henry
1817e98ec9
Merge pull request #418 from jkankiewicz/normalize_C_API_header_include
Expose `Vec<automerge::Change>` initialization and `automerge::AutoCommit::with_actor()` to the C API
2022-08-29 13:35:01 -05:00
Alex Good
a0eb4218d8
Update docs for Transaction::put
Fixes #420
2022-08-27 11:59:14 +01:00
Orion Henry
9879fd9342 copy pasta typo fix 2022-08-26 14:19:28 -05:00
Orion Henry
59bde120ee automerge-js adding trace to out of date errors 2022-08-26 14:17:56 -05:00
Jason Kankiewicz
22f720c465 Emphasize that an AMbyteSpan is only a view onto
the memory that it references.
2022-08-25 13:51:15 -07:00
Orion Henry
e6cd366aa0 automerge-js 0.1.12 2022-08-24 19:12:47 -05:00
Orion Henry
6d05cbd9e3 fix indexOf 2022-08-23 12:13:32 -05:00
Peter van Hardenberg
43bdd60904 the fields in a doc are not docs themselves 2022-08-23 09:31:09 -07:00
Orion Henry
363ad7d59a automerge-js ts fixes 2022-08-23 11:12:22 -05:00
Jason Kankiewicz
7da1832b52 Fix documentation bug caused by missing /. 2022-08-23 06:04:22 -07:00
Jason Kankiewicz
5e37ebfed0 Add AMchangesInit() for @rkuhn in #411.
Expose `automerge::AutoCommit::with_actor()` through `AMcreate()`.
Add notes to clarify the purpose of `AMfreeStack()`, `AMpop()`,
`AMpush()`, `AMpushCallback()`, and `AMresultStack`.
2022-08-23 05:34:45 -07:00
Jason Kankiewicz
1ed67a7658 Add missing documentation for the AMvalue.unknown
variant, the `AMunknownValue.bytes` member and the
`AMunknownValue.type_code` member.
2022-08-22 23:31:55 -07:00
Jason Kankiewicz
3ddde2fff2 Normalize the header include statement for all C
source files.
Normalize the header include statement within the documentation.
Limit `AMpush()` usage within the quickstart example to variable
assignment.
2022-08-22 22:28:23 -07:00
Orion Henry
b4705691c2
Merge pull request #355 from automerge/storage-v2
Storage v2
2022-08-22 18:18:50 -05:00
Alex Good
9ac8827219
Remove storage-v2 feature flag
Signed-off-by: Alex Good <alex@memoryandthought.me>
2022-08-22 21:21:21 +01:00
Alex Good
9c86c09aaa
Rename Change::compressed_bytes -> Change::bytes 2022-08-22 21:18:11 +01:00
Jason Kankiewicz
632da04d60
Add the -DFEATURE_FLAG_STORAGE_V2 CMake option
for toggling the "storage-v2" feature flag in a Cargo invocation.
Correct the `AMunknownValue` struct misnomer.
Ease the rebasing of changes to the `AMvalue` struct declaration with
pending upstream changes to same.
2022-08-22 21:18:07 +01:00
Alex Good
8f2d4a494f
Test entire workspace for storage-v2 in CI
Now that all crates support the storage-v2 feature flag of the automerge
crate we update CI to run tests for '--workspace --all-features'

Signed-off-by: Alex Good <alex@memoryandthought.me>
2022-08-22 21:16:48 +01:00
Alex Good
db4cb52750
Add a storage-v2 feature flag to edit-trace
Signed-off-by: Alex Good <alex@memoryandthought.me>
2022-08-22 21:16:48 +01:00
Alex Good
fc94d43e53
Expose storage-v2 in automerge-wasm
Signed-off-by: Alex Good <alex@memoryandthought.me>
2022-08-22 21:16:47 +01:00
Alex Good
d53d107076
Expose storage-v2 in automerge-c
Signed-off-by: Alex Good <alex@memoryandthought.me>
2022-08-22 21:16:47 +01:00
Alex Good
63dca26fe2
Additional tests for storage-v2
Various tests were required to cover edge cases in the new storage-v2
implementation.

Signed-off-by: Alex Good <alex@memoryandthought.me>
2022-08-22 21:16:47 +01:00