voodoo-store 0.1.0__tar.gz
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.
- voodoo_store-0.1.0/Cargo.lock +325 -0
- voodoo_store-0.1.0/Cargo.toml +16 -0
- voodoo_store-0.1.0/PKG-INFO +302 -0
- voodoo_store-0.1.0/README.md +278 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/Cargo.toml +14 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/examples/application_state.rs +43 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/activation.rs +391 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/atomic.rs +171 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/cdc.rs +402 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/checkpoint.rs +257 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/collection.rs +760 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/compaction.rs +184 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/consumer_group.rs +482 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/cron.rs +229 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/cron_scheduler.rs +429 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/engine.rs +926 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/generation.rs +321 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/header.rs +145 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/jobs.rs +951 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/lib.rs +79 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/log.rs +180 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/messaging.rs +367 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/model.rs +149 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/objects.rs +277 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/operations.rs +221 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/outbox.rs +303 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/query.rs +327 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/queue.rs +537 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/restore.rs +177 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/rpc.rs +439 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/snapshot.rs +123 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/transaction_domains.rs +352 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/transactional.rs +153 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/triggers.rs +544 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/ttl.rs +277 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/src/workflow.rs +1027 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/tests/format_mutation.rs +50 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/tests/process_crash.rs +104 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/tests/recovery_faults.rs +123 -0
- voodoo_store-0.1.0/crates/voodoo-store-core/tests/state_model.rs +108 -0
- voodoo_store-0.1.0/crates/voodoo-store-python/Cargo.toml +16 -0
- voodoo_store-0.1.0/crates/voodoo-store-python/src/lib.rs +419 -0
- voodoo_store-0.1.0/pyproject.toml +36 -0
- voodoo_store-0.1.0/python/voodoo_store/__init__.py +31 -0
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
# This file is automatically @generated by Cargo.
|
|
2
|
+
# It is not intended for manual editing.
|
|
3
|
+
version = 4
|
|
4
|
+
|
|
5
|
+
[[package]]
|
|
6
|
+
name = "block-buffer"
|
|
7
|
+
version = "0.10.4"
|
|
8
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
9
|
+
checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
|
|
10
|
+
dependencies = [
|
|
11
|
+
"generic-array",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
[[package]]
|
|
15
|
+
name = "cfg-if"
|
|
16
|
+
version = "1.0.4"
|
|
17
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
18
|
+
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
|
19
|
+
|
|
20
|
+
[[package]]
|
|
21
|
+
name = "cpufeatures"
|
|
22
|
+
version = "0.2.17"
|
|
23
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
24
|
+
checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
|
|
25
|
+
dependencies = [
|
|
26
|
+
"libc",
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
[[package]]
|
|
30
|
+
name = "crc32fast"
|
|
31
|
+
version = "1.5.2"
|
|
32
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
33
|
+
checksum = "01a7799fd6b852db0e61728dde9a204c423b44d689dbd432522543614b490e78"
|
|
34
|
+
dependencies = [
|
|
35
|
+
"cfg-if",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
[[package]]
|
|
39
|
+
name = "crypto-common"
|
|
40
|
+
version = "0.1.7"
|
|
41
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
42
|
+
checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
|
|
43
|
+
dependencies = [
|
|
44
|
+
"generic-array",
|
|
45
|
+
"typenum",
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
[[package]]
|
|
49
|
+
name = "digest"
|
|
50
|
+
version = "0.10.7"
|
|
51
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
52
|
+
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
|
|
53
|
+
dependencies = [
|
|
54
|
+
"block-buffer",
|
|
55
|
+
"crypto-common",
|
|
56
|
+
]
|
|
57
|
+
|
|
58
|
+
[[package]]
|
|
59
|
+
name = "fs2"
|
|
60
|
+
version = "0.4.3"
|
|
61
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
62
|
+
checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213"
|
|
63
|
+
dependencies = [
|
|
64
|
+
"libc",
|
|
65
|
+
"winapi",
|
|
66
|
+
]
|
|
67
|
+
|
|
68
|
+
[[package]]
|
|
69
|
+
name = "generic-array"
|
|
70
|
+
version = "0.14.7"
|
|
71
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
72
|
+
checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
|
|
73
|
+
dependencies = [
|
|
74
|
+
"typenum",
|
|
75
|
+
"version_check",
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
[[package]]
|
|
79
|
+
name = "getrandom"
|
|
80
|
+
version = "0.4.3"
|
|
81
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
82
|
+
checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
|
|
83
|
+
dependencies = [
|
|
84
|
+
"cfg-if",
|
|
85
|
+
"libc",
|
|
86
|
+
"r-efi",
|
|
87
|
+
]
|
|
88
|
+
|
|
89
|
+
[[package]]
|
|
90
|
+
name = "heck"
|
|
91
|
+
version = "0.5.0"
|
|
92
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
93
|
+
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
|
94
|
+
|
|
95
|
+
[[package]]
|
|
96
|
+
name = "libc"
|
|
97
|
+
version = "0.2.189"
|
|
98
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
99
|
+
checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"
|
|
100
|
+
|
|
101
|
+
[[package]]
|
|
102
|
+
name = "once_cell"
|
|
103
|
+
version = "1.21.4"
|
|
104
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
105
|
+
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
|
|
106
|
+
|
|
107
|
+
[[package]]
|
|
108
|
+
name = "portable-atomic"
|
|
109
|
+
version = "1.15.0"
|
|
110
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
111
|
+
checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85"
|
|
112
|
+
|
|
113
|
+
[[package]]
|
|
114
|
+
name = "proc-macro2"
|
|
115
|
+
version = "1.0.107"
|
|
116
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
117
|
+
checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
|
|
118
|
+
dependencies = [
|
|
119
|
+
"unicode-ident",
|
|
120
|
+
]
|
|
121
|
+
|
|
122
|
+
[[package]]
|
|
123
|
+
name = "pyo3"
|
|
124
|
+
version = "0.28.3"
|
|
125
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
126
|
+
checksum = "91fd8e38a3b50ed1167fb981cd6fd60147e091784c427b8f7183a7ee32c31c12"
|
|
127
|
+
dependencies = [
|
|
128
|
+
"libc",
|
|
129
|
+
"once_cell",
|
|
130
|
+
"portable-atomic",
|
|
131
|
+
"pyo3-build-config",
|
|
132
|
+
"pyo3-ffi",
|
|
133
|
+
"pyo3-macros",
|
|
134
|
+
]
|
|
135
|
+
|
|
136
|
+
[[package]]
|
|
137
|
+
name = "pyo3-build-config"
|
|
138
|
+
version = "0.28.3"
|
|
139
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
140
|
+
checksum = "e368e7ddfdeb98c9bca7f8383be1648fd84ab466bf2bc015e94008db6d35611e"
|
|
141
|
+
dependencies = [
|
|
142
|
+
"target-lexicon",
|
|
143
|
+
]
|
|
144
|
+
|
|
145
|
+
[[package]]
|
|
146
|
+
name = "pyo3-ffi"
|
|
147
|
+
version = "0.28.3"
|
|
148
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
149
|
+
checksum = "7f29e10af80b1f7ccaf7f69eace800a03ecd13e883acfacc1e5d0988605f651e"
|
|
150
|
+
dependencies = [
|
|
151
|
+
"libc",
|
|
152
|
+
"pyo3-build-config",
|
|
153
|
+
]
|
|
154
|
+
|
|
155
|
+
[[package]]
|
|
156
|
+
name = "pyo3-macros"
|
|
157
|
+
version = "0.28.3"
|
|
158
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
159
|
+
checksum = "df6e520eff47c45997d2fc7dd8214b25dd1310918bbb2642156ef66a67f29813"
|
|
160
|
+
dependencies = [
|
|
161
|
+
"proc-macro2",
|
|
162
|
+
"pyo3-macros-backend",
|
|
163
|
+
"quote",
|
|
164
|
+
"syn 2.0.119",
|
|
165
|
+
]
|
|
166
|
+
|
|
167
|
+
[[package]]
|
|
168
|
+
name = "pyo3-macros-backend"
|
|
169
|
+
version = "0.28.3"
|
|
170
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
171
|
+
checksum = "c4cdc218d835738f81c2338f822078af45b4afdf8b2e33cbb5916f108b813acb"
|
|
172
|
+
dependencies = [
|
|
173
|
+
"heck",
|
|
174
|
+
"proc-macro2",
|
|
175
|
+
"pyo3-build-config",
|
|
176
|
+
"quote",
|
|
177
|
+
"syn 2.0.119",
|
|
178
|
+
]
|
|
179
|
+
|
|
180
|
+
[[package]]
|
|
181
|
+
name = "quote"
|
|
182
|
+
version = "1.0.47"
|
|
183
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
184
|
+
checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
|
|
185
|
+
dependencies = [
|
|
186
|
+
"proc-macro2",
|
|
187
|
+
]
|
|
188
|
+
|
|
189
|
+
[[package]]
|
|
190
|
+
name = "r-efi"
|
|
191
|
+
version = "6.0.0"
|
|
192
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
193
|
+
checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
|
|
194
|
+
|
|
195
|
+
[[package]]
|
|
196
|
+
name = "sha2"
|
|
197
|
+
version = "0.10.9"
|
|
198
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
199
|
+
checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
|
|
200
|
+
dependencies = [
|
|
201
|
+
"cfg-if",
|
|
202
|
+
"cpufeatures",
|
|
203
|
+
"digest",
|
|
204
|
+
]
|
|
205
|
+
|
|
206
|
+
[[package]]
|
|
207
|
+
name = "syn"
|
|
208
|
+
version = "2.0.119"
|
|
209
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
210
|
+
checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
|
|
211
|
+
dependencies = [
|
|
212
|
+
"proc-macro2",
|
|
213
|
+
"quote",
|
|
214
|
+
"unicode-ident",
|
|
215
|
+
]
|
|
216
|
+
|
|
217
|
+
[[package]]
|
|
218
|
+
name = "syn"
|
|
219
|
+
version = "3.0.5"
|
|
220
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
221
|
+
checksum = "12df2e0110f65b775f769bb17ef989067a1d931b2eb822bd4346631eeada89f9"
|
|
222
|
+
dependencies = [
|
|
223
|
+
"proc-macro2",
|
|
224
|
+
"quote",
|
|
225
|
+
"unicode-ident",
|
|
226
|
+
]
|
|
227
|
+
|
|
228
|
+
[[package]]
|
|
229
|
+
name = "target-lexicon"
|
|
230
|
+
version = "0.13.5"
|
|
231
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
232
|
+
checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
|
|
233
|
+
|
|
234
|
+
[[package]]
|
|
235
|
+
name = "thiserror"
|
|
236
|
+
version = "2.0.20"
|
|
237
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
238
|
+
checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f"
|
|
239
|
+
dependencies = [
|
|
240
|
+
"thiserror-impl",
|
|
241
|
+
]
|
|
242
|
+
|
|
243
|
+
[[package]]
|
|
244
|
+
name = "thiserror-impl"
|
|
245
|
+
version = "2.0.20"
|
|
246
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
247
|
+
checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af"
|
|
248
|
+
dependencies = [
|
|
249
|
+
"proc-macro2",
|
|
250
|
+
"quote",
|
|
251
|
+
"syn 3.0.5",
|
|
252
|
+
]
|
|
253
|
+
|
|
254
|
+
[[package]]
|
|
255
|
+
name = "typenum"
|
|
256
|
+
version = "1.20.1"
|
|
257
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
258
|
+
checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"
|
|
259
|
+
|
|
260
|
+
[[package]]
|
|
261
|
+
name = "unicode-ident"
|
|
262
|
+
version = "1.0.24"
|
|
263
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
264
|
+
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
|
|
265
|
+
|
|
266
|
+
[[package]]
|
|
267
|
+
name = "version_check"
|
|
268
|
+
version = "0.9.5"
|
|
269
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
270
|
+
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
|
|
271
|
+
|
|
272
|
+
[[package]]
|
|
273
|
+
name = "voodoo-store-cli"
|
|
274
|
+
version = "0.1.0"
|
|
275
|
+
dependencies = [
|
|
276
|
+
"voodoo-store-core",
|
|
277
|
+
]
|
|
278
|
+
|
|
279
|
+
[[package]]
|
|
280
|
+
name = "voodoo-store-core"
|
|
281
|
+
version = "0.1.0"
|
|
282
|
+
dependencies = [
|
|
283
|
+
"crc32fast",
|
|
284
|
+
"fs2",
|
|
285
|
+
"getrandom",
|
|
286
|
+
"sha2",
|
|
287
|
+
"thiserror",
|
|
288
|
+
]
|
|
289
|
+
|
|
290
|
+
[[package]]
|
|
291
|
+
name = "voodoo-store-ffi"
|
|
292
|
+
version = "0.1.0"
|
|
293
|
+
dependencies = [
|
|
294
|
+
"voodoo-store-core",
|
|
295
|
+
]
|
|
296
|
+
|
|
297
|
+
[[package]]
|
|
298
|
+
name = "voodoo-store-python"
|
|
299
|
+
version = "0.1.0"
|
|
300
|
+
dependencies = [
|
|
301
|
+
"pyo3",
|
|
302
|
+
"voodoo-store-core",
|
|
303
|
+
]
|
|
304
|
+
|
|
305
|
+
[[package]]
|
|
306
|
+
name = "winapi"
|
|
307
|
+
version = "0.3.9"
|
|
308
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
309
|
+
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
|
|
310
|
+
dependencies = [
|
|
311
|
+
"winapi-i686-pc-windows-gnu",
|
|
312
|
+
"winapi-x86_64-pc-windows-gnu",
|
|
313
|
+
]
|
|
314
|
+
|
|
315
|
+
[[package]]
|
|
316
|
+
name = "winapi-i686-pc-windows-gnu"
|
|
317
|
+
version = "0.4.0"
|
|
318
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
319
|
+
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
|
320
|
+
|
|
321
|
+
[[package]]
|
|
322
|
+
name = "winapi-x86_64-pc-windows-gnu"
|
|
323
|
+
version = "0.4.0"
|
|
324
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
325
|
+
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
[workspace]
|
|
2
|
+
members = ["crates/voodoo-store-core", "crates/voodoo-store-python"]
|
|
3
|
+
resolver = "2"
|
|
4
|
+
|
|
5
|
+
[workspace.package]
|
|
6
|
+
edition = "2024"
|
|
7
|
+
license = "Apache-2.0"
|
|
8
|
+
repository = "https://github.com/helderperez-dev/voodoo-store"
|
|
9
|
+
rust-version = "1.85"
|
|
10
|
+
|
|
11
|
+
[workspace.dependencies]
|
|
12
|
+
crc32fast = "1.4"
|
|
13
|
+
fs2 = "0.4"
|
|
14
|
+
getrandom = "0.4"
|
|
15
|
+
sha2 = "0.10"
|
|
16
|
+
thiserror = "2"
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: voodoo-store
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Classifier: Development Status :: 3 - Alpha
|
|
5
|
+
Classifier: Intended Audience :: Developers
|
|
6
|
+
Classifier: Programming Language :: Python :: 3
|
|
7
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
8
|
+
Classifier: Programming Language :: Rust
|
|
9
|
+
Classifier: Operating System :: MacOS
|
|
10
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
11
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
12
|
+
Classifier: Topic :: Database
|
|
13
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
14
|
+
Summary: Embedded application state engine for Python, backed by Voodoo Store Rust core
|
|
15
|
+
Keywords: embedded,database,state,runtime,rust
|
|
16
|
+
Author: Helder Perez
|
|
17
|
+
License-Expression: Apache-2.0
|
|
18
|
+
Requires-Python: >=3.9
|
|
19
|
+
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
20
|
+
Project-URL: Homepage, https://github.com/helderperez-dev/voodoo-store
|
|
21
|
+
Project-URL: Issues, https://github.com/helderperez-dev/voodoo-store/issues
|
|
22
|
+
Project-URL: Repository, https://github.com/helderperez-dev/voodoo-store
|
|
23
|
+
|
|
24
|
+
# Voodoo Store
|
|
25
|
+
|
|
26
|
+
> **Application infrastructure in a store.**
|
|
27
|
+
|
|
28
|
+
Voodoo Store is a **standalone, 100% Rust embedded application-state engine** built around one goal:
|
|
29
|
+
|
|
30
|
+
> **A Voodoo application should be able to run robustly with Voodoo + Voodoo Store and no mandatory external infrastructure by default.**
|
|
31
|
+
|
|
32
|
+
It is being built for the Voodoo ecosystem, but the core is not coupled to Voodoo Framework. The engine and `.vstore` format are designed to remain language-neutral and independently usable.
|
|
33
|
+
|
|
34
|
+
**SQLite made the database a file. Voodoo Store aims to make application infrastructure a store.**
|
|
35
|
+
|
|
36
|
+
## Status
|
|
37
|
+
|
|
38
|
+
**v0.1 usable single-node development release.**
|
|
39
|
+
|
|
40
|
+
Voodoo Store is pre-1.0, but it is now suitable for controlled single-node development and production experiments where its current compatibility and operational limits are understood.
|
|
41
|
+
|
|
42
|
+
The current engine includes:
|
|
43
|
+
|
|
44
|
+
- versioned, checksummed `.vstore` files and strong persistent Store identity;
|
|
45
|
+
- checksummed append-only logging, atomic transactions and deterministic crash recovery;
|
|
46
|
+
- Linux/macOS/Windows single-writer locking and explicit durability modes;
|
|
47
|
+
- byte-oriented KV, CAS, counters, prefix scans and TTL;
|
|
48
|
+
- Collections with schema/codec metadata and secondary/unique indexes;
|
|
49
|
+
- durable Queues with leases, delay, priority, retry/NACK, dead state and stale-ACK protection;
|
|
50
|
+
- durable Jobs with 128-bit IDs, idempotency, retry/backoff, deadlines and execution history;
|
|
51
|
+
- one-shot, interval and deterministic UTC Cron scheduling;
|
|
52
|
+
- durable Triggers;
|
|
53
|
+
- Topics, Streams, replay, durable subscriptions and Consumer Groups;
|
|
54
|
+
- durable request/reply correlation and RPC state;
|
|
55
|
+
- transactional Outbox events;
|
|
56
|
+
- content-addressed SHA-256 object storage, deduplication, verification, references and orphan GC;
|
|
57
|
+
- durable Workflow/HITL state with waits, signals, timers and history;
|
|
58
|
+
- verify, backup, create-only restore, logical snapshots and compact-copy;
|
|
59
|
+
- structured health/storage accounting;
|
|
60
|
+
- standalone `voodoo-store` CLI;
|
|
61
|
+
- C ABI v2 foundation with transactions, `last_error` and panic containment;
|
|
62
|
+
- deterministic corruption, torn-write and process-crash testing;
|
|
63
|
+
- CI across Format, Clippy, Linux, macOS, Windows and Rust 1.85 MSRV.
|
|
64
|
+
|
|
65
|
+
This is **not yet a production 1.0**. File/API compatibility should still be considered pre-1.0, and important data should be backed up before upgrading experimental deployments.
|
|
66
|
+
|
|
67
|
+
## Start here
|
|
68
|
+
|
|
69
|
+
Build and test:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
cargo build --workspace
|
|
73
|
+
cargo test --workspace
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Run the executable application-state example:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
cargo run -p voodoo-store-core --example application_state -- application.vstore
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
The example commits application state, a durable Job and an Outbox Event through one transaction:
|
|
83
|
+
|
|
84
|
+
```text
|
|
85
|
+
BEGIN
|
|
86
|
+
PUT order:42:status = paid
|
|
87
|
+
ENQUEUE JOB email.send_receipt(order:42)
|
|
88
|
+
EMIT EVENT order.paid(order:42)
|
|
89
|
+
COMMIT
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
If that transaction does not commit, none of those staged mutations become visible after recovery.
|
|
93
|
+
|
|
94
|
+
See `docs/QUICKSTART.md` for the full walkthrough.
|
|
95
|
+
|
|
96
|
+
## North Star
|
|
97
|
+
|
|
98
|
+
The standard Voodoo deployment is intentionally small:
|
|
99
|
+
|
|
100
|
+
```text
|
|
101
|
+
Application
|
|
102
|
+
|
|
|
103
|
+
+-- Voodoo Runtime
|
|
104
|
+
|
|
|
105
|
+
`-- application.vstore
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
A normal application should not need Redis, PostgreSQL, RabbitMQ, Kafka, Celery, a separate cron service, or a separate local object service merely to get robust application infrastructure.
|
|
109
|
+
|
|
110
|
+
External infrastructure remains available as optional adapters when scale or deployment topology genuinely requires it.
|
|
111
|
+
|
|
112
|
+
## Architecture
|
|
113
|
+
|
|
114
|
+
```text
|
|
115
|
+
Applications / Frameworks
|
|
116
|
+
|
|
|
117
|
+
+-- Voodoo Runtime / Framework
|
|
118
|
+
+-- Rust
|
|
119
|
+
+-- C / native bindings
|
|
120
|
+
+-- future Python / Node / Go / Swift bindings
|
|
121
|
+
|
|
|
122
|
+
Stable APIs / bindings
|
|
123
|
+
|
|
|
124
|
+
voodoo-store-core
|
|
125
|
+
|
|
|
126
|
+
+-- Data: KV / TTL / Collections / Indexes
|
|
127
|
+
+-- Work: Queues / Jobs / Scheduler / Cron / Triggers
|
|
128
|
+
+-- Messaging: Topics / Streams / Consumer Groups / RPC / Outbox
|
|
129
|
+
+-- Objects
|
|
130
|
+
+-- Workflow state
|
|
131
|
+
+-- Operations / health / lifecycle
|
|
132
|
+
|
|
|
133
|
+
Transaction / Commit Layer
|
|
134
|
+
|
|
|
135
|
+
Append-only Checksummed Log
|
|
136
|
+
|
|
|
137
|
+
Recovery / Verification
|
|
138
|
+
|
|
|
139
|
+
Versioned .vstore Header
|
|
140
|
+
|
|
|
141
|
+
Filesystem + File Locking
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
The Store persists durable semantics. Voodoo Runtime executes application code, HTTP handlers, AI inference, external calls and Identity/Auth behavior.
|
|
145
|
+
|
|
146
|
+
## Cross-domain transactions
|
|
147
|
+
|
|
148
|
+
A major Voodoo Store goal is to remove the split-brain normally created by a database plus external work infrastructure.
|
|
149
|
+
|
|
150
|
+
Current typed transaction primitives already allow application state, Jobs, Outbox Events and durable RPC Requests to share a Store transaction.
|
|
151
|
+
|
|
152
|
+
```rust
|
|
153
|
+
use voodoo_store_core::{JobSpec, Store};
|
|
154
|
+
|
|
155
|
+
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
156
|
+
let mut store = Store::open("application.vstore")?;
|
|
157
|
+
|
|
158
|
+
let mut tx = store.begin()?;
|
|
159
|
+
tx.put(b"order:42:status", b"paid")?;
|
|
160
|
+
tx.enqueue_job(JobSpec::new(b"email.send_receipt", b"order:42"), 1_000)?;
|
|
161
|
+
tx.emit_event(b"order.paid", b"order:42", 1_000)?;
|
|
162
|
+
tx.request_rpc(b"payments.capture", b"order:42", 1_000, Some(31_000))?;
|
|
163
|
+
tx.commit()?;
|
|
164
|
+
|
|
165
|
+
Ok(())
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
The public cross-domain transaction surface will continue expanding to additional primitives before 1.0.
|
|
170
|
+
|
|
171
|
+
## Durability
|
|
172
|
+
|
|
173
|
+
```rust
|
|
174
|
+
use voodoo_store_core::{Durability, Store, StoreOptions};
|
|
175
|
+
|
|
176
|
+
let store = Store::open_with_options(
|
|
177
|
+
"application.vstore",
|
|
178
|
+
StoreOptions {
|
|
179
|
+
durability: Durability::Strict,
|
|
180
|
+
repair_torn_tail: true,
|
|
181
|
+
},
|
|
182
|
+
)?;
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
- `Strict` uses `sync_all()` on commit.
|
|
186
|
+
- `Data` uses `sync_data()` on commit and is the default.
|
|
187
|
+
- `Relaxed` relies on later operating-system flushing.
|
|
188
|
+
|
|
189
|
+
Only an incomplete physical tail is automatically repairable. Corruption inside the durable prefix is surfaced as an error rather than silently discarded.
|
|
190
|
+
|
|
191
|
+
## Current good-fit workloads
|
|
192
|
+
|
|
193
|
+
v0.1 is a reasonable target for controlled use in:
|
|
194
|
+
|
|
195
|
+
- Voodoo Runtime development;
|
|
196
|
+
- SaaS/internal-tool prototypes and early deployments;
|
|
197
|
+
- desktop/local-first applications;
|
|
198
|
+
- AI agent and automation state;
|
|
199
|
+
- edge gateways and robotics controllers;
|
|
200
|
+
- single-node APIs that want durable Jobs/Queues without deploying an infrastructure stack.
|
|
201
|
+
|
|
202
|
+
Pin the exact Store version and keep backups for important pre-1.0 stores.
|
|
203
|
+
|
|
204
|
+
## Known pre-1.0 limits
|
|
205
|
+
|
|
206
|
+
The main remaining work before a 1.0 claim includes:
|
|
207
|
+
|
|
208
|
+
- continuous fuzzing and long-running durability soak tests;
|
|
209
|
+
- identity-preserving checkpoints/log generations and atomic in-place compaction;
|
|
210
|
+
- richer Collection query/range/composite-index support;
|
|
211
|
+
- CDC, change feeds and live-query/watch APIs;
|
|
212
|
+
- complete cross-domain transaction coverage for all Store primitives;
|
|
213
|
+
- quotas, richer metrics and tracing;
|
|
214
|
+
- streaming object I/O and lifecycle policies;
|
|
215
|
+
- complete C ABI coverage and first-class language bindings;
|
|
216
|
+
- encryption-at-rest/key-rotation design;
|
|
217
|
+
- later replication/sync and Voodoo Protocol integration.
|
|
218
|
+
|
|
219
|
+
Store Studio and distributed operation are later milestones and do not block controlled single-node use.
|
|
220
|
+
|
|
221
|
+
## CLI
|
|
222
|
+
|
|
223
|
+
The workspace includes the standalone `voodoo-store` binary. Examples:
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
cargo run -p voodoo-store-cli -- put application.vstore hello world
|
|
227
|
+
cargo run -p voodoo-store-cli -- get application.vstore hello
|
|
228
|
+
cargo run -p voodoo-store-cli -- health application.vstore
|
|
229
|
+
cargo run -p voodoo-store-cli -- verify application.vstore
|
|
230
|
+
cargo run -p voodoo-store-cli -- backup application.vstore application.backup.vstore
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
The CLI also exposes lifecycle, Queue, Collection, Messaging, Object, Job, Scheduler, Cron, Trigger and Workflow operations. See `docs/QUICKSTART.md` for usage guidance.
|
|
234
|
+
|
|
235
|
+
## C ABI
|
|
236
|
+
|
|
237
|
+
`voodoo-store-ffi` is the portability foundation for non-Rust bindings. The current ABI includes Store handles, KV operations, buffered transactions, thread-local `last_error` reporting and panic containment. Higher-level primitive coverage is still expanding before the ABI is considered complete.
|
|
238
|
+
|
|
239
|
+
Public header:
|
|
240
|
+
|
|
241
|
+
```text
|
|
242
|
+
include/voodoo_store.h
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## Workspace
|
|
246
|
+
|
|
247
|
+
```text
|
|
248
|
+
crates/
|
|
249
|
+
voodoo-store-core/ # correctness-critical embedded engine
|
|
250
|
+
voodoo-store-ffi/ # C ABI portability layer
|
|
251
|
+
voodoo-store-cli/ # standalone inspection and operation CLI
|
|
252
|
+
|
|
253
|
+
include/
|
|
254
|
+
voodoo_store.h
|
|
255
|
+
|
|
256
|
+
docs/
|
|
257
|
+
ARCHITECTURE.md
|
|
258
|
+
SPEC.md
|
|
259
|
+
INVARIANTS.md
|
|
260
|
+
ROADMAP.md
|
|
261
|
+
QUICKSTART.md
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
## Voodoo integration
|
|
265
|
+
|
|
266
|
+
Voodoo Framework/Runtime will consume Store behind higher-level primitives while the engine stays independently usable.
|
|
267
|
+
|
|
268
|
+
```text
|
|
269
|
+
Voodoo Model -> Store Collections / data
|
|
270
|
+
Voodoo @task -> Store Jobs / Queues
|
|
271
|
+
Voodoo Scheduler -> Store schedules / Cron
|
|
272
|
+
Voodoo events -> Store Topics / Streams / Outbox
|
|
273
|
+
Voodoo ObjectStore -> Store Objects
|
|
274
|
+
Execution / HITL -> Store Workflow state
|
|
275
|
+
Runtime Identity -> durable state persisted through Store
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
Identity/Auth semantics remain in Voodoo Runtime, not in Voodoo Store.
|
|
279
|
+
|
|
280
|
+
## Compatibility principle
|
|
281
|
+
|
|
282
|
+
The lowest-level durable contract is bytes. Voodoo Store does not persist host-specific Python pickle, Java serialization, V8 objects or Go gob as its core format. Typed codecs and schemas are layered above the engine so a compatible Store can be accessed from multiple runtimes.
|
|
283
|
+
|
|
284
|
+
## Development principle
|
|
285
|
+
|
|
286
|
+
Correctness comes before feature count and benchmarks:
|
|
287
|
+
|
|
288
|
+
```text
|
|
289
|
+
SPEC
|
|
290
|
+
-> INVARIANTS
|
|
291
|
+
-> IMPLEMENTATION
|
|
292
|
+
-> TESTS
|
|
293
|
+
-> FAULT INJECTION
|
|
294
|
+
-> FUZZING
|
|
295
|
+
-> BENCHMARKS
|
|
296
|
+
-> OPTIMIZATION
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
## License
|
|
300
|
+
|
|
301
|
+
Apache-2.0
|
|
302
|
+
|