@incoqnito.io/bajadab 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -20,7 +20,7 @@ A lightweight JSON-file-backed database for small, single-machine setups. No ser
20
20
  npm install @incoqnito.io/bajadab
21
21
  ```
22
22
 
23
- Requires Node.js `>= 24`.
23
+ Requires Node.js `>= 26`.
24
24
 
25
25
  ## Quick start
26
26
 
@@ -54,7 +54,7 @@ Every collection has an `IBCollectionConfig`. `db.config.defaultCollectionConfig
54
54
  | `autoIDStrategy` | `AUTO_ID_UUID` (default) / `NO_AUTO_ID` | Generate a `uuidv7` for values with no id, or reject them. |
55
55
  | `duplicateIDStrategy` | `OVERWRITE` (default) / `ERROR` / `IGNORE` | What `add()` does when a value's id already exists. |
56
56
  | `arrayDeletionStrategy` | `IN_PLACE` (default) / `NEW_ARRAY` | How `delete()` removes matches from an `ARRAY` collection. |
57
- | `autoFlushStrategy` | `ALWAYS_AUTO_FLUSH` (default) / `NO_AUTO_FLUSH` | Whether every mutation is written to disk immediately, or only on an explicit `flush()`. |
57
+ | `autoFlushStrategy` | `ALWAYS_AUTO_FLUSH` (default) / `NO_AUTO_FLUSH` | Whether every mutation is written to disk immediately, or only on an explicit `flush()`. With `ALWAYS_AUTO_FLUSH`, a failed write rejects the mutating call, but its change stays applied in memory (and is written by the next flush); its handlers don't fire. |
58
58
  | `dirtyUnloadStrategy` | `FLUSH` (default) / `ERROR` / `IGNORE` | What `unload()` does with unsaved changes. |
59
59
  | `getID` / `setID` | registry key (optional) | Custom id accessors — see below. Omit to use the default, which reads/writes a plain `.id` property. |
60
60
  | `indexes` | `{ [indexKey: string]: registry key }` (optional) | Secondary indexes — see below. Omit for no indexes. |
@@ -138,11 +138,11 @@ Collections are addressed by a stable id, not by name, so a handle to a since-re
138
138
 
139
139
  ## Concurrency
140
140
 
141
- All operations on a database — on any of its collections as well as `create`/`get`/`has`/`dropCollection()`, `snapshot()` and `transaction()` — are serialized within one process by a single lock per database. The lock is reentrant: code that runs while an operation holds it (handlers, predicates, updaters, a transaction's `fn`) can call any other operation on the same database without deadlocking. The flip side is that such code blocks the whole database while it runs, so keep `EBHandlerMode.SYNC` handlers and transaction callbacks short, and don't await anything slow or external inside them. There is no cross-process locking — multiple processes pointed at the same directory can still race on the underlying files.
141
+ All operations on a database — on any of its collections as well as `create`/`get`/`has`/`dropCollection()`, `snapshot()` and `transaction()` — are serialized within one process by a single lock per database. The lock is reentrant: code that runs while an operation holds it (handlers, predicates, updaters, a transaction's `fn`) can call any other operation on the same database without deadlocking. The flip side is that such code blocks the whole database while it runs, so keep `EBHandlerMode.SYNC` handlers and transaction callbacks short, and don't await anything slow or external inside them. `EBHandlerMode.ASYNC` handlers are the exception: they start only once the operation that triggered them has finished, outside its lock, and queue for the lock like any other caller. The same doesn't hold for promises you start yourself without awaiting them inside a handler, predicate, updater or `fn` — those still count as part of the operation holding the lock and run interleaved with it. There is no cross-process locking — multiple processes pointed at the same directory can still race on the underlying files.
142
142
 
143
143
  ## Snapshots
144
144
 
145
- `db.snapshot(targetDir, options?)` flushes every loaded collection, then copies the whole database directory into a new version folder under `targetDir` (created if it doesn't exist yet). The version folder is named after a sortable timestamp (e.g. `20260904T153012345Z`) and is itself a complete, independent database — open it directly with `getDatabase(versionPath)`.
145
+ `db.snapshot(targetDir, options?)` flushes every loaded collection, then copies the whole database directory into a new version folder under `targetDir` (created if it doesn't exist yet; it must not be inside the database directory). The version folder is named after a sortable timestamp (e.g. `20260904T153012345Z`) and is itself a complete, independent database — open it directly with `getDatabase(versionPath)`.
146
146
 
147
147
  ```ts
148
148
  const versionPath = await db.snapshot("./backups");
@@ -159,7 +159,7 @@ const restored = await getDatabase(versionPath);
159
159
 
160
160
  Pruning only ever deletes folders matching bajadab's own naming scheme — anything else you keep in `targetDir` is left alone.
161
161
 
162
- Version folder names have millisecond resolution. Two `snapshot()` calls into the same `targetDir` within the same millisecond (and with the same or no `label`) resolve to the same folder name: the second copy is merged into the first, and if that copy fails, the cleanup removes the earlier snapshot along with it. Don't take snapshots into the same `targetDir` in such quick succession.
162
+ Version folder names have millisecond resolution. Each snapshot claims its folder exclusively before copying into it; if the name is already taken (several snapshots within the same millisecond, or another process writing into the same `targetDir`), the timestamp is advanced by a millisecond until a free name is found. A folder name can therefore be a few milliseconds later than the actual snapshot time, but an existing version folder is never written into or removed by a failed copy.
163
163
 
164
164
  `snapshot()` blocks every other operation on the database for as long as the copy takes, to guarantee a consistent point-in-time copy. There's no separate `restoreSnapshot()` — restoring means copying a version folder back over the original `basePath` (while nothing has it open), or just pointing `getDatabase()` at the version folder directly.
165
165
 
@@ -179,11 +179,11 @@ await db.transaction(["accounts", "orders"], async (tx) => {
179
179
 
180
180
  Every name passed to `transaction()` must be an existing collection; otherwise it rejects before `fn` runs, and nothing is created.
181
181
 
182
- If `fn` resolves, every declared collection's working copy is first written to a temp file. If any of these writes fails, all temp files are discarded and nothing is applied. Otherwise the temp files replace the collections' files, every live state is replaced by its working copy, and only then do the `ADD`/`UPDATE`/`DELETE` handlers registered with `on()` fire — so a handler that reads or writes another declared collection already sees its committed state. They fire once per id the transaction touched, typed by the last operation on it, the same way as outside a transaction: `ADD` if the value is new or was last stored via `add()` (including an id-based overwrite), `UPDATE` (pre-transaction value → final value) if it was last changed via `update()`, `DELETE` if it's gone. A value added and later deleted within the same transaction fires nothing, and a value updated twice fires one `UPDATE`. If `fn` throws, nothing is applied, nothing is flushed, and no handler fires — every declared collection stays exactly as it was. This only covers changes made through the working copies' `add()`/`update()`/`delete()`; values mutated in place are shared with the live collection and aren't isolated (see "Values are stored by reference").
182
+ If `fn` resolves, every working copy the transaction changed is first written to a temp file; unchanged ones are left alone. If any of these writes fails, all temp files are discarded and nothing is applied. Otherwise the temp files replace the collections' files, every live state is replaced by its working copy, and only then do the `ADD`/`UPDATE`/`DELETE` handlers registered with `on()` fire — so a handler that reads or writes another declared collection already sees its committed state. They fire once per id the transaction touched, typed by the last operation on it, the same way as outside a transaction: `ADD` if the value is new or was last stored via `add()` (including an id-based overwrite), `UPDATE` (pre-transaction value → final value) if it was last changed via `update()`, `DELETE` if it's gone. A value added and later deleted within the same transaction fires nothing, and a value updated twice fires one `UPDATE`. If `fn` throws, nothing is applied, nothing is flushed, and no handler fires — every declared collection stays exactly as it was. This only covers changes made through the working copies' `add()`/`update()`/`delete()`; values mutated in place are shared with the live collection and aren't isolated (see "Values are stored by reference").
183
183
 
184
- `tx.getCollection(name)` only accepts names passed to `transaction()`; anything else throws. It mirrors `IBCollection`'s read/write surface (`get`/`has`/`count`/`getByIndex`/`add`/`update`/`delete`) but not `flush`/`reload`/`unload`/`on` — those don't make sense against a working copy that might still be rolled back.
184
+ `tx.getCollection(name)` only accepts names passed to `transaction()`; anything else throws. It mirrors `IBCollection`'s read/write surface (`get`/`has`/`count`/`getByIndex`/`add`/`update`/`delete`) but not `flush`/`reload`/`unload`/`on` — those don't make sense against a working copy that might still be rolled back. Once the transaction has ended, the view rejects every call.
185
185
 
186
- Inside `fn`, `add()`/`update()`/`delete()` through a declared collection's regular handle (the one from `db.getCollection()`) reject — those writes would otherwise be overwritten by the commit. Reading through it is fine and shows the pre-transaction state; collections not declared to the transaction stay fully usable, but writes to them aren't part of the transaction. Calling `transaction()` again from inside `fn` rejects as well, whichever collections it names.
186
+ Inside `fn`, `add()`/`update()`/`delete()` through a declared collection's regular handle (the one from `db.getCollection()`) reject — those writes would otherwise be overwritten by the commit — and so does registering a handler on it with `on()`, since it couldn't see the transaction's changes. Reading through it is fine and shows the pre-transaction state; collections not declared to the transaction stay fully usable, but writes to them aren't part of the transaction. Calling `transaction()` again from inside `fn` rejects as well, whichever collections it names.
187
187
 
188
188
  `transaction()` holds the database lock for its whole duration, so every other operation on the database — on any collection — waits until it resolves. Across collections, the final renames at commit still happen one file at a time — a crash, or a rename that keeps failing, between them can leave a transaction partially applied. If a rename fails, the collections renamed so far are applied (on disk and in memory, and their handlers fire), the rest are discarded, and `transaction()` rejects. There's no cross-process locking here either, same as everywhere else in bajadab.
189
189
 
package/dist/base.d.ts CHANGED
@@ -32,7 +32,7 @@ export declare enum EBArrayDeletionStrategy {
32
32
  export declare enum EBAutoFlushStrategy {
33
33
  /** Only on an explicit {@link IBCollection.flush} call. */
34
34
  NO_AUTO_FLUSH = "NO_AUTO_FLUSH",
35
- /** After every mutating call (`add`/`update`/`delete`). */
35
+ /** After every mutating call (`add`/`update`/`delete`). If that write fails, the call rejects, but its change stays applied in memory (written by the next flush) and its handlers don't fire. */
36
36
  ALWAYS_AUTO_FLUSH = "ALWAYS_AUTO_FLUSH"
37
37
  }
38
38
  /** What {@link IBCollection.unload} does with unsaved changes. */
@@ -92,7 +92,7 @@ export interface IBDatabase {
92
92
  dropCollection(collectionName: string): Promise<void>;
93
93
  /**
94
94
  * Flushes every loaded collection, then copies the whole database directory into a new, timestamped
95
- * version folder under `targetDir` (created if needed). Blocks all other database operations for the
95
+ * version folder under `targetDir` (created if needed; must not be inside the database directory). Blocks all other database operations for the
96
96
  * duration. See {@link IBSnapshotOptions} for pruning older versions. Returns the new version folder's path.
97
97
  */
98
98
  snapshot(targetDir: string, options?: IBSnapshotOptions): Promise<string>;
@@ -105,7 +105,8 @@ export interface IBDatabase {
105
105
  * added and later deleted within the same transaction fires nothing. If `fn` throws, nothing is applied,
106
106
  * nothing is flushed, and no handler fires.
107
107
  * Only collections named in `collectionNames` can be reached from within `fn`; writing to one of them through
108
- * its regular {@link IBCollection} handle inside `fn` rejects, and so does a nested `transaction()` call.
108
+ * its regular {@link IBCollection} handle inside `fn` rejects, as does registering a handler on it via `on()`
109
+ * and a nested `transaction()` call.
109
110
  * Values mutated in place are shared with the live collection and are neither isolated nor reverted.
110
111
  */
111
112
  transaction(collectionNames: string[], fn: (tx: IBTransaction) => Promise<void>): Promise<void>;
@@ -134,7 +135,7 @@ export interface IHandlerRegistration {
134
135
  export declare enum EBHandlerMode {
135
136
  /** The triggering `add()`/`update()`/`delete()` call doesn't resolve until this handler has run. Default. */
136
137
  SYNC = "SYNC",
137
- /** The handler runs without the triggering call waiting for it. */
138
+ /** The handler runs without the triggering call waiting for it, once the database operation that triggered it has finished. */
138
139
  ASYNC = "ASYNC"
139
140
  }
140
141
  /** A single collection of values of type `T`. Obtain one via {@link IBDatabase}. */
@@ -202,7 +203,7 @@ export interface IBTransaction {
202
203
  /**
203
204
  * The transaction-scoped view of `collectionName`. Returns the same instance on repeat calls with the
204
205
  * same (canonicalized) name within one transaction. Throws if `collectionName` wasn't declared to
205
- * {@link IBDatabase.transaction}.
206
+ * {@link IBDatabase.transaction}. The returned view rejects every call once the transaction has ended.
206
207
  */
207
208
  getCollection<T = any>(collectionName: string): Promise<IBTransactionCollection<T>>;
208
209
  }
package/dist/base.js CHANGED
@@ -38,7 +38,7 @@ export var EBAutoFlushStrategy;
38
38
  (function (EBAutoFlushStrategy) {
39
39
  /** Only on an explicit {@link IBCollection.flush} call. */
40
40
  EBAutoFlushStrategy["NO_AUTO_FLUSH"] = "NO_AUTO_FLUSH";
41
- /** After every mutating call (`add`/`update`/`delete`). */
41
+ /** After every mutating call (`add`/`update`/`delete`). If that write fails, the call rejects, but its change stays applied in memory (written by the next flush) and its handlers don't fire. */
42
42
  EBAutoFlushStrategy["ALWAYS_AUTO_FLUSH"] = "ALWAYS_AUTO_FLUSH";
43
43
  })(EBAutoFlushStrategy || (EBAutoFlushStrategy = {}));
44
44
  /** What {@link IBCollection.unload} does with unsaved changes. */
@@ -66,7 +66,7 @@ export var EBHandlerMode;
66
66
  (function (EBHandlerMode) {
67
67
  /** The triggering `add()`/`update()`/`delete()` call doesn't resolve until this handler has run. Default. */
68
68
  EBHandlerMode["SYNC"] = "SYNC";
69
- /** The handler runs without the triggering call waiting for it. */
69
+ /** The handler runs without the triggering call waiting for it, once the database operation that triggered it has finished. */
70
70
  EBHandlerMode["ASYNC"] = "ASYNC";
71
71
  })(EBHandlerMode || (EBHandlerMode = {}));
72
72
  //# sourceMappingURL=base.js.map
package/dist/base.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../src/main/base.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,MAAM,CAAN,IAAY,gBAKX;AALD,WAAY,gBAAgB;IACxB,mCAAmC;IACnC,6CAAyB,CAAA;IACzB,mEAAmE;IACnE,iDAA6B,CAAA;AACjC,CAAC,EALW,gBAAgB,KAAhB,gBAAgB,QAK3B;AAED,uDAAuD;AACvD,MAAM,CAAN,IAAY,oBAMX;AAND,WAAY,oBAAoB;IAC5B,oEAAoE;IACpE,mCAAW,CAAA;IACX,+BAA+B;IAC/B,gDAAgD;IAChD,uCAAe,CAAA;AACnB,CAAC,EANW,oBAAoB,KAApB,oBAAoB,QAM/B;AAED,iFAAiF;AACjF,MAAM,CAAN,IAAY,qBAOX;AAPD,WAAY,qBAAqB;IAC7B,kCAAkC;IAClC,gDAAuB,CAAA;IACvB,6BAA6B;IAC7B,wCAAe,CAAA;IACf,iDAAiD;IACjD,0CAAiB,CAAA;AACrB,CAAC,EAPW,qBAAqB,KAArB,qBAAqB,QAOhC;AAED,wFAAwF;AACxF,MAAM,CAAN,IAAY,uBAKX;AALD,WAAY,uBAAuB;IAC/B,wCAAwC;IACxC,kDAAuB,CAAA;IACvB,2CAA2C;IAC3C,gDAAqB,CAAA;AACzB,CAAC,EALW,uBAAuB,KAAvB,uBAAuB,QAKlC;AAED,6DAA6D;AAC7D,MAAM,CAAN,IAAY,mBAKX;AALD,WAAY,mBAAmB;IAC3B,2DAA2D;IAC3D,sDAA+B,CAAA;IAC/B,2DAA2D;IAC3D,8DAAuC,CAAA;AAC3C,CAAC,EALW,mBAAmB,KAAnB,mBAAmB,QAK9B;AAED,kEAAkE;AAClE,MAAM,CAAN,IAAY,qBAOX;AAPD,WAAY,qBAAqB;IAC7B,yBAAyB;IACzB,wCAAe,CAAA;IACf,gCAAgC;IAChC,wCAAe,CAAA;IACf,4CAA4C;IAC5C,0CAAiB,CAAA;AACrB,CAAC,EAPW,qBAAqB,KAArB,qBAAqB,QAOhC;AAyED,4FAA4F;AAC5F,MAAM,CAAN,IAAY,kBAOX;AAPD,WAAY,kBAAkB;IAC1B,uEAAuE;IACvE,iCAAW,CAAA;IACX,0CAA0C;IAC1C,uCAAiB,CAAA;IACjB,yCAAyC;IACzC,uCAAiB,CAAA;AACrB,CAAC,EAPW,kBAAkB,KAAlB,kBAAkB,QAO7B;AAeD,kGAAkG;AAClG,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACrB,6GAA6G;IAC7G,8BAAa,CAAA;IACb,mEAAmE;IACnE,gCAAe,CAAA;AACnB,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB"}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../src/main/base.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,MAAM,CAAN,IAAY,gBAKX;AALD,WAAY,gBAAgB;IACxB,mCAAmC;IACnC,6CAAyB,CAAA;IACzB,mEAAmE;IACnE,iDAA6B,CAAA;AACjC,CAAC,EALW,gBAAgB,KAAhB,gBAAgB,QAK3B;AAED,uDAAuD;AACvD,MAAM,CAAN,IAAY,oBAMX;AAND,WAAY,oBAAoB;IAC5B,oEAAoE;IACpE,mCAAW,CAAA;IACX,+BAA+B;IAC/B,gDAAgD;IAChD,uCAAe,CAAA;AACnB,CAAC,EANW,oBAAoB,KAApB,oBAAoB,QAM/B;AAED,iFAAiF;AACjF,MAAM,CAAN,IAAY,qBAOX;AAPD,WAAY,qBAAqB;IAC7B,kCAAkC;IAClC,gDAAuB,CAAA;IACvB,6BAA6B;IAC7B,wCAAe,CAAA;IACf,iDAAiD;IACjD,0CAAiB,CAAA;AACrB,CAAC,EAPW,qBAAqB,KAArB,qBAAqB,QAOhC;AAED,wFAAwF;AACxF,MAAM,CAAN,IAAY,uBAKX;AALD,WAAY,uBAAuB;IAC/B,wCAAwC;IACxC,kDAAuB,CAAA;IACvB,2CAA2C;IAC3C,gDAAqB,CAAA;AACzB,CAAC,EALW,uBAAuB,KAAvB,uBAAuB,QAKlC;AAED,6DAA6D;AAC7D,MAAM,CAAN,IAAY,mBAKX;AALD,WAAY,mBAAmB;IAC3B,2DAA2D;IAC3D,sDAA+B,CAAA;IAC/B,kMAAkM;IAClM,8DAAuC,CAAA;AAC3C,CAAC,EALW,mBAAmB,KAAnB,mBAAmB,QAK9B;AAED,kEAAkE;AAClE,MAAM,CAAN,IAAY,qBAOX;AAPD,WAAY,qBAAqB;IAC7B,yBAAyB;IACzB,wCAAe,CAAA;IACf,gCAAgC;IAChC,wCAAe,CAAA;IACf,4CAA4C;IAC5C,0CAAiB,CAAA;AACrB,CAAC,EAPW,qBAAqB,KAArB,qBAAqB,QAOhC;AA0ED,4FAA4F;AAC5F,MAAM,CAAN,IAAY,kBAOX;AAPD,WAAY,kBAAkB;IAC1B,uEAAuE;IACvE,iCAAW,CAAA;IACX,0CAA0C;IAC1C,uCAAiB,CAAA;IACjB,yCAAyC;IACzC,uCAAiB,CAAA;AACrB,CAAC,EAPW,kBAAkB,KAAlB,kBAAkB,QAO7B;AAeD,kGAAkG;AAClG,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACrB,6GAA6G;IAC7G,8BAAa,CAAA;IACb,+HAA+H;IAC/H,gCAAe,CAAA;AACnB,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB"}
package/dist/basics.d.ts CHANGED
@@ -20,8 +20,10 @@ export declare class BDatabase implements IBDatabase {
20
20
  readonly functionRegistry?: IBFunctionRegistry;
21
21
  readonly iid: string;
22
22
  private readonly transactionScope;
23
+ private readonly mutex;
23
24
  constructor(io: IODatabase, config?: IBDatabaseConfig, functionRegistry?: IBFunctionRegistry);
24
25
  runExclusive<R>(fn: () => Promise<R>): Promise<R>;
26
+ runDetached(task: () => Promise<void>): void;
25
27
  isInTransaction(collectionName: string): boolean;
26
28
  addCollection(collection: BCollection): void;
27
29
  getCollection<T>(collectionName: string, collectionConfig?: IBCollectionConfig): Promise<IBCollection<T>>;
@@ -62,6 +64,7 @@ export declare class BCollection<T = any> implements IBCollection<T> {
62
64
  count(predicate?: (v: T) => boolean): Promise<number>;
63
65
  getByIndex(indexKey: string, key: string): Promise<T[]>;
64
66
  private invokeHandler;
67
+ private dispatchHandler;
65
68
  private fireAdd;
66
69
  private fireUpdate;
67
70
  private fireDelete;
@@ -107,7 +110,7 @@ export declare class BCollection<T = any> implements IBCollection<T> {
107
110
  */
108
111
  cloneForTransaction(): Promise<BCollection<T>>;
109
112
  /**
110
- * Writes `clone`'s state to a temp file (see {@link IPreparedWrite}) and computes the handler events for the
113
+ * Writes `clone`'s state to a temp file (see {@link IPreparedWrite}), unless the transaction left it unchanged, and computes the handler events for the
111
114
  * net changes against this collection's current state: one per id the transaction touched, typed by the last
112
115
  * operation on it (`DELETE` if gone, `ADD` if new or last stored via `add()`, `UPDATE` otherwise). Nothing is
113
116
  * applied until `apply()`; call only while already holding this collection's mutex for the whole transaction.
package/dist/basics.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { AsyncLocalStorage } from "node:async_hooks";
2
2
  import { uuidv7, } from "uuidv7";
3
- import { runReentrantProtected } from "@incoqnito.io/ts-iq-core";
3
+ import { ReentrantMutex } from "@incoqnito.io/ts-iq-core";
4
4
  import { EBArrayDeletionStrategy, EBAutoFlushStrategy, EBAutoIDStrategy, EBDirtyUnloadStrategy, EBDuplicateIDStrategy, EBHandlerMode, EBMemStorageStrategy, EBModificationType, } from "./base.js";
5
5
  import { canonicalName } from "./utils.js";
6
6
  /** Default {@link TGetIDFunction}: reads `v.id`, `undefined` if absent. */
@@ -10,19 +10,24 @@ export const DEFAULT_SET_ID = async (v, id) => { v.id = id; };
10
10
  function normalizeID(id) {
11
11
  return id === undefined || id === null || id === "" ? undefined : String(id);
12
12
  }
13
+ const UNCHANGED_TRANSACTION_COMMIT = Object.freeze({
14
+ write: Object.freeze({ commit: async () => { }, discard: async () => { } }),
15
+ apply: () => { },
16
+ fire: async () => { },
17
+ });
13
18
  /** {@link IBCollectionConfig} used when a collection is created without an explicit one. */
14
- export const DEFAULT_COLLECTION_CONFIG = {
19
+ export const DEFAULT_COLLECTION_CONFIG = Object.freeze({
15
20
  arrayDeletionStrategy: EBArrayDeletionStrategy.IN_PLACE,
16
21
  autoIDStrategy: EBAutoIDStrategy.AUTO_ID_UUID,
17
22
  duplicateIDStrategy: EBDuplicateIDStrategy.OVERWRITE,
18
23
  memStorageStrategy: EBMemStorageStrategy.MAP,
19
24
  dirtyUnloadStrategy: EBDirtyUnloadStrategy.FLUSH,
20
25
  autoFlushStrategy: EBAutoFlushStrategy.ALWAYS_AUTO_FLUSH,
21
- };
26
+ });
22
27
  /** {@link IBDatabaseConfig} used when `getDatabase()` creates a fresh database. */
23
- export const DEFAULT_DATABASE_CONFIG = {
28
+ export const DEFAULT_DATABASE_CONFIG = Object.freeze({
24
29
  defaultCollectionConfig: DEFAULT_COLLECTION_CONFIG,
25
- };
30
+ });
26
31
  export class BDatabase {
27
32
  config;
28
33
  collections = new Map();
@@ -30,13 +35,17 @@ export class BDatabase {
30
35
  functionRegistry;
31
36
  iid = uuidv7();
32
37
  transactionScope = new AsyncLocalStorage();
38
+ mutex = new ReentrantMutex(this.iid);
33
39
  constructor(io, config, functionRegistry) {
34
40
  this.config = { ...(config ?? DEFAULT_DATABASE_CONFIG) };
35
41
  this.io = io;
36
42
  this.functionRegistry = functionRegistry;
37
43
  }
38
- async runExclusive(fn) {
39
- return runReentrantProtected(this.iid, fn);
44
+ runExclusive(fn) {
45
+ return this.mutex.run(fn);
46
+ }
47
+ runDetached(task) {
48
+ this.mutex.runAfterRelease(() => { void this.transactionScope.exit(task); });
40
49
  }
41
50
  isInTransaction(collectionName) {
42
51
  return this.transactionScope.getStore()?.has(collectionName) ?? false;
@@ -78,8 +87,8 @@ export class BDatabase {
78
87
  const coll = this.collections.get(cname);
79
88
  if (coll) {
80
89
  coll.markDropped();
90
+ await this.io.deleteCollection(cname);
81
91
  this.collections.delete(cname);
82
- return this.io.deleteCollection(cname);
83
92
  }
84
93
  else {
85
94
  throw new Error(`no such collection ${collectionName}`);
@@ -112,13 +121,14 @@ export class BDatabase {
112
121
  for (const [name, original] of originals) {
113
122
  clones.set(name, await original.cloneForTransaction());
114
123
  }
124
+ const views = new Map(Array.from(clones, ([name, clone]) => [name, new BTransactionCollection(clone)]));
115
125
  const tx = {
116
126
  getCollection: async (collectionName) => {
117
- const clone = clones.get(canonicalName(collectionName));
118
- if (!clone) {
127
+ const view = views.get(canonicalName(collectionName));
128
+ if (!view) {
119
129
  throw new Error(`collection "${collectionName}" was not declared to this transaction`);
120
130
  }
121
- return clone;
131
+ return view;
122
132
  },
123
133
  };
124
134
  try {
@@ -150,6 +160,7 @@ export class BDatabase {
150
160
  }
151
161
  }
152
162
  finally {
163
+ views.forEach(view => view.end());
153
164
  clones.forEach(clone => clone.markDropped());
154
165
  }
155
166
  });
@@ -260,38 +271,40 @@ export class BCollection {
260
271
  console.error(`bajadab: collection "${this.collectionName}" ${modificationType} handler failed`, error);
261
272
  }
262
273
  }
274
+ async dispatchHandler(fn, modificationType, mode) {
275
+ if (mode === EBHandlerMode.SYNC) {
276
+ await this.invokeHandler(fn, modificationType);
277
+ }
278
+ else {
279
+ this.database.runDetached(() => this.invokeHandler(fn, modificationType));
280
+ }
281
+ }
263
282
  async fireAdd(added) {
264
283
  for (const v of added) {
265
284
  for (const { handler, mode } of this.addHandlers) {
266
- const call = this.invokeHandler(() => handler(v), EBModificationType.ADD);
267
- if (mode === EBHandlerMode.SYNC) {
268
- await call;
269
- }
285
+ await this.dispatchHandler(() => handler(v), EBModificationType.ADD, mode);
270
286
  }
271
287
  }
272
288
  }
273
289
  async fireUpdate(pairs) {
274
290
  for (const [previous, updated] of pairs) {
275
291
  for (const { handler, mode } of this.updateHandlers) {
276
- const call = this.invokeHandler(() => handler(previous, updated), EBModificationType.UPDATE);
277
- if (mode === EBHandlerMode.SYNC) {
278
- await call;
279
- }
292
+ await this.dispatchHandler(() => handler(previous, updated), EBModificationType.UPDATE, mode);
280
293
  }
281
294
  }
282
295
  }
283
296
  async fireDelete(deleted) {
284
297
  for (const v of deleted) {
285
298
  for (const { handler, mode } of this.deleteHandlers) {
286
- const call = this.invokeHandler(() => handler(v), EBModificationType.DELETE);
287
- if (mode === EBHandlerMode.SYNC) {
288
- await call;
289
- }
299
+ await this.dispatchHandler(() => handler(v), EBModificationType.DELETE, mode);
290
300
  }
291
301
  }
292
302
  }
293
303
  async on(modificationType, handler, mode = EBHandlerMode.SYNC) {
294
304
  return this.runProtected(async () => {
305
+ if (this.database.isInTransaction(this.collectionName)) {
306
+ throw new Error(`cannot register a handler on collection "${this.collectionName}" while it is part of a running transaction`);
307
+ }
295
308
  switch (modificationType) {
296
309
  case EBModificationType.ADD: {
297
310
  const h = handler;
@@ -411,17 +424,15 @@ export class BCollection {
411
424
  });
412
425
  }
413
426
  resolveIndexDefinitions() {
414
- this.indexDefinitions = new Map();
415
- if (!this.collectionConfig.indexes) {
416
- return;
417
- }
418
- for (const [indexKey, registryKey] of Object.entries(this.collectionConfig.indexes)) {
427
+ const ret = new Map();
428
+ for (const [indexKey, registryKey] of Object.entries(this.collectionConfig.indexes ?? {})) {
419
429
  const extractor = this.database.functionRegistry?.fetch(registryKey);
420
430
  if (!extractor) {
421
431
  throw new Error(`index key function "${registryKey}" is not registered`);
422
432
  }
423
- this.indexDefinitions.set(indexKey, extractor);
433
+ ret.set(indexKey, extractor);
424
434
  }
435
+ return ret;
425
436
  }
426
437
  async indexKeysFor(v) {
427
438
  const result = [];
@@ -825,6 +836,7 @@ export class BCollection {
825
836
  }
826
837
  async reload() {
827
838
  return this.runProtected(async () => {
839
+ const indexDefinitions = this.resolveIndexDefinitions();
828
840
  switch (this.collectionConfig.memStorageStrategy) {
829
841
  case EBMemStorageStrategy.MAP:
830
842
  this.mapData = await this.database.io.loadMapData(this.collectionID);
@@ -834,10 +846,11 @@ export class BCollection {
834
846
  this.arrayData = await this.database.io.loadArrayData(this.collectionID);
835
847
  break;
836
848
  }
837
- this.resolveIndexDefinitions();
849
+ this.indexDefinitions = indexDefinitions;
850
+ this.dirty = false;
851
+ this.loaded = false;
838
852
  await this.rebuildIndexRuntime();
839
853
  this.loaded = true;
840
- this.dirty = false;
841
854
  });
842
855
  }
843
856
  async unload() {
@@ -888,19 +901,23 @@ export class BCollection {
888
901
  if (this.addHandlers.length > 0 || this.updateHandlers.length > 0 || this.deleteHandlers.length > 0) {
889
902
  clone.txChanges = new Map();
890
903
  }
891
- clone.resolveIndexDefinitions();
892
- await clone.rebuildIndexRuntime();
904
+ clone.indexDefinitions = this.indexDefinitions;
905
+ clone.indexRuntime = new Map(Array.from(this.indexRuntime, ([indexKey, byKey]) => [indexKey, new Map(Array.from(byKey, ([key, bucket]) => [key, new Set(bucket)]))]));
906
+ clone.indexedKeys = new Map(this.indexedKeys);
893
907
  return clone;
894
908
  });
895
909
  }
896
910
  /**
897
- * Writes `clone`'s state to a temp file (see {@link IPreparedWrite}) and computes the handler events for the
911
+ * Writes `clone`'s state to a temp file (see {@link IPreparedWrite}), unless the transaction left it unchanged, and computes the handler events for the
898
912
  * net changes against this collection's current state: one per id the transaction touched, typed by the last
899
913
  * operation on it (`DELETE` if gone, `ADD` if new or last stored via `add()`, `UPDATE` otherwise). Nothing is
900
914
  * applied until `apply()`; call only while already holding this collection's mutex for the whole transaction.
901
915
  */
902
916
  async prepareTransactionCommit(clone) {
903
917
  return this.runProtected(async () => {
918
+ if (!clone.dirty) {
919
+ return UNCHANGED_TRANSACTION_COMMIT;
920
+ }
904
921
  await this.checkLoaded();
905
922
  const added = [];
906
923
  const updated = [];
@@ -956,4 +973,47 @@ export class BCollection {
956
973
  });
957
974
  }
958
975
  }
976
+ class BTransactionCollection {
977
+ clone;
978
+ ended = false;
979
+ constructor(clone) {
980
+ this.clone = clone;
981
+ }
982
+ get collectionName() {
983
+ return this.clone.collectionName;
984
+ }
985
+ get collectionID() {
986
+ return this.clone.collectionID;
987
+ }
988
+ end() {
989
+ this.ended = true;
990
+ }
991
+ active() {
992
+ if (this.ended) {
993
+ throw new Error(`the transaction on collection "${this.clone.collectionName}" has already ended`);
994
+ }
995
+ return this.clone;
996
+ }
997
+ async get(predicate) {
998
+ return this.active().get(predicate);
999
+ }
1000
+ async has(predicate) {
1001
+ return this.active().has(predicate);
1002
+ }
1003
+ async count(predicate) {
1004
+ return this.active().count(predicate);
1005
+ }
1006
+ async getByIndex(indexKey, key) {
1007
+ return this.active().getByIndex(indexKey, key);
1008
+ }
1009
+ async add(...vs) {
1010
+ return this.active().add(...vs);
1011
+ }
1012
+ async update(predicate, updater) {
1013
+ return this.active().update(predicate, updater);
1014
+ }
1015
+ async delete(predicate) {
1016
+ return this.active().delete(predicate);
1017
+ }
1018
+ }
959
1019
  //# sourceMappingURL=basics.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"basics.js","sourceRoot":"","sources":["../src/main/basics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"basics.js","sourceRoot":"","sources":["../src/main/basics.ts"],"names":[],"mappings":"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"}
package/dist/fileio.js CHANGED
@@ -1,4 +1,4 @@
1
- import { join } from "node:path";
1
+ import { isAbsolute, join, relative, resolve, sep } from "node:path";
2
2
  import { chmod, cp, mkdir, readdir, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
3
3
  import { setTimeout } from "node:timers/promises";
4
4
  import { uuidv7 } from "uuidv7";
@@ -12,18 +12,45 @@ const RESTRICTED_DIR_MODE = 0o700;
12
12
  const SNAPSHOT_VERSION_PATTERN = /^\d{8}T\d{9}Z(_[A-Za-z0-9_-]+)?$/;
13
13
  const SNAPSHOT_LABEL_PATTERN = /^[A-Za-z0-9_-]+$/;
14
14
  const RENAME_RETRY_DELAYS_MS = [10, 25, 50, 100];
15
+ const SNAPSHOT_NAME_ATTEMPTS = 100;
15
16
  var FsErrorCode;
16
17
  (function (FsErrorCode) {
17
18
  FsErrorCode["ENOENT"] = "ENOENT";
18
19
  FsErrorCode["EPERM"] = "EPERM";
19
20
  FsErrorCode["EBUSY"] = "EBUSY";
20
21
  FsErrorCode["EACCES"] = "EACCES";
22
+ FsErrorCode["EEXIST"] = "EEXIST";
21
23
  })(FsErrorCode || (FsErrorCode = {}));
22
24
  const RETRYABLE_RENAME_ERRORS = new Set([FsErrorCode.EPERM, FsErrorCode.EBUSY, FsErrorCode.EACCES]);
23
- function snapshotVersionName(label) {
24
- const timestamp = new Date().toISOString().replace(/[-:.]/g, "");
25
+ function isSameOrInside(path, dir) {
26
+ const rel = relative(resolve(dir), resolve(path));
27
+ return !isAbsolute(rel) && rel !== ".." && !rel.startsWith(".." + sep);
28
+ }
29
+ let lastSnapshotMs = 0;
30
+ // strictly increasing within the process, so consecutive snapshots never share a name
31
+ function nextSnapshotMs() {
32
+ lastSnapshotMs = Math.max(Date.now(), lastSnapshotMs + 1);
33
+ return lastSnapshotMs;
34
+ }
35
+ function snapshotVersionName(ms, label) {
36
+ const timestamp = new Date(ms).toISOString().replace(/[-:.]/g, "");
25
37
  return label ? `${timestamp}_${label}` : timestamp;
26
38
  }
39
+ // exclusive mkdir claims the name atomically, also against other processes using the same targetDir
40
+ async function createSnapshotVersionDir(targetDir, label) {
41
+ for (let attempt = 1;; attempt++) {
42
+ const versionName = snapshotVersionName(nextSnapshotMs(), label);
43
+ try {
44
+ await mkdir(join(targetDir, versionName), { mode: RESTRICTED_DIR_MODE });
45
+ return versionName;
46
+ }
47
+ catch (err) {
48
+ if (err.code !== FsErrorCode.EEXIST || attempt >= SNAPSHOT_NAME_ATTEMPTS) {
49
+ throw err;
50
+ }
51
+ }
52
+ }
53
+ }
27
54
  // re-applies the restricted mode explicitly rather than relying on fs.cp() to have preserved it
28
55
  async function restrictPermissions(path) {
29
56
  const info = await stat(path);
@@ -189,8 +216,12 @@ export class IODatabase {
189
216
  if (options?.label !== undefined && !SNAPSHOT_LABEL_PATTERN.test(options.label)) {
190
217
  throw new Error(`snapshot label "${options.label}" must only contain letters, digits, "-" or "_"`);
191
218
  }
219
+ if (isSameOrInside(targetDir, this.basePath)) {
220
+ throw new Error(`snapshot target "${targetDir}" must not be inside the database directory "${this.basePath}"`);
221
+ }
192
222
  await mkdir(targetDir, { recursive: true, mode: RESTRICTED_DIR_MODE });
193
- const versionPath = join(targetDir, snapshotVersionName(options?.label));
223
+ const versionName = await createSnapshotVersionDir(targetDir, options?.label);
224
+ const versionPath = join(targetDir, versionName);
194
225
  try {
195
226
  await cp(this.basePath, versionPath, { recursive: true });
196
227
  await restrictPermissions(versionPath);
@@ -200,18 +231,18 @@ export class IODatabase {
200
231
  throw err;
201
232
  }
202
233
  if (options?.keepLast !== undefined) {
203
- await this.pruneSnapshots(targetDir, options.keepLast);
234
+ await this.pruneSnapshots(targetDir, versionName, options.keepLast);
204
235
  }
205
236
  return versionPath;
206
237
  }
207
238
  // only ever deletes folders matching our own naming scheme, never anything else the caller keeps in targetDir
208
- async pruneSnapshots(targetDir, keepLast) {
239
+ async pruneSnapshots(targetDir, createdVersionName, keepLast) {
209
240
  const entries = await readdir(targetDir, { withFileTypes: true });
210
- const versions = entries
211
- .filter(e => e.isDirectory() && SNAPSHOT_VERSION_PATTERN.test(e.name))
241
+ const olderVersions = entries
242
+ .filter(e => e.isDirectory() && e.name !== createdVersionName && SNAPSHOT_VERSION_PATTERN.test(e.name))
212
243
  .map(e => e.name)
213
244
  .sort();
214
- const toDelete = versions.slice(0, Math.max(0, versions.length - (keepLast + 1)));
245
+ const toDelete = olderVersions.slice(0, Math.max(0, olderVersions.length - keepLast));
215
246
  await Promise.all(toDelete.map(name => rm(join(targetDir, name), { recursive: true, force: true })));
216
247
  }
217
248
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fileio.js","sourceRoot":"","sources":["../src/main/fileio.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fileio.js","sourceRoot":"","sources":["../src/main/fileio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,uBAAuB,GAAG,MAAM,aAAa,CAAC;AAa/E,MAAM,iBAAiB,GAAG,aAAa,CAAC;AACxC,MAAM,2BAA2B,GAAG,OAAO,CAAC;AAC5C,MAAM,8BAA8B,GAAG,OAAO,CAAC;AAC/C,MAAM,uBAAuB,GAAG,WAAW,CAAC;AAC5C,MAAM,oBAAoB,GAAG,KAAK,CAAC;AACnC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAClC,MAAM,wBAAwB,GAAG,kCAAkC,CAAC;AACpE,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AAClD,MAAM,sBAAsB,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;AACjD,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC,IAAK,WAMJ;AAND,WAAK,WAAW;IACZ,gCAAiB,CAAA;IACjB,8BAAe,CAAA;IACf,8BAAe,CAAA;IACf,gCAAiB,CAAA;IACjB,gCAAiB,CAAA;AACrB,CAAC,EANI,WAAW,KAAX,WAAW,QAMf;AAED,MAAM,uBAAuB,GACzB,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;AAOxE,SAAS,cAAc,CAAC,IAAY,EAAE,GAAW;IAC7C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;AAC3E,CAAC;AAED,IAAI,cAAc,GAAG,CAAC,CAAC;AAEvB,sFAAsF;AACtF,SAAS,cAAc;IACnB,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,cAAc,GAAG,CAAC,CAAC,CAAC;IAC1D,OAAO,cAAc,CAAC;AAC1B,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAU,EAAE,KAAc;IACnD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACnE,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,oGAAoG;AACpG,KAAK,UAAU,wBAAwB,CAAC,SAAiB,EAAE,KAAc;IACrE,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,mBAAmB,CAAC,cAAc,EAAE,EAAE,KAAK,CAAC,CAAC;QACjE,IAAI,CAAC;YACD,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;YACzE,OAAO,WAAW,CAAC;QACvB,CAAC;QACD,OAAO,GAAQ,EAAE,CAAC;YACd,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,MAAM,IAAI,OAAO,IAAI,sBAAsB,EAAE,CAAC;gBACvE,MAAM,GAAG,CAAC;YACd,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAED,gGAAgG;AAChG,KAAK,UAAU,mBAAmB,CAAC,IAAY;IAC3C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACrB,MAAM,KAAK,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QACvC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClG,CAAC;SACI,CAAC;QACF,MAAM,KAAK,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;IAC5C,CAAC;AACL,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,EAAU;IACnD,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QAChC,IAAI,CAAC;YACD,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,GAAQ,EAAE,CAAC;YACd,IAAI,OAAO,IAAI,sBAAsB,CAAC,MAAM,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrF,MAAM,GAAG,CAAC;YACd,CAAC;YACD,MAAM,UAAU,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC;QACtD,CAAC;IACL,CAAC;AACL,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,UAAkB,EAAE,IAAY;IAC9D,MAAM,QAAQ,GAAG,GAAG,UAAU,IAAI,MAAM,EAAE,MAAM,CAAC;IACjD,IAAI,CAAC;QACD,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,GAAG,EAAE,CAAC;QACT,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,MAAM,GAAG,CAAC;IACd,CAAC;IACD,OAAO;QACH,MAAM,EAAE,KAAK,IAAI,EAAE;YACf,IAAI,CAAC;gBACD,MAAM,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAChD,CAAC;YACD,OAAO,GAAG,EAAE,CAAC;gBACT,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpC,MAAM,GAAG,CAAC;YACd,CAAC;QACL,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;KAC/C,CAAC;AACN,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,UAAkB,EAAE,IAAY;IAC3D,OAAO,CAAC,MAAM,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,OAAO,UAAU;IACV,QAAQ,CAAS;IACT,SAAS,CAAsB;IACxC,cAAc,CAAmB;IAEzC,YAAmB,QAAgB,EAAE,cAAgC,EAAE,SAA+B;QAClG,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,IAAI,GAAG,EAAE,CAAC;IAC5C,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,EAAU,EAAE,QAAmB;QAC5D,MAAM,IAAI,GAAsB,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,8BAA8B,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAC5I,OAAO,IAAI,WAAW,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACrF,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,gBAAqC;QACpF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QACnD,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACD,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;QAC1D,CAAC;QACD,OAAO,GAAQ,EAAE,CAAC;YACd,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;gBAClC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;gBAC/D,OAAO,IAAI,SAAS,CAAC,IAAI,EAAE,uBAAuB,EAAE,gBAAgB,CAAC,CAAC;YAC1E,CAAC;YACD,MAAM,GAAG,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAAoB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,SAAS,CAAC,MAAM,EAAE;aACb,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;aAChD,OAAO,EAAE,CAAC,CAAC;QACpB,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEM,KAAK,CAAC,KAAK;QACd,MAAM,IAAI,GAAoB;YAC1B,MAAM,EAAE,IAAI,CAAC,cAAc;YAC3B,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC;SAChD,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,EAAE,IAAI,CAAC,CAAC;IACxE,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAU,UAA0B;QAC7D,MAAM,EAAE,GAAG,UAAU,CAAC,YAAY,CAAC;QACnC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,2BAA2B,CAAC,CAAC;QAC7E,MAAM,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC5E,MAAM,IAAI,GAAsB;YAC5B,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;YAC7C,cAAc,EAAE,UAAU,CAAC,cAAc;YACzC,YAAY,EAAE,EAAE;SACnB,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,8BAA8B,CAAC,EAAE,IAAI,CAAC,CAAC;QACtF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,UAAU,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,cAAsB;QAChD,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC9C,IAAI,CAAC,EAAE,EAAE,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,sBAAsB,cAAc,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,2BAA2B,CAAC,CAAC;QAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,8BAA8B,CAAC,CAAC;QAC1E,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACtC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,EAAE,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,YAAoB;QACvC,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,GAAG,2BAA2B,EAAE,uBAAuB,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7I,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,GAAQ,EAAE,CAAC;YACd,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;gBAClC,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,MAAM,GAAG,CAAC;QACd,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,aAAa,CAAI,YAAoB;QAC9C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC/C,OAAO,IAAI,IAAI,EAAE,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,WAAW,CAAI,YAAoB;QAC5C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;IAC5D,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,YAAoB,EAAE,IAAS;QACrD,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,GAAG,2BAA2B,EAAE,uBAAuB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9I,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,YAAoB,EAAE,IAAS;QACnD,OAAO,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACjE,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAU,YAAoB,EAAE,SAAc;QACvE,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAEM,KAAK,CAAC,cAAc,CAAU,YAAoB,EAAE,OAAuB;QAC9E,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IACvE,CAAC;IAEM,KAAK,CAAC,cAAc,CAAU,YAAoB,EAAE,SAAc;QACrE,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC;IAEM,KAAK,CAAC,YAAY,CAAU,YAAoB,EAAE,OAAuB;QAC5E,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IACrE,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,OAA2B;QAChE,IAAI,OAAO,EAAE,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,sCAAsC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,OAAO,EAAE,KAAK,KAAK,SAAS,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9E,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,CAAC,KAAK,iDAAiD,CAAC,CAAC;QACvG,CAAC;QACD,IAAI,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,oBAAoB,SAAS,gDAAgD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QACnH,CAAC;QACD,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,MAAM,wBAAwB,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9E,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACjD,IAAI,CAAC;YACD,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,GAAG,EAAE,CAAC;YACT,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM,GAAG,CAAC;QACd,CAAC;QACD,IAAI,OAAO,EAAE,QAAQ,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,8GAA8G;IACtG,KAAK,CAAC,cAAc,CAAC,SAAiB,EAAE,kBAA0B,EAAE,QAAgB;QACxF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,MAAM,aAAa,GAAG,OAAO;aACxB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,kBAAkB,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aACtG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAChB,IAAI,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC;QACtF,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACzG,CAAC;CACJ;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,gBAAqC;IACrF,OAAO,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;AAC/D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@incoqnito.io/bajadab",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "a lightweight json-based database for small-scale single-machine setups",
5
5
  "homepage": "https://bitbucket.org/incoqnito/bajadab#readme",
6
6
  "bugs": {
@@ -26,22 +26,18 @@
26
26
  "test": "node --import tsx --test-global-setup ./src/tests/tests.global.ts --test --enable-source-maps --experimental-test-coverage --test-reporter=lcov --test-reporter-destination=lcov.info --test-reporter=spec --test-reporter-destination=stdout ./src/tests/**/*.test.ts"
27
27
  },
28
28
  "engines": {
29
- "node": ">= 24"
29
+ "node": ">=26"
30
30
  },
31
31
  "dependencies": {
32
- "@incoqnito.io/ts-iq-core": "^2.2.2",
32
+ "@incoqnito.io/ts-iq-core": "^3.1.0",
33
33
  "uuidv7": "^1.2.1"
34
34
  },
35
35
  "devDependencies": {
36
- "@types/node": "^26.1.2",
36
+ "@types/node": "^26.6.4",
37
37
  "rimraf": "^6.1.3",
38
- "tsx": "^4.23.1",
38
+ "tsx": "^4.23.15",
39
39
  "typescript": "^7.0.2"
40
40
  },
41
- "overrides": {
42
- "minimatch": "^10.2.6",
43
- "glob": "^13.0.6"
44
- },
45
41
  "files": [
46
42
  "dist",
47
43
  "src/main"
package/src/main/base.ts CHANGED
@@ -37,7 +37,7 @@ export enum EBArrayDeletionStrategy {
37
37
  export enum EBAutoFlushStrategy {
38
38
  /** Only on an explicit {@link IBCollection.flush} call. */
39
39
  NO_AUTO_FLUSH = "NO_AUTO_FLUSH",
40
- /** After every mutating call (`add`/`update`/`delete`). */
40
+ /** After every mutating call (`add`/`update`/`delete`). If that write fails, the call rejects, but its change stays applied in memory (written by the next flush) and its handlers don't fire. */
41
41
  ALWAYS_AUTO_FLUSH = "ALWAYS_AUTO_FLUSH",
42
42
  }
43
43
 
@@ -103,7 +103,7 @@ export interface IBDatabase {
103
103
  dropCollection(collectionName: string): Promise<void>;
104
104
  /**
105
105
  * Flushes every loaded collection, then copies the whole database directory into a new, timestamped
106
- * version folder under `targetDir` (created if needed). Blocks all other database operations for the
106
+ * version folder under `targetDir` (created if needed; must not be inside the database directory). Blocks all other database operations for the
107
107
  * duration. See {@link IBSnapshotOptions} for pruning older versions. Returns the new version folder's path.
108
108
  */
109
109
  snapshot(targetDir: string, options?: IBSnapshotOptions): Promise<string>;
@@ -116,7 +116,8 @@ export interface IBDatabase {
116
116
  * added and later deleted within the same transaction fires nothing. If `fn` throws, nothing is applied,
117
117
  * nothing is flushed, and no handler fires.
118
118
  * Only collections named in `collectionNames` can be reached from within `fn`; writing to one of them through
119
- * its regular {@link IBCollection} handle inside `fn` rejects, and so does a nested `transaction()` call.
119
+ * its regular {@link IBCollection} handle inside `fn` rejects, as does registering a handler on it via `on()`
120
+ * and a nested `transaction()` call.
120
121
  * Values mutated in place are shared with the live collection and are neither isolated nor reverted.
121
122
  */
122
123
  transaction(collectionNames: string[], fn: (tx: IBTransaction) => Promise<void>): Promise<void>;
@@ -149,7 +150,7 @@ export interface IHandlerRegistration {
149
150
  export enum EBHandlerMode {
150
151
  /** The triggering `add()`/`update()`/`delete()` call doesn't resolve until this handler has run. Default. */
151
152
  SYNC = "SYNC",
152
- /** The handler runs without the triggering call waiting for it. */
153
+ /** The handler runs without the triggering call waiting for it, once the database operation that triggered it has finished. */
153
154
  ASYNC = "ASYNC",
154
155
  }
155
156
 
@@ -223,7 +224,7 @@ export interface IBTransaction {
223
224
  /**
224
225
  * The transaction-scoped view of `collectionName`. Returns the same instance on repeat calls with the
225
226
  * same (canonicalized) name within one transaction. Throws if `collectionName` wasn't declared to
226
- * {@link IBDatabase.transaction}.
227
+ * {@link IBDatabase.transaction}. The returned view rejects every call once the transaction has ended.
227
228
  */
228
229
  getCollection<T = any>(collectionName: string): Promise<IBTransactionCollection<T>>;
229
230
  }
@@ -1,6 +1,6 @@
1
1
  import { AsyncLocalStorage } from "node:async_hooks";
2
2
  import { uuidv7, } from "uuidv7";
3
- import { runReentrantProtected } from "@incoqnito.io/ts-iq-core";
3
+ import { ReentrantMutex } from "@incoqnito.io/ts-iq-core";
4
4
 
5
5
  import type { IODatabase, IPreparedWrite } from "./fileio.js";
6
6
 
@@ -46,20 +46,26 @@ export interface IPreparedTransactionCommit {
46
46
  fire(): Promise<void>;
47
47
  }
48
48
 
49
+ const UNCHANGED_TRANSACTION_COMMIT: IPreparedTransactionCommit = Object.freeze({
50
+ write: Object.freeze({ commit: async () => { }, discard: async () => { } }),
51
+ apply: () => { },
52
+ fire: async () => { },
53
+ });
54
+
49
55
  /** {@link IBCollectionConfig} used when a collection is created without an explicit one. */
50
- export const DEFAULT_COLLECTION_CONFIG: IBCollectionConfig = {
56
+ export const DEFAULT_COLLECTION_CONFIG: IBCollectionConfig = Object.freeze({
51
57
  arrayDeletionStrategy: EBArrayDeletionStrategy.IN_PLACE,
52
58
  autoIDStrategy: EBAutoIDStrategy.AUTO_ID_UUID,
53
59
  duplicateIDStrategy: EBDuplicateIDStrategy.OVERWRITE,
54
60
  memStorageStrategy: EBMemStorageStrategy.MAP,
55
61
  dirtyUnloadStrategy: EBDirtyUnloadStrategy.FLUSH,
56
62
  autoFlushStrategy: EBAutoFlushStrategy.ALWAYS_AUTO_FLUSH,
57
- };
63
+ });
58
64
 
59
65
  /** {@link IBDatabaseConfig} used when `getDatabase()` creates a fresh database. */
60
- export const DEFAULT_DATABASE_CONFIG: IBDatabaseConfig = {
66
+ export const DEFAULT_DATABASE_CONFIG: IBDatabaseConfig = Object.freeze({
61
67
  defaultCollectionConfig: DEFAULT_COLLECTION_CONFIG,
62
- };
68
+ });
63
69
 
64
70
  export class BDatabase implements IBDatabase {
65
71
  public readonly config: IBDatabaseConfig;
@@ -68,6 +74,7 @@ export class BDatabase implements IBDatabase {
68
74
  readonly functionRegistry?: IBFunctionRegistry;
69
75
  readonly iid = uuidv7();
70
76
  private readonly transactionScope = new AsyncLocalStorage<ReadonlySet<string>>();
77
+ private readonly mutex = new ReentrantMutex(this.iid);
71
78
 
72
79
  public constructor(io: IODatabase, config?: IBDatabaseConfig, functionRegistry?: IBFunctionRegistry) {
73
80
  this.config = { ...(config ?? DEFAULT_DATABASE_CONFIG) };
@@ -75,8 +82,12 @@ export class BDatabase implements IBDatabase {
75
82
  this.functionRegistry = functionRegistry;
76
83
  }
77
84
 
78
- public async runExclusive<R>(fn: () => Promise<R>): Promise<R> {
79
- return runReentrantProtected(this.iid, fn);
85
+ public runExclusive<R>(fn: () => Promise<R>): Promise<R> {
86
+ return this.mutex.run(fn);
87
+ }
88
+
89
+ public runDetached(task: () => Promise<void>): void {
90
+ this.mutex.runAfterRelease(() => { void this.transactionScope.exit(task); });
80
91
  }
81
92
 
82
93
  public isInTransaction(collectionName: string): boolean {
@@ -124,8 +135,8 @@ export class BDatabase implements IBDatabase {
124
135
  const coll: BCollection = this.collections.get(cname) as BCollection;
125
136
  if (coll) {
126
137
  coll.markDropped();
138
+ await this.io.deleteCollection(cname);
127
139
  this.collections.delete(cname);
128
- return this.io.deleteCollection(cname);
129
140
  }
130
141
  else {
131
142
  throw new Error(`no such collection ${collectionName}`);
@@ -160,13 +171,14 @@ export class BDatabase implements IBDatabase {
160
171
  for (const [name, original] of originals) {
161
172
  clones.set(name, await original.cloneForTransaction());
162
173
  }
174
+ const views = new Map(Array.from(clones, ([name, clone]) => [name, new BTransactionCollection(clone)]));
163
175
  const tx: IBTransaction = {
164
176
  getCollection: async <T>(collectionName: string): Promise<IBTransactionCollection<T>> => {
165
- const clone = clones.get(canonicalName(collectionName));
166
- if (!clone) {
177
+ const view = views.get(canonicalName(collectionName));
178
+ if (!view) {
167
179
  throw new Error(`collection "${collectionName}" was not declared to this transaction`);
168
180
  }
169
- return clone as IBTransactionCollection<T>;
181
+ return view as IBTransactionCollection<T>;
170
182
  },
171
183
  };
172
184
  try {
@@ -198,6 +210,7 @@ export class BDatabase implements IBDatabase {
198
210
  }
199
211
  }
200
212
  finally {
213
+ views.forEach(view => view.end());
201
214
  clones.forEach(clone => clone.markDropped());
202
215
  }
203
216
  });
@@ -324,13 +337,19 @@ export class BCollection<T = any> implements IBCollection<T> {
324
337
  }
325
338
  }
326
339
 
340
+ private async dispatchHandler(fn: () => void | Promise<void>, modificationType: EBModificationType, mode: EBHandlerMode): Promise<void> {
341
+ if (mode === EBHandlerMode.SYNC) {
342
+ await this.invokeHandler(fn, modificationType);
343
+ }
344
+ else {
345
+ this.database.runDetached(() => this.invokeHandler(fn, modificationType));
346
+ }
347
+ }
348
+
327
349
  private async fireAdd(added: T[]): Promise<void> {
328
350
  for (const v of added) {
329
351
  for (const { handler, mode } of this.addHandlers) {
330
- const call = this.invokeHandler(() => handler(v), EBModificationType.ADD);
331
- if (mode === EBHandlerMode.SYNC) {
332
- await call;
333
- }
352
+ await this.dispatchHandler(() => handler(v), EBModificationType.ADD, mode);
334
353
  }
335
354
  }
336
355
  }
@@ -338,10 +357,7 @@ export class BCollection<T = any> implements IBCollection<T> {
338
357
  private async fireUpdate(pairs: Array<[T, T]>): Promise<void> {
339
358
  for (const [previous, updated] of pairs) {
340
359
  for (const { handler, mode } of this.updateHandlers) {
341
- const call = this.invokeHandler(() => handler(previous, updated), EBModificationType.UPDATE);
342
- if (mode === EBHandlerMode.SYNC) {
343
- await call;
344
- }
360
+ await this.dispatchHandler(() => handler(previous, updated), EBModificationType.UPDATE, mode);
345
361
  }
346
362
  }
347
363
  }
@@ -349,10 +365,7 @@ export class BCollection<T = any> implements IBCollection<T> {
349
365
  private async fireDelete(deleted: T[]): Promise<void> {
350
366
  for (const v of deleted) {
351
367
  for (const { handler, mode } of this.deleteHandlers) {
352
- const call = this.invokeHandler(() => handler(v), EBModificationType.DELETE);
353
- if (mode === EBHandlerMode.SYNC) {
354
- await call;
355
- }
368
+ await this.dispatchHandler(() => handler(v), EBModificationType.DELETE, mode);
356
369
  }
357
370
  }
358
371
  }
@@ -362,6 +375,9 @@ export class BCollection<T = any> implements IBCollection<T> {
362
375
  public async on(modificationType: EBModificationType.DELETE, handler: TDeleteHandler<T>, mode?: EBHandlerMode): Promise<IHandlerRegistration>;
363
376
  public async on(modificationType: EBModificationType, handler: TAddHandler<T> | TUpdateHandler<T> | TDeleteHandler<T>, mode: EBHandlerMode = EBHandlerMode.SYNC): Promise<IHandlerRegistration> {
364
377
  return this.runProtected(async () => {
378
+ if (this.database.isInTransaction(this.collectionName)) {
379
+ throw new Error(`cannot register a handler on collection "${this.collectionName}" while it is part of a running transaction`);
380
+ }
365
381
  switch (modificationType) {
366
382
  case EBModificationType.ADD: {
367
383
  const h = handler as TAddHandler<T>;
@@ -483,18 +499,16 @@ export class BCollection<T = any> implements IBCollection<T> {
483
499
  });
484
500
  }
485
501
 
486
- private resolveIndexDefinitions(): void {
487
- this.indexDefinitions = new Map();
488
- if (!this.collectionConfig.indexes) {
489
- return;
490
- }
491
- for (const [indexKey, registryKey] of Object.entries(this.collectionConfig.indexes)) {
502
+ private resolveIndexDefinitions(): Map<string, TIndexKeyFunction<T>> {
503
+ const ret = new Map<string, TIndexKeyFunction<T>>();
504
+ for (const [indexKey, registryKey] of Object.entries(this.collectionConfig.indexes ?? {})) {
492
505
  const extractor = this.database.functionRegistry?.fetch(registryKey) as TIndexKeyFunction<T> | undefined;
493
506
  if (!extractor) {
494
507
  throw new Error(`index key function "${registryKey}" is not registered`);
495
508
  }
496
- this.indexDefinitions.set(indexKey, extractor);
509
+ ret.set(indexKey, extractor);
497
510
  }
511
+ return ret;
498
512
  }
499
513
 
500
514
  private async indexKeysFor(v: T): Promise<Array<[string, string[]]>> {
@@ -921,6 +935,7 @@ export class BCollection<T = any> implements IBCollection<T> {
921
935
 
922
936
  public async reload(): Promise<void> {
923
937
  return this.runProtected(async () => {
938
+ const indexDefinitions = this.resolveIndexDefinitions();
924
939
  switch (this.collectionConfig.memStorageStrategy) {
925
940
  case EBMemStorageStrategy.MAP:
926
941
  this.mapData = await this.database.io.loadMapData<T>(this.collectionID);
@@ -930,10 +945,11 @@ export class BCollection<T = any> implements IBCollection<T> {
930
945
  this.arrayData = await this.database.io.loadArrayData<T>(this.collectionID);
931
946
  break;
932
947
  }
933
- this.resolveIndexDefinitions();
948
+ this.indexDefinitions = indexDefinitions;
949
+ this.dirty = false;
950
+ this.loaded = false;
934
951
  await this.rebuildIndexRuntime();
935
952
  this.loaded = true;
936
- this.dirty = false;
937
953
  });
938
954
  }
939
955
 
@@ -987,20 +1003,25 @@ export class BCollection<T = any> implements IBCollection<T> {
987
1003
  if (this.addHandlers.length > 0 || this.updateHandlers.length > 0 || this.deleteHandlers.length > 0) {
988
1004
  clone.txChanges = new Map();
989
1005
  }
990
- clone.resolveIndexDefinitions();
991
- await clone.rebuildIndexRuntime();
1006
+ clone.indexDefinitions = this.indexDefinitions;
1007
+ clone.indexRuntime = new Map(Array.from(this.indexRuntime, ([indexKey, byKey]) =>
1008
+ [indexKey, new Map(Array.from(byKey, ([key, bucket]) => [key, new Set(bucket)]))]));
1009
+ clone.indexedKeys = new Map(this.indexedKeys);
992
1010
  return clone;
993
1011
  });
994
1012
  }
995
1013
 
996
1014
  /**
997
- * Writes `clone`'s state to a temp file (see {@link IPreparedWrite}) and computes the handler events for the
1015
+ * Writes `clone`'s state to a temp file (see {@link IPreparedWrite}), unless the transaction left it unchanged, and computes the handler events for the
998
1016
  * net changes against this collection's current state: one per id the transaction touched, typed by the last
999
1017
  * operation on it (`DELETE` if gone, `ADD` if new or last stored via `add()`, `UPDATE` otherwise). Nothing is
1000
1018
  * applied until `apply()`; call only while already holding this collection's mutex for the whole transaction.
1001
1019
  */
1002
1020
  public async prepareTransactionCommit(clone: BCollection<T>): Promise<IPreparedTransactionCommit> {
1003
1021
  return this.runProtected(async () => {
1022
+ if (!clone.dirty) {
1023
+ return UNCHANGED_TRANSACTION_COMMIT;
1024
+ }
1004
1025
  await this.checkLoaded();
1005
1026
  const added: T[] = [];
1006
1027
  const updated: Array<[T, T]> = [];
@@ -1056,4 +1077,59 @@ export class BCollection<T = any> implements IBCollection<T> {
1056
1077
  });
1057
1078
  }
1058
1079
 
1059
- }
1080
+ }
1081
+ class BTransactionCollection<T = any> implements IBTransactionCollection<T> {
1082
+ private readonly clone: BCollection<T>;
1083
+ private ended: boolean = false;
1084
+
1085
+ public constructor(clone: BCollection<T>) {
1086
+ this.clone = clone;
1087
+ }
1088
+
1089
+ public get collectionName(): string {
1090
+ return this.clone.collectionName;
1091
+ }
1092
+
1093
+ public get collectionID(): string {
1094
+ return this.clone.collectionID;
1095
+ }
1096
+
1097
+ public end(): void {
1098
+ this.ended = true;
1099
+ }
1100
+
1101
+ private active(): BCollection<T> {
1102
+ if (this.ended) {
1103
+ throw new Error(`the transaction on collection "${this.clone.collectionName}" has already ended`);
1104
+ }
1105
+ return this.clone;
1106
+ }
1107
+
1108
+ public async get(predicate?: (v: T) => boolean): Promise<T[]> {
1109
+ return this.active().get(predicate);
1110
+ }
1111
+
1112
+ public async has(predicate: (v: T) => boolean): Promise<boolean> {
1113
+ return this.active().has(predicate);
1114
+ }
1115
+
1116
+ public async count(predicate?: (v: T) => boolean): Promise<number> {
1117
+ return this.active().count(predicate);
1118
+ }
1119
+
1120
+ public async getByIndex(indexKey: string, key: string): Promise<T[]> {
1121
+ return this.active().getByIndex(indexKey, key);
1122
+ }
1123
+
1124
+ public async add(...vs: T[]): Promise<number> {
1125
+ return this.active().add(...vs);
1126
+ }
1127
+
1128
+ public async update(predicate: (v: T) => boolean, updater: (v: T) => Promise<T>): Promise<number> {
1129
+ return this.active().update(predicate, updater);
1130
+ }
1131
+
1132
+ public async delete(predicate: (v: T) => boolean): Promise<number> {
1133
+ return this.active().delete(predicate);
1134
+ }
1135
+ }
@@ -1,4 +1,4 @@
1
- import { join } from "node:path";
1
+ import { isAbsolute, join, relative, resolve, sep } from "node:path";
2
2
  import { chmod, cp, mkdir, readdir, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
3
3
  import { setTimeout } from "node:timers/promises";
4
4
  import { uuidv7 } from "uuidv7";
@@ -26,12 +26,14 @@ const RESTRICTED_DIR_MODE = 0o700;
26
26
  const SNAPSHOT_VERSION_PATTERN = /^\d{8}T\d{9}Z(_[A-Za-z0-9_-]+)?$/;
27
27
  const SNAPSHOT_LABEL_PATTERN = /^[A-Za-z0-9_-]+$/;
28
28
  const RENAME_RETRY_DELAYS_MS = [10, 25, 50, 100];
29
+ const SNAPSHOT_NAME_ATTEMPTS = 100;
29
30
 
30
31
  enum FsErrorCode {
31
32
  ENOENT = "ENOENT",
32
33
  EPERM = "EPERM",
33
34
  EBUSY = "EBUSY",
34
35
  EACCES = "EACCES",
36
+ EEXIST = "EEXIST",
35
37
  }
36
38
 
37
39
  const RETRYABLE_RENAME_ERRORS: ReadonlySet<string> =
@@ -42,11 +44,40 @@ export interface IPreparedWrite {
42
44
  discard(): Promise<void>;
43
45
  }
44
46
 
45
- function snapshotVersionName(label?: string): string {
46
- const timestamp = new Date().toISOString().replace(/[-:.]/g, "");
47
+ function isSameOrInside(path: string, dir: string): boolean {
48
+ const rel = relative(resolve(dir), resolve(path));
49
+ return !isAbsolute(rel) && rel !== ".." && !rel.startsWith(".." + sep);
50
+ }
51
+
52
+ let lastSnapshotMs = 0;
53
+
54
+ // strictly increasing within the process, so consecutive snapshots never share a name
55
+ function nextSnapshotMs(): number {
56
+ lastSnapshotMs = Math.max(Date.now(), lastSnapshotMs + 1);
57
+ return lastSnapshotMs;
58
+ }
59
+
60
+ function snapshotVersionName(ms: number, label?: string): string {
61
+ const timestamp = new Date(ms).toISOString().replace(/[-:.]/g, "");
47
62
  return label ? `${timestamp}_${label}` : timestamp;
48
63
  }
49
64
 
65
+ // exclusive mkdir claims the name atomically, also against other processes using the same targetDir
66
+ async function createSnapshotVersionDir(targetDir: string, label?: string): Promise<string> {
67
+ for (let attempt = 1; ; attempt++) {
68
+ const versionName = snapshotVersionName(nextSnapshotMs(), label);
69
+ try {
70
+ await mkdir(join(targetDir, versionName), { mode: RESTRICTED_DIR_MODE });
71
+ return versionName;
72
+ }
73
+ catch (err: any) {
74
+ if (err.code !== FsErrorCode.EEXIST || attempt >= SNAPSHOT_NAME_ATTEMPTS) {
75
+ throw err;
76
+ }
77
+ }
78
+ }
79
+ }
80
+
50
81
  // re-applies the restricted mode explicitly rather than relying on fs.cp() to have preserved it
51
82
  async function restrictPermissions(path: string): Promise<void> {
52
83
  const info = await stat(path);
@@ -233,8 +264,12 @@ export class IODatabase {
233
264
  if (options?.label !== undefined && !SNAPSHOT_LABEL_PATTERN.test(options.label)) {
234
265
  throw new Error(`snapshot label "${options.label}" must only contain letters, digits, "-" or "_"`);
235
266
  }
267
+ if (isSameOrInside(targetDir, this.basePath)) {
268
+ throw new Error(`snapshot target "${targetDir}" must not be inside the database directory "${this.basePath}"`);
269
+ }
236
270
  await mkdir(targetDir, { recursive: true, mode: RESTRICTED_DIR_MODE });
237
- const versionPath = join(targetDir, snapshotVersionName(options?.label));
271
+ const versionName = await createSnapshotVersionDir(targetDir, options?.label);
272
+ const versionPath = join(targetDir, versionName);
238
273
  try {
239
274
  await cp(this.basePath, versionPath, { recursive: true });
240
275
  await restrictPermissions(versionPath);
@@ -244,19 +279,19 @@ export class IODatabase {
244
279
  throw err;
245
280
  }
246
281
  if (options?.keepLast !== undefined) {
247
- await this.pruneSnapshots(targetDir, options.keepLast);
282
+ await this.pruneSnapshots(targetDir, versionName, options.keepLast);
248
283
  }
249
284
  return versionPath;
250
285
  }
251
286
 
252
287
  // only ever deletes folders matching our own naming scheme, never anything else the caller keeps in targetDir
253
- private async pruneSnapshots(targetDir: string, keepLast: number): Promise<void> {
288
+ private async pruneSnapshots(targetDir: string, createdVersionName: string, keepLast: number): Promise<void> {
254
289
  const entries = await readdir(targetDir, { withFileTypes: true });
255
- const versions = entries
256
- .filter(e => e.isDirectory() && SNAPSHOT_VERSION_PATTERN.test(e.name))
290
+ const olderVersions = entries
291
+ .filter(e => e.isDirectory() && e.name !== createdVersionName && SNAPSHOT_VERSION_PATTERN.test(e.name))
257
292
  .map(e => e.name)
258
293
  .sort();
259
- const toDelete = versions.slice(0, Math.max(0, versions.length - (keepLast + 1)));
294
+ const toDelete = olderVersions.slice(0, Math.max(0, olderVersions.length - keepLast));
260
295
  await Promise.all(toDelete.map(name => rm(join(targetDir, name), { recursive: true, force: true })));
261
296
  }
262
297
  }