@lix-js/sdk 0.6.0-preview.1 → 0.6.0-preview.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/SKILL.md +305 -320
  2. package/dist/engine-wasm/wasm/lix_engine.d.ts +5 -0
  3. package/dist/engine-wasm/wasm/lix_engine.js +9 -13
  4. package/dist/engine-wasm/wasm/lix_engine.wasm +0 -0
  5. package/dist/engine-wasm/wasm/lix_engine.wasm.d.ts +1 -0
  6. package/dist/open-lix.d.ts +103 -14
  7. package/dist/open-lix.js +3 -0
  8. package/dist/sqlite/index.js +99 -22
  9. package/dist-engine-src/README.md +18 -0
  10. package/dist-engine-src/src/backend/kv.rs +358 -0
  11. package/dist-engine-src/src/backend/mod.rs +12 -0
  12. package/dist-engine-src/src/backend/testing.rs +658 -0
  13. package/dist-engine-src/src/backend/types.rs +96 -0
  14. package/dist-engine-src/src/binary_cas/chunking.rs +31 -0
  15. package/dist-engine-src/src/binary_cas/codec.rs +346 -0
  16. package/dist-engine-src/src/binary_cas/context.rs +139 -0
  17. package/dist-engine-src/src/binary_cas/kv.rs +1063 -0
  18. package/dist-engine-src/src/binary_cas/mod.rs +11 -0
  19. package/dist-engine-src/src/binary_cas/types.rs +127 -0
  20. package/dist-engine-src/src/cel/context.rs +86 -0
  21. package/dist-engine-src/src/cel/error.rs +19 -0
  22. package/dist-engine-src/src/cel/mod.rs +8 -0
  23. package/dist-engine-src/src/cel/provider.rs +9 -0
  24. package/dist-engine-src/src/cel/runtime.rs +167 -0
  25. package/dist-engine-src/src/cel/value.rs +50 -0
  26. package/dist-engine-src/src/changelog/codec.rs +321 -0
  27. package/dist-engine-src/src/changelog/context.rs +92 -0
  28. package/dist-engine-src/src/changelog/materialization.rs +121 -0
  29. package/dist-engine-src/src/changelog/mod.rs +13 -0
  30. package/dist-engine-src/src/changelog/reader.rs +20 -0
  31. package/dist-engine-src/src/changelog/storage.rs +220 -0
  32. package/dist-engine-src/src/changelog/types.rs +38 -0
  33. package/dist-engine-src/src/commit_graph/context.rs +1588 -0
  34. package/dist-engine-src/src/commit_graph/mod.rs +12 -0
  35. package/dist-engine-src/src/commit_graph/types.rs +145 -0
  36. package/dist-engine-src/src/commit_graph/walker.rs +780 -0
  37. package/dist-engine-src/src/common/error.rs +313 -0
  38. package/dist-engine-src/src/common/fingerprint.rs +3 -0
  39. package/dist-engine-src/src/common/fs_path.rs +1336 -0
  40. package/dist-engine-src/src/common/identity.rs +135 -0
  41. package/dist-engine-src/src/common/metadata.rs +35 -0
  42. package/dist-engine-src/src/common/mod.rs +23 -0
  43. package/dist-engine-src/src/common/types.rs +105 -0
  44. package/dist-engine-src/src/common/wire.rs +222 -0
  45. package/dist-engine-src/src/engine.rs +239 -0
  46. package/dist-engine-src/src/entity_identity.rs +285 -0
  47. package/dist-engine-src/src/functions/context.rs +327 -0
  48. package/dist-engine-src/src/functions/deterministic.rs +113 -0
  49. package/dist-engine-src/src/functions/mod.rs +18 -0
  50. package/dist-engine-src/src/functions/provider.rs +130 -0
  51. package/dist-engine-src/src/functions/state.rs +363 -0
  52. package/dist-engine-src/src/functions/types.rs +37 -0
  53. package/dist-engine-src/src/init.rs +505 -0
  54. package/dist-engine-src/src/json_store/compression.rs +77 -0
  55. package/dist-engine-src/src/json_store/context.rs +129 -0
  56. package/dist-engine-src/src/json_store/encoded.rs +15 -0
  57. package/dist-engine-src/src/json_store/mod.rs +9 -0
  58. package/dist-engine-src/src/json_store/store.rs +236 -0
  59. package/dist-engine-src/src/json_store/types.rs +52 -0
  60. package/dist-engine-src/src/lib.rs +61 -0
  61. package/dist-engine-src/src/live_state/context.rs +2241 -0
  62. package/dist-engine-src/src/live_state/mod.rs +15 -0
  63. package/dist-engine-src/src/live_state/overlay.rs +75 -0
  64. package/dist-engine-src/src/live_state/reader.rs +23 -0
  65. package/dist-engine-src/src/live_state/types.rs +239 -0
  66. package/dist-engine-src/src/live_state/visibility.rs +218 -0
  67. package/dist-engine-src/src/plugin/archive.rs +441 -0
  68. package/dist-engine-src/src/plugin/component.rs +183 -0
  69. package/dist-engine-src/src/plugin/install.rs +637 -0
  70. package/dist-engine-src/src/plugin/manifest.rs +516 -0
  71. package/dist-engine-src/src/plugin/materializer.rs +477 -0
  72. package/dist-engine-src/src/plugin/mod.rs +33 -0
  73. package/dist-engine-src/src/plugin/plugin_manifest.json +119 -0
  74. package/dist-engine-src/src/plugin/storage.rs +74 -0
  75. package/dist-engine-src/src/schema/annotations/defaults.rs +280 -0
  76. package/dist-engine-src/src/schema/annotations/mod.rs +1 -0
  77. package/dist-engine-src/src/schema/builtin/lix_account.json +22 -0
  78. package/dist-engine-src/src/schema/builtin/lix_active_account.json +30 -0
  79. package/dist-engine-src/src/schema/builtin/lix_binary_blob_ref.json +30 -0
  80. package/dist-engine-src/src/schema/builtin/lix_change.json +62 -0
  81. package/dist-engine-src/src/schema/builtin/lix_change_author.json +46 -0
  82. package/dist-engine-src/src/schema/builtin/lix_change_set.json +18 -0
  83. package/dist-engine-src/src/schema/builtin/lix_change_set_element.json +75 -0
  84. package/dist-engine-src/src/schema/builtin/lix_commit.json +62 -0
  85. package/dist-engine-src/src/schema/builtin/lix_commit_edge.json +46 -0
  86. package/dist-engine-src/src/schema/builtin/lix_directory_descriptor.json +53 -0
  87. package/dist-engine-src/src/schema/builtin/lix_entity_label.json +63 -0
  88. package/dist-engine-src/src/schema/builtin/lix_file_descriptor.json +53 -0
  89. package/dist-engine-src/src/schema/builtin/lix_key_value.json +41 -0
  90. package/dist-engine-src/src/schema/builtin/lix_label.json +22 -0
  91. package/dist-engine-src/src/schema/builtin/lix_registered_schema.json +31 -0
  92. package/dist-engine-src/src/schema/builtin/lix_version_descriptor.json +35 -0
  93. package/dist-engine-src/src/schema/builtin/lix_version_ref.json +49 -0
  94. package/dist-engine-src/src/schema/builtin/mod.rs +271 -0
  95. package/dist-engine-src/src/schema/definition.json +157 -0
  96. package/dist-engine-src/src/schema/definition.rs +636 -0
  97. package/dist-engine-src/src/schema/key.rs +206 -0
  98. package/dist-engine-src/src/schema/mod.rs +20 -0
  99. package/dist-engine-src/src/schema/seed.rs +14 -0
  100. package/dist-engine-src/src/schema/tests.rs +739 -0
  101. package/dist-engine-src/src/schema_registry.rs +294 -0
  102. package/dist-engine-src/src/session/context.rs +366 -0
  103. package/dist-engine-src/src/session/create_version.rs +80 -0
  104. package/dist-engine-src/src/session/execute.rs +447 -0
  105. package/dist-engine-src/src/session/merge/analysis.rs +102 -0
  106. package/dist-engine-src/src/session/merge/apply.rs +23 -0
  107. package/dist-engine-src/src/session/merge/conflicts.rs +62 -0
  108. package/dist-engine-src/src/session/merge/mod.rs +11 -0
  109. package/dist-engine-src/src/session/merge/stats.rs +65 -0
  110. package/dist-engine-src/src/session/merge/version.rs +437 -0
  111. package/dist-engine-src/src/session/mod.rs +25 -0
  112. package/dist-engine-src/src/session/switch_version.rs +121 -0
  113. package/dist-engine-src/src/sql2/change_provider.rs +337 -0
  114. package/dist-engine-src/src/sql2/classify.rs +147 -0
  115. package/dist-engine-src/src/sql2/commit_derived_provider.rs +591 -0
  116. package/dist-engine-src/src/sql2/context.rs +307 -0
  117. package/dist-engine-src/src/sql2/directory_history_provider.rs +623 -0
  118. package/dist-engine-src/src/sql2/directory_provider.rs +2405 -0
  119. package/dist-engine-src/src/sql2/dml.rs +148 -0
  120. package/dist-engine-src/src/sql2/entity_history_provider.rs +444 -0
  121. package/dist-engine-src/src/sql2/entity_provider.rs +2700 -0
  122. package/dist-engine-src/src/sql2/error.rs +196 -0
  123. package/dist-engine-src/src/sql2/execute.rs +3379 -0
  124. package/dist-engine-src/src/sql2/file_history_provider.rs +902 -0
  125. package/dist-engine-src/src/sql2/file_provider.rs +3254 -0
  126. package/dist-engine-src/src/sql2/filesystem_planner.rs +1526 -0
  127. package/dist-engine-src/src/sql2/filesystem_predicates.rs +159 -0
  128. package/dist-engine-src/src/sql2/filesystem_visibility.rs +369 -0
  129. package/dist-engine-src/src/sql2/history_projection.rs +80 -0
  130. package/dist-engine-src/src/sql2/history_provider.rs +418 -0
  131. package/dist-engine-src/src/sql2/history_route.rs +643 -0
  132. package/dist-engine-src/src/sql2/lix_state_provider.rs +2430 -0
  133. package/dist-engine-src/src/sql2/mod.rs +43 -0
  134. package/dist-engine-src/src/sql2/read_only.rs +65 -0
  135. package/dist-engine-src/src/sql2/record_batch.rs +17 -0
  136. package/dist-engine-src/src/sql2/result_metadata.rs +29 -0
  137. package/dist-engine-src/src/sql2/runtime.rs +60 -0
  138. package/dist-engine-src/src/sql2/session.rs +135 -0
  139. package/dist-engine-src/src/sql2/udfs/common.rs +295 -0
  140. package/dist-engine-src/src/sql2/udfs/lix_active_version_commit_id.rs +53 -0
  141. package/dist-engine-src/src/sql2/udfs/lix_empty_blob.rs +47 -0
  142. package/dist-engine-src/src/sql2/udfs/lix_json.rs +100 -0
  143. package/dist-engine-src/src/sql2/udfs/lix_json_get.rs +99 -0
  144. package/dist-engine-src/src/sql2/udfs/lix_json_get_text.rs +99 -0
  145. package/dist-engine-src/src/sql2/udfs/lix_text_decode.rs +82 -0
  146. package/dist-engine-src/src/sql2/udfs/lix_text_encode.rs +85 -0
  147. package/dist-engine-src/src/sql2/udfs/lix_uuid_v7.rs +76 -0
  148. package/dist-engine-src/src/sql2/udfs/mod.rs +82 -0
  149. package/dist-engine-src/src/sql2/version_provider.rs +1187 -0
  150. package/dist-engine-src/src/sql2/version_scope.rs +394 -0
  151. package/dist-engine-src/src/sql2/write_normalization.rs +345 -0
  152. package/dist-engine-src/src/storage/context.rs +356 -0
  153. package/dist-engine-src/src/storage/mod.rs +14 -0
  154. package/dist-engine-src/src/storage/read_scope.rs +88 -0
  155. package/dist-engine-src/src/storage/types.rs +501 -0
  156. package/dist-engine-src/src/storage_bench.rs +3406 -0
  157. package/dist-engine-src/src/test_support.rs +81 -0
  158. package/dist-engine-src/src/tracked_state/by_file_index.rs +102 -0
  159. package/dist-engine-src/src/tracked_state/codec.rs +747 -0
  160. package/dist-engine-src/src/tracked_state/context.rs +983 -0
  161. package/dist-engine-src/src/tracked_state/diff.rs +494 -0
  162. package/dist-engine-src/src/tracked_state/materialization.rs +141 -0
  163. package/dist-engine-src/src/tracked_state/merge.rs +474 -0
  164. package/dist-engine-src/src/tracked_state/mod.rs +31 -0
  165. package/dist-engine-src/src/tracked_state/rebuild.rs +771 -0
  166. package/dist-engine-src/src/tracked_state/storage.rs +243 -0
  167. package/dist-engine-src/src/tracked_state/tree.rs +2744 -0
  168. package/dist-engine-src/src/tracked_state/tree_types.rs +176 -0
  169. package/dist-engine-src/src/tracked_state/types.rs +61 -0
  170. package/dist-engine-src/src/transaction/commit.rs +1224 -0
  171. package/dist-engine-src/src/transaction/context.rs +1307 -0
  172. package/dist-engine-src/src/transaction/live_state_overlay.rs +34 -0
  173. package/dist-engine-src/src/transaction/mod.rs +11 -0
  174. package/dist-engine-src/src/transaction/normalization.rs +1026 -0
  175. package/dist-engine-src/src/transaction/schema_resolver.rs +127 -0
  176. package/dist-engine-src/src/transaction/staging.rs +1436 -0
  177. package/dist-engine-src/src/transaction/types.rs +351 -0
  178. package/dist-engine-src/src/transaction/validation.rs +4811 -0
  179. package/dist-engine-src/src/untracked_state/codec.rs +363 -0
  180. package/dist-engine-src/src/untracked_state/context.rs +82 -0
  181. package/dist-engine-src/src/untracked_state/materialization.rs +157 -0
  182. package/dist-engine-src/src/untracked_state/mod.rs +17 -0
  183. package/dist-engine-src/src/untracked_state/storage.rs +348 -0
  184. package/dist-engine-src/src/untracked_state/types.rs +96 -0
  185. package/dist-engine-src/src/version/context.rs +52 -0
  186. package/dist-engine-src/src/version/mod.rs +12 -0
  187. package/dist-engine-src/src/version/refs.rs +421 -0
  188. package/dist-engine-src/src/version/stage_rows.rs +71 -0
  189. package/dist-engine-src/src/version/types.rs +21 -0
  190. package/dist-engine-src/src/wasm/mod.rs +60 -0
  191. package/package.json +68 -64
@@ -0,0 +1,15 @@
1
+ use crate::json_store::types::JsonRef;
2
+ use std::borrow::Cow;
3
+
4
+ #[derive(Debug, Clone, Copy, PartialEq, Eq)]
5
+ pub(super) enum JsonCodec {
6
+ Raw,
7
+ Zstd,
8
+ }
9
+
10
+ pub(super) struct EncodedJson<'a> {
11
+ pub(super) json_ref: JsonRef,
12
+ pub(super) codec: JsonCodec,
13
+ pub(super) uncompressed_len: usize,
14
+ pub(super) data: Cow<'a, [u8]>,
15
+ }
@@ -0,0 +1,9 @@
1
+ pub(crate) mod compression;
2
+ pub(crate) mod context;
3
+ mod encoded;
4
+ pub(crate) mod store;
5
+ pub(crate) mod types;
6
+
7
+ #[allow(unused_imports)]
8
+ pub(crate) use context::{JsonStoreContext, JsonStoreReader, JsonStoreWriter};
9
+ pub(crate) use types::JsonRef;
@@ -0,0 +1,236 @@
1
+ use crate::json_store::compression::{compress_json_payload, decode_json_zstd_payload};
2
+ use crate::json_store::encoded::{EncodedJson, JsonCodec};
3
+ use crate::json_store::types::JsonRef;
4
+ use crate::storage::{KvGetGroup, KvGetRequest, StorageReader};
5
+ use crate::LixError;
6
+ use std::borrow::Cow;
7
+
8
+ pub(crate) const JSON_NAMESPACE: &str = "json_store.json";
9
+ const STORED_JSON_MAGIC: &[u8] = b"lix-json:v1";
10
+ const STORED_JSON_HEADER_LEN: usize = STORED_JSON_MAGIC.len() + 1 + 8;
11
+ const ZSTD_MIN_JSON_BYTES: usize = 16 * 1024;
12
+ const MIN_ZSTD_SAVINGS_BYTES: usize = 128;
13
+
14
+ struct StoredJsonPayload<'a> {
15
+ codec: JsonCodec,
16
+ uncompressed_len: usize,
17
+ data: &'a [u8],
18
+ }
19
+
20
+ fn raw_json_ref_for_content(json: &str) -> JsonRef {
21
+ JsonRef::from_hash(blake3::hash(json.as_bytes()))
22
+ }
23
+
24
+ #[cfg(test)]
25
+ fn encode_json(json: &str) -> Result<EncodedJson<'_>, LixError> {
26
+ encode_json_for_storage(json)
27
+ }
28
+
29
+ fn encode_json_for_storage(json: &str) -> Result<EncodedJson<'_>, LixError> {
30
+ let raw_ref = raw_json_ref_for_content(json);
31
+ encode_json_for_storage_with_ref(json, raw_ref)
32
+ }
33
+
34
+ fn encode_json_for_storage_with_ref(
35
+ json: &str,
36
+ raw_ref: JsonRef,
37
+ ) -> Result<EncodedJson<'_>, LixError> {
38
+ let raw_data = json.as_bytes();
39
+
40
+ if raw_data.len() >= ZSTD_MIN_JSON_BYTES {
41
+ let compressed = compress_json_payload(raw_data)?;
42
+ if raw_data.len().saturating_sub(compressed.len()) >= MIN_ZSTD_SAVINGS_BYTES {
43
+ return Ok(EncodedJson {
44
+ json_ref: raw_ref,
45
+ codec: JsonCodec::Zstd,
46
+ uncompressed_len: json.len(),
47
+ data: Cow::Owned(compressed),
48
+ });
49
+ }
50
+ }
51
+
52
+ Ok(EncodedJson {
53
+ json_ref: raw_ref,
54
+ codec: JsonCodec::Raw,
55
+ uncompressed_len: json.len(),
56
+ data: Cow::Borrowed(raw_data),
57
+ })
58
+ }
59
+
60
+ pub(crate) fn encode_json_bytes_for_storage(bytes: &[u8]) -> Result<(JsonRef, Vec<u8>), LixError> {
61
+ let json = std::str::from_utf8(bytes).map_err(|error| {
62
+ LixError::new(
63
+ "LIX_ERROR_UNKNOWN",
64
+ format!("json bytes are invalid UTF-8: {error}"),
65
+ )
66
+ })?;
67
+ let json_ref = JsonRef::from_hash(blake3::hash(bytes));
68
+ encode_json_str_for_storage_with_ref(json, json_ref)
69
+ }
70
+
71
+ pub(crate) fn encode_json_str_for_storage_with_ref(
72
+ json: &str,
73
+ json_ref: JsonRef,
74
+ ) -> Result<(JsonRef, Vec<u8>), LixError> {
75
+ let encoded_json = encode_json_for_storage_with_ref(json, json_ref)?;
76
+ let json_ref = encoded_json.json_ref.clone();
77
+ Ok((json_ref, encode_stored_json_payload(&encoded_json)))
78
+ }
79
+
80
+ pub(crate) async fn load_json_bytes(
81
+ store: &mut impl StorageReader,
82
+ json_ref: &JsonRef,
83
+ ) -> Result<Option<Vec<u8>>, LixError> {
84
+ let result = store
85
+ .get_values(KvGetRequest {
86
+ groups: vec![KvGetGroup {
87
+ namespace: JSON_NAMESPACE.to_string(),
88
+ keys: vec![json_ref.as_hash_bytes().to_vec()],
89
+ }],
90
+ })
91
+ .await?
92
+ .groups
93
+ .into_iter()
94
+ .next()
95
+ .and_then(|group| group.single_value_owned());
96
+ let Some(bytes) = result else {
97
+ return Ok(None);
98
+ };
99
+ let stored_payload = decode_stored_json_payload(&bytes)?;
100
+ decode_json_payload(store, json_ref, stored_payload)
101
+ .await
102
+ .map(Some)
103
+ }
104
+
105
+ fn encode_stored_json_payload(encoded_json: &EncodedJson<'_>) -> Vec<u8> {
106
+ let mut out = Vec::with_capacity(STORED_JSON_HEADER_LEN + encoded_json.data.as_ref().len());
107
+ out.extend_from_slice(STORED_JSON_MAGIC);
108
+ out.push(json_codec_byte(encoded_json.codec));
109
+ out.extend_from_slice(&(encoded_json.uncompressed_len as u64).to_be_bytes());
110
+ out.extend_from_slice(encoded_json.data.as_ref());
111
+ out
112
+ }
113
+
114
+ fn decode_stored_json_payload(bytes: &[u8]) -> Result<StoredJsonPayload<'_>, LixError> {
115
+ if bytes.len() < STORED_JSON_HEADER_LEN {
116
+ return Err(LixError::new(
117
+ "LIX_ERROR_UNKNOWN",
118
+ "stored JSON payload is truncated",
119
+ ));
120
+ }
121
+ if &bytes[..STORED_JSON_MAGIC.len()] != STORED_JSON_MAGIC {
122
+ return Err(LixError::new(
123
+ "LIX_ERROR_UNKNOWN",
124
+ "stored JSON payload has invalid header",
125
+ ));
126
+ }
127
+ let codec = read_json_codec(bytes[STORED_JSON_MAGIC.len()])?;
128
+ let len_start = STORED_JSON_MAGIC.len() + 1;
129
+ let len_end = len_start + 8;
130
+ let uncompressed_len = u64::from_be_bytes(
131
+ bytes[len_start..len_end]
132
+ .try_into()
133
+ .expect("stored JSON length header is fixed size"),
134
+ ) as usize;
135
+ Ok(StoredJsonPayload {
136
+ codec,
137
+ uncompressed_len,
138
+ data: &bytes[len_end..],
139
+ })
140
+ }
141
+
142
+ fn json_codec_byte(codec: JsonCodec) -> u8 {
143
+ match codec {
144
+ JsonCodec::Raw => 0,
145
+ JsonCodec::Zstd => 1,
146
+ }
147
+ }
148
+
149
+ fn read_json_codec(byte: u8) -> Result<JsonCodec, LixError> {
150
+ match byte {
151
+ 0 => Ok(JsonCodec::Raw),
152
+ 1 => Ok(JsonCodec::Zstd),
153
+ _ => Err(LixError::new(
154
+ "LIX_ERROR_UNKNOWN",
155
+ format!("stored JSON payload has unknown codec byte {byte}"),
156
+ )),
157
+ }
158
+ }
159
+
160
+ async fn decode_json_payload(
161
+ _store: &mut impl StorageReader,
162
+ json_ref: &JsonRef,
163
+ stored_payload: StoredJsonPayload<'_>,
164
+ ) -> Result<Vec<u8>, LixError> {
165
+ let data = match stored_payload.codec {
166
+ JsonCodec::Raw => Ok(stored_payload.data.to_vec()),
167
+ JsonCodec::Zstd => decode_json_zstd_payload(
168
+ stored_payload.data,
169
+ stored_payload.uncompressed_len,
170
+ &json_ref.to_hex(),
171
+ ),
172
+ }?;
173
+ if data.len() != stored_payload.uncompressed_len {
174
+ return Err(LixError::new(
175
+ "LIX_ERROR_UNKNOWN",
176
+ format!(
177
+ "json ref '{}' decoded to {} bytes, expected {}",
178
+ json_ref.to_hex(),
179
+ data.len(),
180
+ stored_payload.uncompressed_len
181
+ ),
182
+ ));
183
+ }
184
+ let actual_hash = blake3::hash(&data);
185
+ if actual_hash.as_bytes() != json_ref.as_hash_bytes() {
186
+ return Err(LixError::new(
187
+ "LIX_ERROR_UNKNOWN",
188
+ format!("json ref '{}' hash mismatch", json_ref.to_hex()),
189
+ ));
190
+ }
191
+ Ok(data)
192
+ }
193
+
194
+ #[cfg(test)]
195
+ mod tests {
196
+ use std::sync::Arc;
197
+
198
+ use super::*;
199
+ use crate::backend::testing::UnitTestBackend;
200
+ use crate::storage::{StorageContext, StorageWriteSet};
201
+
202
+ #[tokio::test]
203
+ async fn json_roundtrips_raw_payload() {
204
+ let storage = StorageContext::new(Arc::new(UnitTestBackend::new()));
205
+ let json = "{\"value\":\"small\"}";
206
+ let encoded = encode_json(json).expect("json should encode");
207
+ assert_eq!(encoded.codec, JsonCodec::Raw);
208
+
209
+ let mut transaction = storage
210
+ .begin_write_transaction()
211
+ .await
212
+ .expect("transaction should open");
213
+ let mut writes = StorageWriteSet::new();
214
+ writes.put(
215
+ JSON_NAMESPACE,
216
+ encoded.json_ref.as_hash_bytes().to_vec(),
217
+ encode_stored_json_payload(&encoded),
218
+ );
219
+ writes
220
+ .apply(&mut transaction.as_mut())
221
+ .await
222
+ .expect("json should store");
223
+ transaction
224
+ .commit()
225
+ .await
226
+ .expect("transaction should commit");
227
+
228
+ let mut store = storage.clone();
229
+ assert_eq!(
230
+ load_json_bytes(&mut store, &encoded.json_ref)
231
+ .await
232
+ .expect("json should load"),
233
+ Some(json.as_bytes().to_vec())
234
+ );
235
+ }
236
+ }
@@ -0,0 +1,52 @@
1
+ #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
2
+ pub(crate) struct JsonRef {
3
+ hash: [u8; 32],
4
+ }
5
+
6
+ impl JsonRef {
7
+ pub(crate) fn from_hash(hash: blake3::Hash) -> Self {
8
+ Self {
9
+ hash: *hash.as_bytes(),
10
+ }
11
+ }
12
+
13
+ pub(crate) fn from_hash_bytes(hash: [u8; 32]) -> Self {
14
+ Self { hash }
15
+ }
16
+
17
+ pub(crate) fn as_hash_bytes(&self) -> &[u8] {
18
+ &self.hash
19
+ }
20
+
21
+ pub(crate) fn to_hex(&self) -> String {
22
+ self.hash.iter().map(|byte| format!("{byte:02x}")).collect()
23
+ }
24
+ }
25
+
26
+ #[derive(Debug, Clone, PartialEq, Eq)]
27
+ pub(crate) struct JsonProjectionPath(String);
28
+
29
+ impl JsonProjectionPath {
30
+ pub(crate) fn new(pointer: impl Into<String>) -> Self {
31
+ Self(pointer.into())
32
+ }
33
+
34
+ pub(crate) fn as_str(&self) -> &str {
35
+ &self.0
36
+ }
37
+ }
38
+
39
+ #[derive(Debug, Clone, PartialEq)]
40
+ pub(crate) struct JsonProjection {
41
+ values: Vec<Option<serde_json::Value>>,
42
+ }
43
+
44
+ impl JsonProjection {
45
+ pub(crate) fn new(values: Vec<Option<serde_json::Value>>) -> Self {
46
+ Self { values }
47
+ }
48
+
49
+ pub(crate) fn values(&self) -> &[Option<serde_json::Value>] {
50
+ &self.values
51
+ }
52
+ }
@@ -0,0 +1,61 @@
1
+ mod backend;
2
+ mod binary_cas;
3
+ pub(crate) mod cel;
4
+ pub(crate) mod changelog;
5
+ pub(crate) mod commit_graph;
6
+ mod common;
7
+ pub mod engine;
8
+ pub(crate) mod entity_identity;
9
+ pub(crate) mod functions;
10
+ pub(crate) mod init;
11
+ #[allow(dead_code)]
12
+ pub(crate) mod json_store;
13
+ pub(crate) mod live_state;
14
+ mod schema;
15
+ pub(crate) mod schema_registry;
16
+ pub mod session;
17
+ pub(crate) mod sql2;
18
+ #[allow(dead_code, unused_imports)]
19
+ pub(crate) mod storage;
20
+ #[cfg(feature = "storage-benches")]
21
+ pub mod storage_bench;
22
+ #[cfg(test)]
23
+ pub(crate) mod test_support;
24
+ pub(crate) mod tracked_state;
25
+ pub mod transaction;
26
+ pub(crate) mod untracked_state;
27
+ pub(crate) mod version;
28
+ pub mod wasm;
29
+
30
+ pub use schema::{
31
+ lix_schema_definition, lix_schema_definition_json, validate_lix_schema,
32
+ validate_lix_schema_definition,
33
+ };
34
+
35
+ pub use backend::{
36
+ Backend, BackendKvEntryPage, BackendKvExistsBatch, BackendKvExistsGroup, BackendKvGetGroup,
37
+ BackendKvGetRequest, BackendKvKeyPage, BackendKvScanRange, BackendKvScanRequest,
38
+ BackendKvValueBatch, BackendKvValueGroup, BackendKvValuePage, BackendKvWriteBatch,
39
+ BackendKvWriteGroup, BackendKvWriteStats, BackendReadTransaction, BackendWriteTransaction,
40
+ BytePage, BytePageBuilder,
41
+ };
42
+ pub use common::LixError;
43
+ pub(crate) use common::{
44
+ parse_row_metadata, serialize_row_metadata, validate_row_metadata, RowMetadata,
45
+ };
46
+ pub use common::{
47
+ CanonicalPluginKey, CanonicalSchemaKey, CanonicalSchemaVersion, EntityId, FileId, VersionId,
48
+ };
49
+ pub use common::{LixNotice, NullableKeyFilter, SqlQueryResult, Value, WriteReceipt};
50
+ pub use common::{WireQueryResult, WireValue};
51
+ pub use engine::Engine;
52
+ pub use init::InitReceipt;
53
+ pub use session::{
54
+ CreateVersionOptions, CreateVersionReceipt, MergeChangeStats, MergeConflict,
55
+ MergeConflictChangeKind, MergeConflictKind, MergeConflictSide, MergeVersionOptions,
56
+ MergeVersionOutcome, MergeVersionPreview, MergeVersionPreviewOptions, MergeVersionReceipt,
57
+ SessionContext, SwitchVersionOptions, SwitchVersionReceipt,
58
+ };
59
+ pub use session::{ExecuteResult, Row, RowRef, TryFromValue};
60
+
61
+ pub(crate) const GLOBAL_VERSION_ID: &str = "global";