@feltdb/core 0.4.12 → 0.4.14
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/cli/commands.js +42 -25
- package/dist/cli/index.js +1 -1
- package/dist/create/cli.js +39 -4
- package/dist/create/create.js +30 -18
- package/dist/create/docker-compose-generator.js +68 -11
- package/dist/create/package-versions.js +1 -1
- package/dist/create/server-source/Cargo.lock +2238 -0
- package/dist/create/server-source/Cargo.toml +7 -0
- package/dist/create/server-source/crates/feltdb/Cargo.lock +175 -0
- package/dist/create/server-source/crates/feltdb/Cargo.toml +79 -0
- package/dist/create/server-source/crates/feltdb/benches/baselines/gate-13-redux.json +370 -0
- package/dist/create/server-source/crates/feltdb/benches/gate13_baseline.rs +589 -0
- package/dist/create/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs +259 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_13_redux.rs +446 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_13_regression_runner.rs +272 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_concurrent_writer_scaling.rs +378 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_production_admission_revalidation.rs +414 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc2_admission_contract.rs +486 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc_root_cause.rs +273 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync1_queued_prototype.rs +587 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync_economics.rs +513 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14b_causal_backlog_scaling.rs +395 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_contract_test.rs +469 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_scaling.rs +409 -0
- package/dist/create/server-source/crates/feltdb/benches/gate_14d_combined_dimension_scaling.rs +627 -0
- package/dist/create/server-source/crates/feltdb/benches/phase_7_1_2_optimization_benchmark.rs +383 -0
- package/dist/create/server-source/crates/feltdb/benches/phase_7_1_3_crossover_analysis.rs +298 -0
- package/dist/create/server-source/crates/feltdb/src/acceptance_tests.rs +1698 -0
- package/dist/create/server-source/crates/feltdb/src/acquisition.rs +286 -0
- package/dist/create/server-source/crates/feltdb/src/admission.rs +192 -0
- package/dist/create/server-source/crates/feltdb/src/admission_contract_tests.rs +477 -0
- package/dist/create/server-source/crates/feltdb/src/adversarial_transport.rs +566 -0
- package/dist/create/server-source/crates/feltdb/src/analytics.rs +475 -0
- package/dist/create/server-source/crates/feltdb/src/application.rs +2244 -0
- package/dist/create/server-source/crates/feltdb/src/application_runtime.rs +1070 -0
- package/dist/create/server-source/crates/feltdb/src/authorization.rs +1030 -0
- package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +266 -0
- package/dist/create/server-source/crates/feltdb/src/capabilities/mod.rs +8 -0
- package/dist/create/server-source/crates/feltdb/src/capabilities/search.rs +418 -0
- package/dist/create/server-source/crates/feltdb/src/capabilities/vector.rs +482 -0
- package/dist/create/server-source/crates/feltdb/src/capability.rs +903 -0
- package/dist/create/server-source/crates/feltdb/src/cardinality_diagnostics.rs +261 -0
- package/dist/create/server-source/crates/feltdb/src/cardinality_endpoint.rs +78 -0
- package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier.rs +2214 -0
- package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier_phase_7_1.rs +194 -0
- package/dist/create/server-source/crates/feltdb/src/concurrency_fuzzing.rs +427 -0
- package/dist/create/server-source/crates/feltdb/src/consistency_contract.rs +453 -0
- package/dist/create/server-source/crates/feltdb/src/content_distribution.rs +465 -0
- package/dist/create/server-source/crates/feltdb/src/convergence.rs +618 -0
- package/dist/create/server-source/crates/feltdb/src/crash_atomic_boundary.rs +418 -0
- package/dist/create/server-source/crates/feltdb/src/crash_injection.rs +380 -0
- package/dist/create/server-source/crates/feltdb/src/crash_recovery_tests.rs +362 -0
- package/dist/create/server-source/crates/feltdb/src/cron.rs +294 -0
- package/dist/create/server-source/crates/feltdb/src/distributed_indexing.rs +474 -0
- package/dist/create/server-source/crates/feltdb/src/distributed_tests.rs +1003 -0
- package/dist/create/server-source/crates/feltdb/src/distributed_transactions.rs +536 -0
- package/dist/create/server-source/crates/feltdb/src/durability_guarantees.rs +364 -0
- package/dist/create/server-source/crates/feltdb/src/durable_dedup_set.rs +235 -0
- package/dist/create/server-source/crates/feltdb/src/durable_operation_log.rs +207 -0
- package/dist/create/server-source/crates/feltdb/src/durable_sync.rs +316 -0
- package/dist/create/server-source/crates/feltdb/src/execution.rs +426 -0
- package/dist/create/server-source/crates/feltdb/src/in_process_transport.rs +219 -0
- package/dist/create/server-source/crates/feltdb/src/indexing.rs +779 -0
- package/dist/create/server-source/crates/feltdb/src/lib.rs +2838 -0
- package/dist/create/server-source/crates/feltdb/src/materialization.rs +184 -0
- package/dist/create/server-source/crates/feltdb/src/metrics.rs +267 -0
- package/dist/create/server-source/crates/feltdb/src/multi_node_convergence.rs +311 -0
- package/dist/create/server-source/crates/feltdb/src/observability.rs +366 -0
- package/dist/create/server-source/crates/feltdb/src/operation.rs +251 -0
- package/dist/create/server-source/crates/feltdb/src/operation_algebra.rs +438 -0
- package/dist/create/server-source/crates/feltdb/src/operation_log.rs +344 -0
- package/dist/create/server-source/crates/feltdb/src/partition_reconciliation.rs +477 -0
- package/dist/create/server-source/crates/feltdb/src/peer_registry.rs +166 -0
- package/dist/create/server-source/crates/feltdb/src/permutation_scheduler.rs +261 -0
- package/dist/create/server-source/crates/feltdb/src/persistence_reality.rs +560 -0
- package/dist/create/server-source/crates/feltdb/src/phase1b_acceptance.rs +3226 -0
- package/dist/create/server-source/crates/feltdb/src/phase1c1_acceptance.rs +201 -0
- package/dist/create/server-source/crates/feltdb/src/phase1c2_acceptance.rs +263 -0
- package/dist/create/server-source/crates/feltdb/src/phase1c3_acceptance.rs +484 -0
- package/dist/create/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +216 -0
- package/dist/create/server-source/crates/feltdb/src/phase5_integration.rs +281 -0
- package/dist/create/server-source/crates/feltdb/src/phase5_scenarios.rs +323 -0
- package/dist/create/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +573 -0
- package/dist/create/server-source/crates/feltdb/src/phase6_convergence_validator.rs +404 -0
- package/dist/create/server-source/crates/feltdb/src/phase6_persistence.rs +418 -0
- package/dist/create/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +381 -0
- package/dist/create/server-source/crates/feltdb/src/phase_1c_three_node.rs +523 -0
- package/dist/create/server-source/crates/feltdb/src/phase_2a_failures.rs +334 -0
- package/dist/create/server-source/crates/feltdb/src/phase_2b_network.rs +306 -0
- package/dist/create/server-source/crates/feltdb/src/phase_2c_cascading.rs +355 -0
- package/dist/create/server-source/crates/feltdb/src/phase_3_durability.rs +395 -0
- package/dist/create/server-source/crates/feltdb/src/phase_4_baseline.rs +346 -0
- package/dist/create/server-source/crates/feltdb/src/phase_5_soak.rs +430 -0
- package/dist/create/server-source/crates/feltdb/src/production_api.rs +400 -0
- package/dist/create/server-source/crates/feltdb/src/provenance.rs +207 -0
- package/dist/create/server-source/crates/feltdb/src/query_performance.rs +217 -0
- package/dist/create/server-source/crates/feltdb/src/references.rs +404 -0
- package/dist/create/server-source/crates/feltdb/src/replay_fuzzing.rs +401 -0
- package/dist/create/server-source/crates/feltdb/src/replication_manager.rs +160 -0
- package/dist/create/server-source/crates/feltdb/src/replication_protocol.rs +132 -0
- package/dist/create/server-source/crates/feltdb/src/routing.rs +409 -0
- package/dist/create/server-source/crates/feltdb/src/sharding.rs +523 -0
- package/dist/create/server-source/crates/feltdb/src/state_contract.rs +3118 -0
- package/dist/create/server-source/crates/feltdb/src/state_hash.rs +291 -0
- package/dist/create/server-source/crates/feltdb/src/state_transition_store.rs +376 -0
- package/dist/create/server-source/crates/feltdb/src/storage.rs +267 -0
- package/dist/create/server-source/crates/feltdb/src/submission.rs +477 -0
- package/dist/create/server-source/crates/feltdb/src/sync.rs +483 -0
- package/dist/create/server-source/crates/feltdb/src/sync_contract.rs +822 -0
- package/dist/create/server-source/crates/feltdb/src/tcp_transport.rs +366 -0
- package/dist/create/server-source/crates/feltdb/src/transaction_api.rs +473 -0
- package/dist/create/server-source/crates/feltdb/src/transaction_invariants.rs +949 -0
- package/dist/create/server-source/crates/feltdb/src/transactions.rs +646 -0
- package/dist/create/server-source/crates/feltdb/src/trigger.rs +390 -0
- package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +928 -0
- package/dist/create/server-source/crates/feltdb/src/workflow.rs +713 -0
- package/dist/create/server-source/crates/feltdb/src/workflow_acceptance_tests.rs +510 -0
- package/dist/create/server-source/crates/feltdb/src/workflow_integration.rs +354 -0
- package/dist/create/server-source/crates/feltdb/src/workflow_runtime.rs +594 -0
- package/dist/create/server-source/crates/feltdb/src/workload.rs +1310 -0
- package/dist/create/server-source/crates/feltdb-server/Cargo.toml +23 -0
- package/dist/create/server-source/crates/feltdb-server/README.md +79 -0
- package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +73 -0
- package/dist/create/server-source/crates/feltdb-server/src/application_contract.rs +425 -0
- package/dist/create/server-source/crates/feltdb-server/src/artifacts.rs +449 -0
- package/dist/create/server-source/crates/feltdb-server/src/audit.rs +59 -0
- package/dist/create/server-source/crates/feltdb-server/src/auth.rs +308 -0
- package/dist/create/server-source/crates/feltdb-server/src/authorization.rs +228 -0
- package/dist/create/server-source/crates/feltdb-server/src/backup.rs +416 -0
- package/dist/create/server-source/crates/feltdb-server/src/causal.rs +218 -0
- package/dist/create/server-source/crates/feltdb-server/src/certification.rs +223 -0
- package/dist/create/server-source/crates/feltdb-server/src/clock.rs +132 -0
- package/dist/create/server-source/crates/feltdb-server/src/cluster.rs +165 -0
- package/dist/create/server-source/crates/feltdb-server/src/connections.rs +1044 -0
- package/dist/create/server-source/crates/feltdb-server/src/content.rs +111 -0
- package/dist/create/server-source/crates/feltdb-server/src/identity.rs +250 -0
- package/dist/create/server-source/crates/feltdb-server/src/key_management.rs +78 -0
- package/dist/create/server-source/crates/feltdb-server/src/key_provider.rs +247 -0
- package/dist/create/server-source/crates/feltdb-server/src/leases.rs +123 -0
- package/dist/create/server-source/crates/feltdb-server/src/lib.rs +25 -0
- package/dist/create/server-source/crates/feltdb-server/src/main.rs +8715 -0
- package/dist/create/server-source/crates/feltdb-server/src/metrics.rs +97 -0
- package/dist/create/server-source/crates/feltdb-server/src/portable_bundle.rs +350 -0
- package/dist/create/server-source/crates/feltdb-server/src/principals.rs +510 -0
- package/dist/create/server-source/crates/feltdb-server/src/providers.rs +269 -0
- package/dist/create/server-source/crates/feltdb-server/src/releases.rs +2563 -0
- package/dist/create/server-source/crates/feltdb-server/src/sessions.rs +156 -0
- package/dist/create/server-source/crates/feltdb-server/src/tenancy.rs +1097 -0
- package/dist/create/server-source/crates/feltdb-server/src/versions.rs +264 -0
- package/dist/create/server-source/crates/feltdb-wasm/Cargo.toml +31 -0
- package/dist/create/server-source/crates/feltdb-wasm/src/lib.rs +1086 -0
- package/dist/create/server-source/crates/feltdb-wasm/test.db +0 -0
- package/dist/flowspec.d.ts +2 -0
- package/dist/flowspec.d.ts.map +1 -1
- package/dist/flowspec.js +28 -4
- package/dist/state-contract.d.ts +7 -1
- package/dist/state-contract.d.ts.map +1 -1
- package/dist/studio/components/ApplicationDesigner.d.ts.map +1 -1
- package/dist/studio/components/ConflictExplorer.d.ts.map +1 -1
- package/dist/studio/components/index.js +1 -1
- package/dist/studio/{components-Q0Nx6gLE.js → components-9kDSWiGL.js} +163 -47
- package/dist/studio/index.js +31 -28
- package/dist/studio-app/assets/{index-BHOmLZF-.js → index-DVdvmf69.js} +9 -9
- package/dist/studio-app/index.html +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
use serde::{Deserialize, Serialize};
|
|
2
|
+
use std::fmt;
|
|
3
|
+
|
|
4
|
+
/// Explicit versioning for all durable formats in FeltDB.
|
|
5
|
+
/// Every component that stores durable state must declare its format version.
|
|
6
|
+
/// Migrations between versions are restartable and preserve causal identity.
|
|
7
|
+
|
|
8
|
+
/// Current versions for all durable formats
|
|
9
|
+
pub struct FormatVersions {
|
|
10
|
+
/// State log format: entries, operation encoding, checkpoints
|
|
11
|
+
pub state_log: u32,
|
|
12
|
+
/// Checkpoint format: snapshot encoding, metadata
|
|
13
|
+
pub checkpoint: u32,
|
|
14
|
+
/// Protocol version: API, peer communication, data encoding
|
|
15
|
+
pub protocol: u32,
|
|
16
|
+
/// Membership proposal format
|
|
17
|
+
pub membership: u32,
|
|
18
|
+
/// Lease store format
|
|
19
|
+
pub leases: u32,
|
|
20
|
+
/// Content store format
|
|
21
|
+
pub content: u32,
|
|
22
|
+
/// Backup bundle format
|
|
23
|
+
pub backup: u32,
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
impl FormatVersions {
|
|
27
|
+
/// Current stable format versions
|
|
28
|
+
pub fn current() -> Self {
|
|
29
|
+
Self {
|
|
30
|
+
state_log: 1,
|
|
31
|
+
checkpoint: 1,
|
|
32
|
+
protocol: 1,
|
|
33
|
+
membership: 1,
|
|
34
|
+
leases: 1,
|
|
35
|
+
content: 1,
|
|
36
|
+
backup: 1,
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/// Minimum supported versions (defines downgrade compatibility)
|
|
41
|
+
pub fn minimum_supported() -> Self {
|
|
42
|
+
Self {
|
|
43
|
+
state_log: 1,
|
|
44
|
+
checkpoint: 1,
|
|
45
|
+
protocol: 1,
|
|
46
|
+
membership: 1,
|
|
47
|
+
leases: 1,
|
|
48
|
+
content: 1,
|
|
49
|
+
backup: 1,
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/// Check if a version is supported
|
|
54
|
+
pub fn is_supported(&self, current: &FormatVersions) -> bool {
|
|
55
|
+
let minimum = Self::minimum_supported();
|
|
56
|
+
self.state_log >= minimum.state_log
|
|
57
|
+
&& self.state_log <= current.state_log
|
|
58
|
+
&& self.checkpoint >= minimum.checkpoint
|
|
59
|
+
&& self.checkpoint <= current.checkpoint
|
|
60
|
+
&& self.protocol >= minimum.protocol
|
|
61
|
+
&& self.protocol <= current.protocol
|
|
62
|
+
&& self.membership >= minimum.membership
|
|
63
|
+
&& self.membership <= current.membership
|
|
64
|
+
&& self.leases >= minimum.leases
|
|
65
|
+
&& self.leases <= current.leases
|
|
66
|
+
&& self.content >= minimum.content
|
|
67
|
+
&& self.content <= current.content
|
|
68
|
+
&& self.backup >= minimum.backup
|
|
69
|
+
&& self.backup <= current.backup
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/// Format version descriptor written to durable files
|
|
74
|
+
#[derive(Clone, Debug, Serialize, Deserialize)]
|
|
75
|
+
pub struct VersionManifest {
|
|
76
|
+
/// Timestamp when this version was written
|
|
77
|
+
pub written_at_ms: u64,
|
|
78
|
+
/// State log format version
|
|
79
|
+
pub state_log_version: u32,
|
|
80
|
+
/// Checkpoint format version
|
|
81
|
+
pub checkpoint_version: u32,
|
|
82
|
+
/// Protocol version
|
|
83
|
+
pub protocol_version: u32,
|
|
84
|
+
/// Membership format version
|
|
85
|
+
pub membership_version: u32,
|
|
86
|
+
/// Lease format version
|
|
87
|
+
pub lease_version: u32,
|
|
88
|
+
/// Content format version
|
|
89
|
+
pub content_version: u32,
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
impl VersionManifest {
|
|
93
|
+
pub fn current() -> Self {
|
|
94
|
+
let versions = FormatVersions::current();
|
|
95
|
+
Self {
|
|
96
|
+
written_at_ms: std::time::SystemTime::now()
|
|
97
|
+
.duration_since(std::time::UNIX_EPOCH)
|
|
98
|
+
.unwrap_or_default()
|
|
99
|
+
.as_millis() as u64,
|
|
100
|
+
state_log_version: versions.state_log,
|
|
101
|
+
checkpoint_version: versions.checkpoint,
|
|
102
|
+
protocol_version: versions.protocol,
|
|
103
|
+
membership_version: versions.membership,
|
|
104
|
+
lease_version: versions.leases,
|
|
105
|
+
content_version: versions.content,
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
pub fn to_format_versions(&self) -> FormatVersions {
|
|
110
|
+
FormatVersions {
|
|
111
|
+
state_log: self.state_log_version,
|
|
112
|
+
checkpoint: self.checkpoint_version,
|
|
113
|
+
protocol: self.protocol_version,
|
|
114
|
+
membership: self.membership_version,
|
|
115
|
+
leases: self.lease_version,
|
|
116
|
+
content: self.content_version,
|
|
117
|
+
backup: 1, // Backup format is managed separately
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/// Migration error
|
|
123
|
+
#[derive(Clone, Debug)]
|
|
124
|
+
pub struct MigrationError {
|
|
125
|
+
pub from_version: u32,
|
|
126
|
+
pub to_version: u32,
|
|
127
|
+
pub component: &'static str,
|
|
128
|
+
pub message: String,
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
impl fmt::Display for MigrationError {
|
|
132
|
+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
133
|
+
write!(
|
|
134
|
+
f,
|
|
135
|
+
"Migration failed for {}: {} -> {}: {}",
|
|
136
|
+
self.component, self.from_version, self.to_version, self.message
|
|
137
|
+
)
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
impl std::error::Error for MigrationError {}
|
|
142
|
+
|
|
143
|
+
/// Migration trait for component-specific upgrade/downgrade logic
|
|
144
|
+
pub trait Migration: Send + Sync {
|
|
145
|
+
/// Component name (e.g., "state_log", "checkpoint")
|
|
146
|
+
fn component(&self) -> &'static str;
|
|
147
|
+
|
|
148
|
+
/// Source version
|
|
149
|
+
fn from_version(&self) -> u32;
|
|
150
|
+
|
|
151
|
+
/// Target version
|
|
152
|
+
fn to_version(&self) -> u32;
|
|
153
|
+
|
|
154
|
+
/// Upgrade the data. Must be restartable.
|
|
155
|
+
fn migrate(&self, data: Vec<u8>) -> Result<Vec<u8>, MigrationError>;
|
|
156
|
+
|
|
157
|
+
/// Downgrade the data. Must be restartable.
|
|
158
|
+
fn downgrade(&self, data: Vec<u8>) -> Result<Vec<u8>, MigrationError>;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/// Migration registry
|
|
162
|
+
pub struct MigrationRegistry {
|
|
163
|
+
upgrades: std::collections::HashMap<(u32, u32), Box<dyn Migration>>,
|
|
164
|
+
downgrades: std::collections::HashMap<(u32, u32), Box<dyn Migration>>,
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
impl MigrationRegistry {
|
|
168
|
+
pub fn new() -> Self {
|
|
169
|
+
Self {
|
|
170
|
+
upgrades: std::collections::HashMap::new(),
|
|
171
|
+
downgrades: std::collections::HashMap::new(),
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
pub fn register_upgrade(&mut self, migration: Box<dyn Migration>) {
|
|
176
|
+
self.upgrades.insert(
|
|
177
|
+
(migration.from_version(), migration.to_version()),
|
|
178
|
+
migration,
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
pub fn register_downgrade(&mut self, migration: Box<dyn Migration>) {
|
|
183
|
+
self.downgrades.insert(
|
|
184
|
+
(migration.from_version(), migration.to_version()),
|
|
185
|
+
migration,
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
pub fn get_upgrade(&self, from: u32, to: u32) -> Option<&Box<dyn Migration>> {
|
|
190
|
+
self.upgrades.get(&(from, to))
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
pub fn get_downgrade(&self, from: u32, to: u32) -> Option<&Box<dyn Migration>> {
|
|
194
|
+
self.downgrades.get(&(from, to))
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
impl Default for MigrationRegistry {
|
|
199
|
+
fn default() -> Self {
|
|
200
|
+
Self::new()
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/// Compatibility policy
|
|
205
|
+
pub const COMPATIBILITY_POLICY: &str = r#"
|
|
206
|
+
## Format Compatibility Policy
|
|
207
|
+
|
|
208
|
+
FeltDB follows semantic versioning for format compatibility:
|
|
209
|
+
|
|
210
|
+
- **Major version bump** (e.g., 1 → 2): Incompatible format change. Requires migration.
|
|
211
|
+
- **Minor version increment within supported range**: Compatible enhancement. No migration required.
|
|
212
|
+
|
|
213
|
+
### Support Matrix
|
|
214
|
+
|
|
215
|
+
- **Current version**: all formats at v1
|
|
216
|
+
- **Minimum supported version**: all formats at v1
|
|
217
|
+
- **Rolling upgrade support**: N → N+1 (one version forward)
|
|
218
|
+
- **Rollback support**: N+1 → N (one version backward, within minimum supported range)
|
|
219
|
+
|
|
220
|
+
### Migration Guarantees
|
|
221
|
+
|
|
222
|
+
Every migration must satisfy:
|
|
223
|
+
1. **Atomicity**: Format change is atomic (all-or-nothing)
|
|
224
|
+
2. **Restartability**: Migration can be safely interrupted and restarted
|
|
225
|
+
3. **Causal identity**: Operations retain their causal identity and vector clocks
|
|
226
|
+
4. **Content hashing**: SHA-256 hashes of data remain verifiable
|
|
227
|
+
5. **Idempotency**: Running the same migration twice produces identical results
|
|
228
|
+
|
|
229
|
+
### Unsupported Format Transitions
|
|
230
|
+
|
|
231
|
+
- Versions below the minimum supported version are rejected before any mutation
|
|
232
|
+
- Multi-step jumps (e.g., v1 → v3) are not supported; use sequential migrations
|
|
233
|
+
- Concurrent format changes are serialized behind a lock
|
|
234
|
+
- Partial/interrupted migrations are detected and rolled back
|
|
235
|
+
|
|
236
|
+
### Publishing Policy
|
|
237
|
+
|
|
238
|
+
Format version changes are announced in release notes with:
|
|
239
|
+
- Source and target versions for each component
|
|
240
|
+
- Migration time estimates for capacity envelopes
|
|
241
|
+
- Rollback procedures and recovery guidance
|
|
242
|
+
"#;
|
|
243
|
+
|
|
244
|
+
#[cfg(test)]
|
|
245
|
+
mod tests {
|
|
246
|
+
use super::*;
|
|
247
|
+
|
|
248
|
+
#[test]
|
|
249
|
+
fn test_version_compatibility() {
|
|
250
|
+
let current = FormatVersions::current();
|
|
251
|
+
let manifest = VersionManifest::current();
|
|
252
|
+
let stored = manifest.to_format_versions();
|
|
253
|
+
|
|
254
|
+
assert!(stored.is_supported(¤t));
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
#[test]
|
|
258
|
+
fn test_minimum_supported() {
|
|
259
|
+
let current = FormatVersions::current();
|
|
260
|
+
let minimum = FormatVersions::minimum_supported();
|
|
261
|
+
|
|
262
|
+
assert!(minimum.is_supported(¤t));
|
|
263
|
+
}
|
|
264
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
[package]
|
|
2
|
+
name = "feltdb-wasm"
|
|
3
|
+
version.workspace = true
|
|
4
|
+
edition.workspace = true
|
|
5
|
+
|
|
6
|
+
[lib]
|
|
7
|
+
crate-type = ["cdylib"]
|
|
8
|
+
|
|
9
|
+
[dependencies]
|
|
10
|
+
feltdb = { path = "../feltdb" }
|
|
11
|
+
wasm-bindgen = "0.2"
|
|
12
|
+
wasm-bindgen-futures = "0.4"
|
|
13
|
+
serde = { version = "1", features = ["derive"] }
|
|
14
|
+
serde_json = "1"
|
|
15
|
+
serde-wasm-bindgen = "0.4"
|
|
16
|
+
tokio = { version = "1", features = ["sync", "macros", "rt", "time"] }
|
|
17
|
+
js-sys = "0.3"
|
|
18
|
+
sha2 = "0.10"
|
|
19
|
+
web-sys = { version = "0.3", features = ["Window"] }
|
|
20
|
+
|
|
21
|
+
[target.'cfg(target_arch = "wasm32")'.dependencies]
|
|
22
|
+
getrandom = { version = "0.2", features = ["js"] }
|
|
23
|
+
|
|
24
|
+
[package.metadata.wasm]
|
|
25
|
+
name = "feltdb"
|
|
26
|
+
|
|
27
|
+
# CI and customer builds must not depend on downloading Binaryen from GitHub.
|
|
28
|
+
# Rust already emits an optimized release artifact; wasm-opt can be applied in
|
|
29
|
+
# a separately provisioned release environment when desired.
|
|
30
|
+
[package.metadata.wasm-pack.profile.release]
|
|
31
|
+
wasm-opt = false
|