@feltdb/core 0.7.0 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -1
- package/dist/cli/commands.js +64 -28
- package/dist/cli/index.js +1 -1
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +2 -1
- package/dist/create/package-versions.js +1 -1
- package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +84 -0
- package/dist/create/server-source/crates/feltdb/src/lib.rs +38 -20
- package/dist/create/server-source/crates/feltdb/src/state_facade.rs +292 -0
- package/dist/create/server-source/crates/feltdb/src/state_model.rs +1856 -0
- package/dist/create/server-source/crates/feltdb/src/transaction_preconditions.rs +43 -11
- package/dist/create/server-source/crates/feltdb/tests/feltdb_state_boundary_tests.rs +634 -0
- package/dist/create/server-source/crates/feltdb/tests/state_model_integration.rs +366 -0
- package/dist/create/server-source/crates/feltdb/tests/state_persistence_integration.rs +270 -0
- package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +13 -0
- package/dist/create/server-source/crates/feltdb-server/src/main.rs +194 -9
- package/dist/db.d.ts +7 -0
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +12 -1
- package/dist/embedded-transaction.d.ts.map +1 -1
- package/dist/embedded-transaction.js +14 -8
- package/dist/feltdb.d.ts +2 -0
- package/dist/feltdb.d.ts.map +1 -1
- package/dist/http-db.d.ts +24 -0
- package/dist/http-db.d.ts.map +1 -1
- package/dist/http-db.js +13 -0
- package/dist/index-core.d.ts +1 -0
- package/dist/index-core.d.ts.map +1 -1
- package/dist/studio-app/assets/{feltdb_wasm-CD744e5D.js → feltdb_wasm-DVKsw75S.js} +1 -1
- package/dist/studio-app/assets/feltdb_wasm_bg-DNyNf0yy.wasm +0 -0
- package/dist/studio-app/assets/{index-DoROs8yx.js → index-C71X92EK.js} +2 -2
- package/dist/studio-app/index.html +1 -1
- package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
- package/package.json +1 -1
- package/dist/studio-app/assets/feltdb_wasm_bg-CiIXhOLi.wasm +0 -0
|
@@ -28,12 +28,9 @@
|
|
|
28
28
|
//! different numbers that happen to share a name, and fencing on the wrong one
|
|
29
29
|
//! would compare a caller's value against something the caller never sees.
|
|
30
30
|
//!
|
|
31
|
-
//!
|
|
32
|
-
//!
|
|
33
|
-
//!
|
|
34
|
-
//! other must advance `__version` in the value it writes. That is asserted
|
|
35
|
-
//! below rather than assumed, because a fence that silently stops fencing is
|
|
36
|
-
//! worse than no fence.
|
|
31
|
+
//! The authority owns conditional transaction versions: `requireAbsent`
|
|
32
|
+
//! creates version 1 and a version-fenced write of N stores N + 1. Both happen
|
|
33
|
+
//! inside the same lock as validation. Unconditional writes remain verbatim.
|
|
37
34
|
|
|
38
35
|
#[cfg(test)]
|
|
39
36
|
mod tests {
|
|
@@ -401,6 +398,7 @@ mod tests {
|
|
|
401
398
|
guarded(&db, "tx-new", &[absent("fresh")], &[set("cells", "fresh", json!({ "id": "fresh" }))])
|
|
402
399
|
.expect("absent record commits");
|
|
403
400
|
assert!(present(&db, "cells", "fresh"));
|
|
401
|
+
assert_eq!(version_of(&db, "cells", "fresh"), 1);
|
|
404
402
|
|
|
405
403
|
let error = guarded(
|
|
406
404
|
&db,
|
|
@@ -807,9 +805,7 @@ mod tests {
|
|
|
807
805
|
}
|
|
808
806
|
|
|
809
807
|
#[test]
|
|
810
|
-
fn
|
|
811
|
-
// Insert remains the client's: Collection.insert supplies __version 1,
|
|
812
|
-
// which is where record versioning begins.
|
|
808
|
+
fn a_transaction_create_gets_authority_version_one_and_can_be_fenced_immediately() {
|
|
813
809
|
let dir = TempDir::new().unwrap();
|
|
814
810
|
let db = db(&dir);
|
|
815
811
|
|
|
@@ -817,10 +813,19 @@ mod tests {
|
|
|
817
813
|
&db,
|
|
818
814
|
"tx-insert",
|
|
819
815
|
&[RecordPrecondition { require_absent: true, ..precondition("cells", "new") }],
|
|
820
|
-
&[set("cells", "new", json!({ "id": "new", "__version":
|
|
816
|
+
&[set("cells", "new", json!({ "id": "new", "__version": 999, "state": "created" }))],
|
|
821
817
|
)
|
|
822
818
|
.expect("commits");
|
|
823
|
-
assert_eq!(version_of(&db, "cells", "new"), 1, "the
|
|
819
|
+
assert_eq!(version_of(&db, "cells", "new"), 1, "the authority owns the initial version");
|
|
820
|
+
|
|
821
|
+
guarded(
|
|
822
|
+
&db,
|
|
823
|
+
"tx-update-new",
|
|
824
|
+
&[expect_version("cells", "new", 1)],
|
|
825
|
+
&[set("cells", "new", json!({ "id": "new", "state": "updated" }))],
|
|
826
|
+
)
|
|
827
|
+
.expect("the newly created version can be fenced immediately");
|
|
828
|
+
assert_eq!(version_of(&db, "cells", "new"), 2);
|
|
824
829
|
|
|
825
830
|
let missing = guarded(
|
|
826
831
|
&db,
|
|
@@ -834,6 +839,33 @@ mod tests {
|
|
|
834
839
|
);
|
|
835
840
|
}
|
|
836
841
|
|
|
842
|
+
#[test]
|
|
843
|
+
fn replayed_conditional_create_does_not_create_or_advance_twice() {
|
|
844
|
+
let dir = TempDir::new().unwrap();
|
|
845
|
+
let db = db(&dir);
|
|
846
|
+
let absent = RecordPrecondition { require_absent: true, ..precondition("cells", "new") };
|
|
847
|
+
|
|
848
|
+
let first = guarded(
|
|
849
|
+
&db,
|
|
850
|
+
"tx-create-once",
|
|
851
|
+
&[absent.clone()],
|
|
852
|
+
&[set("cells", "new", json!({ "id": "new", "delivery": 1 }))],
|
|
853
|
+
)
|
|
854
|
+
.expect("first delivery commits");
|
|
855
|
+
assert!(!first.duplicate);
|
|
856
|
+
|
|
857
|
+
let replay = guarded(
|
|
858
|
+
&db,
|
|
859
|
+
"tx-create-once",
|
|
860
|
+
&[absent],
|
|
861
|
+
&[set("cells", "new", json!({ "id": "new", "delivery": 2 }))],
|
|
862
|
+
)
|
|
863
|
+
.expect("replay returns the original transaction result");
|
|
864
|
+
assert!(replay.duplicate);
|
|
865
|
+
assert_eq!(version_of(&db, "cells", "new"), 1);
|
|
866
|
+
assert_eq!(field(&db, "cells", "new", "delivery"), 1);
|
|
867
|
+
}
|
|
868
|
+
|
|
837
869
|
#[test]
|
|
838
870
|
fn replay_of_a_fenced_transaction_does_not_advance_twice() {
|
|
839
871
|
let dir = TempDir::new().unwrap();
|