@brightchain/node-express-suite 0.25.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 (127) hide show
  1. package/MIGRATION.md +131 -0
  2. package/README.md +11 -0
  3. package/package.json +18 -0
  4. package/src/index.d.ts +46 -0
  5. package/src/index.d.ts.map +1 -0
  6. package/src/index.js +73 -0
  7. package/src/index.js.map +1 -0
  8. package/src/lib/application.d.ts +35 -0
  9. package/src/lib/application.d.ts.map +1 -0
  10. package/src/lib/application.js +38 -0
  11. package/src/lib/application.js.map +1 -0
  12. package/src/lib/bright-db-model-registry.d.ts +56 -0
  13. package/src/lib/bright-db-model-registry.d.ts.map +1 -0
  14. package/src/lib/bright-db-model-registry.js +71 -0
  15. package/src/lib/bright-db-model-registry.js.map +1 -0
  16. package/src/lib/brightchain-lib.d.ts +7 -0
  17. package/src/lib/brightchain-lib.d.ts.map +1 -0
  18. package/src/lib/brightchain-lib.js +12 -0
  19. package/src/lib/brightchain-lib.js.map +1 -0
  20. package/src/lib/brightdb.d.ts +7 -0
  21. package/src/lib/brightdb.d.ts.map +1 -0
  22. package/src/lib/brightdb.js +11 -0
  23. package/src/lib/brightdb.js.map +1 -0
  24. package/src/lib/constants.d.ts +6 -0
  25. package/src/lib/constants.d.ts.map +1 -0
  26. package/src/lib/constants.js +12 -0
  27. package/src/lib/constants.js.map +1 -0
  28. package/src/lib/create-test-app.d.ts +22 -0
  29. package/src/lib/create-test-app.d.ts.map +1 -0
  30. package/src/lib/create-test-app.js +49 -0
  31. package/src/lib/create-test-app.js.map +1 -0
  32. package/src/lib/databaseInit.d.ts +53 -0
  33. package/src/lib/databaseInit.d.ts.map +1 -0
  34. package/src/lib/databaseInit.js +114 -0
  35. package/src/lib/databaseInit.js.map +1 -0
  36. package/src/lib/datastore/block-document-store-factory.d.ts +31 -0
  37. package/src/lib/datastore/block-document-store-factory.d.ts.map +1 -0
  38. package/src/lib/datastore/block-document-store-factory.js +35 -0
  39. package/src/lib/datastore/block-document-store-factory.js.map +1 -0
  40. package/src/lib/datastore/block-document-store.d.ts +201 -0
  41. package/src/lib/datastore/block-document-store.d.ts.map +1 -0
  42. package/src/lib/datastore/block-document-store.js +649 -0
  43. package/src/lib/datastore/block-document-store.js.map +1 -0
  44. package/src/lib/datastore/document-store.d.ts +83 -0
  45. package/src/lib/datastore/document-store.d.ts.map +1 -0
  46. package/src/lib/datastore/document-store.js +3 -0
  47. package/src/lib/datastore/document-store.js.map +1 -0
  48. package/src/lib/datastore/index.d.ts +6 -0
  49. package/src/lib/datastore/index.d.ts.map +1 -0
  50. package/src/lib/datastore/index.js +11 -0
  51. package/src/lib/datastore/index.js.map +1 -0
  52. package/src/lib/datastore/memory-document-store.d.ts +9 -0
  53. package/src/lib/datastore/memory-document-store.d.ts.map +1 -0
  54. package/src/lib/datastore/memory-document-store.js +218 -0
  55. package/src/lib/datastore/memory-document-store.js.map +1 -0
  56. package/src/lib/environment.d.ts +64 -0
  57. package/src/lib/environment.d.ts.map +1 -0
  58. package/src/lib/environment.js +165 -0
  59. package/src/lib/environment.js.map +1 -0
  60. package/src/lib/factories/blockStoreFactory.d.ts +10 -0
  61. package/src/lib/factories/blockStoreFactory.d.ts.map +1 -0
  62. package/src/lib/factories/blockStoreFactory.js +14 -0
  63. package/src/lib/factories/blockStoreFactory.js.map +1 -0
  64. package/src/lib/interfaces/bright-db-application.d.ts +34 -0
  65. package/src/lib/interfaces/bright-db-application.d.ts.map +1 -0
  66. package/src/lib/interfaces/bright-db-application.js +13 -0
  67. package/src/lib/interfaces/bright-db-application.js.map +1 -0
  68. package/src/lib/interfaces/environment.d.ts +34 -0
  69. package/src/lib/interfaces/environment.d.ts.map +1 -0
  70. package/src/lib/interfaces/environment.js +11 -0
  71. package/src/lib/interfaces/environment.js.map +1 -0
  72. package/src/lib/middleware/index.d.ts +2 -0
  73. package/src/lib/middleware/index.d.ts.map +1 -0
  74. package/src/lib/middleware/index.js +6 -0
  75. package/src/lib/middleware/index.js.map +1 -0
  76. package/src/lib/middleware/validateBody.d.ts +13 -0
  77. package/src/lib/middleware/validateBody.d.ts.map +1 -0
  78. package/src/lib/middleware/validateBody.js +35 -0
  79. package/src/lib/middleware/validateBody.js.map +1 -0
  80. package/src/lib/middlewares.d.ts +9 -0
  81. package/src/lib/middlewares.d.ts.map +1 -0
  82. package/src/lib/middlewares.js +21 -0
  83. package/src/lib/middlewares.js.map +1 -0
  84. package/src/lib/plugins/bright-db-database-plugin.d.ts +95 -0
  85. package/src/lib/plugins/bright-db-database-plugin.d.ts.map +1 -0
  86. package/src/lib/plugins/bright-db-database-plugin.js +143 -0
  87. package/src/lib/plugins/bright-db-database-plugin.js.map +1 -0
  88. package/src/lib/plugins/configure-bright-db-app.d.ts +25 -0
  89. package/src/lib/plugins/configure-bright-db-app.d.ts.map +1 -0
  90. package/src/lib/plugins/configure-bright-db-app.js +31 -0
  91. package/src/lib/plugins/configure-bright-db-app.js.map +1 -0
  92. package/src/lib/services/bright-db-authentication-provider.d.ts +31 -0
  93. package/src/lib/services/bright-db-authentication-provider.d.ts.map +1 -0
  94. package/src/lib/services/bright-db-authentication-provider.js +91 -0
  95. package/src/lib/services/bright-db-authentication-provider.js.map +1 -0
  96. package/src/lib/services/bright-db-base-service.d.ts +26 -0
  97. package/src/lib/services/bright-db-base-service.d.ts.map +1 -0
  98. package/src/lib/services/bright-db-base-service.js +30 -0
  99. package/src/lib/services/bright-db-base-service.js.map +1 -0
  100. package/src/lib/services/bright-db-collection.d.ts +50 -0
  101. package/src/lib/services/bright-db-collection.d.ts.map +1 -0
  102. package/src/lib/services/bright-db-collection.js +116 -0
  103. package/src/lib/services/bright-db-collection.js.map +1 -0
  104. package/src/lib/services/sessionAdapter.d.ts +62 -0
  105. package/src/lib/services/sessionAdapter.d.ts.map +1 -0
  106. package/src/lib/services/sessionAdapter.js +106 -0
  107. package/src/lib/services/sessionAdapter.js.map +1 -0
  108. package/src/lib/shared-types.d.ts +41 -0
  109. package/src/lib/shared-types.d.ts.map +1 -0
  110. package/src/lib/shared-types.js +3 -0
  111. package/src/lib/shared-types.js.map +1 -0
  112. package/src/lib/transactions/bright-db-transaction-manager.d.ts +46 -0
  113. package/src/lib/transactions/bright-db-transaction-manager.d.ts.map +1 -0
  114. package/src/lib/transactions/bright-db-transaction-manager.js +81 -0
  115. package/src/lib/transactions/bright-db-transaction-manager.js.map +1 -0
  116. package/src/lib/types/backend-id.d.ts +3 -0
  117. package/src/lib/types/backend-id.d.ts.map +1 -0
  118. package/src/lib/types/backend-id.js +3 -0
  119. package/src/lib/types/backend-id.js.map +1 -0
  120. package/src/lib/upstream.d.ts +8 -0
  121. package/src/lib/upstream.d.ts.map +1 -0
  122. package/src/lib/upstream.js +13 -0
  123. package/src/lib/upstream.js.map +1 -0
  124. package/src/lib/validation/userValidation.d.ts +44 -0
  125. package/src/lib/validation/userValidation.d.ts.map +1 -0
  126. package/src/lib/validation/userValidation.js +147 -0
  127. package/src/lib/validation/userValidation.js.map +1 -0
@@ -0,0 +1,649 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BlockDocumentStore = exports.CollectionHeadRegistry = void 0;
4
+ const brightchain_lib_1 = require("@brightchain/brightchain-lib");
5
+ const crypto_1 = require("crypto");
6
+ /**
7
+ * Simple in-memory registry for collection head pointers.
8
+ * This maps collection names to their latest index block IDs.
9
+ *
10
+ * In a production system, this would be persisted to a separate
11
+ * key-value store or database. For now, we use a static map
12
+ * that's shared across all BlockDocumentStore instances.
13
+ */
14
+ class CollectionHeadRegistry {
15
+ static instance;
16
+ heads = new Map();
17
+ constructor() { }
18
+ static getInstance() {
19
+ if (!CollectionHeadRegistry.instance) {
20
+ CollectionHeadRegistry.instance = new CollectionHeadRegistry();
21
+ }
22
+ return CollectionHeadRegistry.instance;
23
+ }
24
+ getHead(collectionKey) {
25
+ return this.heads.get(collectionKey);
26
+ }
27
+ setHead(collectionKey, indexBlockId) {
28
+ this.heads.set(collectionKey, indexBlockId);
29
+ }
30
+ /**
31
+ * Generate a unique key for a collection based on store identity and collection name
32
+ */
33
+ static makeKey(storeId, collectionName) {
34
+ return `${storeId}:${collectionName}`;
35
+ }
36
+ /**
37
+ * Clear all heads (useful for testing)
38
+ */
39
+ clear() {
40
+ this.heads.clear();
41
+ }
42
+ }
43
+ exports.CollectionHeadRegistry = CollectionHeadRegistry;
44
+ class BlockQuery {
45
+ resolveValue;
46
+ constructor(resolveValue) {
47
+ this.resolveValue = resolveValue;
48
+ }
49
+ self() {
50
+ return this;
51
+ }
52
+ select() {
53
+ return this.self();
54
+ }
55
+ populate() {
56
+ return this.self();
57
+ }
58
+ sort() {
59
+ return this.self();
60
+ }
61
+ limit() {
62
+ return this.self();
63
+ }
64
+ skip() {
65
+ return this.self();
66
+ }
67
+ lean() {
68
+ return this.self();
69
+ }
70
+ collation() {
71
+ return this.self();
72
+ }
73
+ session() {
74
+ return this.self();
75
+ }
76
+ where() {
77
+ return this.self();
78
+ }
79
+ distinct() {
80
+ return this.self();
81
+ }
82
+ async exec() {
83
+ return this.resolveValue();
84
+ }
85
+ then(onfulfilled, onrejected) {
86
+ return this.exec().then(onfulfilled, onrejected);
87
+ }
88
+ }
89
+ function matchFilter(doc, filter = {}) {
90
+ return Object.entries(filter).every(([key, value]) => {
91
+ if (value === undefined)
92
+ return true;
93
+ return doc[key] === value;
94
+ });
95
+ }
96
+ /**
97
+ * Calculate a content-addressable block ID using the same algorithm as the block store.
98
+ * This uses SHA3-512 via the ChecksumService to match how RawDataBlock computes its idChecksum.
99
+ */
100
+ function calculateBlockId(data) {
101
+ const checksumService = (0, brightchain_lib_1.getGlobalServiceProvider)().checksumService;
102
+ const checksum = checksumService.calculateChecksum(data instanceof Buffer ? new Uint8Array(data) : data);
103
+ return checksum.toHex();
104
+ }
105
+ async function encodeDoc(doc) {
106
+ return Buffer.from(JSON.stringify(doc), 'utf8');
107
+ }
108
+ function decodeDoc(buf) {
109
+ return JSON.parse(buf.toString('utf8'));
110
+ }
111
+ class BlockCollection {
112
+ store;
113
+ collectionName;
114
+ quorumService;
115
+ storeId;
116
+ generateId;
117
+ index = new Map(); // _id -> blockId
118
+ registryKey; // key for looking up index block ID in registry
119
+ indexLoaded = false;
120
+ indexLoading;
121
+ constructor(store, collectionName, quorumService, storeId = 'default', generateId = () => (0, crypto_1.randomUUID)().replace(/-/g, '')) {
122
+ this.store = store;
123
+ this.collectionName = collectionName;
124
+ this.quorumService = quorumService;
125
+ this.storeId = storeId;
126
+ this.generateId = generateId;
127
+ // Registry key is used to look up the latest index block ID
128
+ this.registryKey = CollectionHeadRegistry.makeKey(storeId, collectionName);
129
+ }
130
+ async ensureIndexLoaded() {
131
+ if (this.indexLoaded)
132
+ return;
133
+ if (!this.indexLoading) {
134
+ this.indexLoading = (async () => {
135
+ const registry = CollectionHeadRegistry.getInstance();
136
+ const indexBlockId = registry.getHead(this.registryKey);
137
+ if (indexBlockId) {
138
+ try {
139
+ const indexBlock = await this.store.get(indexBlockId);
140
+ const indexData = indexBlock.data;
141
+ const parsed = JSON.parse(Buffer.from(indexData).toString('utf8'));
142
+ // Support both old format (ids array) and new format (mappings object)
143
+ if (parsed?.mappings) {
144
+ for (const [logicalId, blockId] of Object.entries(parsed.mappings)) {
145
+ this.index.set(logicalId, blockId);
146
+ }
147
+ }
148
+ else if (parsed?.ids) {
149
+ // Legacy format: logical ID equals block ID
150
+ for (const id of parsed.ids) {
151
+ this.index.set(id, id);
152
+ }
153
+ }
154
+ }
155
+ catch {
156
+ // Index block not found - start fresh
157
+ }
158
+ }
159
+ this.indexLoaded = true;
160
+ })().finally(() => {
161
+ this.indexLoading = undefined;
162
+ });
163
+ }
164
+ return this.indexLoading;
165
+ }
166
+ async persistIndex() {
167
+ // Store the index as a mapping of logical IDs to block IDs
168
+ const indexData = {};
169
+ for (const [logicalId, blockId] of this.index.entries()) {
170
+ indexData[logicalId] = blockId;
171
+ }
172
+ const payload = Buffer.from(JSON.stringify({ mappings: indexData }), 'utf8');
173
+ if (payload.length > this.store.blockSize) {
174
+ throw new Error(`Index too large for block size (${payload.length} > ${this.store.blockSize}) in ${this.collectionName}`);
175
+ }
176
+ // Store the index under its content hash (content-addressable)
177
+ const indexBlockId = calculateBlockId(payload);
178
+ await this.store.put(indexBlockId, payload);
179
+ // Update the registry with the new index block ID
180
+ const registry = CollectionHeadRegistry.getInstance();
181
+ registry.setHead(this.registryKey, indexBlockId);
182
+ }
183
+ resolveBlockId(id) {
184
+ return id ?? this.generateId();
185
+ }
186
+ async writeDoc(doc, existingId) {
187
+ await this.ensureIndexLoaded();
188
+ // Use a logical ID for the document (either existing or generated)
189
+ const logicalId = existingId ?? this.resolveBlockId(doc._id);
190
+ // Encode the document with the logical ID
191
+ const docWithId = { ...doc, _id: logicalId };
192
+ const data = await encodeDoc(docWithId);
193
+ if (data.length > this.store.blockSize) {
194
+ throw new Error(`Document too large for block size (${data.length} > ${this.store.blockSize}) in ${this.collectionName}`);
195
+ }
196
+ // Use content hash as the block ID for content-addressable storage
197
+ const blockId = calculateBlockId(data);
198
+ // Check if block already exists (content-addressable deduplication)
199
+ const exists = await this.store.has(blockId);
200
+ if (!exists) {
201
+ await this.store.put(blockId, data);
202
+ }
203
+ // Map logical ID to content hash in the index
204
+ this.index.set(logicalId, blockId);
205
+ doc._id = logicalId;
206
+ await this.persistIndex();
207
+ return doc;
208
+ }
209
+ async readDoc(logicalId) {
210
+ await this.ensureIndexLoaded();
211
+ // Get the content hash from the index
212
+ const blockId = this.index.get(logicalId);
213
+ if (!blockId)
214
+ return null;
215
+ try {
216
+ const block = await this.store.get(blockId);
217
+ const blockData = block.data;
218
+ return decodeDoc(Buffer.from(blockData));
219
+ }
220
+ catch {
221
+ // Block not found in store
222
+ return null;
223
+ }
224
+ }
225
+ toSingleQuery(resolver) {
226
+ return new BlockQuery(resolver);
227
+ }
228
+ toManyQuery(resolver) {
229
+ return new BlockQuery(resolver);
230
+ }
231
+ find(filter) {
232
+ return this.toManyQuery(async () => {
233
+ await this.ensureIndexLoaded();
234
+ const docs = [];
235
+ for (const id of this.index.keys()) {
236
+ const doc = await this.readDoc(id);
237
+ if (doc && matchFilter(doc, filter))
238
+ docs.push(doc);
239
+ }
240
+ return docs;
241
+ });
242
+ }
243
+ findOne(filter) {
244
+ return this.toSingleQuery(async () => {
245
+ await this.ensureIndexLoaded();
246
+ for (const id of this.index.keys()) {
247
+ const doc = await this.readDoc(id);
248
+ if (doc && matchFilter(doc, filter))
249
+ return doc;
250
+ }
251
+ return null;
252
+ });
253
+ }
254
+ findById(id) {
255
+ return this.toSingleQuery(() => this.readDoc(id));
256
+ }
257
+ /**
258
+ * Retrieve a document by ID, decrypting if necessary
259
+ * @param id - The document ID
260
+ * @param options - Options for retrieving encrypted documents
261
+ * @returns The document (decrypted if it was encrypted)
262
+ */
263
+ async findByIdDecrypted(id, options) {
264
+ const doc = await this.readDoc(id);
265
+ if (!doc) {
266
+ return null;
267
+ }
268
+ const internalDoc = doc;
269
+ if (internalDoc.__encryptionMetadata?.isEncrypted) {
270
+ if (!this.quorumService) {
271
+ throw new Error('QuorumService is required to decrypt encrypted documents');
272
+ }
273
+ if (!options?.membersWithPrivateKey ||
274
+ options.membersWithPrivateKey.length === 0) {
275
+ throw new Error('Members with private keys are required to decrypt encrypted documents');
276
+ }
277
+ const sealedDocId = internalDoc.__encryptionMetadata.sealedDocumentId;
278
+ if (!sealedDocId) {
279
+ throw new Error('Encrypted document is missing sealed document ID');
280
+ }
281
+ // Convert stored HexString back to TID via idProvider
282
+ const sp = brightchain_lib_1.ServiceProvider.getInstance();
283
+ const documentTid = sp.idProvider.idFromString(sealedDocId);
284
+ // Unseal the document using QuorumService
285
+ const unsealedDoc = await this.quorumService.unsealDocument(documentTid, options.membersWithPrivateKey);
286
+ // Return the unsealed document with the original _id
287
+ return {
288
+ ...unsealedDoc,
289
+ _id: internalDoc._id,
290
+ };
291
+ }
292
+ return doc;
293
+ }
294
+ /**
295
+ * Check if a document is encrypted
296
+ * @param id - The document ID
297
+ * @returns True if the document is encrypted
298
+ */
299
+ async isEncrypted(id) {
300
+ const doc = await this.readDoc(id);
301
+ if (!doc) {
302
+ return false;
303
+ }
304
+ const internalDoc = doc;
305
+ return internalDoc.__encryptionMetadata?.isEncrypted ?? false;
306
+ }
307
+ /**
308
+ * Get encryption metadata for a document
309
+ * @param id - The document ID
310
+ * @returns The encryption metadata, or null if not encrypted
311
+ */
312
+ async getEncryptionMetadata(id) {
313
+ const doc = await this.readDoc(id);
314
+ if (!doc) {
315
+ return null;
316
+ }
317
+ const internalDoc = doc;
318
+ return internalDoc.__encryptionMetadata ?? null;
319
+ }
320
+ /**
321
+ * Check if a member has access to a document
322
+ * @param id - The document ID
323
+ * @param memberId - The member ID to check access for
324
+ * @returns True if the member has access (either unencrypted or member is in the encryption list)
325
+ */
326
+ async hasAccess(id, memberId) {
327
+ const doc = await this.readDoc(id);
328
+ if (!doc) {
329
+ return false;
330
+ }
331
+ const internalDoc = doc;
332
+ // Unencrypted documents are accessible to everyone
333
+ if (!internalDoc.__encryptionMetadata?.isEncrypted) {
334
+ return true;
335
+ }
336
+ // For encrypted documents, check if the member is in the member list
337
+ const memberIds = internalDoc.__encryptionMetadata.memberIds ?? [];
338
+ return memberIds.includes(memberId);
339
+ }
340
+ /**
341
+ * Find all documents accessible by a specific member
342
+ * @param memberId - The member ID to filter by
343
+ * @param filter - Optional additional filter criteria
344
+ * @returns Array of documents the member has access to
345
+ */
346
+ async findAccessibleBy(memberId, filter) {
347
+ await this.ensureIndexLoaded();
348
+ const docs = [];
349
+ for (const id of this.index.keys()) {
350
+ const doc = await this.readDoc(id);
351
+ if (doc && matchFilter(doc, filter)) {
352
+ const internalDoc = doc;
353
+ // Include unencrypted documents
354
+ if (!internalDoc.__encryptionMetadata?.isEncrypted) {
355
+ docs.push(doc);
356
+ continue;
357
+ }
358
+ // Include encrypted documents where the member has access
359
+ const memberIds = internalDoc.__encryptionMetadata.memberIds ?? [];
360
+ if (memberIds.includes(memberId)) {
361
+ docs.push(doc);
362
+ }
363
+ }
364
+ }
365
+ return docs;
366
+ }
367
+ /**
368
+ * Find one document accessible by a specific member
369
+ * @param memberId - The member ID to filter by
370
+ * @param filter - Optional additional filter criteria
371
+ * @returns The first document the member has access to, or null
372
+ */
373
+ async findOneAccessibleBy(memberId, filter) {
374
+ await this.ensureIndexLoaded();
375
+ for (const id of this.index.keys()) {
376
+ const doc = await this.readDoc(id);
377
+ if (doc && matchFilter(doc, filter)) {
378
+ const internalDoc = doc;
379
+ // Include unencrypted documents
380
+ if (!internalDoc.__encryptionMetadata?.isEncrypted) {
381
+ return doc;
382
+ }
383
+ // Include encrypted documents where the member has access
384
+ const memberIds = internalDoc.__encryptionMetadata.memberIds ?? [];
385
+ if (memberIds.includes(memberId)) {
386
+ return doc;
387
+ }
388
+ }
389
+ }
390
+ return null;
391
+ }
392
+ /**
393
+ * Count documents accessible by a specific member
394
+ * @param memberId - The member ID to filter by
395
+ * @param filter - Optional additional filter criteria
396
+ * @returns The count of documents the member has access to
397
+ */
398
+ async countAccessibleBy(memberId, filter) {
399
+ const docs = await this.findAccessibleBy(memberId, filter);
400
+ return docs.length;
401
+ }
402
+ findOneAndUpdate(filter, update) {
403
+ return this.toSingleQuery(async () => {
404
+ const doc = await this.findOne(filter).exec();
405
+ if (!doc)
406
+ return null;
407
+ Object.assign(doc, update);
408
+ const docId = doc._id;
409
+ if (docId) {
410
+ await this.writeDoc(doc, docId);
411
+ }
412
+ return doc;
413
+ });
414
+ }
415
+ findOneAndDelete(filter) {
416
+ return this.toSingleQuery(async () => {
417
+ const doc = await this.findOne(filter).exec();
418
+ if (!doc)
419
+ return null;
420
+ await this.deleteOne({ _id: doc._id });
421
+ return doc;
422
+ });
423
+ }
424
+ findByIdAndUpdate(id, update) {
425
+ return this.findOneAndUpdate({ _id: id }, update);
426
+ }
427
+ findByIdAndDelete(id) {
428
+ return this.findOneAndDelete({ _id: id });
429
+ }
430
+ async create(doc, options) {
431
+ await this.ensureIndexLoaded();
432
+ // Handle encryption if requested
433
+ if (options?.encrypt) {
434
+ if (!this.quorumService) {
435
+ throw new Error('QuorumService is required for encrypted documents');
436
+ }
437
+ if (!options.agent) {
438
+ throw new Error('Agent member is required for encrypted documents');
439
+ }
440
+ if (!options.memberIds || options.memberIds.length < 2) {
441
+ throw new Error('At least 2 member IDs are required for encrypted documents');
442
+ }
443
+ // Seal the document using QuorumService
444
+ const sealedResult = await this.quorumService.sealDocument(options.agent, doc, options.memberIds, options.sharesRequired);
445
+ // Store metadata about the encrypted document
446
+ const sp = brightchain_lib_1.ServiceProvider.getInstance();
447
+ const internalDoc = {
448
+ ...doc,
449
+ __encryptionMetadata: {
450
+ isEncrypted: true,
451
+ sealedDocumentId: sp.idProvider.toString(sealedResult.documentId, 'hex'),
452
+ memberIds: sealedResult.memberIds.map((id) => sp.idProvider.toString(id, 'hex')),
453
+ sharesRequired: sealedResult.sharesRequired,
454
+ createdAt: sealedResult.createdAt.toISOString(),
455
+ },
456
+ };
457
+ return this.writeDoc(internalDoc);
458
+ }
459
+ return this.writeDoc({ ...doc });
460
+ }
461
+ async insertMany(docs) {
462
+ await this.ensureIndexLoaded();
463
+ const res = [];
464
+ for (const doc of docs) {
465
+ res.push(await this.create(doc));
466
+ }
467
+ return res;
468
+ }
469
+ async updateOne(filter, update) {
470
+ const doc = await this.findOne(filter).exec();
471
+ if (!doc)
472
+ return { modifiedCount: 0, matchedCount: 0 };
473
+ Object.assign(doc, update);
474
+ const docId = doc._id;
475
+ if (docId) {
476
+ await this.writeDoc(doc, docId);
477
+ }
478
+ return { modifiedCount: 1, matchedCount: 1 };
479
+ }
480
+ async updateMany(filter, update) {
481
+ const docs = await this.find(filter).exec();
482
+ let count = 0;
483
+ if (docs) {
484
+ for (const doc of docs) {
485
+ Object.assign(doc, update);
486
+ const docId = doc._id;
487
+ if (docId) {
488
+ await this.writeDoc(doc, docId);
489
+ }
490
+ count += 1;
491
+ }
492
+ }
493
+ return { modifiedCount: count, matchedCount: count };
494
+ }
495
+ async replaceOne(filter, doc) {
496
+ const existing = await this.findOne(filter).exec();
497
+ if (!existing)
498
+ return { modifiedCount: 0, matchedCount: 0 };
499
+ const existingId = existing._id;
500
+ if (existingId) {
501
+ await this.writeDoc(doc, existingId);
502
+ }
503
+ return { modifiedCount: 1, matchedCount: 1 };
504
+ }
505
+ async deleteOne(filter) {
506
+ await this.ensureIndexLoaded();
507
+ for (const [logicalId, blockId] of this.index.entries()) {
508
+ const doc = await this.readDoc(logicalId);
509
+ if (doc && matchFilter(doc, filter)) {
510
+ try {
511
+ await this.store.delete(blockId);
512
+ }
513
+ catch {
514
+ // Block might already be deleted or not exist
515
+ }
516
+ this.index.delete(logicalId);
517
+ await this.persistIndex();
518
+ return { deletedCount: 1 };
519
+ }
520
+ }
521
+ return { deletedCount: 0 };
522
+ }
523
+ async deleteMany(filter) {
524
+ await this.ensureIndexLoaded();
525
+ let deleted = 0;
526
+ for (const [logicalId, blockId] of Array.from(this.index.entries())) {
527
+ const doc = await this.readDoc(logicalId);
528
+ if (doc && matchFilter(doc, filter)) {
529
+ try {
530
+ await this.store.delete(blockId);
531
+ }
532
+ catch {
533
+ // Block might already be deleted or not exist
534
+ }
535
+ this.index.delete(logicalId);
536
+ deleted += 1;
537
+ }
538
+ }
539
+ if (deleted > 0) {
540
+ await this.persistIndex();
541
+ }
542
+ return { deletedCount: deleted };
543
+ }
544
+ async countDocuments(filter) {
545
+ const docs = await this.find(filter).exec();
546
+ return docs ? docs.length : 0;
547
+ }
548
+ async estimatedDocumentCount() {
549
+ return this.index.size;
550
+ }
551
+ aggregate(_pipeline) {
552
+ return new BlockQuery(async () => []);
553
+ }
554
+ distinct(field) {
555
+ return new BlockQuery(async () => {
556
+ const values = new Set();
557
+ for (const id of this.index.keys()) {
558
+ const doc = await this.readDoc(id);
559
+ if (doc && field in doc)
560
+ values.add(doc[field]);
561
+ }
562
+ return Array.from(values);
563
+ });
564
+ }
565
+ async exists(filter) {
566
+ await this.ensureIndexLoaded();
567
+ const doc = await this.findOne(filter).exec();
568
+ return doc ? { _id: doc._id } : null;
569
+ }
570
+ watch() {
571
+ /* noop */
572
+ }
573
+ startSession() {
574
+ return undefined;
575
+ }
576
+ }
577
+ class BlockDocumentStore {
578
+ blockStore;
579
+ quorumService;
580
+ collections = new Map();
581
+ storeId;
582
+ generateId;
583
+ _connected = false;
584
+ constructor(blockStore, quorumService, idProvider) {
585
+ this.blockStore = blockStore;
586
+ this.quorumService = quorumService;
587
+ // Resolve the ID provider: use the injected one, fall back to ServiceProvider
588
+ const resolvedProvider = idProvider ?? this.resolveIdProvider();
589
+ if (resolvedProvider) {
590
+ this.generateId = () => resolvedProvider.serialize(resolvedProvider.generate());
591
+ }
592
+ else {
593
+ this.generateId = () => (0, crypto_1.randomUUID)().replace(/-/g, '');
594
+ }
595
+ // Generate a unique store ID for this instance
596
+ this.storeId = this.generateId();
597
+ }
598
+ /**
599
+ * Attempt to resolve the ID provider from the global ServiceProvider.
600
+ * Returns undefined if the ServiceProvider is not yet initialized.
601
+ */
602
+ resolveIdProvider() {
603
+ try {
604
+ return brightchain_lib_1.ServiceProvider.getInstance().idProvider;
605
+ }
606
+ catch {
607
+ return undefined;
608
+ }
609
+ }
610
+ collection(name) {
611
+ if (!this.collections.has(name)) {
612
+ this.collections.set(name, new BlockCollection(this.blockStore, name, this.quorumService, this.storeId, this.generateId));
613
+ }
614
+ return this.collections.get(name);
615
+ }
616
+ /**
617
+ * Get a collection with encryption support
618
+ * @param name - The collection name
619
+ * @returns The collection with encryption methods available
620
+ */
621
+ encryptedCollection(name) {
622
+ if (!this.quorumService) {
623
+ throw new Error('QuorumService is required for encrypted collections');
624
+ }
625
+ if (!this.collections.has(name)) {
626
+ this.collections.set(name, new BlockCollection(this.blockStore, name, this.quorumService, this.storeId, this.generateId));
627
+ }
628
+ return this.collections.get(name);
629
+ }
630
+ // ── IBrightDbDocumentStore lifecycle methods ──────────────────────────
631
+ async connect() {
632
+ this._connected = true;
633
+ }
634
+ async disconnect() {
635
+ this._connected = false;
636
+ }
637
+ isConnected() {
638
+ return this._connected;
639
+ }
640
+ /**
641
+ * Retrieve a collection by model name.
642
+ * Alias for collection() to match upstream's IDocumentStore.getModel() pattern.
643
+ */
644
+ getModel(modelName) {
645
+ return this.collection(modelName);
646
+ }
647
+ }
648
+ exports.BlockDocumentStore = BlockDocumentStore;
649
+ //# sourceMappingURL=block-document-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-document-store.js","sourceRoot":"","sources":["../../../../../brightchain-node-express-suite/src/lib/datastore/block-document-store.ts"],"names":[],"mappings":"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"}