@feltdb/core 0.15.0 → 0.16.1
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/dist/agent-state.d.ts +20 -0
- package/dist/agent-state.d.ts.map +1 -1
- package/dist/agent-state.js +36 -0
- package/dist/build-identity.json +12 -4
- package/dist/cli/commands.js +187 -4
- package/dist/cli/publish-engine.js +116 -16
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +20 -2
- package/dist/create/build-identity.json +12 -4
- package/dist/create/managed-account.js +93 -35
- package/dist/create/package-versions.js +1 -1
- package/dist/create/server-source/Cargo.lock +6 -509
- package/dist/create/server-source/Cargo.toml +2 -13
- package/dist/create/server-source/crates/feltdb-client/Cargo.toml +1 -1
- package/dist/create/server-source/crates/feltdb-server/Cargo.toml +1 -1
- package/dist/create/server-source/crates/feltdb-server/src/main.rs +356 -24
- package/dist/create/server-source/crates/feltdb-server/tests/rust_client.rs +10 -1
- package/dist/create/server-source/crates/feltdb-wasm/Cargo.toml +1 -1
- package/dist/db.d.ts +11 -1
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +15 -2
- package/dist/error-codes.d.ts +5 -0
- package/dist/error-codes.d.ts.map +1 -1
- package/dist/error-codes.js +9 -1
- package/dist/http-db.d.ts +16 -0
- package/dist/http-db.d.ts.map +1 -1
- package/dist/http-db.js +36 -6
- package/dist/managed-recovery.d.ts +6 -0
- package/dist/managed-recovery.d.ts.map +1 -1
- package/dist/managed-recovery.js +9 -0
- package/dist/studio-app/assets/{feltdb_wasm-BjM1ylL3.js → feltdb_wasm-BUIxCuTR.js} +1 -1
- package/dist/studio-app/assets/feltdb_wasm_bg-C3D6y6DK.wasm +0 -0
- package/dist/studio-app/assets/index-BhXYAhgS.js +37 -0
- package/dist/studio-app/index.html +1 -1
- package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
- package/dist/wasm/package.json +1 -1
- package/dist/workload.d.ts +55 -3
- package/dist/workload.d.ts.map +1 -1
- package/dist/workload.js +23 -0
- package/dist/workspace/workspace-connection.d.ts.map +1 -1
- package/dist/workspace/workspace-connection.js +14 -3
- package/package.json +1 -1
- package/dist/create/server-source/crates/feltdb/Cargo.lock +0 -175
- package/dist/create/server-source/crates/feltdb/Cargo.toml +0 -102
- package/dist/create/server-source/crates/feltdb/LICENSE +0 -21
- package/dist/create/server-source/crates/feltdb/README.md +0 -75
- package/dist/create/server-source/crates/feltdb/benches/baselines/gate-13-redux.json +0 -370
- package/dist/create/server-source/crates/feltdb/benches/gate13_baseline.rs +0 -589
- package/dist/create/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs +0 -247
- package/dist/create/server-source/crates/feltdb/benches/gate_13_redux.rs +0 -440
- package/dist/create/server-source/crates/feltdb/benches/gate_13_regression_runner.rs +0 -275
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_concurrent_writer_scaling.rs +0 -381
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_production_admission_revalidation.rs +0 -467
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc2_admission_contract.rs +0 -489
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc_root_cause.rs +0 -281
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync1_queued_prototype.rs +0 -606
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync_economics.rs +0 -531
- package/dist/create/server-source/crates/feltdb/benches/gate_14b_causal_backlog_scaling.rs +0 -462
- package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_contract_test.rs +0 -505
- package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_scaling.rs +0 -484
- package/dist/create/server-source/crates/feltdb/benches/gate_14d_combined_dimension_scaling.rs +0 -758
- package/dist/create/server-source/crates/feltdb/benches/phase_7_1_2_optimization_benchmark.rs +0 -421
- package/dist/create/server-source/crates/feltdb/benches/phase_7_1_3_crossover_analysis.rs +0 -329
- package/dist/create/server-source/crates/feltdb/src/acceptance_tests.rs +0 -1705
- package/dist/create/server-source/crates/feltdb/src/acquisition.rs +0 -286
- package/dist/create/server-source/crates/feltdb/src/admission.rs +0 -185
- package/dist/create/server-source/crates/feltdb/src/admission_contract_tests.rs +0 -507
- package/dist/create/server-source/crates/feltdb/src/adversarial_transport.rs +0 -539
- package/dist/create/server-source/crates/feltdb/src/agent_state.rs +0 -320
- package/dist/create/server-source/crates/feltdb/src/agent_transition_contract.rs +0 -1545
- package/dist/create/server-source/crates/feltdb/src/analytics.rs +0 -521
- package/dist/create/server-source/crates/feltdb/src/application.rs +0 -2674
- package/dist/create/server-source/crates/feltdb/src/application_runtime.rs +0 -1070
- package/dist/create/server-source/crates/feltdb/src/authority.rs +0 -479
- package/dist/create/server-source/crates/feltdb/src/authority_failover.rs +0 -847
- package/dist/create/server-source/crates/feltdb/src/authorization.rs +0 -1030
- package/dist/create/server-source/crates/feltdb/src/authorization_security_tests.rs +0 -1122
- package/dist/create/server-source/crates/feltdb/src/bin/feltdb-authority-client.rs +0 -32
- package/dist/create/server-source/crates/feltdb/src/bin/feltdb-authority.rs +0 -19
- package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +0 -1474
- package/dist/create/server-source/crates/feltdb/src/capabilities/mod.rs +0 -8
- package/dist/create/server-source/crates/feltdb/src/capabilities/search.rs +0 -418
- package/dist/create/server-source/crates/feltdb/src/capabilities/vector.rs +0 -482
- package/dist/create/server-source/crates/feltdb/src/capability.rs +0 -903
- package/dist/create/server-source/crates/feltdb/src/cardinality_diagnostics.rs +0 -263
- package/dist/create/server-source/crates/feltdb/src/cardinality_endpoint.rs +0 -77
- package/dist/create/server-source/crates/feltdb/src/causal_backlog_bound.rs +0 -496
- package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier.rs +0 -2574
- package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier_phase_7_1.rs +0 -212
- package/dist/create/server-source/crates/feltdb/src/concurrency_fuzzing.rs +0 -422
- package/dist/create/server-source/crates/feltdb/src/consistency_contract.rs +0 -445
- package/dist/create/server-source/crates/feltdb/src/content_distribution.rs +0 -465
- package/dist/create/server-source/crates/feltdb/src/convergence.rs +0 -634
- package/dist/create/server-source/crates/feltdb/src/crash_atomic_boundary.rs +0 -427
- package/dist/create/server-source/crates/feltdb/src/crash_injection.rs +0 -376
- package/dist/create/server-source/crates/feltdb/src/crash_recovery_tests.rs +0 -365
- package/dist/create/server-source/crates/feltdb/src/cron.rs +0 -294
- package/dist/create/server-source/crates/feltdb/src/dedup_bound_investigation.rs +0 -483
- package/dist/create/server-source/crates/feltdb/src/distributed_indexing.rs +0 -477
- package/dist/create/server-source/crates/feltdb/src/distributed_tests.rs +0 -1003
- package/dist/create/server-source/crates/feltdb/src/distributed_transactions.rs +0 -1334
- package/dist/create/server-source/crates/feltdb/src/durability_guarantees.rs +0 -368
- package/dist/create/server-source/crates/feltdb/src/durable_dedup_set.rs +0 -231
- package/dist/create/server-source/crates/feltdb/src/durable_operation_identity.rs +0 -482
- package/dist/create/server-source/crates/feltdb/src/durable_operation_log.rs +0 -203
- package/dist/create/server-source/crates/feltdb/src/durable_sync.rs +0 -317
- package/dist/create/server-source/crates/feltdb/src/equality_index.rs +0 -595
- package/dist/create/server-source/crates/feltdb/src/execution.rs +0 -426
- package/dist/create/server-source/crates/feltdb/src/in_process_transport.rs +0 -214
- package/dist/create/server-source/crates/feltdb/src/indexing.rs +0 -776
- package/dist/create/server-source/crates/feltdb/src/lib.rs +0 -7365
- package/dist/create/server-source/crates/feltdb/src/managed_cas_tests.rs +0 -234
- package/dist/create/server-source/crates/feltdb/src/materialization.rs +0 -184
- package/dist/create/server-source/crates/feltdb/src/metrics.rs +0 -266
- package/dist/create/server-source/crates/feltdb/src/multi_node_convergence.rs +0 -310
- package/dist/create/server-source/crates/feltdb/src/multi_operation_transaction.rs +0 -736
- package/dist/create/server-source/crates/feltdb/src/observability.rs +0 -379
- package/dist/create/server-source/crates/feltdb/src/operation.rs +0 -290
- package/dist/create/server-source/crates/feltdb/src/operation_algebra.rs +0 -439
- package/dist/create/server-source/crates/feltdb/src/operation_log.rs +0 -349
- package/dist/create/server-source/crates/feltdb/src/p1_application_atomicity.rs +0 -332
- package/dist/create/server-source/crates/feltdb/src/p1_atomicity_acceptance.rs +0 -718
- package/dist/create/server-source/crates/feltdb/src/partition_reconciliation.rs +0 -487
- package/dist/create/server-source/crates/feltdb/src/peer_registry.rs +0 -166
- package/dist/create/server-source/crates/feltdb/src/permutation_scheduler.rs +0 -289
- package/dist/create/server-source/crates/feltdb/src/persistence_reality.rs +0 -566
- package/dist/create/server-source/crates/feltdb/src/phase1b_acceptance.rs +0 -3391
- package/dist/create/server-source/crates/feltdb/src/phase1c1_acceptance.rs +0 -203
- package/dist/create/server-source/crates/feltdb/src/phase1c2_acceptance.rs +0 -261
- package/dist/create/server-source/crates/feltdb/src/phase1c3_acceptance.rs +0 -502
- package/dist/create/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +0 -216
- package/dist/create/server-source/crates/feltdb/src/phase5_integration.rs +0 -303
- package/dist/create/server-source/crates/feltdb/src/phase5_scenarios.rs +0 -323
- package/dist/create/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +0 -531
- package/dist/create/server-source/crates/feltdb/src/phase6_convergence_validator.rs +0 -406
- package/dist/create/server-source/crates/feltdb/src/phase6_persistence.rs +0 -436
- package/dist/create/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +0 -387
- package/dist/create/server-source/crates/feltdb/src/phase_2a_failures.rs +0 -378
- package/dist/create/server-source/crates/feltdb/src/phase_2b_network.rs +0 -359
- package/dist/create/server-source/crates/feltdb/src/phase_2c_cascading.rs +0 -372
- package/dist/create/server-source/crates/feltdb/src/phase_3_durability.rs +0 -404
- package/dist/create/server-source/crates/feltdb/src/phase_4_baseline.rs +0 -376
- package/dist/create/server-source/crates/feltdb/src/phase_5_soak.rs +0 -461
- package/dist/create/server-source/crates/feltdb/src/policy_evaluation.rs +0 -2125
- package/dist/create/server-source/crates/feltdb/src/production_api.rs +0 -418
- package/dist/create/server-source/crates/feltdb/src/provenance.rs +0 -207
- package/dist/create/server-source/crates/feltdb/src/query_execution_diagnostics.rs +0 -126
- package/dist/create/server-source/crates/feltdb/src/query_performance.rs +0 -218
- package/dist/create/server-source/crates/feltdb/src/read_basis.rs +0 -257
- package/dist/create/server-source/crates/feltdb/src/references.rs +0 -404
- package/dist/create/server-source/crates/feltdb/src/replay_fuzzing.rs +0 -401
- package/dist/create/server-source/crates/feltdb/src/replica_acknowledgements.rs +0 -501
- package/dist/create/server-source/crates/feltdb/src/replica_membership.rs +0 -680
- package/dist/create/server-source/crates/feltdb/src/replication_manager.rs +0 -163
- package/dist/create/server-source/crates/feltdb/src/replication_protocol.rs +0 -133
- package/dist/create/server-source/crates/feltdb/src/routing.rs +0 -409
- package/dist/create/server-source/crates/feltdb/src/semantic_decision.rs +0 -2029
- package/dist/create/server-source/crates/feltdb/src/semantic_query.rs +0 -599
- package/dist/create/server-source/crates/feltdb/src/sharding.rs +0 -549
- package/dist/create/server-source/crates/feltdb/src/state_conflict_contract.rs +0 -516
- package/dist/create/server-source/crates/feltdb/src/state_contract.rs +0 -6003
- package/dist/create/server-source/crates/feltdb/src/state_diff_contract.rs +0 -222
- package/dist/create/server-source/crates/feltdb/src/state_facade.rs +0 -320
- package/dist/create/server-source/crates/feltdb/src/state_hash.rs +0 -291
- package/dist/create/server-source/crates/feltdb/src/state_model.rs +0 -4158
- package/dist/create/server-source/crates/feltdb/src/state_transition_store.rs +0 -379
- package/dist/create/server-source/crates/feltdb/src/state_trigger.rs +0 -673
- package/dist/create/server-source/crates/feltdb/src/storage.rs +0 -273
- package/dist/create/server-source/crates/feltdb/src/submission.rs +0 -471
- package/dist/create/server-source/crates/feltdb/src/sync.rs +0 -495
- package/dist/create/server-source/crates/feltdb/src/sync_contract.rs +0 -822
- package/dist/create/server-source/crates/feltdb/src/tcp_transport.rs +0 -433
- package/dist/create/server-source/crates/feltdb/src/transaction_api.rs +0 -462
- package/dist/create/server-source/crates/feltdb/src/transaction_invariants.rs +0 -965
- package/dist/create/server-source/crates/feltdb/src/transaction_preconditions.rs +0 -1120
- package/dist/create/server-source/crates/feltdb/src/transactions.rs +0 -643
- package/dist/create/server-source/crates/feltdb/src/trigger.rs +0 -390
- package/dist/create/server-source/crates/feltdb/src/trigger_contract.rs +0 -749
- package/dist/create/server-source/crates/feltdb/src/versioned_object_substrate.rs +0 -708
- package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +0 -1269
- package/dist/create/server-source/crates/feltdb/src/workflow.rs +0 -713
- package/dist/create/server-source/crates/feltdb/src/workflow_acceptance_tests.rs +0 -510
- package/dist/create/server-source/crates/feltdb/src/workflow_integration.rs +0 -354
- package/dist/create/server-source/crates/feltdb/src/workflow_runtime.rs +0 -594
- package/dist/create/server-source/crates/feltdb/src/workload.rs +0 -4222
- package/dist/create/server-source/crates/feltdb/src/workload_diagnostics.rs +0 -456
- package/dist/create/server-source/crates/feltdb/tests/agent_state_native.rs +0 -1188
- package/dist/create/server-source/crates/feltdb/tests/agent_transition_contract_conformance.rs +0 -2884
- package/dist/create/server-source/crates/feltdb/tests/authority_process.rs +0 -297
- package/dist/create/server-source/crates/feltdb/tests/authority_transaction_identity.rs +0 -534
- package/dist/create/server-source/crates/feltdb/tests/bounded_read_contract.rs +0 -132
- package/dist/create/server-source/crates/feltdb/tests/branching_evidence.rs +0 -299
- package/dist/create/server-source/crates/feltdb/tests/common/mod.rs +0 -96
- package/dist/create/server-source/crates/feltdb/tests/compaction_stall_contract.rs +0 -272
- package/dist/create/server-source/crates/feltdb/tests/crash_durability_contract.rs +0 -467
- package/dist/create/server-source/crates/feltdb/tests/current_revision_authority_evidence.rs +0 -309
- package/dist/create/server-source/crates/feltdb/tests/durable_backup_contract.rs +0 -445
- package/dist/create/server-source/crates/feltdb/tests/durable_corruption_contract.rs +0 -518
- package/dist/create/server-source/crates/feltdb/tests/durable_format_compatibility.rs +0 -392
- package/dist/create/server-source/crates/feltdb/tests/feltdb_state_boundary_tests.rs +0 -850
- package/dist/create/server-source/crates/feltdb/tests/fixtures/agent_transition_corpus.json +0 -23340
- package/dist/create/server-source/crates/feltdb/tests/fixtures/state_conflict_contract_corpus.json +0 -1916
- package/dist/create/server-source/crates/feltdb/tests/fixtures/state_diff_contract_corpus.json +0 -1878
- package/dist/create/server-source/crates/feltdb/tests/fixtures/trigger_contract_corpus.json +0 -1862
- package/dist/create/server-source/crates/feltdb/tests/generalized_version_control_evidence.rs +0 -123
- package/dist/create/server-source/crates/feltdb/tests/generalized_version_control_substrate_completion.rs +0 -299
- package/dist/create/server-source/crates/feltdb/tests/local_process_ownership.rs +0 -69
- package/dist/create/server-source/crates/feltdb/tests/managed_incident_regression.rs +0 -191
- package/dist/create/server-source/crates/feltdb/tests/operational_health_contract.rs +0 -278
- package/dist/create/server-source/crates/feltdb/tests/pr34_query_collection.rs +0 -234
- package/dist/create/server-source/crates/feltdb/tests/pr35_equality_index.rs +0 -947
- package/dist/create/server-source/crates/feltdb/tests/pr7_self_authorization_proof.rs +0 -404
- package/dist/create/server-source/crates/feltdb/tests/pr8_vocabulary_assessment.rs +0 -916
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase2_boundary_tests.rs +0 -1045
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3a_path_a_tests.rs +0 -347
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_authorized_mutations.rs +0 -361
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_role_based_authorization.rs +0 -330
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_simple_auth_delete.rs +0 -93
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_team_delete_role_authorization.rs +0 -622
- package/dist/create/server-source/crates/feltdb/tests/pr9_teams_role_based_access.rs +0 -517
- package/dist/create/server-source/crates/feltdb/tests/production_certification.rs +0 -1153
- package/dist/create/server-source/crates/feltdb/tests/production_contract.rs +0 -771
- package/dist/create/server-source/crates/feltdb/tests/production_readiness_contract.rs +0 -1383
- package/dist/create/server-source/crates/feltdb/tests/reconciliation_application.rs +0 -868
- package/dist/create/server-source/crates/feltdb/tests/reconciliation_wire_format_evidence.rs +0 -221
- package/dist/create/server-source/crates/feltdb/tests/replicated_history_contract.rs +0 -417
- package/dist/create/server-source/crates/feltdb/tests/resource_scoped_revisions.rs +0 -338
- package/dist/create/server-source/crates/feltdb/tests/revision_identity_contract.rs +0 -1039
- package/dist/create/server-source/crates/feltdb/tests/revision_model_decision.rs +0 -739
- package/dist/create/server-source/crates/feltdb/tests/revision_retention_boundary_evidence.rs +0 -452
- package/dist/create/server-source/crates/feltdb/tests/saas_authorization_integration.rs +0 -81
- package/dist/create/server-source/crates/feltdb/tests/saas_invitation_lifecycle.rs +0 -438
- package/dist/create/server-source/crates/feltdb/tests/semantic_decision.rs +0 -1165
- package/dist/create/server-source/crates/feltdb/tests/semantic_query.rs +0 -767
- package/dist/create/server-source/crates/feltdb/tests/semantic_query_contract.rs +0 -363
- package/dist/create/server-source/crates/feltdb/tests/state_conflict_contract_conformance.rs +0 -1799
- package/dist/create/server-source/crates/feltdb/tests/state_diff_contract_conformance.rs +0 -1316
- package/dist/create/server-source/crates/feltdb/tests/state_model_integration.rs +0 -358
- package/dist/create/server-source/crates/feltdb/tests/state_persistence_integration.rs +0 -365
- package/dist/create/server-source/crates/feltdb/tests/state_ref_authority.rs +0 -918
- package/dist/create/server-source/crates/feltdb/tests/state_store_boundary_evidence.rs +0 -299
- package/dist/create/server-source/crates/feltdb/tests/storage_independent_versioned_object_substrate.rs +0 -328
- package/dist/create/server-source/crates/feltdb/tests/sync_divergence_evidence.rs +0 -255
- package/dist/create/server-source/crates/feltdb/tests/three_way_input_boundary_evidence.rs +0 -249
- package/dist/create/server-source/crates/feltdb/tests/trigger_contract_conformance.rs +0 -994
- package/dist/create/server-source/crates/feltdb/tests/workload_envelope_contract.rs +0 -484
- package/dist/studio-app/assets/feltdb_wasm_bg-TseJn2Ax.wasm +0 -0
- package/dist/studio-app/assets/index-1wd0uKua.js +0 -30
|
@@ -1,365 +0,0 @@
|
|
|
1
|
-
//! Comprehensive tests for FeltDB State Model persistence
|
|
2
|
-
//!
|
|
3
|
-
//! This test suite verifies that:
|
|
4
|
-
//! 1. State revisions persist to disk through FeltDB
|
|
5
|
-
//! 2. Current pointer persists correctly
|
|
6
|
-
//! 3. Branches persist and recover
|
|
7
|
-
//! 4. Restart recovery works (close database, reopen and recover state)
|
|
8
|
-
//! 5. Deterministic StateIds survive restart
|
|
9
|
-
//! 6. Volatile stores remain unchanged
|
|
10
|
-
|
|
11
|
-
#[cfg(test)]
|
|
12
|
-
mod state_persistence_tests {
|
|
13
|
-
use feltdb::state_model::StateStore;
|
|
14
|
-
use std::sync::Arc;
|
|
15
|
-
use tempfile::TempDir;
|
|
16
|
-
|
|
17
|
-
#[test]
|
|
18
|
-
fn test_persistent_store_saves_revisions_to_disk() {
|
|
19
|
-
let temp_dir = TempDir::new().unwrap();
|
|
20
|
-
let temp_path = temp_dir.path().join("test.log");
|
|
21
|
-
|
|
22
|
-
// Create initial state with FeltDB persistence
|
|
23
|
-
let db1 = feltdb::FeltDb::open(&temp_path).expect("open db");
|
|
24
|
-
let store1 = StateStore::with_feltdb(Arc::new(db1)).expect("create store");
|
|
25
|
-
let rev1 = store1
|
|
26
|
-
.create("docs:1", r#"{"v":1}"#.to_string(), "auth".to_string())
|
|
27
|
-
.expect("create");
|
|
28
|
-
let rev2 = store1
|
|
29
|
-
.commit(r#"{"v":2}"#.to_string(), &rev1, "auth".to_string())
|
|
30
|
-
.expect("commit");
|
|
31
|
-
|
|
32
|
-
let id1 = rev1.id.clone();
|
|
33
|
-
let id2 = rev2.id.clone();
|
|
34
|
-
let id2_hex = id2.as_hex().to_string();
|
|
35
|
-
|
|
36
|
-
// Verify both revisions exist
|
|
37
|
-
assert!(store1.exists(&id1), "rev1 should exist");
|
|
38
|
-
assert!(store1.exists(&id2), "rev2 should exist");
|
|
39
|
-
assert_eq!(
|
|
40
|
-
store1.get(&id2).map(|r| r.id.as_hex().to_string()),
|
|
41
|
-
Some(id2_hex.clone())
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
// Drop store and database (simulate restart)
|
|
45
|
-
drop(store1);
|
|
46
|
-
|
|
47
|
-
// New process: recover from disk
|
|
48
|
-
let db2 = feltdb::FeltDb::open(&temp_path).expect("open db again");
|
|
49
|
-
let store2 = StateStore::with_feltdb(Arc::new(db2)).expect("recovery setup");
|
|
50
|
-
|
|
51
|
-
// Verify all revisions still exist
|
|
52
|
-
assert!(store2.exists(&id1), "rev1 should survive restart");
|
|
53
|
-
assert!(store2.exists(&id2), "rev2 should survive restart");
|
|
54
|
-
assert_eq!(
|
|
55
|
-
store2.get(&id2).map(|r| r.id.as_hex().to_string()),
|
|
56
|
-
Some(id2_hex),
|
|
57
|
-
"the revision is retrievable by identity after restart"
|
|
58
|
-
);
|
|
59
|
-
|
|
60
|
-
// Verify content is correct
|
|
61
|
-
let recovered_rev2 = store2.get(&id2).expect("get rev2");
|
|
62
|
-
assert_eq!(recovered_rev2.content, r#"{"v":2}"#);
|
|
63
|
-
assert_eq!(recovered_rev2.authority, "auth");
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
#[test]
|
|
67
|
-
fn test_persistent_store_preserves_state_id_determinism() {
|
|
68
|
-
let temp_dir = TempDir::new().unwrap();
|
|
69
|
-
let temp_path = temp_dir.path().join("test.log");
|
|
70
|
-
|
|
71
|
-
let db1 = feltdb::FeltDb::open(&temp_path).expect("open db");
|
|
72
|
-
let store1 = StateStore::with_feltdb(Arc::new(db1)).expect("create store");
|
|
73
|
-
let rev1 = store1
|
|
74
|
-
.create(
|
|
75
|
-
"docs:1",
|
|
76
|
-
r#"{"fixed":"content"}"#.to_string(),
|
|
77
|
-
"auth".to_string(),
|
|
78
|
-
)
|
|
79
|
-
.expect("create");
|
|
80
|
-
let id1 = rev1.id.clone();
|
|
81
|
-
drop(store1);
|
|
82
|
-
|
|
83
|
-
// Recover and recreate the same content
|
|
84
|
-
let db2 = feltdb::FeltDb::open(&temp_path).expect("open db again");
|
|
85
|
-
let store2 = StateStore::with_feltdb(Arc::new(db2)).expect("recovery");
|
|
86
|
-
let recovered = store2.get(&id1).expect("get");
|
|
87
|
-
|
|
88
|
-
// Content hash must be the same for identical content
|
|
89
|
-
assert_eq!(
|
|
90
|
-
recovered.id.as_hex(),
|
|
91
|
-
id1.as_hex(),
|
|
92
|
-
"StateId should be deterministic"
|
|
93
|
-
);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
#[test]
|
|
97
|
-
fn test_persistent_store_handles_branch_persistence() {
|
|
98
|
-
let temp_dir = TempDir::new().unwrap();
|
|
99
|
-
let temp_path = temp_dir.path().join("test.log");
|
|
100
|
-
|
|
101
|
-
// Create store and initial state
|
|
102
|
-
let db1 = feltdb::FeltDb::open(&temp_path).expect("open db");
|
|
103
|
-
let store1 = StateStore::with_feltdb(Arc::new(db1)).expect("create store");
|
|
104
|
-
let rev1 = store1
|
|
105
|
-
.create("docs:1", r#"{"v":1}"#.to_string(), "auth".to_string())
|
|
106
|
-
.expect("create");
|
|
107
|
-
|
|
108
|
-
let id1 = rev1.id.clone();
|
|
109
|
-
let id1_hex = id1.as_hex().to_string();
|
|
110
|
-
|
|
111
|
-
// There are no named branches. A revision is addressed by its own
|
|
112
|
-
// content-derived identity, which is what a name would have pointed at.
|
|
113
|
-
assert_eq!(
|
|
114
|
-
store1.get(&id1).map(|id| id.id.as_hex().to_string()),
|
|
115
|
-
Some(id1_hex.clone())
|
|
116
|
-
);
|
|
117
|
-
drop(store1);
|
|
118
|
-
|
|
119
|
-
let db2 = feltdb::FeltDb::open(&temp_path).expect("open db again");
|
|
120
|
-
let store2 = StateStore::with_feltdb(Arc::new(db2)).expect("reopen");
|
|
121
|
-
assert_eq!(
|
|
122
|
-
store2.get(&id1).map(|id| id.id.as_hex().to_string()),
|
|
123
|
-
Some(id1_hex),
|
|
124
|
-
"the revision survives restart under its own identity"
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
#[test]
|
|
129
|
-
fn test_volatile_store_does_not_persist() {
|
|
130
|
-
let temp_dir = TempDir::new().unwrap();
|
|
131
|
-
let temp_path = temp_dir.path().join("test.log");
|
|
132
|
-
|
|
133
|
-
// Create volatile store
|
|
134
|
-
let store1 = StateStore::new_volatile();
|
|
135
|
-
let rev1 = store1
|
|
136
|
-
.create("docs:1", r#"{"v":1}"#.to_string(), "auth".to_string())
|
|
137
|
-
.expect("create");
|
|
138
|
-
drop(store1);
|
|
139
|
-
|
|
140
|
-
// Try to recover from disk (should be empty)
|
|
141
|
-
let db2 = feltdb::FeltDb::open(&temp_path).expect("open db");
|
|
142
|
-
let store2 = StateStore::with_feltdb(Arc::new(db2)).expect("create store");
|
|
143
|
-
assert!(
|
|
144
|
-
!store2.exists(&rev1.id),
|
|
145
|
-
"volatile store should not persist"
|
|
146
|
-
);
|
|
147
|
-
assert!(
|
|
148
|
-
store2.get(&rev1.id).is_none(),
|
|
149
|
-
"nothing from the volatile store reached disk"
|
|
150
|
-
);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
#[test]
|
|
154
|
-
fn test_persistent_store_tracks_ancestry_across_restart() {
|
|
155
|
-
let temp_dir = TempDir::new().unwrap();
|
|
156
|
-
let temp_path = temp_dir.path().join("test.log");
|
|
157
|
-
|
|
158
|
-
// Create chain of revisions
|
|
159
|
-
let db1 = feltdb::FeltDb::open(&temp_path).expect("open db");
|
|
160
|
-
let store1 = StateStore::with_feltdb(Arc::new(db1)).expect("create store");
|
|
161
|
-
let rev1 = store1
|
|
162
|
-
.create("docs:1", r#"{"v":1}"#.to_string(), "auth".to_string())
|
|
163
|
-
.expect("create");
|
|
164
|
-
let rev2 = store1
|
|
165
|
-
.commit(r#"{"v":2}"#.to_string(), &rev1, "auth".to_string())
|
|
166
|
-
.expect("commit");
|
|
167
|
-
let rev3 = store1
|
|
168
|
-
.commit(r#"{"v":3}"#.to_string(), &rev2, "auth".to_string())
|
|
169
|
-
.expect("commit");
|
|
170
|
-
|
|
171
|
-
let id1 = rev1.id.clone();
|
|
172
|
-
let id2 = rev2.id.clone();
|
|
173
|
-
let id3 = rev3.id.clone();
|
|
174
|
-
drop(store1);
|
|
175
|
-
|
|
176
|
-
// Recover and verify parent pointers
|
|
177
|
-
let db2 = feltdb::FeltDb::open(&temp_path).expect("open db again");
|
|
178
|
-
let store2 = StateStore::with_feltdb(Arc::new(db2)).expect("recovery");
|
|
179
|
-
|
|
180
|
-
let recovered_rev3 = store2.get(&id3).expect("get rev3");
|
|
181
|
-
assert_eq!(
|
|
182
|
-
recovered_rev3.parent_id.as_ref().map(|id| id.as_hex()),
|
|
183
|
-
Some(id2.as_hex()),
|
|
184
|
-
"rev3 parent should be rev2"
|
|
185
|
-
);
|
|
186
|
-
|
|
187
|
-
let recovered_rev2 = store2.get(&id2).expect("get rev2");
|
|
188
|
-
assert_eq!(
|
|
189
|
-
recovered_rev2.parent_id.as_ref().map(|id| id.as_hex()),
|
|
190
|
-
Some(id1.as_hex()),
|
|
191
|
-
"rev2 parent should be rev1"
|
|
192
|
-
);
|
|
193
|
-
|
|
194
|
-
let recovered_rev1 = store2.get(&id1).expect("get rev1");
|
|
195
|
-
assert!(
|
|
196
|
-
recovered_rev1.parent_id.is_none(),
|
|
197
|
-
"rev1 should have no parent"
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
#[test]
|
|
202
|
-
fn test_persistent_store_multiple_commits_in_sequence() {
|
|
203
|
-
let temp_dir = TempDir::new().unwrap();
|
|
204
|
-
let temp_path = temp_dir.path().join("test.log");
|
|
205
|
-
|
|
206
|
-
let db = feltdb::FeltDb::open(&temp_path).expect("open db");
|
|
207
|
-
let store = StateStore::with_feltdb(Arc::new(db)).expect("create store");
|
|
208
|
-
|
|
209
|
-
// Commit sequence
|
|
210
|
-
let rev1 = store
|
|
211
|
-
.create("docs:1", r#"{"step":1}"#.to_string(), "app".to_string())
|
|
212
|
-
.expect("1");
|
|
213
|
-
let rev2 = store
|
|
214
|
-
.commit(r#"{"step":2}"#.to_string(), &rev1, "app".to_string())
|
|
215
|
-
.expect("2");
|
|
216
|
-
let rev3 = store
|
|
217
|
-
.commit(r#"{"step":3}"#.to_string(), &rev2, "app".to_string())
|
|
218
|
-
.expect("3");
|
|
219
|
-
let rev4 = store
|
|
220
|
-
.commit(r#"{"step":4}"#.to_string(), &rev3, "app".to_string())
|
|
221
|
-
.expect("4");
|
|
222
|
-
let rev5 = store
|
|
223
|
-
.commit(r#"{"step":5}"#.to_string(), &rev4, "app".to_string())
|
|
224
|
-
.expect("5");
|
|
225
|
-
|
|
226
|
-
let id1 = rev1.id.clone();
|
|
227
|
-
let id2 = rev2.id.clone();
|
|
228
|
-
let id3 = rev3.id.clone();
|
|
229
|
-
let id4 = rev4.id.clone();
|
|
230
|
-
let id5 = rev5.id.clone();
|
|
231
|
-
|
|
232
|
-
// All should exist
|
|
233
|
-
assert!(store.exists(&id1));
|
|
234
|
-
assert!(store.exists(&id2));
|
|
235
|
-
assert!(store.exists(&id3));
|
|
236
|
-
assert!(store.exists(&id4));
|
|
237
|
-
assert!(store.exists(&id5));
|
|
238
|
-
let id5_hex = id5.as_hex().to_string();
|
|
239
|
-
assert_eq!(
|
|
240
|
-
store.get(&id5).map(|r| r.id.as_hex().to_string()),
|
|
241
|
-
Some(id5_hex)
|
|
242
|
-
);
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
#[test]
|
|
246
|
-
fn test_persistence_with_corrupted_content() {
|
|
247
|
-
let temp_dir = TempDir::new().unwrap();
|
|
248
|
-
let temp_path = temp_dir.path().join("test.log");
|
|
249
|
-
|
|
250
|
-
// Create and persist
|
|
251
|
-
let db1 = feltdb::FeltDb::open(&temp_path).expect("open db");
|
|
252
|
-
let store1 = StateStore::with_feltdb(Arc::new(db1)).expect("create store");
|
|
253
|
-
let rev1 = store1
|
|
254
|
-
.create(
|
|
255
|
-
"docs:1",
|
|
256
|
-
r#"{"complex":{"nested":{"data":[1,2,3],"unicode":"αβγ"}}}"#.to_string(),
|
|
257
|
-
"auth".to_string(),
|
|
258
|
-
)
|
|
259
|
-
.expect("create");
|
|
260
|
-
let id1 = rev1.id.clone();
|
|
261
|
-
drop(store1);
|
|
262
|
-
|
|
263
|
-
// Recover
|
|
264
|
-
let db2 = feltdb::FeltDb::open(&temp_path).expect("open db again");
|
|
265
|
-
let store2 = StateStore::with_feltdb(Arc::new(db2)).expect("recovery");
|
|
266
|
-
let recovered = store2.get(&id1).expect("get");
|
|
267
|
-
assert_eq!(
|
|
268
|
-
recovered.content,
|
|
269
|
-
r#"{"complex":{"nested":{"data":[1,2,3],"unicode":"αβγ"}}}"#
|
|
270
|
-
);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
#[test]
|
|
274
|
-
fn test_concurrent_access_to_persistent_store() {
|
|
275
|
-
let temp_dir = TempDir::new().unwrap();
|
|
276
|
-
let temp_path = temp_dir.path().join("test.log");
|
|
277
|
-
|
|
278
|
-
let db = feltdb::FeltDb::open(&temp_path).expect("open db");
|
|
279
|
-
let store = StateStore::with_feltdb(Arc::new(db)).expect("create store");
|
|
280
|
-
let rev1 = store
|
|
281
|
-
.create("docs:1", r#"{"v":1}"#.to_string(), "auth".to_string())
|
|
282
|
-
.expect("create");
|
|
283
|
-
let id1 = rev1.id.clone();
|
|
284
|
-
|
|
285
|
-
// Clone the store for concurrent access
|
|
286
|
-
let store_clone1 = store.clone();
|
|
287
|
-
let store_clone2 = store.clone();
|
|
288
|
-
|
|
289
|
-
let id1_hex = id1.as_hex().to_string();
|
|
290
|
-
|
|
291
|
-
// Both can read
|
|
292
|
-
assert_eq!(
|
|
293
|
-
store_clone1.get(&id1).map(|r| r.id.as_hex().to_string()),
|
|
294
|
-
Some(id1_hex.clone())
|
|
295
|
-
);
|
|
296
|
-
assert_eq!(
|
|
297
|
-
store_clone2.get(&id1).map(|r| r.id.as_hex().to_string()),
|
|
298
|
-
Some(id1_hex)
|
|
299
|
-
);
|
|
300
|
-
|
|
301
|
-
// Commit from one
|
|
302
|
-
let rev2 = store_clone1
|
|
303
|
-
.commit(r#"{"v":2}"#.to_string(), &rev1, "auth".to_string())
|
|
304
|
-
.expect("commit");
|
|
305
|
-
let id2 = rev2.id.clone();
|
|
306
|
-
|
|
307
|
-
// Both should see the new revision
|
|
308
|
-
assert!(store.exists(&id2));
|
|
309
|
-
assert!(store_clone2.exists(&id2));
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
#[test]
|
|
313
|
-
fn test_persistent_store_recovery_after_multiple_crashes() {
|
|
314
|
-
let temp_dir = TempDir::new().unwrap();
|
|
315
|
-
let temp_path = temp_dir.path().join("test.log");
|
|
316
|
-
|
|
317
|
-
// The caller carries the ids it cares about across restarts.
|
|
318
|
-
let rev2_id;
|
|
319
|
-
let rev3_id;
|
|
320
|
-
|
|
321
|
-
// Cycle 1: create initial state
|
|
322
|
-
{
|
|
323
|
-
let db = feltdb::FeltDb::open(&temp_path).expect("open db");
|
|
324
|
-
let store = StateStore::with_feltdb(Arc::new(db)).expect("create store");
|
|
325
|
-
let rev1 = store
|
|
326
|
-
.create("docs:1", r#"{"cycle":1}"#.to_string(), "auth".to_string())
|
|
327
|
-
.expect("create1");
|
|
328
|
-
rev2_id = store
|
|
329
|
-
.commit(r#"{"cycle":1.5}"#.to_string(), &rev1, "auth".to_string())
|
|
330
|
-
.expect("commit1")
|
|
331
|
-
.id;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
// Cycle 2: reopen and add more, starting from the id we carried
|
|
335
|
-
{
|
|
336
|
-
let db = feltdb::FeltDb::open(&temp_path).expect("open db");
|
|
337
|
-
let store = StateStore::with_feltdb(Arc::new(db)).expect("create store");
|
|
338
|
-
let rev2 = store.get(&rev2_id).expect("rev2 survives");
|
|
339
|
-
rev3_id = store
|
|
340
|
-
.commit(r#"{"cycle":2}"#.to_string(), &rev2, "auth".to_string())
|
|
341
|
-
.expect("commit2")
|
|
342
|
-
.id;
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
// Cycle 3: verify all history
|
|
346
|
-
{
|
|
347
|
-
let db = feltdb::FeltDb::open(&temp_path).expect("open db");
|
|
348
|
-
let store = StateStore::with_feltdb(Arc::new(db)).expect("create store");
|
|
349
|
-
|
|
350
|
-
// Walk the chain backwards - count how many nodes we can reach
|
|
351
|
-
let mut rev = store.get(&rev3_id).expect("rev3 survives every cycle");
|
|
352
|
-
let mut count = 1; // Start with 1 for the current node
|
|
353
|
-
while let Some(parent_id) = &rev.parent_id {
|
|
354
|
-
rev = store.get(parent_id).expect("get parent");
|
|
355
|
-
count += 1;
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
assert!(
|
|
359
|
-
count >= 3,
|
|
360
|
-
"should have chain of at least 3 revisions, got {}",
|
|
361
|
-
count
|
|
362
|
-
);
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
}
|