@feltdb/core 0.4.11 → 0.4.13

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 (164) hide show
  1. package/dist/cli/commands.js +5 -2
  2. package/dist/cli/index.js +1 -1
  3. package/dist/create/cli.js +16 -1
  4. package/dist/create/create.js +30 -16
  5. package/dist/create/docker-compose-generator.js +48 -9
  6. package/dist/create/package-versions.js +1 -1
  7. package/dist/create/server-source/Cargo.lock +2238 -0
  8. package/dist/create/server-source/Cargo.toml +7 -0
  9. package/dist/create/server-source/crates/feltdb/Cargo.lock +175 -0
  10. package/dist/create/server-source/crates/feltdb/Cargo.toml +79 -0
  11. package/dist/create/server-source/crates/feltdb/benches/baselines/gate-13-redux.json +370 -0
  12. package/dist/create/server-source/crates/feltdb/benches/gate13_baseline.rs +589 -0
  13. package/dist/create/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs +259 -0
  14. package/dist/create/server-source/crates/feltdb/benches/gate_13_redux.rs +446 -0
  15. package/dist/create/server-source/crates/feltdb/benches/gate_13_regression_runner.rs +272 -0
  16. package/dist/create/server-source/crates/feltdb/benches/gate_14a_concurrent_writer_scaling.rs +378 -0
  17. package/dist/create/server-source/crates/feltdb/benches/gate_14a_production_admission_revalidation.rs +414 -0
  18. package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc2_admission_contract.rs +486 -0
  19. package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc_root_cause.rs +273 -0
  20. package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync1_queued_prototype.rs +587 -0
  21. package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync_economics.rs +513 -0
  22. package/dist/create/server-source/crates/feltdb/benches/gate_14b_causal_backlog_scaling.rs +395 -0
  23. package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_contract_test.rs +469 -0
  24. package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_scaling.rs +409 -0
  25. package/dist/create/server-source/crates/feltdb/benches/gate_14d_combined_dimension_scaling.rs +627 -0
  26. package/dist/create/server-source/crates/feltdb/benches/phase_7_1_2_optimization_benchmark.rs +383 -0
  27. package/dist/create/server-source/crates/feltdb/benches/phase_7_1_3_crossover_analysis.rs +298 -0
  28. package/dist/create/server-source/crates/feltdb/src/acceptance_tests.rs +1698 -0
  29. package/dist/create/server-source/crates/feltdb/src/acquisition.rs +286 -0
  30. package/dist/create/server-source/crates/feltdb/src/admission.rs +192 -0
  31. package/dist/create/server-source/crates/feltdb/src/admission_contract_tests.rs +477 -0
  32. package/dist/create/server-source/crates/feltdb/src/adversarial_transport.rs +566 -0
  33. package/dist/create/server-source/crates/feltdb/src/analytics.rs +475 -0
  34. package/dist/create/server-source/crates/feltdb/src/application.rs +2244 -0
  35. package/dist/create/server-source/crates/feltdb/src/application_runtime.rs +1070 -0
  36. package/dist/create/server-source/crates/feltdb/src/authorization.rs +1030 -0
  37. package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +266 -0
  38. package/dist/create/server-source/crates/feltdb/src/capabilities/mod.rs +8 -0
  39. package/dist/create/server-source/crates/feltdb/src/capabilities/search.rs +418 -0
  40. package/dist/create/server-source/crates/feltdb/src/capabilities/vector.rs +482 -0
  41. package/dist/create/server-source/crates/feltdb/src/capability.rs +903 -0
  42. package/dist/create/server-source/crates/feltdb/src/cardinality_diagnostics.rs +261 -0
  43. package/dist/create/server-source/crates/feltdb/src/cardinality_endpoint.rs +78 -0
  44. package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier.rs +2214 -0
  45. package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier_phase_7_1.rs +194 -0
  46. package/dist/create/server-source/crates/feltdb/src/concurrency_fuzzing.rs +427 -0
  47. package/dist/create/server-source/crates/feltdb/src/consistency_contract.rs +453 -0
  48. package/dist/create/server-source/crates/feltdb/src/content_distribution.rs +465 -0
  49. package/dist/create/server-source/crates/feltdb/src/convergence.rs +618 -0
  50. package/dist/create/server-source/crates/feltdb/src/crash_atomic_boundary.rs +418 -0
  51. package/dist/create/server-source/crates/feltdb/src/crash_injection.rs +380 -0
  52. package/dist/create/server-source/crates/feltdb/src/crash_recovery_tests.rs +362 -0
  53. package/dist/create/server-source/crates/feltdb/src/cron.rs +294 -0
  54. package/dist/create/server-source/crates/feltdb/src/distributed_indexing.rs +474 -0
  55. package/dist/create/server-source/crates/feltdb/src/distributed_tests.rs +1003 -0
  56. package/dist/create/server-source/crates/feltdb/src/distributed_transactions.rs +536 -0
  57. package/dist/create/server-source/crates/feltdb/src/durability_guarantees.rs +364 -0
  58. package/dist/create/server-source/crates/feltdb/src/durable_dedup_set.rs +235 -0
  59. package/dist/create/server-source/crates/feltdb/src/durable_operation_log.rs +207 -0
  60. package/dist/create/server-source/crates/feltdb/src/durable_sync.rs +316 -0
  61. package/dist/create/server-source/crates/feltdb/src/execution.rs +426 -0
  62. package/dist/create/server-source/crates/feltdb/src/in_process_transport.rs +219 -0
  63. package/dist/create/server-source/crates/feltdb/src/indexing.rs +779 -0
  64. package/dist/create/server-source/crates/feltdb/src/lib.rs +2838 -0
  65. package/dist/create/server-source/crates/feltdb/src/materialization.rs +184 -0
  66. package/dist/create/server-source/crates/feltdb/src/metrics.rs +267 -0
  67. package/dist/create/server-source/crates/feltdb/src/multi_node_convergence.rs +311 -0
  68. package/dist/create/server-source/crates/feltdb/src/observability.rs +366 -0
  69. package/dist/create/server-source/crates/feltdb/src/operation.rs +251 -0
  70. package/dist/create/server-source/crates/feltdb/src/operation_algebra.rs +438 -0
  71. package/dist/create/server-source/crates/feltdb/src/operation_log.rs +344 -0
  72. package/dist/create/server-source/crates/feltdb/src/partition_reconciliation.rs +477 -0
  73. package/dist/create/server-source/crates/feltdb/src/peer_registry.rs +166 -0
  74. package/dist/create/server-source/crates/feltdb/src/permutation_scheduler.rs +261 -0
  75. package/dist/create/server-source/crates/feltdb/src/persistence_reality.rs +560 -0
  76. package/dist/create/server-source/crates/feltdb/src/phase1b_acceptance.rs +3226 -0
  77. package/dist/create/server-source/crates/feltdb/src/phase1c1_acceptance.rs +201 -0
  78. package/dist/create/server-source/crates/feltdb/src/phase1c2_acceptance.rs +263 -0
  79. package/dist/create/server-source/crates/feltdb/src/phase1c3_acceptance.rs +484 -0
  80. package/dist/create/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +216 -0
  81. package/dist/create/server-source/crates/feltdb/src/phase5_integration.rs +281 -0
  82. package/dist/create/server-source/crates/feltdb/src/phase5_scenarios.rs +323 -0
  83. package/dist/create/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +573 -0
  84. package/dist/create/server-source/crates/feltdb/src/phase6_convergence_validator.rs +404 -0
  85. package/dist/create/server-source/crates/feltdb/src/phase6_persistence.rs +418 -0
  86. package/dist/create/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +381 -0
  87. package/dist/create/server-source/crates/feltdb/src/phase_1c_three_node.rs +523 -0
  88. package/dist/create/server-source/crates/feltdb/src/phase_2a_failures.rs +334 -0
  89. package/dist/create/server-source/crates/feltdb/src/phase_2b_network.rs +306 -0
  90. package/dist/create/server-source/crates/feltdb/src/phase_2c_cascading.rs +355 -0
  91. package/dist/create/server-source/crates/feltdb/src/phase_3_durability.rs +395 -0
  92. package/dist/create/server-source/crates/feltdb/src/phase_4_baseline.rs +346 -0
  93. package/dist/create/server-source/crates/feltdb/src/phase_5_soak.rs +430 -0
  94. package/dist/create/server-source/crates/feltdb/src/production_api.rs +400 -0
  95. package/dist/create/server-source/crates/feltdb/src/provenance.rs +207 -0
  96. package/dist/create/server-source/crates/feltdb/src/query_performance.rs +217 -0
  97. package/dist/create/server-source/crates/feltdb/src/references.rs +404 -0
  98. package/dist/create/server-source/crates/feltdb/src/replay_fuzzing.rs +401 -0
  99. package/dist/create/server-source/crates/feltdb/src/replication_manager.rs +160 -0
  100. package/dist/create/server-source/crates/feltdb/src/replication_protocol.rs +132 -0
  101. package/dist/create/server-source/crates/feltdb/src/routing.rs +409 -0
  102. package/dist/create/server-source/crates/feltdb/src/sharding.rs +523 -0
  103. package/dist/create/server-source/crates/feltdb/src/state_contract.rs +3118 -0
  104. package/dist/create/server-source/crates/feltdb/src/state_hash.rs +291 -0
  105. package/dist/create/server-source/crates/feltdb/src/state_transition_store.rs +376 -0
  106. package/dist/create/server-source/crates/feltdb/src/storage.rs +267 -0
  107. package/dist/create/server-source/crates/feltdb/src/submission.rs +477 -0
  108. package/dist/create/server-source/crates/feltdb/src/sync.rs +483 -0
  109. package/dist/create/server-source/crates/feltdb/src/sync_contract.rs +822 -0
  110. package/dist/create/server-source/crates/feltdb/src/tcp_transport.rs +366 -0
  111. package/dist/create/server-source/crates/feltdb/src/transaction_api.rs +473 -0
  112. package/dist/create/server-source/crates/feltdb/src/transaction_invariants.rs +949 -0
  113. package/dist/create/server-source/crates/feltdb/src/transactions.rs +646 -0
  114. package/dist/create/server-source/crates/feltdb/src/trigger.rs +390 -0
  115. package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +928 -0
  116. package/dist/create/server-source/crates/feltdb/src/workflow.rs +713 -0
  117. package/dist/create/server-source/crates/feltdb/src/workflow_acceptance_tests.rs +510 -0
  118. package/dist/create/server-source/crates/feltdb/src/workflow_integration.rs +354 -0
  119. package/dist/create/server-source/crates/feltdb/src/workflow_runtime.rs +594 -0
  120. package/dist/create/server-source/crates/feltdb/src/workload.rs +1310 -0
  121. package/dist/create/server-source/crates/feltdb-server/Cargo.toml +23 -0
  122. package/dist/create/server-source/crates/feltdb-server/README.md +79 -0
  123. package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +73 -0
  124. package/dist/create/server-source/crates/feltdb-server/src/application_contract.rs +425 -0
  125. package/dist/create/server-source/crates/feltdb-server/src/artifacts.rs +449 -0
  126. package/dist/create/server-source/crates/feltdb-server/src/audit.rs +59 -0
  127. package/dist/create/server-source/crates/feltdb-server/src/auth.rs +308 -0
  128. package/dist/create/server-source/crates/feltdb-server/src/authorization.rs +228 -0
  129. package/dist/create/server-source/crates/feltdb-server/src/backup.rs +416 -0
  130. package/dist/create/server-source/crates/feltdb-server/src/causal.rs +218 -0
  131. package/dist/create/server-source/crates/feltdb-server/src/certification.rs +223 -0
  132. package/dist/create/server-source/crates/feltdb-server/src/clock.rs +132 -0
  133. package/dist/create/server-source/crates/feltdb-server/src/cluster.rs +165 -0
  134. package/dist/create/server-source/crates/feltdb-server/src/connections.rs +1044 -0
  135. package/dist/create/server-source/crates/feltdb-server/src/content.rs +111 -0
  136. package/dist/create/server-source/crates/feltdb-server/src/identity.rs +250 -0
  137. package/dist/create/server-source/crates/feltdb-server/src/key_management.rs +78 -0
  138. package/dist/create/server-source/crates/feltdb-server/src/key_provider.rs +247 -0
  139. package/dist/create/server-source/crates/feltdb-server/src/leases.rs +123 -0
  140. package/dist/create/server-source/crates/feltdb-server/src/lib.rs +25 -0
  141. package/dist/create/server-source/crates/feltdb-server/src/main.rs +8715 -0
  142. package/dist/create/server-source/crates/feltdb-server/src/metrics.rs +97 -0
  143. package/dist/create/server-source/crates/feltdb-server/src/portable_bundle.rs +350 -0
  144. package/dist/create/server-source/crates/feltdb-server/src/principals.rs +510 -0
  145. package/dist/create/server-source/crates/feltdb-server/src/providers.rs +269 -0
  146. package/dist/create/server-source/crates/feltdb-server/src/releases.rs +2563 -0
  147. package/dist/create/server-source/crates/feltdb-server/src/sessions.rs +156 -0
  148. package/dist/create/server-source/crates/feltdb-server/src/tenancy.rs +1097 -0
  149. package/dist/create/server-source/crates/feltdb-server/src/versions.rs +264 -0
  150. package/dist/create/server-source/crates/feltdb-wasm/Cargo.toml +31 -0
  151. package/dist/create/server-source/crates/feltdb-wasm/src/lib.rs +1086 -0
  152. package/dist/create/server-source/crates/feltdb-wasm/test.db +0 -0
  153. package/dist/flowspec.d.ts +2 -0
  154. package/dist/flowspec.d.ts.map +1 -1
  155. package/dist/flowspec.js +28 -4
  156. package/dist/state-contract.d.ts +7 -1
  157. package/dist/state-contract.d.ts.map +1 -1
  158. package/dist/studio/components/ApplicationDesigner.d.ts.map +1 -1
  159. package/dist/studio/components/index.js +1 -1
  160. package/dist/studio/{components-q43NSTTH.js → components-bHTARBin.js} +160 -89
  161. package/dist/studio/index.js +31 -28
  162. package/dist/studio-app/assets/{index-DZpBoVMp.js → index-BqKquLuU.js} +8 -8
  163. package/dist/studio-app/index.html +1 -1
  164. package/package.json +1 -1
@@ -0,0 +1,267 @@
1
+ use crate::{FlowError, Result, StoredRow};
2
+ use std::collections::HashMap;
3
+ use std::fs::{self, OpenOptions};
4
+ use std::io::{BufRead, BufReader, Write};
5
+ use std::path::{Path, PathBuf};
6
+
7
+ /// Trait defining the storage abstraction for FeltDB.
8
+ ///
9
+ /// This allows FeltDB to work with different storage backends:
10
+ /// - Memory (for testing)
11
+ /// - Native files (for desktop/server)
12
+ /// - Browser storage (OPFS/IndexedDB via WASM)
13
+ pub trait Storage: Send + Sync {
14
+ /// Append a new operation to the log
15
+ fn append(&mut self, row: &StoredRow) -> Result<()>;
16
+
17
+ /// Read all operations from storage
18
+ fn read_all(&self) -> Result<Vec<StoredRow>>;
19
+
20
+ /// Create a checkpoint of the current state
21
+ fn checkpoint(&mut self, state: &CheckpointData) -> Result<()>;
22
+
23
+ /// Read the latest checkpoint if it exists
24
+ fn read_checkpoint(&self) -> Result<Option<CheckpointData>>;
25
+
26
+ /// Compact the storage by merging checkpoint and delta operations
27
+ fn compact(&mut self) -> Result<()>;
28
+
29
+ /// Get the storage backend type name (for debugging/runtime info)
30
+ fn storage_type(&self) -> &'static str;
31
+ }
32
+
33
+ /// Data structure for checkpoints
34
+ #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
35
+ pub struct CheckpointData {
36
+ /// All rows at checkpoint time
37
+ pub rows: HashMap<String, HashMap<String, StoredRow>>,
38
+ /// Key counters at checkpoint time
39
+ pub key_counters: HashMap<String, u64>,
40
+ /// Operations since last checkpoint
41
+ pub delta_operations: Vec<StoredRow>,
42
+ }
43
+
44
+ /// In-memory storage backend for testing
45
+ pub struct MemoryStorage {
46
+ operations: Vec<StoredRow>,
47
+ checkpoint: Option<CheckpointData>,
48
+ }
49
+
50
+ impl MemoryStorage {
51
+ pub fn new() -> Self {
52
+ Self {
53
+ operations: Vec::new(),
54
+ checkpoint: None,
55
+ }
56
+ }
57
+ }
58
+
59
+ impl Default for MemoryStorage {
60
+ fn default() -> Self {
61
+ Self::new()
62
+ }
63
+ }
64
+
65
+ impl Storage for MemoryStorage {
66
+ fn append(&mut self, row: &StoredRow) -> Result<()> {
67
+ self.operations.push(row.clone());
68
+ Ok(())
69
+ }
70
+
71
+ fn read_all(&self) -> Result<Vec<StoredRow>> {
72
+ Ok(self.operations.clone())
73
+ }
74
+
75
+ fn checkpoint(&mut self, state: &CheckpointData) -> Result<()> {
76
+ self.checkpoint = Some(state.clone());
77
+ self.operations.clear();
78
+ Ok(())
79
+ }
80
+
81
+ fn read_checkpoint(&self) -> Result<Option<CheckpointData>> {
82
+ Ok(self.checkpoint.clone())
83
+ }
84
+
85
+ fn compact(&mut self) -> Result<()> {
86
+ // For in-memory, compaction is just checkpoint + clear deltas
87
+ if let Some(checkpoint) = &self.checkpoint {
88
+ self.operations = checkpoint.delta_operations.clone();
89
+ }
90
+ Ok(())
91
+ }
92
+
93
+ fn storage_type(&self) -> &'static str {
94
+ "memory"
95
+ }
96
+ }
97
+
98
+ /// File-based storage backend for native file operations
99
+ pub struct FileStorage {
100
+ path: PathBuf,
101
+ checkpoint_path: PathBuf,
102
+ }
103
+
104
+ impl FileStorage {
105
+ pub fn new<P: AsRef<Path>>(path: P) -> Result<Self> {
106
+ let path = path.as_ref().to_path_buf();
107
+ if let Some(parent) = path.parent() {
108
+ fs::create_dir_all(parent)?;
109
+ }
110
+ if !path.exists() {
111
+ OpenOptions::new().create(true).append(true).open(&path)?;
112
+ }
113
+
114
+ let checkpoint_path = path.with_extension("checkpoint");
115
+ Ok(Self {
116
+ path,
117
+ checkpoint_path,
118
+ })
119
+ }
120
+ }
121
+
122
+ impl Storage for FileStorage {
123
+ fn append(&mut self, row: &StoredRow) -> Result<()> {
124
+ let mut file = OpenOptions::new()
125
+ .create(true)
126
+ .append(true)
127
+ .open(&self.path)?;
128
+ let mut line = serde_json::to_string(row)?;
129
+ line.push('\n');
130
+ file.write_all(line.as_bytes())?;
131
+ file.flush()?;
132
+ Ok(())
133
+ }
134
+
135
+ fn read_all(&self) -> Result<Vec<StoredRow>> {
136
+ let mut operations = Vec::new();
137
+
138
+ // First, try to read checkpoint if it exists
139
+ if let Ok(checkpoint_data) = self.read_checkpoint() {
140
+ if checkpoint_data.is_some() {
141
+ // Get all rows from checkpoint
142
+ if let Some(cp) = checkpoint_data {
143
+ for bucket in cp.rows.values() {
144
+ for row in bucket.values() {
145
+ operations.push(row.clone());
146
+ }
147
+ }
148
+ // Add delta operations
149
+ operations.extend(cp.delta_operations.clone());
150
+ return Ok(operations);
151
+ }
152
+ }
153
+ }
154
+
155
+ // If no checkpoint, read from main log file
156
+ if self.path.exists() {
157
+ let file = OpenOptions::new().read(true).open(&self.path)?;
158
+ let reader = BufReader::new(file);
159
+
160
+ for line in reader.lines() {
161
+ let line = line?;
162
+ if line.trim().is_empty() {
163
+ continue;
164
+ }
165
+ let row: StoredRow = serde_json::from_str(&line)
166
+ .map_err(|_| FlowError::CorruptLogLine(line.clone()))?;
167
+ operations.push(row);
168
+ }
169
+ }
170
+
171
+ Ok(operations)
172
+ }
173
+
174
+ fn checkpoint(&mut self, state: &CheckpointData) -> Result<()> {
175
+ let checkpoint_json = serde_json::to_string(state)?;
176
+ let mut file = OpenOptions::new()
177
+ .create(true)
178
+ .write(true)
179
+ .truncate(true)
180
+ .open(&self.checkpoint_path)?;
181
+ file.write_all(checkpoint_json.as_bytes())?;
182
+ file.flush()?;
183
+ Ok(())
184
+ }
185
+
186
+ fn read_checkpoint(&self) -> Result<Option<CheckpointData>> {
187
+ if !self.checkpoint_path.exists() {
188
+ return Ok(None);
189
+ }
190
+
191
+ let content = fs::read_to_string(&self.checkpoint_path)?;
192
+ match serde_json::from_str(&content) {
193
+ Ok(data) => Ok(Some(data)),
194
+ Err(_) => Ok(None),
195
+ }
196
+ }
197
+
198
+ fn compact(&mut self) -> Result<()> {
199
+ // Compaction for file storage:
200
+ // 1. Create checkpoint
201
+ // 2. Truncate main log to only contain delta operations
202
+ // 3. On next read, we'll load from checkpoint + deltas
203
+
204
+ // This is handled automatically by read_all() which checks for checkpoint first
205
+ Ok(())
206
+ }
207
+
208
+ fn storage_type(&self) -> &'static str {
209
+ "file"
210
+ }
211
+ }
212
+
213
+ #[cfg(test)]
214
+ mod tests {
215
+ use super::*;
216
+
217
+ #[test]
218
+ fn memory_storage_append_and_read() {
219
+ let mut storage = MemoryStorage::new();
220
+ let row = StoredRow {
221
+ capability: "test".to_string(),
222
+ key: "test:1".to_string(),
223
+ rust_type: "String".to_string(),
224
+ value: serde_json::json!("value"),
225
+ unix_ms: 1000,
226
+ content_hash: None,
227
+ flow_ref: None,
228
+ deleted: false,
229
+ operation: None,
230
+ };
231
+
232
+ storage.append(&row).expect("append should succeed");
233
+ let operations = storage.read_all().expect("read_all should succeed");
234
+ assert_eq!(operations.len(), 1);
235
+ assert_eq!(operations[0].key, "test:1");
236
+ }
237
+
238
+ #[test]
239
+ fn memory_storage_checkpoint() {
240
+ let mut storage = MemoryStorage::new();
241
+ let row = StoredRow {
242
+ capability: "test".to_string(),
243
+ key: "test:1".to_string(),
244
+ rust_type: "String".to_string(),
245
+ value: serde_json::json!("value"),
246
+ unix_ms: 1000,
247
+ content_hash: None,
248
+ flow_ref: None,
249
+ deleted: false,
250
+ operation: None,
251
+ };
252
+
253
+ storage.append(&row).expect("append");
254
+
255
+ let checkpoint = CheckpointData {
256
+ rows: Default::default(),
257
+ key_counters: Default::default(),
258
+ delta_operations: vec![row],
259
+ };
260
+
261
+ storage
262
+ .checkpoint(&checkpoint)
263
+ .expect("checkpoint should succeed");
264
+ let operations = storage.read_all().expect("read_all should succeed");
265
+ assert_eq!(operations.len(), 0); // Cleared after checkpoint
266
+ }
267
+ }