@push.rocks/smartmongo 2.2.0 → 4.0.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 (126) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/index.d.ts +1 -1
  3. package/dist_ts/index.js +3 -3
  4. package/dist_ts/tsmdb/engine/AggregationEngine.js +189 -0
  5. package/dist_ts/{congodb → tsmdb}/engine/IndexEngine.d.ts +23 -3
  6. package/dist_ts/tsmdb/engine/IndexEngine.js +678 -0
  7. package/dist_ts/tsmdb/engine/QueryEngine.js +271 -0
  8. package/dist_ts/tsmdb/engine/QueryPlanner.d.ts +64 -0
  9. package/dist_ts/tsmdb/engine/QueryPlanner.js +308 -0
  10. package/dist_ts/tsmdb/engine/SessionEngine.d.ts +117 -0
  11. package/dist_ts/tsmdb/engine/SessionEngine.js +232 -0
  12. package/dist_ts/{congodb → tsmdb}/engine/TransactionEngine.d.ts +1 -1
  13. package/dist_ts/tsmdb/engine/TransactionEngine.js +287 -0
  14. package/dist_ts/tsmdb/engine/UpdateEngine.js +461 -0
  15. package/dist_ts/{congodb/errors/CongoErrors.d.ts → tsmdb/errors/TsmdbErrors.d.ts} +16 -16
  16. package/dist_ts/tsmdb/errors/TsmdbErrors.js +155 -0
  17. package/dist_ts/{congodb → tsmdb}/index.d.ts +11 -4
  18. package/dist_ts/tsmdb/index.js +31 -0
  19. package/dist_ts/tsmdb/server/CommandRouter.d.ts +87 -0
  20. package/dist_ts/tsmdb/server/CommandRouter.js +222 -0
  21. package/dist_ts/{congodb/server/CongoServer.d.ts → tsmdb/server/TsmdbServer.d.ts} +6 -6
  22. package/dist_ts/tsmdb/server/TsmdbServer.js +229 -0
  23. package/dist_ts/{congodb → tsmdb}/server/WireProtocol.d.ts +1 -1
  24. package/dist_ts/tsmdb/server/WireProtocol.js +298 -0
  25. package/dist_ts/{congodb → tsmdb}/server/handlers/AdminHandler.d.ts +1 -1
  26. package/dist_ts/tsmdb/server/handlers/AdminHandler.js +668 -0
  27. package/dist_ts/{congodb → tsmdb}/server/handlers/AggregateHandler.d.ts +1 -1
  28. package/dist_ts/tsmdb/server/handlers/AggregateHandler.js +277 -0
  29. package/dist_ts/{congodb → tsmdb}/server/handlers/DeleteHandler.d.ts +1 -1
  30. package/dist_ts/tsmdb/server/handlers/DeleteHandler.js +95 -0
  31. package/dist_ts/{congodb → tsmdb}/server/handlers/FindHandler.d.ts +1 -1
  32. package/dist_ts/tsmdb/server/handlers/FindHandler.js +291 -0
  33. package/dist_ts/{congodb → tsmdb}/server/handlers/HelloHandler.d.ts +1 -1
  34. package/dist_ts/{congodb → tsmdb}/server/handlers/HelloHandler.js +2 -2
  35. package/dist_ts/{congodb → tsmdb}/server/handlers/IndexHandler.d.ts +1 -1
  36. package/dist_ts/tsmdb/server/handlers/IndexHandler.js +183 -0
  37. package/dist_ts/{congodb → tsmdb}/server/handlers/InsertHandler.d.ts +1 -1
  38. package/dist_ts/tsmdb/server/handlers/InsertHandler.js +79 -0
  39. package/dist_ts/{congodb → tsmdb}/server/handlers/UpdateHandler.d.ts +1 -1
  40. package/dist_ts/tsmdb/server/handlers/UpdateHandler.js +296 -0
  41. package/dist_ts/tsmdb/server/handlers/index.js +10 -0
  42. package/dist_ts/{congodb → tsmdb}/server/index.d.ts +2 -2
  43. package/dist_ts/tsmdb/server/index.js +7 -0
  44. package/dist_ts/{congodb → tsmdb}/storage/FileStorageAdapter.d.ts +27 -3
  45. package/dist_ts/tsmdb/storage/FileStorageAdapter.js +465 -0
  46. package/dist_ts/{congodb → tsmdb}/storage/IStorageAdapter.d.ts +7 -2
  47. package/dist_ts/{congodb → tsmdb}/storage/IStorageAdapter.js +1 -1
  48. package/dist_ts/{congodb → tsmdb}/storage/MemoryStorageAdapter.d.ts +3 -2
  49. package/dist_ts/tsmdb/storage/MemoryStorageAdapter.js +378 -0
  50. package/dist_ts/{congodb → tsmdb}/storage/OpLog.d.ts +1 -1
  51. package/dist_ts/tsmdb/storage/OpLog.js +221 -0
  52. package/dist_ts/tsmdb/storage/WAL.d.ts +117 -0
  53. package/dist_ts/tsmdb/storage/WAL.js +286 -0
  54. package/dist_ts/tsmdb/tsmdb.plugins.js +14 -0
  55. package/dist_ts/{congodb → tsmdb}/types/interfaces.d.ts +3 -3
  56. package/dist_ts/{congodb → tsmdb}/types/interfaces.js +1 -1
  57. package/dist_ts/tsmdb/utils/checksum.d.ts +30 -0
  58. package/dist_ts/tsmdb/utils/checksum.js +77 -0
  59. package/dist_ts/tsmdb/utils/index.d.ts +1 -0
  60. package/dist_ts/tsmdb/utils/index.js +2 -0
  61. package/package.json +1 -1
  62. package/readme.hints.md +7 -12
  63. package/readme.md +25 -25
  64. package/ts/00_commitinfo_data.ts +1 -1
  65. package/ts/index.ts +2 -2
  66. package/ts/{congodb → tsmdb}/engine/AggregationEngine.ts +1 -1
  67. package/ts/tsmdb/engine/IndexEngine.ts +798 -0
  68. package/ts/{congodb → tsmdb}/engine/QueryEngine.ts +1 -1
  69. package/ts/tsmdb/engine/QueryPlanner.ts +393 -0
  70. package/ts/tsmdb/engine/SessionEngine.ts +292 -0
  71. package/ts/{congodb → tsmdb}/engine/TransactionEngine.ts +12 -12
  72. package/ts/{congodb → tsmdb}/engine/UpdateEngine.ts +1 -1
  73. package/ts/{congodb/errors/CongoErrors.ts → tsmdb/errors/TsmdbErrors.ts} +34 -34
  74. package/ts/{congodb → tsmdb}/index.ts +16 -7
  75. package/ts/{congodb → tsmdb}/server/CommandRouter.ts +114 -5
  76. package/ts/{congodb/server/CongoServer.ts → tsmdb/server/TsmdbServer.ts} +11 -8
  77. package/ts/{congodb → tsmdb}/server/WireProtocol.ts +1 -1
  78. package/ts/{congodb → tsmdb}/server/handlers/AdminHandler.ts +116 -11
  79. package/ts/{congodb → tsmdb}/server/handlers/AggregateHandler.ts +1 -1
  80. package/ts/{congodb → tsmdb}/server/handlers/DeleteHandler.ts +18 -3
  81. package/ts/{congodb → tsmdb}/server/handlers/FindHandler.ts +43 -14
  82. package/ts/{congodb → tsmdb}/server/handlers/HelloHandler.ts +1 -1
  83. package/ts/{congodb → tsmdb}/server/handlers/IndexHandler.ts +1 -1
  84. package/ts/{congodb → tsmdb}/server/handlers/InsertHandler.ts +7 -1
  85. package/ts/{congodb → tsmdb}/server/handlers/UpdateHandler.ts +34 -5
  86. package/ts/{congodb → tsmdb}/server/index.ts +2 -2
  87. package/ts/{congodb → tsmdb}/storage/FileStorageAdapter.ts +90 -7
  88. package/ts/{congodb → tsmdb}/storage/IStorageAdapter.ts +8 -2
  89. package/ts/{congodb → tsmdb}/storage/MemoryStorageAdapter.ts +14 -2
  90. package/ts/{congodb → tsmdb}/storage/OpLog.ts +1 -1
  91. package/ts/tsmdb/storage/WAL.ts +375 -0
  92. package/ts/{congodb → tsmdb}/types/interfaces.ts +3 -3
  93. package/ts/tsmdb/utils/checksum.ts +88 -0
  94. package/ts/tsmdb/utils/index.ts +1 -0
  95. package/dist_ts/congodb/congodb.plugins.js +0 -14
  96. package/dist_ts/congodb/engine/AggregationEngine.js +0 -189
  97. package/dist_ts/congodb/engine/IndexEngine.js +0 -376
  98. package/dist_ts/congodb/engine/QueryEngine.js +0 -271
  99. package/dist_ts/congodb/engine/TransactionEngine.js +0 -287
  100. package/dist_ts/congodb/engine/UpdateEngine.js +0 -461
  101. package/dist_ts/congodb/errors/CongoErrors.js +0 -155
  102. package/dist_ts/congodb/index.js +0 -26
  103. package/dist_ts/congodb/server/CommandRouter.d.ts +0 -51
  104. package/dist_ts/congodb/server/CommandRouter.js +0 -132
  105. package/dist_ts/congodb/server/CongoServer.js +0 -227
  106. package/dist_ts/congodb/server/WireProtocol.js +0 -298
  107. package/dist_ts/congodb/server/handlers/AdminHandler.js +0 -568
  108. package/dist_ts/congodb/server/handlers/AggregateHandler.js +0 -277
  109. package/dist_ts/congodb/server/handlers/DeleteHandler.js +0 -83
  110. package/dist_ts/congodb/server/handlers/FindHandler.js +0 -261
  111. package/dist_ts/congodb/server/handlers/IndexHandler.js +0 -183
  112. package/dist_ts/congodb/server/handlers/InsertHandler.js +0 -76
  113. package/dist_ts/congodb/server/handlers/UpdateHandler.js +0 -270
  114. package/dist_ts/congodb/server/handlers/index.js +0 -10
  115. package/dist_ts/congodb/server/index.js +0 -7
  116. package/dist_ts/congodb/storage/FileStorageAdapter.js +0 -396
  117. package/dist_ts/congodb/storage/MemoryStorageAdapter.js +0 -367
  118. package/dist_ts/congodb/storage/OpLog.js +0 -221
  119. package/ts/congodb/engine/IndexEngine.ts +0 -479
  120. /package/dist_ts/{congodb → tsmdb}/engine/AggregationEngine.d.ts +0 -0
  121. /package/dist_ts/{congodb → tsmdb}/engine/QueryEngine.d.ts +0 -0
  122. /package/dist_ts/{congodb → tsmdb}/engine/UpdateEngine.d.ts +0 -0
  123. /package/dist_ts/{congodb → tsmdb}/server/handlers/index.d.ts +0 -0
  124. /package/dist_ts/{congodb/congodb.plugins.d.ts → tsmdb/tsmdb.plugins.d.ts} +0 -0
  125. /package/ts/{congodb → tsmdb}/server/handlers/index.ts +0 -0
  126. /package/ts/{congodb/congodb.plugins.ts → tsmdb/tsmdb.plugins.ts} +0 -0
@@ -0,0 +1,296 @@
1
+ import * as plugins from '../../tsmdb.plugins.js';
2
+ import { QueryEngine } from '../../engine/QueryEngine.js';
3
+ import { UpdateEngine } from '../../engine/UpdateEngine.js';
4
+ /**
5
+ * UpdateHandler - Handles update, findAndModify commands
6
+ */
7
+ export class UpdateHandler {
8
+ async handle(context) {
9
+ const { command } = context;
10
+ // Check findAndModify first since it also has an 'update' field
11
+ if (command.findAndModify) {
12
+ return this.handleFindAndModify(context);
13
+ }
14
+ else if (command.update && typeof command.update === 'string') {
15
+ // 'update' command has collection name as the value
16
+ return this.handleUpdate(context);
17
+ }
18
+ return {
19
+ ok: 0,
20
+ errmsg: 'Unknown update-related command',
21
+ code: 59,
22
+ codeName: 'CommandNotFound',
23
+ };
24
+ }
25
+ /**
26
+ * Handle update command
27
+ */
28
+ async handleUpdate(context) {
29
+ const { storage, database, command, documentSequences } = context;
30
+ const collection = command.update;
31
+ if (typeof collection !== 'string') {
32
+ return {
33
+ ok: 0,
34
+ errmsg: 'update command requires a collection name',
35
+ code: 2,
36
+ codeName: 'BadValue',
37
+ };
38
+ }
39
+ // Get updates from command or document sequences
40
+ let updates = command.updates || [];
41
+ // Check for OP_MSG document sequences
42
+ if (documentSequences && documentSequences.has('updates')) {
43
+ updates = documentSequences.get('updates');
44
+ }
45
+ if (!Array.isArray(updates) || updates.length === 0) {
46
+ return {
47
+ ok: 0,
48
+ errmsg: 'update command requires updates array',
49
+ code: 2,
50
+ codeName: 'BadValue',
51
+ };
52
+ }
53
+ const ordered = command.ordered !== false;
54
+ const writeErrors = [];
55
+ let totalMatched = 0;
56
+ let totalModified = 0;
57
+ let totalUpserted = 0;
58
+ const upserted = [];
59
+ // Ensure collection exists
60
+ await storage.createCollection(database, collection);
61
+ const indexEngine = context.getIndexEngine(collection);
62
+ for (let i = 0; i < updates.length; i++) {
63
+ const updateSpec = updates[i];
64
+ const filter = updateSpec.q || updateSpec.filter || {};
65
+ const update = updateSpec.u || updateSpec.update || {};
66
+ const multi = updateSpec.multi || false;
67
+ const upsert = updateSpec.upsert || false;
68
+ const arrayFilters = updateSpec.arrayFilters;
69
+ try {
70
+ // Try to use index-accelerated query
71
+ const candidateIds = await indexEngine.findCandidateIds(filter);
72
+ let documents;
73
+ if (candidateIds !== null) {
74
+ documents = await storage.findByIds(database, collection, candidateIds);
75
+ }
76
+ else {
77
+ documents = await storage.findAll(database, collection);
78
+ }
79
+ // Apply filter
80
+ let matchingDocs = QueryEngine.filter(documents, filter);
81
+ if (matchingDocs.length === 0 && upsert) {
82
+ // Upsert: create new document
83
+ const newDoc = { _id: new plugins.bson.ObjectId() };
84
+ // Apply filter fields to the new document
85
+ this.applyFilterToDoc(newDoc, filter);
86
+ // Apply update
87
+ const updatedDoc = UpdateEngine.applyUpdate(newDoc, update, arrayFilters);
88
+ // Handle $setOnInsert
89
+ if (update.$setOnInsert) {
90
+ Object.assign(updatedDoc, update.$setOnInsert);
91
+ }
92
+ // Update index for the new document
93
+ await indexEngine.onInsert(updatedDoc);
94
+ await storage.insertOne(database, collection, updatedDoc);
95
+ totalUpserted++;
96
+ upserted.push({ index: i, _id: updatedDoc._id });
97
+ }
98
+ else {
99
+ // Update existing documents
100
+ const docsToUpdate = multi ? matchingDocs : matchingDocs.slice(0, 1);
101
+ totalMatched += docsToUpdate.length;
102
+ for (const doc of docsToUpdate) {
103
+ const updatedDoc = UpdateEngine.applyUpdate(doc, update, arrayFilters);
104
+ // Check if document actually changed
105
+ const changed = JSON.stringify(doc) !== JSON.stringify(updatedDoc);
106
+ if (changed) {
107
+ // Update index
108
+ await indexEngine.onUpdate(doc, updatedDoc);
109
+ await storage.updateById(database, collection, doc._id, updatedDoc);
110
+ totalModified++;
111
+ }
112
+ }
113
+ }
114
+ }
115
+ catch (error) {
116
+ writeErrors.push({
117
+ index: i,
118
+ code: error.code || 1,
119
+ errmsg: error.message || 'Update failed',
120
+ });
121
+ if (ordered) {
122
+ break;
123
+ }
124
+ }
125
+ }
126
+ const response = {
127
+ ok: 1,
128
+ n: totalMatched + totalUpserted,
129
+ nModified: totalModified,
130
+ };
131
+ if (upserted.length > 0) {
132
+ response.upserted = upserted;
133
+ }
134
+ if (writeErrors.length > 0) {
135
+ response.writeErrors = writeErrors;
136
+ }
137
+ return response;
138
+ }
139
+ /**
140
+ * Handle findAndModify command
141
+ */
142
+ async handleFindAndModify(context) {
143
+ const { storage, database, command } = context;
144
+ const collection = command.findAndModify;
145
+ const query = command.query || {};
146
+ const update = command.update;
147
+ const remove = command.remove || false;
148
+ const returnNew = command.new || false;
149
+ const upsert = command.upsert || false;
150
+ const sort = command.sort;
151
+ const fields = command.fields;
152
+ const arrayFilters = command.arrayFilters;
153
+ // Validate - either update or remove, not both
154
+ if (update && remove) {
155
+ return {
156
+ ok: 0,
157
+ errmsg: 'cannot specify both update and remove',
158
+ code: 2,
159
+ codeName: 'BadValue',
160
+ };
161
+ }
162
+ if (!update && !remove) {
163
+ return {
164
+ ok: 0,
165
+ errmsg: 'either update or remove is required',
166
+ code: 2,
167
+ codeName: 'BadValue',
168
+ };
169
+ }
170
+ // Ensure collection exists
171
+ await storage.createCollection(database, collection);
172
+ // Try to use index-accelerated query
173
+ const indexEngine = context.getIndexEngine(collection);
174
+ const candidateIds = await indexEngine.findCandidateIds(query);
175
+ let documents;
176
+ if (candidateIds !== null) {
177
+ documents = await storage.findByIds(database, collection, candidateIds);
178
+ }
179
+ else {
180
+ documents = await storage.findAll(database, collection);
181
+ }
182
+ let matchingDocs = QueryEngine.filter(documents, query);
183
+ // Apply sort if specified
184
+ if (sort) {
185
+ matchingDocs = QueryEngine.sort(matchingDocs, sort);
186
+ }
187
+ const doc = matchingDocs[0];
188
+ if (remove) {
189
+ // Delete operation
190
+ if (!doc) {
191
+ return { ok: 1, value: null };
192
+ }
193
+ // Update index for delete
194
+ await indexEngine.onDelete(doc);
195
+ await storage.deleteById(database, collection, doc._id);
196
+ let result = doc;
197
+ if (fields) {
198
+ result = QueryEngine.project([doc], fields)[0];
199
+ }
200
+ return {
201
+ ok: 1,
202
+ value: result,
203
+ lastErrorObject: {
204
+ n: 1,
205
+ },
206
+ };
207
+ }
208
+ else {
209
+ // Update operation
210
+ if (!doc && !upsert) {
211
+ return { ok: 1, value: null };
212
+ }
213
+ let resultDoc;
214
+ let originalDoc = null;
215
+ let isUpsert = false;
216
+ if (doc) {
217
+ // Update existing
218
+ originalDoc = { ...doc };
219
+ resultDoc = UpdateEngine.applyUpdate(doc, update, arrayFilters);
220
+ // Update index
221
+ await indexEngine.onUpdate(doc, resultDoc);
222
+ await storage.updateById(database, collection, doc._id, resultDoc);
223
+ }
224
+ else {
225
+ // Upsert
226
+ isUpsert = true;
227
+ const newDoc = { _id: new plugins.bson.ObjectId() };
228
+ this.applyFilterToDoc(newDoc, query);
229
+ resultDoc = UpdateEngine.applyUpdate(newDoc, update, arrayFilters);
230
+ if (update.$setOnInsert) {
231
+ Object.assign(resultDoc, update.$setOnInsert);
232
+ }
233
+ // Update index for insert
234
+ await indexEngine.onInsert(resultDoc);
235
+ await storage.insertOne(database, collection, resultDoc);
236
+ }
237
+ // Apply projection
238
+ let returnValue = returnNew ? resultDoc : (originalDoc || null);
239
+ if (returnValue && fields) {
240
+ returnValue = QueryEngine.project([returnValue], fields)[0];
241
+ }
242
+ const response = {
243
+ ok: 1,
244
+ value: returnValue,
245
+ lastErrorObject: {
246
+ n: 1,
247
+ updatedExisting: !isUpsert && doc !== undefined,
248
+ },
249
+ };
250
+ if (isUpsert) {
251
+ response.lastErrorObject.upserted = resultDoc._id;
252
+ }
253
+ return response;
254
+ }
255
+ }
256
+ /**
257
+ * Apply filter equality conditions to a new document (for upsert)
258
+ */
259
+ applyFilterToDoc(doc, filter) {
260
+ for (const [key, value] of Object.entries(filter)) {
261
+ // Skip operators
262
+ if (key.startsWith('$'))
263
+ continue;
264
+ // Handle nested paths
265
+ if (typeof value === 'object' && value !== null) {
266
+ // Check if it's an operator
267
+ const valueKeys = Object.keys(value);
268
+ if (valueKeys.some(k => k.startsWith('$'))) {
269
+ // Extract equality value from $eq if present
270
+ if ('$eq' in value) {
271
+ this.setNestedValue(doc, key, value.$eq);
272
+ }
273
+ continue;
274
+ }
275
+ }
276
+ // Direct value assignment
277
+ this.setNestedValue(doc, key, value);
278
+ }
279
+ }
280
+ /**
281
+ * Set a nested value using dot notation
282
+ */
283
+ setNestedValue(obj, path, value) {
284
+ const parts = path.split('.');
285
+ let current = obj;
286
+ for (let i = 0; i < parts.length - 1; i++) {
287
+ const part = parts[i];
288
+ if (!(part in current)) {
289
+ current[part] = {};
290
+ }
291
+ current = current[part];
292
+ }
293
+ current[parts[parts.length - 1]] = value;
294
+ }
295
+ }
296
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXBkYXRlSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL3RzbWRiL3NlcnZlci9oYW5kbGVycy9VcGRhdGVIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFHbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUU1RDs7R0FFRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBQ3hCLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBd0I7UUFDbkMsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUU1QixnRUFBZ0U7UUFDaEUsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0MsQ0FBQzthQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLE9BQU8sQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEUsb0RBQW9EO1lBQ3BELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBRUQsT0FBTztZQUNMLEVBQUUsRUFBRSxDQUFDO1lBQ0wsTUFBTSxFQUFFLGdDQUFnQztZQUN4QyxJQUFJLEVBQUUsRUFBRTtZQUNSLFFBQVEsRUFBRSxpQkFBaUI7U0FDNUIsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBd0I7UUFDakQsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRWxFLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDbEMs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
@@ -0,0 +1,10 @@
1
+ // Export all command handlers
2
+ export { HelloHandler } from './HelloHandler.js';
3
+ export { InsertHandler } from './InsertHandler.js';
4
+ export { FindHandler } from './FindHandler.js';
5
+ export { UpdateHandler } from './UpdateHandler.js';
6
+ export { DeleteHandler } from './DeleteHandler.js';
7
+ export { AggregateHandler } from './AggregateHandler.js';
8
+ export { IndexHandler } from './IndexHandler.js';
9
+ export { AdminHandler } from './AdminHandler.js';
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy90c21kYi9zZXJ2ZXIvaGFuZGxlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsOEJBQThCO0FBRTlCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQyJ9
@@ -1,5 +1,5 @@
1
- export { CongoServer } from './CongoServer.js';
2
- export type { ICongoServerOptions } from './CongoServer.js';
1
+ export { TsmdbServer } from './TsmdbServer.js';
2
+ export type { ITsmdbServerOptions } from './TsmdbServer.js';
3
3
  export { WireProtocol } from './WireProtocol.js';
4
4
  export { CommandRouter } from './CommandRouter.js';
5
5
  export type { ICommandHandler, IHandlerContext, ICursorState } from './CommandRouter.js';
@@ -0,0 +1,7 @@
1
+ // Server module exports
2
+ export { TsmdbServer } from './TsmdbServer.js';
3
+ export { WireProtocol } from './WireProtocol.js';
4
+ export { CommandRouter } from './CommandRouter.js';
5
+ // Export handlers
6
+ export * from './handlers/index.js';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy90c21kYi9zZXJ2ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0JBQXdCO0FBRXhCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR25ELGtCQUFrQjtBQUNsQixjQUFjLHFCQUFxQixDQUFDIn0=
@@ -1,8 +1,17 @@
1
- import * as plugins from '../congodb.plugins.js';
1
+ import * as plugins from '../tsmdb.plugins.js';
2
2
  import type { IStorageAdapter } from './IStorageAdapter.js';
3
3
  import type { IStoredDocument, IOpLogEntry, Document } from '../types/interfaces.js';
4
4
  /**
5
- * File-based storage adapter for CongoDB
5
+ * File storage adapter options
6
+ */
7
+ export interface IFileStorageAdapterOptions {
8
+ /** Enable checksum verification for data integrity */
9
+ enableChecksums?: boolean;
10
+ /** Throw error on checksum mismatch (default: false, just log warning) */
11
+ strictChecksums?: boolean;
12
+ }
13
+ /**
14
+ * File-based storage adapter for TsmDB
6
15
  * Stores data in JSON files on disk for persistence
7
16
  */
8
17
  export declare class FileStorageAdapter implements IStorageAdapter {
@@ -10,7 +19,9 @@ export declare class FileStorageAdapter implements IStorageAdapter {
10
19
  private opLogCounter;
11
20
  private initialized;
12
21
  private fs;
13
- constructor(basePath: string);
22
+ private enableChecksums;
23
+ private strictChecksums;
24
+ constructor(basePath: string, options?: IFileStorageAdapterOptions);
14
25
  private getDbPath;
15
26
  private getCollectionPath;
16
27
  private getIndexPath;
@@ -19,6 +30,18 @@ export declare class FileStorageAdapter implements IStorageAdapter {
19
30
  private readJsonFile;
20
31
  private writeJsonFile;
21
32
  private restoreObjectIds;
33
+ /**
34
+ * Verify document checksum and handle errors
35
+ */
36
+ private verifyDocumentChecksum;
37
+ /**
38
+ * Add checksum to document before storing
39
+ */
40
+ private prepareDocumentForStorage;
41
+ /**
42
+ * Remove internal checksum field before returning to user
43
+ */
44
+ private cleanDocumentForReturn;
22
45
  initialize(): Promise<void>;
23
46
  close(): Promise<void>;
24
47
  listDatabases(): Promise<string[]>;
@@ -33,6 +56,7 @@ export declare class FileStorageAdapter implements IStorageAdapter {
33
56
  insertOne(dbName: string, collName: string, doc: Document): Promise<IStoredDocument>;
34
57
  insertMany(dbName: string, collName: string, docsToInsert: Document[]): Promise<IStoredDocument[]>;
35
58
  findAll(dbName: string, collName: string): Promise<IStoredDocument[]>;
59
+ findByIds(dbName: string, collName: string, ids: Set<string>): Promise<IStoredDocument[]>;
36
60
  findById(dbName: string, collName: string, id: plugins.bson.ObjectId): Promise<IStoredDocument | null>;
37
61
  updateById(dbName: string, collName: string, id: plugins.bson.ObjectId, doc: IStoredDocument): Promise<boolean>;
38
62
  deleteById(dbName: string, collName: string, id: plugins.bson.ObjectId): Promise<boolean>;