@brightchain/brightchain-lib 0.18.0 → 0.19.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.
Files changed (103) hide show
  1. package/package.json +1 -1
  2. package/src/lib/db/aggregation.d.ts +20 -0
  3. package/src/lib/db/aggregation.d.ts.map +1 -0
  4. package/src/lib/db/aggregation.js +407 -0
  5. package/src/lib/db/aggregation.js.map +1 -0
  6. package/src/lib/db/collection.d.ts +315 -0
  7. package/src/lib/db/collection.d.ts.map +1 -0
  8. package/src/lib/db/collection.js +1054 -0
  9. package/src/lib/db/collection.js.map +1 -0
  10. package/src/lib/db/cursor.d.ts +51 -0
  11. package/src/lib/db/cursor.d.ts.map +1 -0
  12. package/src/lib/db/cursor.js +100 -0
  13. package/src/lib/db/cursor.js.map +1 -0
  14. package/src/lib/db/errors.d.ts +83 -0
  15. package/src/lib/db/errors.d.ts.map +1 -0
  16. package/src/lib/db/errors.js +103 -0
  17. package/src/lib/db/errors.js.map +1 -0
  18. package/src/lib/db/inMemoryDatabase.d.ts +135 -0
  19. package/src/lib/db/inMemoryDatabase.d.ts.map +1 -0
  20. package/src/lib/db/inMemoryDatabase.js +258 -0
  21. package/src/lib/db/inMemoryDatabase.js.map +1 -0
  22. package/src/lib/db/inMemoryHeadRegistry.d.ts +33 -0
  23. package/src/lib/db/inMemoryHeadRegistry.d.ts.map +1 -0
  24. package/src/lib/db/inMemoryHeadRegistry.js +83 -0
  25. package/src/lib/db/inMemoryHeadRegistry.js.map +1 -0
  26. package/src/lib/db/index.d.ts +14 -0
  27. package/src/lib/db/index.d.ts.map +1 -0
  28. package/src/lib/db/index.js +18 -0
  29. package/src/lib/db/index.js.map +1 -0
  30. package/src/lib/db/indexing.d.ts +133 -0
  31. package/src/lib/db/indexing.d.ts.map +1 -0
  32. package/src/lib/db/indexing.js +287 -0
  33. package/src/lib/db/indexing.js.map +1 -0
  34. package/src/lib/db/queryEngine.d.ts +50 -0
  35. package/src/lib/db/queryEngine.d.ts.map +1 -0
  36. package/src/lib/db/queryEngine.js +461 -0
  37. package/src/lib/db/queryEngine.js.map +1 -0
  38. package/src/lib/db/schemaValidation.d.ts +41 -0
  39. package/src/lib/db/schemaValidation.d.ts.map +1 -0
  40. package/src/lib/db/schemaValidation.js +322 -0
  41. package/src/lib/db/schemaValidation.js.map +1 -0
  42. package/src/lib/db/transaction.d.ts +88 -0
  43. package/src/lib/db/transaction.d.ts.map +1 -0
  44. package/src/lib/db/transaction.js +112 -0
  45. package/src/lib/db/transaction.js.map +1 -0
  46. package/src/lib/db/types.d.ts +11 -0
  47. package/src/lib/db/types.d.ts.map +1 -0
  48. package/src/lib/db/types.js +11 -0
  49. package/src/lib/db/types.js.map +1 -0
  50. package/src/lib/db/updateEngine.d.ts +20 -0
  51. package/src/lib/db/updateEngine.d.ts.map +1 -0
  52. package/src/lib/db/updateEngine.js +193 -0
  53. package/src/lib/db/updateEngine.js.map +1 -0
  54. package/src/lib/db/uuidGenerator.d.ts +13 -0
  55. package/src/lib/db/uuidGenerator.d.ts.map +1 -0
  56. package/src/lib/db/uuidGenerator.js +34 -0
  57. package/src/lib/db/uuidGenerator.js.map +1 -0
  58. package/src/lib/errors/memberIndexSchemaValidationError.d.ts +6 -0
  59. package/src/lib/errors/memberIndexSchemaValidationError.d.ts.map +1 -0
  60. package/src/lib/errors/memberIndexSchemaValidationError.js +15 -0
  61. package/src/lib/errors/memberIndexSchemaValidationError.js.map +1 -0
  62. package/src/lib/index.d.ts +12 -0
  63. package/src/lib/index.d.ts.map +1 -1
  64. package/src/lib/index.js +55 -1
  65. package/src/lib/index.js.map +1 -1
  66. package/src/lib/interfaces/index.d.ts +1 -0
  67. package/src/lib/interfaces/index.d.ts.map +1 -1
  68. package/src/lib/interfaces/index.js.map +1 -1
  69. package/src/lib/interfaces/member-init-config.d.ts +20 -0
  70. package/src/lib/interfaces/member-init-config.d.ts.map +1 -0
  71. package/src/lib/interfaces/member-init-config.js +3 -0
  72. package/src/lib/interfaces/member-init-config.js.map +1 -0
  73. package/src/lib/interfaces/storage/index.d.ts +5 -0
  74. package/src/lib/interfaces/storage/index.d.ts.map +1 -1
  75. package/src/lib/interfaces/storage/index.js.map +1 -1
  76. package/src/lib/interfaces/storage/memberIndexSchema.d.ts +11 -0
  77. package/src/lib/interfaces/storage/memberIndexSchema.d.ts.map +1 -0
  78. package/src/lib/interfaces/storage/memberIndexSchema.js +26 -0
  79. package/src/lib/interfaces/storage/memberIndexSchema.js.map +1 -0
  80. package/src/lib/interfaces/storage/mnemonicSchema.d.ts +10 -0
  81. package/src/lib/interfaces/storage/mnemonicSchema.d.ts.map +1 -0
  82. package/src/lib/interfaces/storage/mnemonicSchema.js +22 -0
  83. package/src/lib/interfaces/storage/mnemonicSchema.js.map +1 -0
  84. package/src/lib/interfaces/storage/roleSchema.d.ts +10 -0
  85. package/src/lib/interfaces/storage/roleSchema.d.ts.map +1 -0
  86. package/src/lib/interfaces/storage/roleSchema.js +45 -0
  87. package/src/lib/interfaces/storage/roleSchema.js.map +1 -0
  88. package/src/lib/interfaces/storage/userRoleSchema.d.ts +10 -0
  89. package/src/lib/interfaces/storage/userRoleSchema.d.ts.map +1 -0
  90. package/src/lib/interfaces/storage/userRoleSchema.js +35 -0
  91. package/src/lib/interfaces/storage/userRoleSchema.js.map +1 -0
  92. package/src/lib/interfaces/storage/userSchema.d.ts +12 -0
  93. package/src/lib/interfaces/storage/userSchema.d.ts.map +1 -0
  94. package/src/lib/interfaces/storage/userSchema.js +62 -0
  95. package/src/lib/interfaces/storage/userSchema.js.map +1 -0
  96. /package/{BLOCK_COVERAGE_AUDIT.md → brightchain-lib/BLOCK_COVERAGE_AUDIT.md} +0 -0
  97. /package/{BROWSER_COMPAT.md → brightchain-lib/BROWSER_COMPAT.md} +0 -0
  98. /package/{DEPRECATIONS.md → brightchain-lib/DEPRECATIONS.md} +0 -0
  99. /package/{DEPRECATIONS_REMOVED.md → brightchain-lib/DEPRECATIONS_REMOVED.md} +0 -0
  100. /package/{MIGRATION.md → brightchain-lib/MIGRATION.md} +0 -0
  101. /package/{NAMING_AUDIT.md → brightchain-lib/NAMING_AUDIT.md} +0 -0
  102. /package/{NAMING_CONVENTIONS.md → brightchain-lib/NAMING_CONVENTIONS.md} +0 -0
  103. /package/{README.md → brightchain-lib/README.md} +0 -0
@@ -0,0 +1,258 @@
1
+ "use strict";
2
+ /**
3
+ * InMemoryDatabase – a platform-agnostic IDatabase implementation.
4
+ *
5
+ * Uses MemoryBlockStore and InMemoryHeadRegistry for storage, requiring
6
+ * no Node.js APIs. This is the base class that BrightChainDb in
7
+ * brightchain-db extends to add disk persistence.
8
+ *
9
+ * Usage:
10
+ * const db = new InMemoryDatabase(blockStore, { name: 'mydb' });
11
+ * await db.connect();
12
+ * const users = db.collection('users');
13
+ * await users.insertOne({ name: 'Alice' });
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.InMemoryDatabase = void 0;
17
+ const collection_1 = require("./collection");
18
+ const inMemoryHeadRegistry_1 = require("./inMemoryHeadRegistry");
19
+ const transaction_1 = require("./transaction");
20
+ const uuidGenerator_1 = require("./uuidGenerator");
21
+ /**
22
+ * The main in-memory database driver – analogous to MongoDB's `Db` class.
23
+ *
24
+ * Designed to be extended by `BrightChainDb` in brightchain-db which adds
25
+ * persistence-specific options (dataDir, poolId, PersistentHeadRegistry).
26
+ */
27
+ class InMemoryDatabase {
28
+ constructor(blockStore, options) {
29
+ this.collections = new Map();
30
+ /** Server-side cursor sessions for REST pagination */
31
+ this.cursorSessions = new Map();
32
+ /** Connection state for IDatabase conformance */
33
+ this._connected = false;
34
+ this.store = blockStore;
35
+ this.name = options?.name ?? 'brightchain';
36
+ this.headRegistry = options?.headRegistry ?? new inMemoryHeadRegistry_1.InMemoryHeadRegistry();
37
+ this.uuidGenerator = options?.uuidGenerator ?? (0, uuidGenerator_1.createDefaultUuidGenerator)();
38
+ this.cursorTimeoutMs = options?.cursorTimeoutMs ?? 300000;
39
+ }
40
+ /**
41
+ * Connect to the backing store.
42
+ * Block storage does not require a network connection, so the URI is
43
+ * accepted but ignored. Calling connect on an already-connected instance
44
+ * completes without error (idempotent).
45
+ */
46
+ async connect(_uri) {
47
+ this._connected = true;
48
+ }
49
+ /**
50
+ * Disconnect from the backing store.
51
+ * Calling disconnect on an already-disconnected instance completes
52
+ * without error (idempotent).
53
+ */
54
+ async disconnect() {
55
+ this._connected = false;
56
+ }
57
+ /**
58
+ * Whether the store is currently connected.
59
+ */
60
+ isConnected() {
61
+ return this._connected;
62
+ }
63
+ /**
64
+ * Get (or create) a collection by name.
65
+ * Collections are created lazily – no explicit create step is needed.
66
+ */
67
+ collection(name, options) {
68
+ if (!this.collections.has(name)) {
69
+ const coll = new collection_1.Collection(name, this.store, this.name, this.headRegistry, options, this.uuidGenerator);
70
+ // Wire up cross-collection resolver for $lookup
71
+ coll.setCollectionResolver((collName) => this.collection(collName));
72
+ this.collections.set(name, coll);
73
+ }
74
+ return this.collections.get(name);
75
+ }
76
+ /**
77
+ * Expose the head registry for components that need to read head block IDs
78
+ * (e.g. CBLIndex for FEC parity generation on metadata blocks).
79
+ */
80
+ getHeadRegistry() {
81
+ return this.headRegistry;
82
+ }
83
+ /**
84
+ * List all known collection names.
85
+ */
86
+ listCollections() {
87
+ return Array.from(this.collections.keys());
88
+ }
89
+ /**
90
+ * Drop a collection – removes all documents and indexes.
91
+ */
92
+ async dropCollection(name) {
93
+ const coll = this.collections.get(name);
94
+ if (!coll)
95
+ return false;
96
+ await coll.drop();
97
+ this.collections.delete(name);
98
+ return true;
99
+ }
100
+ /**
101
+ * Drop the entire database.
102
+ * Clears all collections. Subclasses may add pool management.
103
+ */
104
+ async dropDatabase() {
105
+ this.collections.clear();
106
+ }
107
+ /**
108
+ * Start a client session for transaction support.
109
+ *
110
+ * Usage:
111
+ * const session = db.startSession();
112
+ * session.startTransaction();
113
+ * try {
114
+ * await coll.insertOne(doc, { session });
115
+ * await session.commitTransaction();
116
+ * } catch {
117
+ * await session.abortTransaction();
118
+ * } finally {
119
+ * session.endSession();
120
+ * }
121
+ */
122
+ startSession() {
123
+ const commitCallback = async (journal) => {
124
+ for (const op of journal) {
125
+ const coll = this.collection(op.collection);
126
+ switch (op.type) {
127
+ case 'insert':
128
+ await coll._txInsert(op.doc);
129
+ break;
130
+ case 'update':
131
+ await coll._txUpdate(op.docId, op.after);
132
+ break;
133
+ case 'delete':
134
+ await coll._txDelete(op.docId, op.doc);
135
+ break;
136
+ }
137
+ }
138
+ };
139
+ const rollbackCallback = async (journal) => {
140
+ // Roll back in reverse order.
141
+ // Copy-on-write: rollback only restores doc-index mappings.
142
+ // Blocks written during the failed commit are left as orphans in
143
+ // the store — they are immutable and harmless.
144
+ for (let i = journal.length - 1; i >= 0; i--) {
145
+ const op = journal[i];
146
+ const coll = this.collection(op.collection);
147
+ try {
148
+ switch (op.type) {
149
+ case 'insert':
150
+ // Remove the new mapping (block stays in store)
151
+ await coll._txRollbackInsert(op.doc._id);
152
+ break;
153
+ case 'update':
154
+ // Restore old mapping (old block still in store — CoW)
155
+ await coll._txRollbackUpdate(op.docId, op.before);
156
+ break;
157
+ case 'delete':
158
+ // Restore old mapping (old block still in store — CoW)
159
+ await coll._txRollbackDelete(op.doc);
160
+ break;
161
+ }
162
+ }
163
+ catch {
164
+ // Best-effort rollback
165
+ }
166
+ }
167
+ };
168
+ return new transaction_1.DbSession(commitCallback, rollbackCallback, this.uuidGenerator);
169
+ }
170
+ /**
171
+ * Convenience: run a callback within a transaction.
172
+ * Automatically commits on success, aborts on error.
173
+ */
174
+ async withTransaction(fn) {
175
+ const session = this.startSession();
176
+ session.startTransaction();
177
+ try {
178
+ const result = await fn(session);
179
+ await session.commitTransaction();
180
+ return result;
181
+ }
182
+ catch (err) {
183
+ // Only abort if the transaction is still active.
184
+ // commitTransaction() clears inTransaction in its finally block, so if
185
+ // the error came from commitTransaction itself the abort is already done.
186
+ if (session.inTransaction) {
187
+ await session.abortTransaction();
188
+ }
189
+ throw err;
190
+ }
191
+ finally {
192
+ session.endSession();
193
+ }
194
+ }
195
+ // ═══════════════════════════════════════════════════════
196
+ // Server-side cursor sessions (for REST pagination)
197
+ // ═══════════════════════════════════════════════════════
198
+ /**
199
+ * Create a server-side cursor session for paginated access.
200
+ */
201
+ createCursorSession(params) {
202
+ this.cleanExpiredCursors();
203
+ const id = this.uuidGenerator();
204
+ const cursor = {
205
+ ...params,
206
+ id,
207
+ lastAccessed: Date.now(),
208
+ };
209
+ this.cursorSessions.set(id, cursor);
210
+ return cursor;
211
+ }
212
+ /**
213
+ * Get a cursor session by ID and refresh its last-accessed timestamp.
214
+ * Returns null if the cursor has expired or doesn't exist.
215
+ */
216
+ getCursorSession(cursorId) {
217
+ const cursor = this.cursorSessions.get(cursorId);
218
+ if (!cursor)
219
+ return null;
220
+ if (Date.now() - cursor.lastAccessed > this.cursorTimeoutMs) {
221
+ this.cursorSessions.delete(cursorId);
222
+ return null;
223
+ }
224
+ cursor.lastAccessed = Date.now();
225
+ return cursor;
226
+ }
227
+ /**
228
+ * Advance cursor position and return next batch of document IDs.
229
+ */
230
+ getNextBatch(cursorId) {
231
+ const cursor = this.getCursorSession(cursorId);
232
+ if (!cursor)
233
+ return null;
234
+ const start = cursor.position;
235
+ const end = Math.min(start + cursor.batchSize, cursor.documentIds.length);
236
+ cursor.position = end;
237
+ return cursor.documentIds.slice(start, end);
238
+ }
239
+ /**
240
+ * Close and remove a cursor session.
241
+ */
242
+ closeCursorSession(cursorId) {
243
+ return this.cursorSessions.delete(cursorId);
244
+ }
245
+ /**
246
+ * Clean up expired cursor sessions.
247
+ */
248
+ cleanExpiredCursors() {
249
+ const now = Date.now();
250
+ for (const [id, cursor] of this.cursorSessions.entries()) {
251
+ if (now - cursor.lastAccessed > this.cursorTimeoutMs) {
252
+ this.cursorSessions.delete(id);
253
+ }
254
+ }
255
+ }
256
+ }
257
+ exports.InMemoryDatabase = InMemoryDatabase;
258
+ //# sourceMappingURL=inMemoryDatabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inMemoryDatabase.js","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/db/inMemoryDatabase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * In-memory HeadRegistry implementation.
3
+ *
4
+ * Preserves the existing HeadRegistry behavior (pure in-memory, no disk I/O)
5
+ * while conforming to the IHeadRegistry interface. Mutating methods return
6
+ * resolved Promises for interface compatibility with persistent implementations.
7
+ *
8
+ * Use `createIsolated()` for test scenarios that need an independent registry.
9
+ */
10
+ import type { DeferredHeadUpdate, IHeadRegistry } from '../interfaces/storage/headRegistry';
11
+ export declare class InMemoryHeadRegistry implements IHeadRegistry {
12
+ private readonly heads;
13
+ private readonly timestamps;
14
+ private readonly deferred;
15
+ private makeKey;
16
+ getHead(dbName: string, collectionName: string): string | undefined;
17
+ setHead(dbName: string, collectionName: string, blockId: string): Promise<void>;
18
+ removeHead(dbName: string, collectionName: string): Promise<void>;
19
+ clear(): Promise<void>;
20
+ load(): Promise<void>;
21
+ getAllHeads(): Map<string, string>;
22
+ getHeadTimestamp(dbName: string, collectionName: string): Date | undefined;
23
+ mergeHeadUpdate(dbName: string, collectionName: string, blockId: string, timestamp: Date): Promise<boolean>;
24
+ deferHeadUpdate(dbName: string, collectionName: string, blockId: string, timestamp: Date): Promise<void>;
25
+ applyDeferredUpdates(blockId: string): Promise<number>;
26
+ getDeferredUpdates(): DeferredHeadUpdate[];
27
+ /**
28
+ * Factory method that creates an independent InMemoryHeadRegistry instance.
29
+ * Useful for tests that need isolated state.
30
+ */
31
+ static createIsolated(): InMemoryHeadRegistry;
32
+ }
33
+ //# sourceMappingURL=inMemoryHeadRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inMemoryHeadRegistry.d.ts","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/db/inMemoryHeadRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EACV,kBAAkB,EAClB,aAAa,EACd,MAAM,oCAAoC,CAAC;AAE5C,qBAAa,oBAAqB,YAAW,aAAa;IACxD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IACnD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA2B;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IAErD,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI7D,OAAO,CACX,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAMV,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAIlC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAIpE,eAAe,CACnB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,IAAI,GACd,OAAO,CAAC,OAAO,CAAC;IAeb,eAAe,CACnB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,IAAI,GACd,OAAO,CAAC,IAAI,CAAC;IAIV,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuB5D,kBAAkB,IAAI,kBAAkB,EAAE;IAI1C;;;OAGG;IACH,MAAM,CAAC,cAAc,IAAI,oBAAoB;CAG9C"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InMemoryHeadRegistry = void 0;
4
+ class InMemoryHeadRegistry {
5
+ constructor() {
6
+ this.heads = new Map();
7
+ this.timestamps = new Map();
8
+ this.deferred = [];
9
+ }
10
+ makeKey(dbName, collectionName) {
11
+ return `${dbName}:${collectionName}`;
12
+ }
13
+ getHead(dbName, collectionName) {
14
+ return this.heads.get(this.makeKey(dbName, collectionName));
15
+ }
16
+ async setHead(dbName, collectionName, blockId) {
17
+ const key = this.makeKey(dbName, collectionName);
18
+ this.heads.set(key, blockId);
19
+ this.timestamps.set(key, new Date());
20
+ }
21
+ async removeHead(dbName, collectionName) {
22
+ const key = this.makeKey(dbName, collectionName);
23
+ this.heads.delete(key);
24
+ this.timestamps.delete(key);
25
+ }
26
+ async clear() {
27
+ this.heads.clear();
28
+ this.timestamps.clear();
29
+ this.deferred.length = 0;
30
+ }
31
+ async load() {
32
+ // No-op for in-memory implementation
33
+ }
34
+ getAllHeads() {
35
+ return new Map(this.heads);
36
+ }
37
+ getHeadTimestamp(dbName, collectionName) {
38
+ return this.timestamps.get(this.makeKey(dbName, collectionName));
39
+ }
40
+ async mergeHeadUpdate(dbName, collectionName, blockId, timestamp) {
41
+ const key = this.makeKey(dbName, collectionName);
42
+ const localTimestamp = this.timestamps.get(key);
43
+ // If no local head exists, or the remote timestamp is strictly newer, apply
44
+ if (!localTimestamp || timestamp.getTime() > localTimestamp.getTime()) {
45
+ this.heads.set(key, blockId);
46
+ this.timestamps.set(key, timestamp);
47
+ return true;
48
+ }
49
+ // Local is same age or newer — reject
50
+ return false;
51
+ }
52
+ async deferHeadUpdate(dbName, collectionName, blockId, timestamp) {
53
+ this.deferred.push({ dbName, collectionName, blockId, timestamp });
54
+ }
55
+ async applyDeferredUpdates(blockId) {
56
+ let applied = 0;
57
+ const remaining = [];
58
+ for (const update of this.deferred) {
59
+ if (update.blockId === blockId) {
60
+ await this.mergeHeadUpdate(update.dbName, update.collectionName, update.blockId, update.timestamp);
61
+ applied++;
62
+ }
63
+ else {
64
+ remaining.push(update);
65
+ }
66
+ }
67
+ this.deferred.length = 0;
68
+ this.deferred.push(...remaining);
69
+ return applied;
70
+ }
71
+ getDeferredUpdates() {
72
+ return [...this.deferred];
73
+ }
74
+ /**
75
+ * Factory method that creates an independent InMemoryHeadRegistry instance.
76
+ * Useful for tests that need isolated state.
77
+ */
78
+ static createIsolated() {
79
+ return new InMemoryHeadRegistry();
80
+ }
81
+ }
82
+ exports.InMemoryHeadRegistry = InMemoryHeadRegistry;
83
+ //# sourceMappingURL=inMemoryHeadRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inMemoryHeadRegistry.js","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/db/inMemoryHeadRegistry.ts"],"names":[],"mappings":";;;AAcA,MAAa,oBAAoB;IAAjC;QACmB,UAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;QAClC,eAAU,GAAG,IAAI,GAAG,EAAgB,CAAC;QACrC,aAAQ,GAAyB,EAAE,CAAC;IA2GvD,CAAC;IAzGS,OAAO,CAAC,MAAc,EAAE,cAAsB;QACpD,OAAO,GAAG,MAAM,IAAI,cAAc,EAAE,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,MAAc,EAAE,cAAsB;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,OAAO,CACX,MAAc,EACd,cAAsB,EACtB,OAAe;QAEf,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,cAAsB;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,IAAI;QACR,qCAAqC;IACvC,CAAC;IAED,WAAW;QACT,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,gBAAgB,CAAC,MAAc,EAAE,cAAsB;QACrD,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,MAAc,EACd,cAAsB,EACtB,OAAe,EACf,SAAe;QAEf,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QACjD,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEhD,4EAA4E;QAC5E,IAAI,CAAC,cAAc,IAAI,SAAS,CAAC,OAAO,EAAE,GAAG,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC;YACtE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACpC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,sCAAsC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,MAAc,EACd,cAAsB,EACtB,OAAe,EACf,SAAe;QAEf,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,OAAe;QACxC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,SAAS,GAAyB,EAAE,CAAC;QAE3C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBAC/B,MAAM,IAAI,CAAC,eAAe,CACxB,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,cAAc,EACrB,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,SAAS,CACjB,CAAC;gBACF,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;QACjC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,kBAAkB;QAChB,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,cAAc;QACnB,OAAO,IAAI,oBAAoB,EAAE,CAAC;IACpC,CAAC;CACF;AA9GD,oDA8GC"}
@@ -0,0 +1,14 @@
1
+ export * from './aggregation';
2
+ export * from './collection';
3
+ export * from './cursor';
4
+ export * from './errors';
5
+ export * from './indexing';
6
+ export * from './inMemoryDatabase';
7
+ export * from './inMemoryHeadRegistry';
8
+ export * from './queryEngine';
9
+ export * from './schemaValidation';
10
+ export * from './transaction';
11
+ export * from './types';
12
+ export * from './updateEngine';
13
+ export * from './uuidGenerator';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/db/index.ts"],"names":[],"mappings":"AACA,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ // db barrel – types & utilities first, building blocks, then higher-level components
5
+ tslib_1.__exportStar(require("./aggregation"), exports);
6
+ tslib_1.__exportStar(require("./collection"), exports);
7
+ tslib_1.__exportStar(require("./cursor"), exports);
8
+ tslib_1.__exportStar(require("./errors"), exports);
9
+ tslib_1.__exportStar(require("./indexing"), exports);
10
+ tslib_1.__exportStar(require("./inMemoryDatabase"), exports);
11
+ tslib_1.__exportStar(require("./inMemoryHeadRegistry"), exports);
12
+ tslib_1.__exportStar(require("./queryEngine"), exports);
13
+ tslib_1.__exportStar(require("./schemaValidation"), exports);
14
+ tslib_1.__exportStar(require("./transaction"), exports);
15
+ tslib_1.__exportStar(require("./types"), exports);
16
+ tslib_1.__exportStar(require("./updateEngine"), exports);
17
+ tslib_1.__exportStar(require("./uuidGenerator"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/db/index.ts"],"names":[],"mappings":";;;AAAA,qFAAqF;AACrF,wDAA8B;AAC9B,uDAA6B;AAC7B,mDAAyB;AACzB,mDAAyB;AACzB,qDAA2B;AAC3B,6DAAmC;AACnC,iEAAuC;AACvC,wDAA8B;AAC9B,6DAAmC;AACnC,wDAA8B;AAC9B,kDAAwB;AACxB,yDAA+B;AAC/B,0DAAgC"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * In-memory index engine for fast document lookups.
3
+ *
4
+ * Supports single-field and compound indexes with optional uniqueness.
5
+ * Indexes are stored as sorted maps from stringified key values to sets of document IDs.
6
+ */
7
+ import type { IndexOptions, IndexSpec } from '@digitaldefiance/suite-core-lib';
8
+ import type { BsonDocument, DocumentId } from '../interfaces/storage/documentTypes';
9
+ /**
10
+ * Represents a single index on a collection.
11
+ */
12
+ export declare class CollectionIndex {
13
+ /** Name of the index */
14
+ readonly name: string;
15
+ /** Fields and sort direction */
16
+ readonly spec: IndexSpec;
17
+ /** Whether the index enforces uniqueness */
18
+ readonly unique: boolean;
19
+ /** Whether to skip documents missing the indexed field */
20
+ readonly sparse: boolean;
21
+ /**
22
+ * Map from stringified key → Set of document IDs.
23
+ * For unique indexes the set will have at most 1 entry.
24
+ */
25
+ private readonly entries;
26
+ constructor(spec: IndexSpec, options?: IndexOptions);
27
+ /**
28
+ * Extract the index key from a document.
29
+ * Returns `undefined` if the document is missing a required field (and the index is sparse).
30
+ */
31
+ private extractKey;
32
+ /**
33
+ * Add a document to the index.
34
+ * @throws Error if the index is unique and a duplicate key is found.
35
+ */
36
+ addDocument(doc: BsonDocument): void;
37
+ /**
38
+ * Remove a document from the index.
39
+ */
40
+ removeDocument(doc: BsonDocument): void;
41
+ /**
42
+ * Look up document IDs by exact field values.
43
+ * Returns `undefined` if the query cannot use this index.
44
+ */
45
+ lookup(query: Record<string, unknown>): Set<DocumentId> | undefined;
46
+ /**
47
+ * Get all document IDs in the index.
48
+ */
49
+ allIds(): Set<DocumentId>;
50
+ /**
51
+ * Clear the index.
52
+ */
53
+ clear(): void;
54
+ /**
55
+ * Get the number of entries in the index.
56
+ */
57
+ get size(): number;
58
+ /**
59
+ * Serialize the index metadata for persistence.
60
+ */
61
+ toJSON(): {
62
+ name: string;
63
+ spec: IndexSpec;
64
+ unique: boolean;
65
+ sparse: boolean;
66
+ };
67
+ }
68
+ /**
69
+ * Manages multiple indexes for a collection.
70
+ */
71
+ export declare class IndexManager {
72
+ private readonly indexes;
73
+ /**
74
+ * Create a new index.
75
+ * @returns The name of the created index.
76
+ * @throws Error if an index with the same name already exists with different options.
77
+ */
78
+ createIndex(spec: IndexSpec, options?: IndexOptions): string;
79
+ /**
80
+ * Drop an index by name.
81
+ */
82
+ dropIndex(name: string): boolean;
83
+ /**
84
+ * Get all index names.
85
+ */
86
+ listIndexes(): string[];
87
+ /**
88
+ * Get an index by name.
89
+ */
90
+ getIndex(name: string): CollectionIndex | undefined;
91
+ /**
92
+ * Index a document in all indexes.
93
+ * @throws DuplicateKeyError if a unique constraint is violated.
94
+ */
95
+ addDocument(doc: BsonDocument): void;
96
+ /**
97
+ * Remove a document from all indexes.
98
+ */
99
+ removeDocument(doc: BsonDocument): void;
100
+ /**
101
+ * Rebuild all indexes from a set of documents.
102
+ */
103
+ rebuildAll(docs: BsonDocument[]): void;
104
+ /**
105
+ * Try to find an index that can serve the given query filter.
106
+ * Returns the set of matching document IDs if an index applies, otherwise undefined.
107
+ */
108
+ findCandidates(filter: Record<string, unknown>): Set<DocumentId> | undefined;
109
+ /**
110
+ * Serialize all index metadata for persistence.
111
+ */
112
+ toJSON(): Array<{
113
+ name: string;
114
+ spec: IndexSpec;
115
+ unique: boolean;
116
+ sparse: boolean;
117
+ }>;
118
+ /**
119
+ * Restore indexes from serialized metadata and rebuild from docs.
120
+ */
121
+ restoreFromJSON(metadata: Array<{
122
+ name: string;
123
+ spec: IndexSpec;
124
+ unique: boolean;
125
+ sparse: boolean;
126
+ }>, docs: BsonDocument[]): void;
127
+ }
128
+ export declare class DuplicateKeyError extends Error {
129
+ readonly indexName: string;
130
+ readonly keyValue: string;
131
+ constructor(indexName: string, keyValue: string);
132
+ }
133
+ //# sourceMappingURL=indexing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexing.d.ts","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/db/indexing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACX,MAAM,qCAAqC,CAAC;AAE7C;;GAEG;AACH,qBAAa,eAAe;IAC1B,wBAAwB;IACxB,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,gCAAgC;IAChC,SAAgB,IAAI,EAAE,SAAS,CAAC;IAChC,4CAA4C;IAC5C,SAAgB,MAAM,EAAE,OAAO,CAAC;IAChC,0DAA0D;IAC1D,SAAgB,MAAM,EAAE,OAAO,CAAC;IAEhC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;gBAElD,IAAI,EAAE,SAAS,EAAE,OAAO,GAAE,YAAiB;IAWvD;;;OAGG;IACH,OAAO,CAAC,UAAU;IAUlB;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAuBpC;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAavC;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,SAAS;IA+BnE;;OAEG;IACH,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC;IAQzB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,MAAM,IAAI;QACR,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,SAAS,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;KACjB;CAQF;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAE9D;;;;OAIG;IACH,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,GAAE,YAAiB,GAAG,MAAM;IAiBhE;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACH,WAAW,IAAI,MAAM,EAAE;IAIvB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAInD;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAYpC;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAMvC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,IAAI;IAStC;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,SAAS;IAQ5E;;OAEG;IACH,MAAM,IAAI,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,SAAS,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;IAIF;;OAEG;IACH,eAAe,CACb,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,SAAS,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC,EACF,IAAI,EAAE,YAAY,EAAE,GACnB,IAAI;CAUR;AAID,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,SAAgB,QAAQ,EAAE,MAAM,CAAC;gBAErB,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAQhD"}