@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,668 +0,0 @@
1
- import * as plugins from '../../plugins.js';
2
- import { SessionEngine } from '../../engine/SessionEngine.js';
3
- /**
4
- * AdminHandler - Handles administrative commands
5
- */
6
- export class AdminHandler {
7
- async handle(context) {
8
- const { command } = context;
9
- // Determine which command to handle
10
- if (command.ping !== undefined) {
11
- return this.handlePing(context);
12
- }
13
- else if (command.listDatabases !== undefined) {
14
- return this.handleListDatabases(context);
15
- }
16
- else if (command.listCollections !== undefined) {
17
- return this.handleListCollections(context);
18
- }
19
- else if (command.drop !== undefined) {
20
- return this.handleDrop(context);
21
- }
22
- else if (command.dropDatabase !== undefined) {
23
- return this.handleDropDatabase(context);
24
- }
25
- else if (command.create !== undefined) {
26
- return this.handleCreate(context);
27
- }
28
- else if (command.serverStatus !== undefined) {
29
- return this.handleServerStatus(context);
30
- }
31
- else if (command.buildInfo !== undefined) {
32
- return this.handleBuildInfo(context);
33
- }
34
- else if (command.whatsmyuri !== undefined) {
35
- return this.handleWhatsMyUri(context);
36
- }
37
- else if (command.getLog !== undefined) {
38
- return this.handleGetLog(context);
39
- }
40
- else if (command.hostInfo !== undefined) {
41
- return this.handleHostInfo(context);
42
- }
43
- else if (command.replSetGetStatus !== undefined) {
44
- return this.handleReplSetGetStatus(context);
45
- }
46
- else if (command.saslStart !== undefined) {
47
- return this.handleSaslStart(context);
48
- }
49
- else if (command.saslContinue !== undefined) {
50
- return this.handleSaslContinue(context);
51
- }
52
- else if (command.endSessions !== undefined) {
53
- return this.handleEndSessions(context);
54
- }
55
- else if (command.abortTransaction !== undefined) {
56
- return this.handleAbortTransaction(context);
57
- }
58
- else if (command.commitTransaction !== undefined) {
59
- return this.handleCommitTransaction(context);
60
- }
61
- else if (command.collStats !== undefined) {
62
- return this.handleCollStats(context);
63
- }
64
- else if (command.dbStats !== undefined) {
65
- return this.handleDbStats(context);
66
- }
67
- else if (command.connectionStatus !== undefined) {
68
- return this.handleConnectionStatus(context);
69
- }
70
- else if (command.currentOp !== undefined) {
71
- return this.handleCurrentOp(context);
72
- }
73
- else if (command.collMod !== undefined) {
74
- return this.handleCollMod(context);
75
- }
76
- else if (command.renameCollection !== undefined) {
77
- return this.handleRenameCollection(context);
78
- }
79
- return {
80
- ok: 0,
81
- errmsg: 'Unknown admin command',
82
- code: 59,
83
- codeName: 'CommandNotFound',
84
- };
85
- }
86
- /**
87
- * Handle ping command
88
- */
89
- async handlePing(context) {
90
- return { ok: 1 };
91
- }
92
- /**
93
- * Handle listDatabases command
94
- */
95
- async handleListDatabases(context) {
96
- const { storage, command } = context;
97
- const dbNames = await storage.listDatabases();
98
- const nameOnly = command.nameOnly || false;
99
- if (nameOnly) {
100
- return {
101
- ok: 1,
102
- databases: dbNames.map(name => ({ name })),
103
- };
104
- }
105
- // Build database list with sizes
106
- const databases = [];
107
- let totalSize = 0;
108
- for (const name of dbNames) {
109
- const collections = await storage.listCollections(name);
110
- let dbSize = 0;
111
- for (const collName of collections) {
112
- const docs = await storage.findAll(name, collName);
113
- // Estimate size (rough approximation)
114
- dbSize += docs.reduce((sum, doc) => sum + JSON.stringify(doc).length, 0);
115
- }
116
- totalSize += dbSize;
117
- databases.push({
118
- name,
119
- sizeOnDisk: dbSize,
120
- empty: dbSize === 0,
121
- });
122
- }
123
- return {
124
- ok: 1,
125
- databases,
126
- totalSize,
127
- totalSizeMb: totalSize / (1024 * 1024),
128
- };
129
- }
130
- /**
131
- * Handle listCollections command
132
- */
133
- async handleListCollections(context) {
134
- const { storage, database, command } = context;
135
- const filter = command.filter || {};
136
- const nameOnly = command.nameOnly || false;
137
- const cursor = command.cursor || {};
138
- const batchSize = cursor.batchSize || 101;
139
- const collNames = await storage.listCollections(database);
140
- let collections = [];
141
- for (const name of collNames) {
142
- // Apply name filter
143
- if (filter.name && filter.name !== name) {
144
- // Check regex
145
- if (filter.name.$regex) {
146
- const regex = new RegExp(filter.name.$regex, filter.name.$options);
147
- if (!regex.test(name))
148
- continue;
149
- }
150
- else {
151
- continue;
152
- }
153
- }
154
- if (nameOnly) {
155
- collections.push({ name });
156
- }
157
- else {
158
- collections.push({
159
- name,
160
- type: 'collection',
161
- options: {},
162
- info: {
163
- readOnly: false,
164
- uuid: new plugins.bson.UUID(),
165
- },
166
- idIndex: {
167
- v: 2,
168
- key: { _id: 1 },
169
- name: '_id_',
170
- },
171
- });
172
- }
173
- }
174
- return {
175
- ok: 1,
176
- cursor: {
177
- id: plugins.bson.Long.fromNumber(0),
178
- ns: `${database}.$cmd.listCollections`,
179
- firstBatch: collections,
180
- },
181
- };
182
- }
183
- /**
184
- * Handle drop command (drop collection)
185
- */
186
- async handleDrop(context) {
187
- const { storage, database, command } = context;
188
- const collection = command.drop;
189
- const existed = await storage.dropCollection(database, collection);
190
- if (!existed) {
191
- return {
192
- ok: 0,
193
- errmsg: `ns not found ${database}.${collection}`,
194
- code: 26,
195
- codeName: 'NamespaceNotFound',
196
- };
197
- }
198
- return { ok: 1, ns: `${database}.${collection}` };
199
- }
200
- /**
201
- * Handle dropDatabase command
202
- */
203
- async handleDropDatabase(context) {
204
- const { storage, database } = context;
205
- await storage.dropDatabase(database);
206
- return { ok: 1, dropped: database };
207
- }
208
- /**
209
- * Handle create command (create collection)
210
- */
211
- async handleCreate(context) {
212
- const { storage, database, command } = context;
213
- const collection = command.create;
214
- // Check if already exists
215
- const exists = await storage.collectionExists(database, collection);
216
- if (exists) {
217
- return {
218
- ok: 0,
219
- errmsg: `Collection ${database}.${collection} already exists.`,
220
- code: 48,
221
- codeName: 'NamespaceExists',
222
- };
223
- }
224
- await storage.createCollection(database, collection);
225
- return { ok: 1 };
226
- }
227
- /**
228
- * Handle serverStatus command
229
- */
230
- async handleServerStatus(context) {
231
- const { server, sessionEngine } = context;
232
- const uptime = server.getUptime();
233
- const connections = server.getConnectionCount();
234
- const sessions = sessionEngine.listSessions();
235
- const sessionsWithTxn = sessionEngine.getSessionsWithTransactions();
236
- return {
237
- ok: 1,
238
- host: `${server.host}:${server.port}`,
239
- version: '7.0.0',
240
- process: 'smartdb',
241
- pid: process.pid,
242
- uptime,
243
- uptimeMillis: uptime * 1000,
244
- uptimeEstimate: uptime,
245
- localTime: new Date(),
246
- mem: {
247
- resident: Math.floor(process.memoryUsage().rss / (1024 * 1024)),
248
- virtual: Math.floor(process.memoryUsage().heapTotal / (1024 * 1024)),
249
- supported: true,
250
- },
251
- connections: {
252
- current: connections,
253
- available: 1000 - connections,
254
- totalCreated: connections,
255
- active: connections,
256
- },
257
- logicalSessionRecordCache: {
258
- activeSessionsCount: sessions.length,
259
- sessionsCollectionJobCount: 0,
260
- lastSessionsCollectionJobDurationMillis: 0,
261
- lastSessionsCollectionJobTimestamp: new Date(),
262
- transactionReaperJobCount: 0,
263
- lastTransactionReaperJobDurationMillis: 0,
264
- lastTransactionReaperJobTimestamp: new Date(),
265
- },
266
- transactions: {
267
- retriedCommandsCount: 0,
268
- retriedStatementsCount: 0,
269
- transactionsCollectionWriteCount: 0,
270
- currentActive: sessionsWithTxn.length,
271
- currentInactive: 0,
272
- currentOpen: sessionsWithTxn.length,
273
- totalStarted: sessionsWithTxn.length,
274
- totalCommitted: 0,
275
- totalAborted: 0,
276
- },
277
- network: {
278
- bytesIn: 0,
279
- bytesOut: 0,
280
- numRequests: 0,
281
- },
282
- storageEngine: {
283
- name: 'smartdb',
284
- supportsCommittedReads: true,
285
- persistent: false,
286
- },
287
- };
288
- }
289
- /**
290
- * Handle buildInfo command
291
- */
292
- async handleBuildInfo(context) {
293
- return {
294
- ok: 1,
295
- version: '7.0.0',
296
- gitVersion: 'smartdb',
297
- modules: [],
298
- allocator: 'system',
299
- javascriptEngine: 'none',
300
- sysInfo: 'deprecated',
301
- versionArray: [7, 0, 0, 0],
302
- openssl: {
303
- running: 'disabled',
304
- compiled: 'disabled',
305
- },
306
- buildEnvironment: {
307
- distmod: 'smartdb',
308
- distarch: process.arch,
309
- cc: '',
310
- ccflags: '',
311
- cxx: '',
312
- cxxflags: '',
313
- linkflags: '',
314
- target_arch: process.arch,
315
- target_os: process.platform,
316
- },
317
- bits: 64,
318
- debug: false,
319
- maxBsonObjectSize: 16777216,
320
- storageEngines: ['smartdb'],
321
- };
322
- }
323
- /**
324
- * Handle whatsmyuri command
325
- */
326
- async handleWhatsMyUri(context) {
327
- const { server } = context;
328
- return {
329
- ok: 1,
330
- you: `127.0.0.1:${server.port}`,
331
- };
332
- }
333
- /**
334
- * Handle getLog command
335
- */
336
- async handleGetLog(context) {
337
- const { command } = context;
338
- if (command.getLog === '*') {
339
- return {
340
- ok: 1,
341
- names: ['global', 'startupWarnings'],
342
- };
343
- }
344
- return {
345
- ok: 1,
346
- totalLinesWritten: 0,
347
- log: [],
348
- };
349
- }
350
- /**
351
- * Handle hostInfo command
352
- */
353
- async handleHostInfo(context) {
354
- return {
355
- ok: 1,
356
- system: {
357
- currentTime: new Date(),
358
- hostname: 'localhost',
359
- cpuAddrSize: 64,
360
- memSizeMB: Math.floor(process.memoryUsage().heapTotal / (1024 * 1024)),
361
- numCores: 1,
362
- cpuArch: process.arch,
363
- numaEnabled: false,
364
- },
365
- os: {
366
- type: process.platform,
367
- name: process.platform,
368
- version: process.version,
369
- },
370
- extra: {},
371
- };
372
- }
373
- /**
374
- * Handle replSetGetStatus command
375
- */
376
- async handleReplSetGetStatus(context) {
377
- // We're standalone, not a replica set
378
- return {
379
- ok: 0,
380
- errmsg: 'not running with --replSet',
381
- code: 76,
382
- codeName: 'NoReplicationEnabled',
383
- };
384
- }
385
- /**
386
- * Handle saslStart command (authentication)
387
- */
388
- async handleSaslStart(context) {
389
- // We don't require authentication, but we need to respond properly
390
- // to let drivers know auth is "successful"
391
- return {
392
- ok: 1,
393
- conversationId: 1,
394
- done: true,
395
- payload: Buffer.from([]),
396
- };
397
- }
398
- /**
399
- * Handle saslContinue command
400
- */
401
- async handleSaslContinue(context) {
402
- return {
403
- ok: 1,
404
- conversationId: 1,
405
- done: true,
406
- payload: Buffer.from([]),
407
- };
408
- }
409
- /**
410
- * Handle endSessions command
411
- */
412
- async handleEndSessions(context) {
413
- const { command, sessionEngine } = context;
414
- // End each session in the array
415
- const sessions = command.endSessions || [];
416
- for (const sessionSpec of sessions) {
417
- const sessionId = SessionEngine.extractSessionId(sessionSpec);
418
- if (sessionId) {
419
- await sessionEngine.endSession(sessionId);
420
- }
421
- }
422
- return { ok: 1 };
423
- }
424
- /**
425
- * Handle abortTransaction command
426
- */
427
- async handleAbortTransaction(context) {
428
- const { transactionEngine, sessionEngine, txnId, sessionId } = context;
429
- if (!txnId) {
430
- return {
431
- ok: 0,
432
- errmsg: 'No transaction started',
433
- code: 251,
434
- codeName: 'NoSuchTransaction',
435
- };
436
- }
437
- try {
438
- await transactionEngine.abortTransaction(txnId);
439
- transactionEngine.endTransaction(txnId);
440
- // Update session state
441
- if (sessionId) {
442
- sessionEngine.endTransaction(sessionId);
443
- }
444
- return { ok: 1 };
445
- }
446
- catch (error) {
447
- return {
448
- ok: 0,
449
- errmsg: error.message || 'Abort transaction failed',
450
- code: error.code || 1,
451
- codeName: error.codeName || 'UnknownError',
452
- };
453
- }
454
- }
455
- /**
456
- * Handle commitTransaction command
457
- */
458
- async handleCommitTransaction(context) {
459
- const { transactionEngine, sessionEngine, txnId, sessionId } = context;
460
- if (!txnId) {
461
- return {
462
- ok: 0,
463
- errmsg: 'No transaction started',
464
- code: 251,
465
- codeName: 'NoSuchTransaction',
466
- };
467
- }
468
- try {
469
- await transactionEngine.commitTransaction(txnId);
470
- transactionEngine.endTransaction(txnId);
471
- // Update session state
472
- if (sessionId) {
473
- sessionEngine.endTransaction(sessionId);
474
- }
475
- return { ok: 1 };
476
- }
477
- catch (error) {
478
- // If commit fails, transaction should be aborted
479
- try {
480
- await transactionEngine.abortTransaction(txnId);
481
- transactionEngine.endTransaction(txnId);
482
- if (sessionId) {
483
- sessionEngine.endTransaction(sessionId);
484
- }
485
- }
486
- catch {
487
- // Ignore abort errors
488
- }
489
- if (error.code === 112) {
490
- // Write conflict
491
- return {
492
- ok: 0,
493
- errmsg: error.message || 'Write conflict during commit',
494
- code: 112,
495
- codeName: 'WriteConflict',
496
- };
497
- }
498
- return {
499
- ok: 0,
500
- errmsg: error.message || 'Commit transaction failed',
501
- code: error.code || 1,
502
- codeName: error.codeName || 'UnknownError',
503
- };
504
- }
505
- }
506
- /**
507
- * Handle collStats command
508
- */
509
- async handleCollStats(context) {
510
- const { storage, database, command } = context;
511
- const collection = command.collStats;
512
- const exists = await storage.collectionExists(database, collection);
513
- if (!exists) {
514
- return {
515
- ok: 0,
516
- errmsg: `ns not found ${database}.${collection}`,
517
- code: 26,
518
- codeName: 'NamespaceNotFound',
519
- };
520
- }
521
- const docs = await storage.findAll(database, collection);
522
- const size = docs.reduce((sum, doc) => sum + JSON.stringify(doc).length, 0);
523
- const count = docs.length;
524
- const avgObjSize = count > 0 ? size / count : 0;
525
- const indexes = await storage.getIndexes(database, collection);
526
- return {
527
- ok: 1,
528
- ns: `${database}.${collection}`,
529
- count,
530
- size,
531
- avgObjSize,
532
- storageSize: size,
533
- totalIndexSize: 0,
534
- indexSizes: indexes.reduce((acc, idx) => {
535
- acc[idx.name] = 0;
536
- return acc;
537
- }, {}),
538
- nindexes: indexes.length,
539
- };
540
- }
541
- /**
542
- * Handle dbStats command
543
- */
544
- async handleDbStats(context) {
545
- const { storage, database } = context;
546
- const collections = await storage.listCollections(database);
547
- let totalSize = 0;
548
- let totalObjects = 0;
549
- for (const collName of collections) {
550
- const docs = await storage.findAll(database, collName);
551
- totalObjects += docs.length;
552
- totalSize += docs.reduce((sum, doc) => sum + JSON.stringify(doc).length, 0);
553
- }
554
- return {
555
- ok: 1,
556
- db: database,
557
- collections: collections.length,
558
- views: 0,
559
- objects: totalObjects,
560
- avgObjSize: totalObjects > 0 ? totalSize / totalObjects : 0,
561
- dataSize: totalSize,
562
- storageSize: totalSize,
563
- indexes: collections.length, // At least _id index per collection
564
- indexSize: 0,
565
- totalSize,
566
- };
567
- }
568
- /**
569
- * Handle connectionStatus command
570
- */
571
- async handleConnectionStatus(context) {
572
- return {
573
- ok: 1,
574
- authInfo: {
575
- authenticatedUsers: [],
576
- authenticatedUserRoles: [],
577
- },
578
- };
579
- }
580
- /**
581
- * Handle currentOp command
582
- */
583
- async handleCurrentOp(context) {
584
- return {
585
- ok: 1,
586
- inprog: [],
587
- };
588
- }
589
- /**
590
- * Handle collMod command
591
- */
592
- async handleCollMod(context) {
593
- // We don't support modifying collection options, but acknowledge the command
594
- return { ok: 1 };
595
- }
596
- /**
597
- * Handle renameCollection command
598
- */
599
- async handleRenameCollection(context) {
600
- const { storage, command } = context;
601
- const from = command.renameCollection;
602
- const to = command.to;
603
- const dropTarget = command.dropTarget || false;
604
- if (!from || !to) {
605
- return {
606
- ok: 0,
607
- errmsg: 'renameCollection requires both source and target',
608
- code: 2,
609
- codeName: 'BadValue',
610
- };
611
- }
612
- // Parse namespace (format: "db.collection")
613
- const fromParts = from.split('.');
614
- const toParts = to.split('.');
615
- if (fromParts.length < 2 || toParts.length < 2) {
616
- return {
617
- ok: 0,
618
- errmsg: 'Invalid namespace format',
619
- code: 73,
620
- codeName: 'InvalidNamespace',
621
- };
622
- }
623
- const fromDb = fromParts[0];
624
- const fromColl = fromParts.slice(1).join('.');
625
- const toDb = toParts[0];
626
- const toColl = toParts.slice(1).join('.');
627
- // Check if source exists
628
- const sourceExists = await storage.collectionExists(fromDb, fromColl);
629
- if (!sourceExists) {
630
- return {
631
- ok: 0,
632
- errmsg: `source namespace ${from} does not exist`,
633
- code: 26,
634
- codeName: 'NamespaceNotFound',
635
- };
636
- }
637
- // Check if target exists
638
- const targetExists = await storage.collectionExists(toDb, toColl);
639
- if (targetExists) {
640
- if (dropTarget) {
641
- await storage.dropCollection(toDb, toColl);
642
- }
643
- else {
644
- return {
645
- ok: 0,
646
- errmsg: `target namespace ${to} already exists`,
647
- code: 48,
648
- codeName: 'NamespaceExists',
649
- };
650
- }
651
- }
652
- // Same database rename
653
- if (fromDb === toDb) {
654
- await storage.renameCollection(fromDb, fromColl, toColl);
655
- }
656
- else {
657
- // Cross-database rename: copy documents then drop source
658
- await storage.createCollection(toDb, toColl);
659
- const docs = await storage.findAll(fromDb, fromColl);
660
- for (const doc of docs) {
661
- await storage.insertOne(toDb, toColl, doc);
662
- }
663
- await storage.dropCollection(fromDb, fromColl);
664
- }
665
- return { ok: 1 };
666
- }
667
- }
668
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRtaW5IYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvdHNfc21hcnRkYi9zZXJ2ZXIvaGFuZGxlcnMvQWRtaW5IYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFFNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTlEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFDdkIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUF3QjtRQUNuQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRTVCLG9DQUFvQztRQUNwQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLENBQUM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0MsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0MsQ0FBQzthQUFNLElBQUksT0FBTyxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNqRCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QyxDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzlDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLENBQUM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxF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