@feltdb/core 0.6.9 → 0.6.10

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 (98) hide show
  1. package/dist/cli/commands.js +189 -71
  2. package/dist/cli/index.js +1 -1
  3. package/dist/collection.d.ts +110 -2
  4. package/dist/collection.d.ts.map +1 -1
  5. package/dist/collection.js +228 -3
  6. package/dist/create/package-versions.js +1 -1
  7. package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +408 -178
  8. package/dist/create/server-source/crates/feltdb/src/lib.rs +49 -5
  9. package/dist/create/server-source/crates/feltdb/src/multi_operation_transaction.rs +659 -0
  10. package/dist/create/server-source/crates/feltdb/src/p1_application_atomicity.rs +285 -0
  11. package/dist/create/server-source/crates/feltdb/src/p1_atomicity_acceptance.rs +582 -0
  12. package/dist/create/server-source/crates/feltdb-server/src/main.rs +141 -0
  13. package/dist/db.d.ts +59 -0
  14. package/dist/db.d.ts.map +1 -1
  15. package/dist/db.js +94 -2
  16. package/dist/embedded-transaction.d.ts +77 -0
  17. package/dist/embedded-transaction.d.ts.map +1 -0
  18. package/dist/embedded-transaction.js +102 -0
  19. package/dist/feltdb.d.ts +49 -1
  20. package/dist/feltdb.d.ts.map +1 -1
  21. package/dist/file-db.d.ts +33 -0
  22. package/dist/file-db.d.ts.map +1 -1
  23. package/dist/file-db.js +128 -4
  24. package/dist/freshness.d.ts +119 -0
  25. package/dist/freshness.d.ts.map +1 -0
  26. package/dist/freshness.js +115 -0
  27. package/dist/http-db.d.ts +48 -0
  28. package/dist/http-db.d.ts.map +1 -1
  29. package/dist/http-db.js +77 -1
  30. package/dist/index-backend.d.ts +8 -0
  31. package/dist/index-backend.d.ts.map +1 -1
  32. package/dist/index-backend.js +13 -0
  33. package/dist/index-core.d.ts +78 -0
  34. package/dist/index-core.d.ts.map +1 -0
  35. package/dist/index-core.js +72 -0
  36. package/dist/index-manager.d.ts +11 -0
  37. package/dist/index-manager.d.ts.map +1 -1
  38. package/dist/index-manager.js +30 -13
  39. package/dist/index-types.d.ts +17 -0
  40. package/dist/index-types.d.ts.map +1 -1
  41. package/dist/index.browser.d.ts +14 -0
  42. package/dist/index.browser.d.ts.map +1 -0
  43. package/dist/index.browser.js +13 -0
  44. package/dist/index.d.ts +8 -59
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +11 -54
  47. package/dist/indexeddb-db.d.ts +32 -0
  48. package/dist/indexeddb-db.d.ts.map +1 -1
  49. package/dist/indexeddb-db.js +151 -1
  50. package/dist/memory-db.d.ts +26 -0
  51. package/dist/memory-db.d.ts.map +1 -1
  52. package/dist/memory-db.js +86 -0
  53. package/dist/runtime-registry.d.ts +32 -0
  54. package/dist/runtime-registry.d.ts.map +1 -0
  55. package/dist/runtime-registry.js +38 -0
  56. package/dist/studio-app/assets/{feltdb_wasm-B4wq4mqp.js → feltdb_wasm-CJv3wHzi.js} +1 -1
  57. package/dist/studio-app/assets/feltdb_wasm_bg-C8TG8r2n.wasm +0 -0
  58. package/dist/studio-app/assets/index-D3rT0SJi.js +28 -0
  59. package/dist/studio-app/index.html +1 -1
  60. package/dist/transaction.d.ts +98 -0
  61. package/dist/transaction.d.ts.map +1 -0
  62. package/dist/transaction.js +86 -0
  63. package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
  64. package/dist/workspace/browser.d.ts +22 -0
  65. package/dist/workspace/browser.d.ts.map +1 -0
  66. package/dist/workspace/browser.js +17 -0
  67. package/dist/workspace/git-identity.d.ts +35 -0
  68. package/dist/workspace/git-identity.d.ts.map +1 -0
  69. package/dist/workspace/git-identity.js +81 -0
  70. package/dist/workspace/index.d.ts +11 -1
  71. package/dist/workspace/index.d.ts.map +1 -1
  72. package/dist/workspace/index.js +6 -0
  73. package/dist/workspace/investigation-analysis.d.ts +47 -0
  74. package/dist/workspace/investigation-analysis.d.ts.map +1 -0
  75. package/dist/workspace/investigation-analysis.js +181 -0
  76. package/dist/workspace/investigation-lifecycle-manager.d.ts +86 -0
  77. package/dist/workspace/investigation-lifecycle-manager.d.ts.map +1 -0
  78. package/dist/workspace/investigation-lifecycle-manager.js +229 -0
  79. package/dist/workspace/investigation-supervisor.d.ts +100 -0
  80. package/dist/workspace/investigation-supervisor.d.ts.map +1 -0
  81. package/dist/workspace/investigation-supervisor.js +236 -0
  82. package/dist/workspace/runtime-investigation.d.ts +1 -1
  83. package/dist/workspace/runtime-investigation.d.ts.map +1 -1
  84. package/dist/workspace/runtime-investigation.js +46 -21
  85. package/dist/workspace/runtime-observation.d.ts +79 -0
  86. package/dist/workspace/runtime-observation.d.ts.map +1 -0
  87. package/dist/workspace/runtime-observation.js +152 -0
  88. package/dist/workspace/runtime-observer.d.ts +51 -0
  89. package/dist/workspace/runtime-observer.d.ts.map +1 -0
  90. package/dist/workspace/runtime-observer.js +268 -0
  91. package/dist/workspace/workspace-connection.d.ts.map +1 -1
  92. package/dist/workspace/workspace-connection.js +14 -5
  93. package/dist/workspace/workspace-types.d.ts +113 -0
  94. package/dist/workspace/workspace-types.d.ts.map +1 -1
  95. package/package.json +12 -4
  96. package/dist/create/server-source/crates/feltdb/src/phase_1c_three_node.rs +0 -523
  97. package/dist/studio-app/assets/feltdb_wasm_bg-Ceyi7l21.wasm +0 -0
  98. package/dist/studio-app/assets/index-BF45M757.js +0 -28
@@ -41,6 +41,7 @@ use feltdb::{
41
41
  Grant, GrantSigner, GrantStore, Subject as GrantSubject,
42
42
  },
43
43
  cardinality_endpoint::{CardinalityContext, CardinalityDiagnosticResponse},
44
+ AtomicMutation, AtomicPrecondition,
44
45
  policy_evaluation::{Actor, PolicyContext, PolicyEvaluator, PolicySubject},
45
46
  state_contract::{
46
47
  begin_read, compare_schemas, execute_query as execute_state_query, execute_transaction,
@@ -6298,6 +6299,8 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
6298
6299
  "/api/connections/{connection_id}",
6299
6300
  axum::routing::delete(delete_connection_control),
6300
6301
  )
6302
+ .route("/transactions", axum::routing::post(commit_transaction))
6303
+ .route("/revision", get(get_revision))
6301
6304
  .route(
6302
6305
  "/collections/{collection}",
6303
6306
  get(list_records).post(create_record),
@@ -8974,6 +8977,30 @@ fn put_canonical(
8974
8977
  }))
8975
8978
  }
8976
8979
 
8980
+ /// The authority's current committed-state revision.
8981
+ ///
8982
+ /// This is the value `apply_atomic_transaction` advances and writes into each
8983
+ /// durable transaction record as `state_after`. It already survived restart and
8984
+ /// already refused to move backwards; the only thing missing was a way to read
8985
+ /// it without performing a write, which is what a cache needs.
8986
+ ///
8987
+ /// `scope` is the store's instance id. A revision is comparable only against
8988
+ /// another revision carrying the same scope, so a client that fails over to a
8989
+ /// different replica sees a scope change rather than a silently wrong
8990
+ /// comparison against a counter that means something else there.
8991
+ #[derive(Serialize)]
8992
+ struct RevisionResponse {
8993
+ revision: u64,
8994
+ scope: String,
8995
+ }
8996
+
8997
+ async fn get_revision(State(state): State<AppState>) -> Result<Json<RevisionResponse>, ApiError> {
8998
+ Ok(Json(RevisionResponse {
8999
+ revision: state.db.sequence()?,
9000
+ scope: state.db.instance_id()?,
9001
+ }))
9002
+ }
9003
+
8977
9004
  async fn list_records(
8978
9005
  State(state): State<AppState>,
8979
9006
  Path(collection): Path<String>,
@@ -9000,6 +9027,120 @@ async fn get_record(
9000
9027
  }))
9001
9028
  }
9002
9029
 
9030
+ /// One operation inside an application transaction.
9031
+ #[derive(Deserialize)]
9032
+ #[serde(rename_all = "camelCase")]
9033
+ struct AtomicTxOperationRequest {
9034
+ collection: String,
9035
+ id: String,
9036
+ /// Absent value means delete.
9037
+ #[serde(default)]
9038
+ value: Option<Map<String, Value>>,
9039
+ /// When set, the record must not already exist for the transaction to commit.
9040
+ #[serde(default)]
9041
+ require_absent: bool,
9042
+ }
9043
+
9044
+ #[derive(Deserialize)]
9045
+ #[serde(rename_all = "camelCase")]
9046
+ struct AtomicTxRequest {
9047
+ /// Caller-supplied identity. Reusing one makes the commit idempotent.
9048
+ transaction_id: String,
9049
+ operations: Vec<AtomicTxOperationRequest>,
9050
+ }
9051
+
9052
+ #[derive(Serialize)]
9053
+ #[serde(rename_all = "camelCase")]
9054
+ struct AtomicTxResponse {
9055
+ transaction_id: String,
9056
+ /// True when this id had already been committed; nothing was reapplied.
9057
+ duplicate: bool,
9058
+ operations: usize,
9059
+ state_before: u64,
9060
+ state_after: u64,
9061
+ }
9062
+
9063
+ /// Commit several operations as one atomic, durable transaction.
9064
+ ///
9065
+ /// This is the application-facing entry point to the same atomic commit path
9066
+ /// the substrate uses: preconditions are evaluated first, then one transaction
9067
+ /// record is written and fsynced, and only then is derived state updated.
9068
+ /// There is no second transaction mechanism — the request is translated into
9069
+ /// the store's own atomic transaction and nothing else.
9070
+ async fn commit_transaction(
9071
+ State(state): State<AppState>,
9072
+ Json(request): Json<AtomicTxRequest>,
9073
+ ) -> Result<(StatusCode, Json<AtomicTxResponse>), ApiError> {
9074
+ if request.transaction_id.trim().is_empty() {
9075
+ return Err(ApiError(
9076
+ StatusCode::BAD_REQUEST,
9077
+ "transactionId is required".to_string(),
9078
+ ));
9079
+ }
9080
+ if request.operations.is_empty() {
9081
+ return Err(ApiError(
9082
+ StatusCode::BAD_REQUEST,
9083
+ "a transaction requires at least one operation".to_string(),
9084
+ ));
9085
+ }
9086
+
9087
+ // Validate every operation before any of them is turned into a mutation, so
9088
+ // a malformed request cannot commit a prefix of the transaction.
9089
+ let mut mutations = Vec::with_capacity(request.operations.len());
9090
+ let mut preconditions = Vec::new();
9091
+ let mut seen = std::collections::HashSet::new();
9092
+ for operation in request.operations {
9093
+ let key = record_key(&operation.collection, &operation.id)?;
9094
+ if !seen.insert(key.clone()) {
9095
+ return Err(ApiError(
9096
+ StatusCode::BAD_REQUEST,
9097
+ format!("transaction writes {key} more than once"),
9098
+ ));
9099
+ }
9100
+ if operation.require_absent {
9101
+ // The store reads a precondition with no expected version as
9102
+ // "this record must not exist", and evaluates it inside the same
9103
+ // lock as the commit, so there is no window between the check and
9104
+ // the write.
9105
+ preconditions.push(AtomicPrecondition {
9106
+ capability: operation.collection.clone(),
9107
+ key: key.clone(),
9108
+ expected_version: None,
9109
+ });
9110
+ }
9111
+ let value = operation.value.map(|mut fields| {
9112
+ fields.insert("id".to_string(), Value::String(operation.id.clone()));
9113
+ Value::Object(fields)
9114
+ });
9115
+ mutations.push(AtomicMutation {
9116
+ capability: operation.collection,
9117
+ key,
9118
+ value,
9119
+ });
9120
+ }
9121
+
9122
+ let operations = mutations.len();
9123
+ let commit = state
9124
+ .db
9125
+ .apply_atomic_transaction(&request.transaction_id, None, &preconditions, &mutations, None)
9126
+ .map_err(|error| {
9127
+ // A refused transaction applied nothing, so this is a conflict, not
9128
+ // a partially completed request.
9129
+ ApiError(StatusCode::CONFLICT, error.to_string())
9130
+ })?;
9131
+
9132
+ Ok((
9133
+ if commit.duplicate { StatusCode::OK } else { StatusCode::CREATED },
9134
+ Json(AtomicTxResponse {
9135
+ transaction_id: commit.transaction_id,
9136
+ duplicate: commit.duplicate,
9137
+ operations,
9138
+ state_before: commit.state_before,
9139
+ state_after: commit.state_after,
9140
+ }),
9141
+ ))
9142
+ }
9143
+
9003
9144
  async fn create_record(
9004
9145
  State(state): State<AppState>,
9005
9146
  Path(collection): Path<String>,
package/dist/db.d.ts CHANGED
@@ -5,7 +5,9 @@
5
5
  * Persistence, indexing, and reactivity are completely transparent.
6
6
  */
7
7
  import type { JsDb } from './feltdb.js';
8
+ import { type FreshnessCapability, type Revision } from './freshness.js';
8
9
  import { Collection, Relationship } from './collection.js';
10
+ import { type AtomicTransactionOptions, type AtomicTransactionResult, type AtomicTransactionScope } from './transaction.js';
9
11
  import { type Cell } from './cell.js';
10
12
  import type { AgentRef, AgentDefinition, AgentExecution } from './agent.js';
11
13
  import { AgentRegistry } from './agent-registry.js';
@@ -280,6 +282,31 @@ export declare class StateFirstDB {
280
282
  * const allActive = await tasks.where(t => t.status === "active").all();
281
283
  */
282
284
  collection<T>(name: string): Collection<T>;
285
+ /**
286
+ * Commit several operations as one atomic, durable transaction.
287
+ *
288
+ * Either every operation commits or none do — including across a crash.
289
+ *
290
+ * @example
291
+ * const result = await db.transaction(async tx => {
292
+ * tx.collection('users').set('u1', user);
293
+ * tx.collection('orders').set('o1', order);
294
+ * tx.collection('audit').set('a1', event);
295
+ * });
296
+ * result.transactionId; // durable identity, stable across restart
297
+ *
298
+ * The callback stages operations; it does not write them. Nothing reaches
299
+ * the authority until the callback returns, so there is no window in which
300
+ * part of the transaction is durable and the rest is not.
301
+ *
302
+ * Throwing from the callback abandons the transaction without sending
303
+ * anything.
304
+ *
305
+ * Requires a runtime backed by an authority that provides atomic
306
+ * transactions. Runtimes that cannot refuse rather than silently degrading
307
+ * the transaction into a sequence of independent writes.
308
+ */
309
+ transaction(build: (tx: AtomicTransactionScope) => void | Promise<void>, options?: AtomicTransactionOptions): Promise<AtomicTransactionResult>;
283
310
  /**
284
311
  * Get or create a durable cell.
285
312
  *
@@ -444,10 +471,42 @@ export declare class StateFirstDB {
444
471
  /**
445
472
  * Get the current sequence number for this instance.
446
473
  *
474
+ * **Not a freshness signal.** It means a different thing in each runtime and
475
+ * never reflects a write made by another process, tab, or node. Use
476
+ * {@link StateFirstDB.freshness} to find out whether cached state can be validated,
477
+ * and {@link StateFirstDB.revision} to validate it.
478
+ *
447
479
  * @example
448
480
  * const seq = db.getSequence();
449
481
  */
450
482
  getSequence(): number;
483
+ /**
484
+ * What freshness validation this runtime can honestly support.
485
+ *
486
+ * Runtimes differ because their consistency domains differ, not because some
487
+ * are unfinished. A runtime with no serialization authority over its writers
488
+ * reports `validation: 'refresh'`, and that is the correct answer for it.
489
+ *
490
+ * @example
491
+ * const capability = await db.freshness();
492
+ * if (capability.validation === 'revision') {
493
+ * const revision = await db.revision();
494
+ * }
495
+ */
496
+ freshness(): Promise<FreshnessCapability>;
497
+ /**
498
+ * The current committed-state revision.
499
+ *
500
+ * Throws unless {@link StateFirstDB.freshness} advertises revision validation, and
501
+ * throws if the runtime returns a revision from a scope it did not advertise.
502
+ * A revision is comparable only against one carrying the same scope.
503
+ *
504
+ * @example
505
+ * const before = await db.revision();
506
+ * // ... work ...
507
+ * const stillCurrent = isCacheCurrent(before, await db.revision());
508
+ */
509
+ revision(): Promise<Revision>;
451
510
  /**
452
511
  * Register a trigger that maps operations to executions
453
512
  *
package/dist/db.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
package/dist/db.js CHANGED
@@ -4,7 +4,9 @@
4
4
  * High-level, application-facing API that treats FeltDB as application state.
5
5
  * Persistence, indexing, and reactivity are completely transparent.
6
6
  */
7
+ import { describeFreshness, readRevision, } from './freshness.js';
7
8
  import { Collection, Relationship } from './collection.js';
9
+ import { AtomicTransactionBuilder, AtomicTransactionError, } from './transaction.js';
8
10
  import { CellImpl } from './cell.js';
9
11
  import { createAgentRef } from './agent.js';
10
12
  import { AgentRegistry } from './agent-registry.js';
@@ -12,7 +14,7 @@ import { AgentRuntime } from './agent-runtime.js';
12
14
  import { MemoryJsDb } from './memory-db.js';
13
15
  import { HttpJsDb } from './http-db.js';
14
16
  import { IndexedDbJsDb } from './indexeddb-db.js';
15
- import { FileJsDb } from './file-db.js';
17
+ import { requireRuntime } from './runtime-registry.js';
16
18
  import { emptyFlowSpec, planFlowSpecMigration, validateFlowSpec } from './flowspec.js';
17
19
  import { SyncController } from './sync-contract.js';
18
20
  import { WorkloadClient } from './workload.js';
@@ -29,7 +31,9 @@ export function createFeltDB(options) {
29
31
  }
30
32
  const runtime = options.server ? new HttpJsDb(options.server)
31
33
  : 'browser' in options && options.browser ? new IndexedDbJsDb(options.namespace)
32
- : 'path' in options && options.path ? new FileJsDb(options.path)
34
+ : 'path' in options && options.path ? requireRuntime('file', options.path, 'createFeltDB({ path }) needs the Node file runtime, which is not available here. '
35
+ + 'In a browser use createFeltDB({ browser: true }); in Node import "@feltdb/core" '
36
+ + 'rather than a browser-conditioned build.')
33
37
  : new MemoryJsDb(options.namespace);
34
38
  return new StateFirstDB(runtime);
35
39
  }
@@ -135,6 +139,58 @@ export class StateFirstDB {
135
139
  }
136
140
  return this.collections.get(name);
137
141
  }
142
+ /**
143
+ * Commit several operations as one atomic, durable transaction.
144
+ *
145
+ * Either every operation commits or none do — including across a crash.
146
+ *
147
+ * @example
148
+ * const result = await db.transaction(async tx => {
149
+ * tx.collection('users').set('u1', user);
150
+ * tx.collection('orders').set('o1', order);
151
+ * tx.collection('audit').set('a1', event);
152
+ * });
153
+ * result.transactionId; // durable identity, stable across restart
154
+ *
155
+ * The callback stages operations; it does not write them. Nothing reaches
156
+ * the authority until the callback returns, so there is no window in which
157
+ * part of the transaction is durable and the rest is not.
158
+ *
159
+ * Throwing from the callback abandons the transaction without sending
160
+ * anything.
161
+ *
162
+ * Requires a runtime backed by an authority that provides atomic
163
+ * transactions. Runtimes that cannot refuse rather than silently degrading
164
+ * the transaction into a sequence of independent writes.
165
+ */
166
+ async transaction(build, options = {}) {
167
+ const builder = new AtomicTransactionBuilder(options.transactionId);
168
+ if (!this.jsDb.commit_transaction) {
169
+ throw new AtomicTransactionError('This FeltDB runtime does not provide atomic transactions. '
170
+ + 'Connect to a FeltDB authority (createFeltDB({ server: ... })) to use db.transaction(). '
171
+ + 'FeltDB will not emulate a transaction with separate writes, because that would not be atomic.', builder.transactionId);
172
+ }
173
+ await build(builder);
174
+ const request = builder.seal();
175
+ if (request.operations.length === 0) {
176
+ throw new AtomicTransactionError('a transaction requires at least one operation', request.transactionId);
177
+ }
178
+ try {
179
+ const result = await this.jsDb.commit_transaction(request);
180
+ return {
181
+ transactionId: result.transactionId ?? request.transactionId,
182
+ duplicate: Boolean(result.duplicate),
183
+ operations: result.operations ?? request.operations.length,
184
+ stateBefore: result.stateBefore ?? 0,
185
+ stateAfter: result.stateAfter ?? 0,
186
+ };
187
+ }
188
+ catch (error) {
189
+ // A refused transaction applied nothing. Surfacing that plainly matters:
190
+ // a caller must never be left wondering whether a prefix landed.
191
+ throw new AtomicTransactionError(error instanceof Error ? error.message : String(error), request.transactionId);
192
+ }
193
+ }
138
194
  /**
139
195
  * Get or create a durable cell.
140
196
  *
@@ -525,12 +581,48 @@ export class StateFirstDB {
525
581
  /**
526
582
  * Get the current sequence number for this instance.
527
583
  *
584
+ * **Not a freshness signal.** It means a different thing in each runtime and
585
+ * never reflects a write made by another process, tab, or node. Use
586
+ * {@link StateFirstDB.freshness} to find out whether cached state can be validated,
587
+ * and {@link StateFirstDB.revision} to validate it.
588
+ *
528
589
  * @example
529
590
  * const seq = db.getSequence();
530
591
  */
531
592
  getSequence() {
532
593
  return this.jsDb.get_sequence();
533
594
  }
595
+ /**
596
+ * What freshness validation this runtime can honestly support.
597
+ *
598
+ * Runtimes differ because their consistency domains differ, not because some
599
+ * are unfinished. A runtime with no serialization authority over its writers
600
+ * reports `validation: 'refresh'`, and that is the correct answer for it.
601
+ *
602
+ * @example
603
+ * const capability = await db.freshness();
604
+ * if (capability.validation === 'revision') {
605
+ * const revision = await db.revision();
606
+ * }
607
+ */
608
+ freshness() {
609
+ return describeFreshness(this.jsDb);
610
+ }
611
+ /**
612
+ * The current committed-state revision.
613
+ *
614
+ * Throws unless {@link StateFirstDB.freshness} advertises revision validation, and
615
+ * throws if the runtime returns a revision from a scope it did not advertise.
616
+ * A revision is comparable only against one carrying the same scope.
617
+ *
618
+ * @example
619
+ * const before = await db.revision();
620
+ * // ... work ...
621
+ * const stillCurrent = isCacheCurrent(before, await db.revision());
622
+ */
623
+ revision() {
624
+ return readRevision(this.jsDb);
625
+ }
534
626
  /**
535
627
  * Register a trigger that maps operations to executions
536
628
  *
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Transaction semantics for embedded runtimes.
3
+ *
4
+ * FeltDB has one transaction contract. The authority-backed runtime satisfies
5
+ * it by handing the staged transaction to the store's own atomic commit path;
6
+ * the embedded runtimes satisfy it here.
7
+ *
8
+ * The semantics live in this module *once*. A runtime does not reimplement
9
+ * them — it supplies only the thing that is genuinely runtime-specific: its
10
+ * atomic durable commit boundary.
11
+ *
12
+ * ```text
13
+ * db.transaction()
14
+ * │
15
+ * staged operations
16
+ * │
17
+ * ┌────────┴────────┐
18
+ * │ │
19
+ * authority embedded
20
+ * (store's atomic (decidePlan here +
21
+ * commit path) runtime commit)
22
+ * │ │
23
+ * └────────┬────────┘
24
+ * │
25
+ * atomic durable
26
+ * commit
27
+ * ```
28
+ *
29
+ * The decision step is pure: it reads current state and produces a plan. It
30
+ * performs no I/O and mutates nothing, so a runtime can evaluate the whole
31
+ * transaction before touching storage and then apply the plan in one atomic
32
+ * step. That ordering is what makes partial application impossible.
33
+ */
34
+ import type { AtomicTransactionRequest, AtomicTransactionResult } from './transaction.js';
35
+ /** One resolved mutation. An absent `value` means delete. */
36
+ export interface EmbeddedMutation {
37
+ /** Storage key, `collection:id`. */
38
+ key: string;
39
+ collection: string;
40
+ id: string;
41
+ value?: Record<string, unknown>;
42
+ }
43
+ /** What a runtime must be able to tell the decision step. */
44
+ export interface EmbeddedTransactionState {
45
+ /** Whether a record currently exists. */
46
+ exists(key: string): boolean;
47
+ /** Whether this transaction id has already been committed. */
48
+ hasApplied(transactionId: string): boolean;
49
+ }
50
+ export type EmbeddedPlan = {
51
+ kind: 'duplicate';
52
+ } | {
53
+ kind: 'reject';
54
+ reason: string;
55
+ } | {
56
+ kind: 'apply';
57
+ mutations: EmbeddedMutation[];
58
+ };
59
+ /** Storage key for a collection and id. */
60
+ export declare function recordKey(collection: string, id: string): string;
61
+ /**
62
+ * Decide what a transaction should do, without doing any of it.
63
+ *
64
+ * Returns `duplicate` when this transaction id was already committed (so
65
+ * redelivery is a no-op), `reject` when the transaction cannot commit at all,
66
+ * or `apply` with every mutation resolved.
67
+ *
68
+ * A rejection means nothing may be written. There is no partial plan.
69
+ */
70
+ export declare function decideTransaction(request: AtomicTransactionRequest, state: EmbeddedTransactionState): EmbeddedPlan;
71
+ /** Shape a runtime returns after committing. */
72
+ export declare function embeddedResult(request: AtomicTransactionRequest, duplicate: boolean, stateBefore: number, stateAfter: number): AtomicTransactionResult;
73
+ /** Raised when a transaction is refused. Nothing was written. */
74
+ export declare class EmbeddedTransactionRejected extends Error {
75
+ constructor(reason: string);
76
+ }
77
+ //# sourceMappingURL=embedded-transaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedded-transaction.d.ts","sourceRoot":"","sources":["../src/embedded-transaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE1F,6DAA6D;AAC7D,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,6DAA6D;AAC7D,MAAM,WAAW,wBAAwB;IACvC,yCAAyC;IACzC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,8DAA8D;IAC9D,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5C;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAAC;AAErD,2CAA2C;AAC3C,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAEhE;AAID;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,wBAAwB,EACjC,KAAK,EAAE,wBAAwB,GAC9B,YAAY,CA0Cd;AAED,gDAAgD;AAChD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,wBAAwB,EACjC,SAAS,EAAE,OAAO,EAClB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,uBAAuB,CAQzB;AAED,iEAAiE;AACjE,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,MAAM,EAAE,MAAM;CAI3B"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Transaction semantics for embedded runtimes.
3
+ *
4
+ * FeltDB has one transaction contract. The authority-backed runtime satisfies
5
+ * it by handing the staged transaction to the store's own atomic commit path;
6
+ * the embedded runtimes satisfy it here.
7
+ *
8
+ * The semantics live in this module *once*. A runtime does not reimplement
9
+ * them — it supplies only the thing that is genuinely runtime-specific: its
10
+ * atomic durable commit boundary.
11
+ *
12
+ * ```text
13
+ * db.transaction()
14
+ * │
15
+ * staged operations
16
+ * │
17
+ * ┌────────┴────────┐
18
+ * │ │
19
+ * authority embedded
20
+ * (store's atomic (decidePlan here +
21
+ * commit path) runtime commit)
22
+ * │ │
23
+ * └────────┬────────┘
24
+ * │
25
+ * atomic durable
26
+ * commit
27
+ * ```
28
+ *
29
+ * The decision step is pure: it reads current state and produces a plan. It
30
+ * performs no I/O and mutates nothing, so a runtime can evaluate the whole
31
+ * transaction before touching storage and then apply the plan in one atomic
32
+ * step. That ordering is what makes partial application impossible.
33
+ */
34
+ /** Storage key for a collection and id. */
35
+ export function recordKey(collection, id) {
36
+ return `${collection}:${id}`;
37
+ }
38
+ const SEGMENT = /^[A-Za-z0-9._-]{1,128}$/;
39
+ /**
40
+ * Decide what a transaction should do, without doing any of it.
41
+ *
42
+ * Returns `duplicate` when this transaction id was already committed (so
43
+ * redelivery is a no-op), `reject` when the transaction cannot commit at all,
44
+ * or `apply` with every mutation resolved.
45
+ *
46
+ * A rejection means nothing may be written. There is no partial plan.
47
+ */
48
+ export function decideTransaction(request, state) {
49
+ if (!request.transactionId || !request.transactionId.trim()) {
50
+ return { kind: 'reject', reason: 'transactionId is required' };
51
+ }
52
+ if (request.operations.length === 0) {
53
+ return { kind: 'reject', reason: 'a transaction requires at least one operation' };
54
+ }
55
+ if (state.hasApplied(request.transactionId)) {
56
+ return { kind: 'duplicate' };
57
+ }
58
+ const mutations = [];
59
+ const seen = new Set();
60
+ for (const operation of request.operations) {
61
+ if (!SEGMENT.test(operation.collection) || !SEGMENT.test(operation.id)) {
62
+ return {
63
+ kind: 'reject',
64
+ reason: `invalid collection or id: ${operation.collection}:${operation.id}`,
65
+ };
66
+ }
67
+ const key = recordKey(operation.collection, operation.id);
68
+ if (seen.has(key)) {
69
+ return { kind: 'reject', reason: `transaction writes ${key} more than once` };
70
+ }
71
+ seen.add(key);
72
+ if (operation.requireAbsent && state.exists(key)) {
73
+ return { kind: 'reject', reason: `PRECONDITION_FAILED:${key}:record already exists` };
74
+ }
75
+ mutations.push({
76
+ key,
77
+ collection: operation.collection,
78
+ id: operation.id,
79
+ value: operation.value === undefined
80
+ ? undefined
81
+ : { ...operation.value, id: operation.id },
82
+ });
83
+ }
84
+ return { kind: 'apply', mutations };
85
+ }
86
+ /** Shape a runtime returns after committing. */
87
+ export function embeddedResult(request, duplicate, stateBefore, stateAfter) {
88
+ return {
89
+ transactionId: request.transactionId,
90
+ duplicate,
91
+ operations: request.operations.length,
92
+ stateBefore,
93
+ stateAfter,
94
+ };
95
+ }
96
+ /** Raised when a transaction is refused. Nothing was written. */
97
+ export class EmbeddedTransactionRejected extends Error {
98
+ constructor(reason) {
99
+ super(reason);
100
+ this.name = 'EmbeddedTransactionRejected';
101
+ }
102
+ }