@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.
Files changed (35) hide show
  1. package/README.md +27 -1
  2. package/dist/cli/commands.js +64 -28
  3. package/dist/cli/index.js +1 -1
  4. package/dist/collection.d.ts.map +1 -1
  5. package/dist/collection.js +2 -1
  6. package/dist/create/package-versions.js +1 -1
  7. package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +84 -0
  8. package/dist/create/server-source/crates/feltdb/src/lib.rs +38 -20
  9. package/dist/create/server-source/crates/feltdb/src/state_facade.rs +292 -0
  10. package/dist/create/server-source/crates/feltdb/src/state_model.rs +1856 -0
  11. package/dist/create/server-source/crates/feltdb/src/transaction_preconditions.rs +43 -11
  12. package/dist/create/server-source/crates/feltdb/tests/feltdb_state_boundary_tests.rs +634 -0
  13. package/dist/create/server-source/crates/feltdb/tests/state_model_integration.rs +366 -0
  14. package/dist/create/server-source/crates/feltdb/tests/state_persistence_integration.rs +270 -0
  15. package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +13 -0
  16. package/dist/create/server-source/crates/feltdb-server/src/main.rs +194 -9
  17. package/dist/db.d.ts +7 -0
  18. package/dist/db.d.ts.map +1 -1
  19. package/dist/db.js +12 -1
  20. package/dist/embedded-transaction.d.ts.map +1 -1
  21. package/dist/embedded-transaction.js +14 -8
  22. package/dist/feltdb.d.ts +2 -0
  23. package/dist/feltdb.d.ts.map +1 -1
  24. package/dist/http-db.d.ts +24 -0
  25. package/dist/http-db.d.ts.map +1 -1
  26. package/dist/http-db.js +13 -0
  27. package/dist/index-core.d.ts +1 -0
  28. package/dist/index-core.d.ts.map +1 -1
  29. package/dist/studio-app/assets/{feltdb_wasm-CD744e5D.js → feltdb_wasm-DVKsw75S.js} +1 -1
  30. package/dist/studio-app/assets/feltdb_wasm_bg-DNyNf0yy.wasm +0 -0
  31. package/dist/studio-app/assets/{index-DoROs8yx.js → index-C71X92EK.js} +2 -2
  32. package/dist/studio-app/index.html +1 -1
  33. package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
  34. package/package.json +1 -1
  35. 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
- //! `__version` is owned by the writer: the client sets it to 1 on insert and
32
- //! single-record CAS increments it. A transaction `set` writes the value it is
33
- //! given, so a caller that wants successive fenced transactions to exclude each
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 a_transaction_insert_keeps_the_callers_value_and_the_authority_assigns_nothing() {
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": 1 }))],
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 caller's value, stored as given");
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();