@push.rocks/smartdb 1.0.1 → 2.1.1

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/.smartconfig.json +18 -4
  2. package/dist_rust/rustdb_linux_amd64 +0 -0
  3. package/dist_rust/rustdb_linux_arm64 +0 -0
  4. package/dist_ts/00_commitinfo_data.js +3 -3
  5. package/dist_ts/index.d.ts +1 -0
  6. package/dist_ts/ts_local/classes.localsmartdb.d.ts +5 -5
  7. package/dist_ts/ts_local/classes.localsmartdb.js +7 -9
  8. package/dist_ts/ts_local/plugins.d.ts +1 -2
  9. package/dist_ts/ts_local/plugins.js +3 -3
  10. package/dist_ts/ts_smartdb/index.d.ts +2 -24
  11. package/dist_ts/ts_smartdb/index.js +4 -29
  12. package/dist_ts/ts_smartdb/plugins.d.ts +2 -10
  13. package/dist_ts/ts_smartdb/plugins.js +3 -13
  14. package/dist_ts/ts_smartdb/rust-db-bridge.d.ts +122 -0
  15. package/dist_ts/ts_smartdb/rust-db-bridge.js +113 -0
  16. package/dist_ts/ts_smartdb/server/SmartdbServer.d.ts +39 -37
  17. package/dist_ts/ts_smartdb/server/SmartdbServer.js +87 -206
  18. package/dist_ts/ts_smartdb/server/index.d.ts +0 -4
  19. package/dist_ts/ts_smartdb/server/index.js +1 -5
  20. package/dist_ts_debugserver/bundled.d.ts +4 -0
  21. package/dist_ts_debugserver/bundled.js +12 -0
  22. package/dist_ts_debugserver/classes.debugserver.d.ts +36 -0
  23. package/dist_ts_debugserver/classes.debugserver.js +95 -0
  24. package/dist_ts_debugserver/index.d.ts +2 -0
  25. package/dist_ts_debugserver/index.js +2 -0
  26. package/dist_ts_debugserver/plugins.d.ts +2 -0
  27. package/dist_ts_debugserver/plugins.js +3 -0
  28. package/dist_ts_debugui/index.d.ts +2 -0
  29. package/dist_ts_debugui/index.js +2 -0
  30. package/dist_ts_debugui/plugins.d.ts +1 -0
  31. package/dist_ts_debugui/plugins.js +2 -0
  32. package/dist_ts_debugui/smartdb-debugui.d.ts +62 -0
  33. package/dist_ts_debugui/smartdb-debugui.js +1132 -0
  34. package/license +3 -1
  35. package/package.json +14 -13
  36. package/readme.md +209 -177
  37. package/ts/00_commitinfo_data.ts +2 -2
  38. package/ts/index.ts +11 -0
  39. package/ts/ts_local/classes.localsmartdb.ts +5 -6
  40. package/ts/ts_local/plugins.ts +1 -3
  41. package/ts/ts_smartdb/index.ts +14 -41
  42. package/ts/ts_smartdb/plugins.ts +2 -15
  43. package/ts/ts_smartdb/rust-db-bridge.ts +262 -0
  44. package/ts/ts_smartdb/server/SmartdbServer.ts +115 -246
  45. package/ts/ts_smartdb/server/index.ts +0 -7
  46. package/dist_ts/ts_smartdb/engine/AggregationEngine.d.ts +0 -66
  47. package/dist_ts/ts_smartdb/engine/AggregationEngine.js +0 -189
  48. package/dist_ts/ts_smartdb/engine/IndexEngine.d.ts +0 -97
  49. package/dist_ts/ts_smartdb/engine/IndexEngine.js +0 -678
  50. package/dist_ts/ts_smartdb/engine/QueryEngine.d.ts +0 -54
  51. package/dist_ts/ts_smartdb/engine/QueryEngine.js +0 -271
  52. package/dist_ts/ts_smartdb/engine/QueryPlanner.d.ts +0 -64
  53. package/dist_ts/ts_smartdb/engine/QueryPlanner.js +0 -308
  54. package/dist_ts/ts_smartdb/engine/SessionEngine.d.ts +0 -117
  55. package/dist_ts/ts_smartdb/engine/SessionEngine.js +0 -232
  56. package/dist_ts/ts_smartdb/engine/TransactionEngine.d.ts +0 -85
  57. package/dist_ts/ts_smartdb/engine/TransactionEngine.js +0 -287
  58. package/dist_ts/ts_smartdb/engine/UpdateEngine.d.ts +0 -47
  59. package/dist_ts/ts_smartdb/engine/UpdateEngine.js +0 -461
  60. package/dist_ts/ts_smartdb/errors/SmartdbErrors.d.ts +0 -100
  61. package/dist_ts/ts_smartdb/errors/SmartdbErrors.js +0 -155
  62. package/dist_ts/ts_smartdb/server/CommandRouter.d.ts +0 -87
  63. package/dist_ts/ts_smartdb/server/CommandRouter.js +0 -222
  64. package/dist_ts/ts_smartdb/server/WireProtocol.d.ts +0 -117
  65. package/dist_ts/ts_smartdb/server/WireProtocol.js +0 -298
  66. package/dist_ts/ts_smartdb/server/handlers/AdminHandler.d.ts +0 -100
  67. package/dist_ts/ts_smartdb/server/handlers/AdminHandler.js +0 -668
  68. package/dist_ts/ts_smartdb/server/handlers/AggregateHandler.d.ts +0 -31
  69. package/dist_ts/ts_smartdb/server/handlers/AggregateHandler.js +0 -277
  70. package/dist_ts/ts_smartdb/server/handlers/DeleteHandler.d.ts +0 -8
  71. package/dist_ts/ts_smartdb/server/handlers/DeleteHandler.js +0 -95
  72. package/dist_ts/ts_smartdb/server/handlers/FindHandler.d.ts +0 -31
  73. package/dist_ts/ts_smartdb/server/handlers/FindHandler.js +0 -291
  74. package/dist_ts/ts_smartdb/server/handlers/HelloHandler.d.ts +0 -11
  75. package/dist_ts/ts_smartdb/server/handlers/HelloHandler.js +0 -62
  76. package/dist_ts/ts_smartdb/server/handlers/IndexHandler.d.ts +0 -20
  77. package/dist_ts/ts_smartdb/server/handlers/IndexHandler.js +0 -183
  78. package/dist_ts/ts_smartdb/server/handlers/InsertHandler.d.ts +0 -8
  79. package/dist_ts/ts_smartdb/server/handlers/InsertHandler.js +0 -79
  80. package/dist_ts/ts_smartdb/server/handlers/UpdateHandler.d.ts +0 -24
  81. package/dist_ts/ts_smartdb/server/handlers/UpdateHandler.js +0 -296
  82. package/dist_ts/ts_smartdb/server/handlers/index.d.ts +0 -8
  83. package/dist_ts/ts_smartdb/server/handlers/index.js +0 -10
  84. package/dist_ts/ts_smartdb/storage/FileStorageAdapter.d.ts +0 -85
  85. package/dist_ts/ts_smartdb/storage/FileStorageAdapter.js +0 -465
  86. package/dist_ts/ts_smartdb/storage/IStorageAdapter.d.ts +0 -145
  87. package/dist_ts/ts_smartdb/storage/IStorageAdapter.js +0 -2
  88. package/dist_ts/ts_smartdb/storage/MemoryStorageAdapter.d.ts +0 -67
  89. package/dist_ts/ts_smartdb/storage/MemoryStorageAdapter.js +0 -378
  90. package/dist_ts/ts_smartdb/storage/OpLog.d.ts +0 -93
  91. package/dist_ts/ts_smartdb/storage/OpLog.js +0 -221
  92. package/dist_ts/ts_smartdb/storage/WAL.d.ts +0 -117
  93. package/dist_ts/ts_smartdb/storage/WAL.js +0 -286
  94. package/dist_ts/ts_smartdb/types/interfaces.d.ts +0 -363
  95. package/dist_ts/ts_smartdb/types/interfaces.js +0 -2
  96. package/dist_ts/ts_smartdb/utils/checksum.d.ts +0 -30
  97. package/dist_ts/ts_smartdb/utils/checksum.js +0 -77
  98. package/dist_ts/ts_smartdb/utils/index.d.ts +0 -1
  99. package/dist_ts/ts_smartdb/utils/index.js +0 -2
  100. package/ts/ts_smartdb/engine/AggregationEngine.ts +0 -283
  101. package/ts/ts_smartdb/engine/IndexEngine.ts +0 -798
  102. package/ts/ts_smartdb/engine/QueryEngine.ts +0 -301
  103. package/ts/ts_smartdb/engine/QueryPlanner.ts +0 -393
  104. package/ts/ts_smartdb/engine/SessionEngine.ts +0 -292
  105. package/ts/ts_smartdb/engine/TransactionEngine.ts +0 -351
  106. package/ts/ts_smartdb/engine/UpdateEngine.ts +0 -506
  107. package/ts/ts_smartdb/errors/SmartdbErrors.ts +0 -181
  108. package/ts/ts_smartdb/server/CommandRouter.ts +0 -289
  109. package/ts/ts_smartdb/server/WireProtocol.ts +0 -416
  110. package/ts/ts_smartdb/server/handlers/AdminHandler.ts +0 -719
  111. package/ts/ts_smartdb/server/handlers/AggregateHandler.ts +0 -342
  112. package/ts/ts_smartdb/server/handlers/DeleteHandler.ts +0 -115
  113. package/ts/ts_smartdb/server/handlers/FindHandler.ts +0 -330
  114. package/ts/ts_smartdb/server/handlers/HelloHandler.ts +0 -78
  115. package/ts/ts_smartdb/server/handlers/IndexHandler.ts +0 -207
  116. package/ts/ts_smartdb/server/handlers/InsertHandler.ts +0 -97
  117. package/ts/ts_smartdb/server/handlers/UpdateHandler.ts +0 -344
  118. package/ts/ts_smartdb/server/handlers/index.ts +0 -10
  119. package/ts/ts_smartdb/storage/FileStorageAdapter.ts +0 -562
  120. package/ts/ts_smartdb/storage/IStorageAdapter.ts +0 -208
  121. package/ts/ts_smartdb/storage/MemoryStorageAdapter.ts +0 -455
  122. package/ts/ts_smartdb/storage/OpLog.ts +0 -282
  123. package/ts/ts_smartdb/storage/WAL.ts +0 -375
  124. package/ts/ts_smartdb/types/interfaces.ts +0 -433
  125. package/ts/ts_smartdb/utils/checksum.ts +0 -88
  126. package/ts/ts_smartdb/utils/index.ts +0 -1
@@ -1,344 +0,0 @@
1
- import * as plugins from '../../plugins.js';
2
- import type { ICommandHandler, IHandlerContext } from '../CommandRouter.js';
3
- import type { IStoredDocument } from '../../types/interfaces.js';
4
- import { QueryEngine } from '../../engine/QueryEngine.js';
5
- import { UpdateEngine } from '../../engine/UpdateEngine.js';
6
-
7
- /**
8
- * UpdateHandler - Handles update, findAndModify commands
9
- */
10
- export class UpdateHandler implements ICommandHandler {
11
- async handle(context: IHandlerContext): Promise<plugins.bson.Document> {
12
- const { command } = context;
13
-
14
- // Check findAndModify first since it also has an 'update' field
15
- if (command.findAndModify) {
16
- return this.handleFindAndModify(context);
17
- } else if (command.update && typeof command.update === 'string') {
18
- // 'update' command has collection name as the value
19
- return this.handleUpdate(context);
20
- }
21
-
22
- return {
23
- ok: 0,
24
- errmsg: 'Unknown update-related command',
25
- code: 59,
26
- codeName: 'CommandNotFound',
27
- };
28
- }
29
-
30
- /**
31
- * Handle update command
32
- */
33
- private async handleUpdate(context: IHandlerContext): Promise<plugins.bson.Document> {
34
- const { storage, database, command, documentSequences } = context;
35
-
36
- const collection = command.update;
37
- if (typeof collection !== 'string') {
38
- return {
39
- ok: 0,
40
- errmsg: 'update command requires a collection name',
41
- code: 2,
42
- codeName: 'BadValue',
43
- };
44
- }
45
-
46
- // Get updates from command or document sequences
47
- let updates: plugins.bson.Document[] = command.updates || [];
48
-
49
- // Check for OP_MSG document sequences
50
- if (documentSequences && documentSequences.has('updates')) {
51
- updates = documentSequences.get('updates')!;
52
- }
53
-
54
- if (!Array.isArray(updates) || updates.length === 0) {
55
- return {
56
- ok: 0,
57
- errmsg: 'update command requires updates array',
58
- code: 2,
59
- codeName: 'BadValue',
60
- };
61
- }
62
-
63
- const ordered = command.ordered !== false;
64
- const writeErrors: plugins.bson.Document[] = [];
65
- let totalMatched = 0;
66
- let totalModified = 0;
67
- let totalUpserted = 0;
68
- const upserted: plugins.bson.Document[] = [];
69
-
70
- // Ensure collection exists
71
- await storage.createCollection(database, collection);
72
-
73
- const indexEngine = context.getIndexEngine(collection);
74
-
75
- for (let i = 0; i < updates.length; i++) {
76
- const updateSpec = updates[i];
77
- const filter = updateSpec.q || updateSpec.filter || {};
78
- const update = updateSpec.u || updateSpec.update || {};
79
- const multi = updateSpec.multi || false;
80
- const upsert = updateSpec.upsert || false;
81
- const arrayFilters = updateSpec.arrayFilters;
82
-
83
- try {
84
- // Try to use index-accelerated query
85
- const candidateIds = await indexEngine.findCandidateIds(filter);
86
-
87
- let documents: IStoredDocument[];
88
- if (candidateIds !== null) {
89
- documents = await storage.findByIds(database, collection, candidateIds);
90
- } else {
91
- documents = await storage.findAll(database, collection);
92
- }
93
-
94
- // Apply filter
95
- let matchingDocs = QueryEngine.filter(documents, filter);
96
-
97
- if (matchingDocs.length === 0 && upsert) {
98
- // Upsert: create new document
99
- const newDoc: plugins.bson.Document = { _id: new plugins.bson.ObjectId() };
100
-
101
- // Apply filter fields to the new document
102
- this.applyFilterToDoc(newDoc, filter);
103
-
104
- // Apply update
105
- const updatedDoc = UpdateEngine.applyUpdate(newDoc as any, update, arrayFilters);
106
-
107
- // Handle $setOnInsert
108
- if (update.$setOnInsert) {
109
- Object.assign(updatedDoc, update.$setOnInsert);
110
- }
111
-
112
- // Update index for the new document
113
- await indexEngine.onInsert(updatedDoc);
114
- await storage.insertOne(database, collection, updatedDoc);
115
- totalUpserted++;
116
- upserted.push({ index: i, _id: updatedDoc._id });
117
- } else {
118
- // Update existing documents
119
- const docsToUpdate = multi ? matchingDocs : matchingDocs.slice(0, 1);
120
- totalMatched += docsToUpdate.length;
121
-
122
- for (const doc of docsToUpdate) {
123
- const updatedDoc = UpdateEngine.applyUpdate(doc, update, arrayFilters);
124
-
125
- // Check if document actually changed
126
- const changed = JSON.stringify(doc) !== JSON.stringify(updatedDoc);
127
- if (changed) {
128
- // Update index
129
- await indexEngine.onUpdate(doc as any, updatedDoc);
130
- await storage.updateById(database, collection, doc._id, updatedDoc);
131
- totalModified++;
132
- }
133
- }
134
- }
135
- } catch (error: any) {
136
- writeErrors.push({
137
- index: i,
138
- code: error.code || 1,
139
- errmsg: error.message || 'Update failed',
140
- });
141
-
142
- if (ordered) {
143
- break;
144
- }
145
- }
146
- }
147
-
148
- const response: plugins.bson.Document = {
149
- ok: 1,
150
- n: totalMatched + totalUpserted,
151
- nModified: totalModified,
152
- };
153
-
154
- if (upserted.length > 0) {
155
- response.upserted = upserted;
156
- }
157
-
158
- if (writeErrors.length > 0) {
159
- response.writeErrors = writeErrors;
160
- }
161
-
162
- return response;
163
- }
164
-
165
- /**
166
- * Handle findAndModify command
167
- */
168
- private async handleFindAndModify(context: IHandlerContext): Promise<plugins.bson.Document> {
169
- const { storage, database, command } = context;
170
-
171
- const collection = command.findAndModify;
172
- const query = command.query || {};
173
- const update = command.update;
174
- const remove = command.remove || false;
175
- const returnNew = command.new || false;
176
- const upsert = command.upsert || false;
177
- const sort = command.sort;
178
- const fields = command.fields;
179
- const arrayFilters = command.arrayFilters;
180
-
181
- // Validate - either update or remove, not both
182
- if (update && remove) {
183
- return {
184
- ok: 0,
185
- errmsg: 'cannot specify both update and remove',
186
- code: 2,
187
- codeName: 'BadValue',
188
- };
189
- }
190
-
191
- if (!update && !remove) {
192
- return {
193
- ok: 0,
194
- errmsg: 'either update or remove is required',
195
- code: 2,
196
- codeName: 'BadValue',
197
- };
198
- }
199
-
200
- // Ensure collection exists
201
- await storage.createCollection(database, collection);
202
-
203
- // Try to use index-accelerated query
204
- const indexEngine = context.getIndexEngine(collection);
205
- const candidateIds = await indexEngine.findCandidateIds(query);
206
-
207
- let documents: IStoredDocument[];
208
- if (candidateIds !== null) {
209
- documents = await storage.findByIds(database, collection, candidateIds);
210
- } else {
211
- documents = await storage.findAll(database, collection);
212
- }
213
-
214
- let matchingDocs = QueryEngine.filter(documents, query);
215
-
216
- // Apply sort if specified
217
- if (sort) {
218
- matchingDocs = QueryEngine.sort(matchingDocs, sort);
219
- }
220
-
221
- const doc = matchingDocs[0];
222
-
223
- if (remove) {
224
- // Delete operation
225
- if (!doc) {
226
- return { ok: 1, value: null };
227
- }
228
-
229
- // Update index for delete
230
- await indexEngine.onDelete(doc as any);
231
- await storage.deleteById(database, collection, doc._id);
232
-
233
- let result = doc;
234
- if (fields) {
235
- result = QueryEngine.project([doc], fields)[0] as any;
236
- }
237
-
238
- return {
239
- ok: 1,
240
- value: result,
241
- lastErrorObject: {
242
- n: 1,
243
- },
244
- };
245
- } else {
246
- // Update operation
247
- if (!doc && !upsert) {
248
- return { ok: 1, value: null };
249
- }
250
-
251
- let resultDoc: plugins.bson.Document;
252
- let originalDoc: plugins.bson.Document | null = null;
253
- let isUpsert = false;
254
-
255
- if (doc) {
256
- // Update existing
257
- originalDoc = { ...doc };
258
- resultDoc = UpdateEngine.applyUpdate(doc, update, arrayFilters);
259
- // Update index
260
- await indexEngine.onUpdate(doc as any, resultDoc as any);
261
- await storage.updateById(database, collection, doc._id, resultDoc as any);
262
- } else {
263
- // Upsert
264
- isUpsert = true;
265
- const newDoc: plugins.bson.Document = { _id: new plugins.bson.ObjectId() };
266
- this.applyFilterToDoc(newDoc, query);
267
- resultDoc = UpdateEngine.applyUpdate(newDoc as any, update, arrayFilters);
268
-
269
- if (update.$setOnInsert) {
270
- Object.assign(resultDoc, update.$setOnInsert);
271
- }
272
-
273
- // Update index for insert
274
- await indexEngine.onInsert(resultDoc as any);
275
- await storage.insertOne(database, collection, resultDoc);
276
- }
277
-
278
- // Apply projection
279
- let returnValue = returnNew ? resultDoc : (originalDoc || null);
280
- if (returnValue && fields) {
281
- returnValue = QueryEngine.project([returnValue as any], fields)[0];
282
- }
283
-
284
- const response: plugins.bson.Document = {
285
- ok: 1,
286
- value: returnValue,
287
- lastErrorObject: {
288
- n: 1,
289
- updatedExisting: !isUpsert && doc !== undefined,
290
- },
291
- };
292
-
293
- if (isUpsert) {
294
- response.lastErrorObject.upserted = resultDoc._id;
295
- }
296
-
297
- return response;
298
- }
299
- }
300
-
301
- /**
302
- * Apply filter equality conditions to a new document (for upsert)
303
- */
304
- private applyFilterToDoc(doc: plugins.bson.Document, filter: plugins.bson.Document): void {
305
- for (const [key, value] of Object.entries(filter)) {
306
- // Skip operators
307
- if (key.startsWith('$')) continue;
308
-
309
- // Handle nested paths
310
- if (typeof value === 'object' && value !== null) {
311
- // Check if it's an operator
312
- const valueKeys = Object.keys(value);
313
- if (valueKeys.some(k => k.startsWith('$'))) {
314
- // Extract equality value from $eq if present
315
- if ('$eq' in value) {
316
- this.setNestedValue(doc, key, value.$eq);
317
- }
318
- continue;
319
- }
320
- }
321
-
322
- // Direct value assignment
323
- this.setNestedValue(doc, key, value);
324
- }
325
- }
326
-
327
- /**
328
- * Set a nested value using dot notation
329
- */
330
- private setNestedValue(obj: plugins.bson.Document, path: string, value: any): void {
331
- const parts = path.split('.');
332
- let current = obj;
333
-
334
- for (let i = 0; i < parts.length - 1; i++) {
335
- const part = parts[i];
336
- if (!(part in current)) {
337
- current[part] = {};
338
- }
339
- current = current[part];
340
- }
341
-
342
- current[parts[parts.length - 1]] = value;
343
- }
344
- }
@@ -1,10 +0,0 @@
1
- // Export all command handlers
2
-
3
- export { HelloHandler } from './HelloHandler.js';
4
- export { InsertHandler } from './InsertHandler.js';
5
- export { FindHandler } from './FindHandler.js';
6
- export { UpdateHandler } from './UpdateHandler.js';
7
- export { DeleteHandler } from './DeleteHandler.js';
8
- export { AggregateHandler } from './AggregateHandler.js';
9
- export { IndexHandler } from './IndexHandler.js';
10
- export { AdminHandler } from './AdminHandler.js';