@push.rocks/smartdb 1.0.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 (112) hide show
  1. package/.smartconfig.json +38 -0
  2. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  3. package/dist_ts/00_commitinfo_data.js +9 -0
  4. package/dist_ts/index.d.ts +5 -0
  5. package/dist_ts/index.js +8 -0
  6. package/dist_ts/ts_local/classes.localsmartdb.d.ts +78 -0
  7. package/dist_ts/ts_local/classes.localsmartdb.js +115 -0
  8. package/dist_ts/ts_local/index.d.ts +2 -0
  9. package/dist_ts/ts_local/index.js +2 -0
  10. package/dist_ts/ts_local/plugins.d.ts +2 -0
  11. package/dist_ts/ts_local/plugins.js +3 -0
  12. package/dist_ts/ts_smartdb/engine/AggregationEngine.d.ts +66 -0
  13. package/dist_ts/ts_smartdb/engine/AggregationEngine.js +189 -0
  14. package/dist_ts/ts_smartdb/engine/IndexEngine.d.ts +97 -0
  15. package/dist_ts/ts_smartdb/engine/IndexEngine.js +678 -0
  16. package/dist_ts/ts_smartdb/engine/QueryEngine.d.ts +54 -0
  17. package/dist_ts/ts_smartdb/engine/QueryEngine.js +271 -0
  18. package/dist_ts/ts_smartdb/engine/QueryPlanner.d.ts +64 -0
  19. package/dist_ts/ts_smartdb/engine/QueryPlanner.js +308 -0
  20. package/dist_ts/ts_smartdb/engine/SessionEngine.d.ts +117 -0
  21. package/dist_ts/ts_smartdb/engine/SessionEngine.js +232 -0
  22. package/dist_ts/ts_smartdb/engine/TransactionEngine.d.ts +85 -0
  23. package/dist_ts/ts_smartdb/engine/TransactionEngine.js +287 -0
  24. package/dist_ts/ts_smartdb/engine/UpdateEngine.d.ts +47 -0
  25. package/dist_ts/ts_smartdb/engine/UpdateEngine.js +461 -0
  26. package/dist_ts/ts_smartdb/errors/SmartdbErrors.d.ts +100 -0
  27. package/dist_ts/ts_smartdb/errors/SmartdbErrors.js +155 -0
  28. package/dist_ts/ts_smartdb/index.d.ts +26 -0
  29. package/dist_ts/ts_smartdb/index.js +31 -0
  30. package/dist_ts/ts_smartdb/plugins.d.ts +10 -0
  31. package/dist_ts/ts_smartdb/plugins.js +14 -0
  32. package/dist_ts/ts_smartdb/server/CommandRouter.d.ts +87 -0
  33. package/dist_ts/ts_smartdb/server/CommandRouter.js +222 -0
  34. package/dist_ts/ts_smartdb/server/SmartdbServer.d.ts +102 -0
  35. package/dist_ts/ts_smartdb/server/SmartdbServer.js +279 -0
  36. package/dist_ts/ts_smartdb/server/WireProtocol.d.ts +117 -0
  37. package/dist_ts/ts_smartdb/server/WireProtocol.js +298 -0
  38. package/dist_ts/ts_smartdb/server/handlers/AdminHandler.d.ts +100 -0
  39. package/dist_ts/ts_smartdb/server/handlers/AdminHandler.js +668 -0
  40. package/dist_ts/ts_smartdb/server/handlers/AggregateHandler.d.ts +31 -0
  41. package/dist_ts/ts_smartdb/server/handlers/AggregateHandler.js +277 -0
  42. package/dist_ts/ts_smartdb/server/handlers/DeleteHandler.d.ts +8 -0
  43. package/dist_ts/ts_smartdb/server/handlers/DeleteHandler.js +95 -0
  44. package/dist_ts/ts_smartdb/server/handlers/FindHandler.d.ts +31 -0
  45. package/dist_ts/ts_smartdb/server/handlers/FindHandler.js +291 -0
  46. package/dist_ts/ts_smartdb/server/handlers/HelloHandler.d.ts +11 -0
  47. package/dist_ts/ts_smartdb/server/handlers/HelloHandler.js +62 -0
  48. package/dist_ts/ts_smartdb/server/handlers/IndexHandler.d.ts +20 -0
  49. package/dist_ts/ts_smartdb/server/handlers/IndexHandler.js +183 -0
  50. package/dist_ts/ts_smartdb/server/handlers/InsertHandler.d.ts +8 -0
  51. package/dist_ts/ts_smartdb/server/handlers/InsertHandler.js +79 -0
  52. package/dist_ts/ts_smartdb/server/handlers/UpdateHandler.d.ts +24 -0
  53. package/dist_ts/ts_smartdb/server/handlers/UpdateHandler.js +296 -0
  54. package/dist_ts/ts_smartdb/server/handlers/index.d.ts +8 -0
  55. package/dist_ts/ts_smartdb/server/handlers/index.js +10 -0
  56. package/dist_ts/ts_smartdb/server/index.d.ts +6 -0
  57. package/dist_ts/ts_smartdb/server/index.js +7 -0
  58. package/dist_ts/ts_smartdb/storage/FileStorageAdapter.d.ts +85 -0
  59. package/dist_ts/ts_smartdb/storage/FileStorageAdapter.js +465 -0
  60. package/dist_ts/ts_smartdb/storage/IStorageAdapter.d.ts +145 -0
  61. package/dist_ts/ts_smartdb/storage/IStorageAdapter.js +2 -0
  62. package/dist_ts/ts_smartdb/storage/MemoryStorageAdapter.d.ts +67 -0
  63. package/dist_ts/ts_smartdb/storage/MemoryStorageAdapter.js +378 -0
  64. package/dist_ts/ts_smartdb/storage/OpLog.d.ts +93 -0
  65. package/dist_ts/ts_smartdb/storage/OpLog.js +221 -0
  66. package/dist_ts/ts_smartdb/storage/WAL.d.ts +117 -0
  67. package/dist_ts/ts_smartdb/storage/WAL.js +286 -0
  68. package/dist_ts/ts_smartdb/types/interfaces.d.ts +363 -0
  69. package/dist_ts/ts_smartdb/types/interfaces.js +2 -0
  70. package/dist_ts/ts_smartdb/utils/checksum.d.ts +30 -0
  71. package/dist_ts/ts_smartdb/utils/checksum.js +77 -0
  72. package/dist_ts/ts_smartdb/utils/index.d.ts +1 -0
  73. package/dist_ts/ts_smartdb/utils/index.js +2 -0
  74. package/license +19 -0
  75. package/package.json +69 -0
  76. package/readme.md +529 -0
  77. package/ts/00_commitinfo_data.ts +8 -0
  78. package/ts/index.ts +11 -0
  79. package/ts/ts_local/classes.localsmartdb.ts +143 -0
  80. package/ts/ts_local/index.ts +2 -0
  81. package/ts/ts_local/plugins.ts +3 -0
  82. package/ts/ts_smartdb/engine/AggregationEngine.ts +283 -0
  83. package/ts/ts_smartdb/engine/IndexEngine.ts +798 -0
  84. package/ts/ts_smartdb/engine/QueryEngine.ts +301 -0
  85. package/ts/ts_smartdb/engine/QueryPlanner.ts +393 -0
  86. package/ts/ts_smartdb/engine/SessionEngine.ts +292 -0
  87. package/ts/ts_smartdb/engine/TransactionEngine.ts +351 -0
  88. package/ts/ts_smartdb/engine/UpdateEngine.ts +506 -0
  89. package/ts/ts_smartdb/errors/SmartdbErrors.ts +181 -0
  90. package/ts/ts_smartdb/index.ts +46 -0
  91. package/ts/ts_smartdb/plugins.ts +17 -0
  92. package/ts/ts_smartdb/server/CommandRouter.ts +289 -0
  93. package/ts/ts_smartdb/server/SmartdbServer.ts +354 -0
  94. package/ts/ts_smartdb/server/WireProtocol.ts +416 -0
  95. package/ts/ts_smartdb/server/handlers/AdminHandler.ts +719 -0
  96. package/ts/ts_smartdb/server/handlers/AggregateHandler.ts +342 -0
  97. package/ts/ts_smartdb/server/handlers/DeleteHandler.ts +115 -0
  98. package/ts/ts_smartdb/server/handlers/FindHandler.ts +330 -0
  99. package/ts/ts_smartdb/server/handlers/HelloHandler.ts +78 -0
  100. package/ts/ts_smartdb/server/handlers/IndexHandler.ts +207 -0
  101. package/ts/ts_smartdb/server/handlers/InsertHandler.ts +97 -0
  102. package/ts/ts_smartdb/server/handlers/UpdateHandler.ts +344 -0
  103. package/ts/ts_smartdb/server/handlers/index.ts +10 -0
  104. package/ts/ts_smartdb/server/index.ts +10 -0
  105. package/ts/ts_smartdb/storage/FileStorageAdapter.ts +562 -0
  106. package/ts/ts_smartdb/storage/IStorageAdapter.ts +208 -0
  107. package/ts/ts_smartdb/storage/MemoryStorageAdapter.ts +455 -0
  108. package/ts/ts_smartdb/storage/OpLog.ts +282 -0
  109. package/ts/ts_smartdb/storage/WAL.ts +375 -0
  110. package/ts/ts_smartdb/types/interfaces.ts +433 -0
  111. package/ts/ts_smartdb/utils/checksum.ts +88 -0
  112. package/ts/ts_smartdb/utils/index.ts +1 -0
@@ -0,0 +1,291 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import { QueryEngine } from '../../engine/QueryEngine.js';
3
+ /**
4
+ * FindHandler - Handles find, getMore, killCursors, count, distinct commands
5
+ */
6
+ export class FindHandler {
7
+ cursors;
8
+ nextCursorId;
9
+ constructor(cursors, nextCursorId) {
10
+ this.cursors = cursors;
11
+ this.nextCursorId = nextCursorId;
12
+ }
13
+ async handle(context) {
14
+ const { command } = context;
15
+ // Determine which operation to perform
16
+ if (command.find) {
17
+ return this.handleFind(context);
18
+ }
19
+ else if (command.getMore !== undefined) {
20
+ return this.handleGetMore(context);
21
+ }
22
+ else if (command.killCursors) {
23
+ return this.handleKillCursors(context);
24
+ }
25
+ else if (command.count) {
26
+ return this.handleCount(context);
27
+ }
28
+ else if (command.distinct) {
29
+ return this.handleDistinct(context);
30
+ }
31
+ return {
32
+ ok: 0,
33
+ errmsg: 'Unknown find-related command',
34
+ code: 59,
35
+ codeName: 'CommandNotFound',
36
+ };
37
+ }
38
+ /**
39
+ * Handle find command
40
+ */
41
+ async handleFind(context) {
42
+ const { storage, database, command, getIndexEngine } = context;
43
+ const collection = command.find;
44
+ const filter = command.filter || {};
45
+ const projection = command.projection;
46
+ const sort = command.sort;
47
+ const skip = command.skip || 0;
48
+ const limit = command.limit || 0;
49
+ const batchSize = command.batchSize || 101;
50
+ const singleBatch = command.singleBatch || false;
51
+ // Ensure collection exists
52
+ const exists = await storage.collectionExists(database, collection);
53
+ if (!exists) {
54
+ // Return empty cursor for non-existent collection
55
+ return {
56
+ ok: 1,
57
+ cursor: {
58
+ id: plugins.bson.Long.fromNumber(0),
59
+ ns: `${database}.${collection}`,
60
+ firstBatch: [],
61
+ },
62
+ };
63
+ }
64
+ // Try to use index-accelerated query
65
+ const indexEngine = getIndexEngine(collection);
66
+ const candidateIds = await indexEngine.findCandidateIds(filter);
67
+ let documents;
68
+ if (candidateIds !== null) {
69
+ // Index hit - fetch only candidate documents
70
+ documents = await storage.findByIds(database, collection, candidateIds);
71
+ // Still apply filter for any conditions the index couldn't fully satisfy
72
+ documents = QueryEngine.filter(documents, filter);
73
+ }
74
+ else {
75
+ // No suitable index - full collection scan
76
+ documents = await storage.findAll(database, collection);
77
+ // Apply filter
78
+ documents = QueryEngine.filter(documents, filter);
79
+ }
80
+ // Apply sort
81
+ if (sort) {
82
+ documents = QueryEngine.sort(documents, sort);
83
+ }
84
+ // Apply skip
85
+ if (skip > 0) {
86
+ documents = documents.slice(skip);
87
+ }
88
+ // Apply limit
89
+ if (limit > 0) {
90
+ documents = documents.slice(0, limit);
91
+ }
92
+ // Apply projection
93
+ if (projection) {
94
+ documents = QueryEngine.project(documents, projection);
95
+ }
96
+ // Determine how many documents to return in first batch
97
+ const effectiveBatchSize = Math.min(batchSize, documents.length);
98
+ const firstBatch = documents.slice(0, effectiveBatchSize);
99
+ const remaining = documents.slice(effectiveBatchSize);
100
+ // Create cursor if there are more documents
101
+ let cursorId = BigInt(0);
102
+ if (remaining.length > 0 && !singleBatch) {
103
+ cursorId = this.nextCursorId();
104
+ this.cursors.set(cursorId, {
105
+ id: cursorId,
106
+ database,
107
+ collection,
108
+ documents: remaining,
109
+ position: 0,
110
+ batchSize,
111
+ createdAt: new Date(),
112
+ });
113
+ }
114
+ return {
115
+ ok: 1,
116
+ cursor: {
117
+ id: plugins.bson.Long.fromBigInt(cursorId),
118
+ ns: `${database}.${collection}`,
119
+ firstBatch,
120
+ },
121
+ };
122
+ }
123
+ /**
124
+ * Handle getMore command
125
+ */
126
+ async handleGetMore(context) {
127
+ const { database, command } = context;
128
+ const cursorIdInput = command.getMore;
129
+ const collection = command.collection;
130
+ const batchSize = command.batchSize || 101;
131
+ // Convert cursorId to bigint
132
+ let cursorId;
133
+ if (typeof cursorIdInput === 'bigint') {
134
+ cursorId = cursorIdInput;
135
+ }
136
+ else if (cursorIdInput instanceof plugins.bson.Long) {
137
+ cursorId = cursorIdInput.toBigInt();
138
+ }
139
+ else {
140
+ cursorId = BigInt(cursorIdInput);
141
+ }
142
+ const cursor = this.cursors.get(cursorId);
143
+ if (!cursor) {
144
+ return {
145
+ ok: 0,
146
+ errmsg: `cursor id ${cursorId} not found`,
147
+ code: 43,
148
+ codeName: 'CursorNotFound',
149
+ };
150
+ }
151
+ // Verify namespace
152
+ if (cursor.database !== database || cursor.collection !== collection) {
153
+ return {
154
+ ok: 0,
155
+ errmsg: 'cursor namespace mismatch',
156
+ code: 43,
157
+ codeName: 'CursorNotFound',
158
+ };
159
+ }
160
+ // Get next batch
161
+ const start = cursor.position;
162
+ const end = Math.min(start + batchSize, cursor.documents.length);
163
+ const nextBatch = cursor.documents.slice(start, end);
164
+ cursor.position = end;
165
+ // Check if cursor is exhausted
166
+ let returnCursorId = cursorId;
167
+ if (cursor.position >= cursor.documents.length) {
168
+ this.cursors.delete(cursorId);
169
+ returnCursorId = BigInt(0);
170
+ }
171
+ return {
172
+ ok: 1,
173
+ cursor: {
174
+ id: plugins.bson.Long.fromBigInt(returnCursorId),
175
+ ns: `${database}.${collection}`,
176
+ nextBatch,
177
+ },
178
+ };
179
+ }
180
+ /**
181
+ * Handle killCursors command
182
+ */
183
+ async handleKillCursors(context) {
184
+ const { command } = context;
185
+ const collection = command.killCursors;
186
+ const cursorIds = command.cursors || [];
187
+ const cursorsKilled = [];
188
+ const cursorsNotFound = [];
189
+ const cursorsUnknown = [];
190
+ for (const idInput of cursorIds) {
191
+ let cursorId;
192
+ if (typeof idInput === 'bigint') {
193
+ cursorId = idInput;
194
+ }
195
+ else if (idInput instanceof plugins.bson.Long) {
196
+ cursorId = idInput.toBigInt();
197
+ }
198
+ else {
199
+ cursorId = BigInt(idInput);
200
+ }
201
+ if (this.cursors.has(cursorId)) {
202
+ this.cursors.delete(cursorId);
203
+ cursorsKilled.push(plugins.bson.Long.fromBigInt(cursorId));
204
+ }
205
+ else {
206
+ cursorsNotFound.push(plugins.bson.Long.fromBigInt(cursorId));
207
+ }
208
+ }
209
+ return {
210
+ ok: 1,
211
+ cursorsKilled,
212
+ cursorsNotFound,
213
+ cursorsUnknown,
214
+ cursorsAlive: [],
215
+ };
216
+ }
217
+ /**
218
+ * Handle count command
219
+ */
220
+ async handleCount(context) {
221
+ const { storage, database, command, getIndexEngine } = context;
222
+ const collection = command.count;
223
+ const query = command.query || {};
224
+ const skip = command.skip || 0;
225
+ const limit = command.limit || 0;
226
+ // Check if collection exists
227
+ const exists = await storage.collectionExists(database, collection);
228
+ if (!exists) {
229
+ return { ok: 1, n: 0 };
230
+ }
231
+ // Try to use index-accelerated query
232
+ const indexEngine = getIndexEngine(collection);
233
+ const candidateIds = await indexEngine.findCandidateIds(query);
234
+ let documents;
235
+ if (candidateIds !== null) {
236
+ // Index hit - fetch only candidate documents
237
+ documents = await storage.findByIds(database, collection, candidateIds);
238
+ documents = QueryEngine.filter(documents, query);
239
+ }
240
+ else {
241
+ // No suitable index - full collection scan
242
+ documents = await storage.findAll(database, collection);
243
+ documents = QueryEngine.filter(documents, query);
244
+ }
245
+ // Apply skip
246
+ if (skip > 0) {
247
+ documents = documents.slice(skip);
248
+ }
249
+ // Apply limit
250
+ if (limit > 0) {
251
+ documents = documents.slice(0, limit);
252
+ }
253
+ return { ok: 1, n: documents.length };
254
+ }
255
+ /**
256
+ * Handle distinct command
257
+ */
258
+ async handleDistinct(context) {
259
+ const { storage, database, command, getIndexEngine } = context;
260
+ const collection = command.distinct;
261
+ const key = command.key;
262
+ const query = command.query || {};
263
+ if (!key) {
264
+ return {
265
+ ok: 0,
266
+ errmsg: 'distinct requires a key',
267
+ code: 2,
268
+ codeName: 'BadValue',
269
+ };
270
+ }
271
+ // Check if collection exists
272
+ const exists = await storage.collectionExists(database, collection);
273
+ if (!exists) {
274
+ return { ok: 1, values: [] };
275
+ }
276
+ // Try to use index-accelerated query
277
+ const indexEngine = getIndexEngine(collection);
278
+ const candidateIds = await indexEngine.findCandidateIds(query);
279
+ let documents;
280
+ if (candidateIds !== null) {
281
+ documents = await storage.findByIds(database, collection, candidateIds);
282
+ }
283
+ else {
284
+ documents = await storage.findAll(database, collection);
285
+ }
286
+ // Get distinct values
287
+ const values = QueryEngine.distinct(documents, key, query);
288
+ return { ok: 1, values };
289
+ }
290
+ }
291
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmluZEhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy90c19zbWFydGRiL3NlcnZlci9oYW5kbGVycy9GaW5kSGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUxRDs7R0FFRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBQ2QsT0FBTyxDQUE0QjtJQUNuQyxZQUFZLENBQWU7SUFFbkMsWUFDRSxPQUFrQyxFQUNsQyxZQUEwQjtRQUUxQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNuQyxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUF3QjtRQUNuQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRTVCLHVDQUF1QztRQUN2QyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsQ0FBQzthQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN6QyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsQ0FBQzthQUFNLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQy9CLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLENBQUM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsQ0FBQzthQUFNLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxD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
@@ -0,0 +1,11 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import type { ICommandHandler, IHandlerContext } from '../CommandRouter.js';
3
+ /**
4
+ * HelloHandler - Handles hello/isMaster handshake commands
5
+ *
6
+ * This is the first command sent by MongoDB drivers to establish a connection.
7
+ * It returns server capabilities and configuration.
8
+ */
9
+ export declare class HelloHandler implements ICommandHandler {
10
+ handle(context: IHandlerContext): Promise<plugins.bson.Document>;
11
+ }
@@ -0,0 +1,62 @@
1
+ import * as plugins from '../../plugins.js';
2
+ /**
3
+ * HelloHandler - Handles hello/isMaster handshake commands
4
+ *
5
+ * This is the first command sent by MongoDB drivers to establish a connection.
6
+ * It returns server capabilities and configuration.
7
+ */
8
+ export class HelloHandler {
9
+ async handle(context) {
10
+ const { command, server } = context;
11
+ // Build response with server capabilities
12
+ const response = {
13
+ ismaster: true,
14
+ ok: 1,
15
+ // Maximum sizes
16
+ maxBsonObjectSize: 16777216, // 16 MB
17
+ maxMessageSizeBytes: 48000000, // 48 MB
18
+ maxWriteBatchSize: 100000, // 100k documents per batch
19
+ // Timestamps
20
+ localTime: new Date(),
21
+ // Session support
22
+ logicalSessionTimeoutMinutes: 30,
23
+ // Connection info
24
+ connectionId: 1,
25
+ // Wire protocol versions (support MongoDB 3.6 through 7.0)
26
+ minWireVersion: 0,
27
+ maxWireVersion: 21,
28
+ // Server mode
29
+ readOnly: false,
30
+ // Topology info (standalone mode)
31
+ isWritablePrimary: true,
32
+ // Additional info
33
+ topologyVersion: {
34
+ processId: new plugins.bson.ObjectId(),
35
+ counter: plugins.bson.Long.fromNumber(0),
36
+ },
37
+ };
38
+ // Handle hello-specific fields
39
+ if (command.hello || command.hello === 1) {
40
+ response.helloOk = true;
41
+ }
42
+ // Handle client metadata
43
+ if (command.client) {
44
+ // Client is providing metadata about itself
45
+ // We just acknowledge it - no need to do anything special
46
+ }
47
+ // Handle SASL mechanisms query
48
+ if (command.saslSupportedMechs) {
49
+ response.saslSupportedMechs = [
50
+ // We don't actually support auth, but the driver needs to see this
51
+ ];
52
+ }
53
+ // Compression support (none for now)
54
+ if (command.compression) {
55
+ response.compression = [];
56
+ }
57
+ // Server version info
58
+ response.version = '7.0.0';
59
+ return response;
60
+ }
61
+ }
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVsbG9IYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvdHNfc21hcnRkYi9zZXJ2ZXIvaGFuZGxlcnMvSGVsbG9IYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFHNUM7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUN2QixLQUFLLENBQUMsTUFBTSxDQUFDLE9BQXdCO1FBQ25DLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRXBDLDBDQUEwQztRQUMxQyxNQUFNLFFBQVEsR0FBMEI7WUFDdEMsUUFBUSxFQUFFLElBQUk7WUFDZCxFQUFFLEVBQUUsQ0FBQztZQUVMLGdCQUFnQjtZQUNoQixpQkFBaUIsRUFBRSxRQUFRLEVBQVksUUFBUTtZQUMvQyxtQkFBbUIsRUFBRSxRQUFRLEVBQVUsUUFBUTtZQUMvQyxpQkFBaUIsRUFBRSxNQUFNLEVBQWMsMkJBQTJCO1lBRWxFLGFBQWE7WUFDYixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUU7WUFFckIsa0JBQWtCO1lBQ2xCLDRCQUE0QixFQUFFLEVBQUU7WUFFaEMsa0JBQWtCO1lBQ2xCLFlBQVksRUFBRSxDQUFDO1lBRWYsMkRBQTJEO1lBQzNELGNBQWMsRUFBRSxDQUFDO1lBQ2pCLGNBQWMsRUFBRSxFQUFFO1lBRWxCLGNBQWM7WUFDZCxRQUFRLEVBQUUsS0FBSztZQUVmLGtDQUFrQztZQUNsQyxpQkFBaUIsRUFBRSxJQUFJO1lBRXZCLGtCQUFrQjtZQUNsQixlQUFlLEVBQUU7Z0JBQ2YsU0FBUyxFQUFFLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ3RDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2FBQ3pDO1NBQ0YsQ0FBQztRQUVGLCtCQUErQjtRQUMvQixJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QyxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUMxQixDQUFDO1FBRUQseUJBQXlCO1FBQ3pCLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLDRDQUE0QztZQUM1QywwREFBMEQ7UUFDNUQsQ0FBQztRQUVELCtCQUErQjtRQUMvQixJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQy9CLFFBQVEsQ0FBQyxrQkFBa0IsR0FBRztZQUM1QixtRUFBbUU7YUFDcEUsQ0FBQztRQUNKLENBQUM7UUFFRCxxQ0FBcUM7UUFDckMsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDeEIsUUFBUSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUVELHNCQUFzQjtRQUN0QixRQUFRLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUUzQixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0NBQ0YifQ==
@@ -0,0 +1,20 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import type { ICommandHandler, IHandlerContext } from '../CommandRouter.js';
3
+ /**
4
+ * IndexHandler - Handles createIndexes, dropIndexes, listIndexes commands
5
+ */
6
+ export declare class IndexHandler implements ICommandHandler {
7
+ handle(context: IHandlerContext): Promise<plugins.bson.Document>;
8
+ /**
9
+ * Handle createIndexes command
10
+ */
11
+ private handleCreateIndexes;
12
+ /**
13
+ * Handle dropIndexes command
14
+ */
15
+ private handleDropIndexes;
16
+ /**
17
+ * Handle listIndexes command
18
+ */
19
+ private handleListIndexes;
20
+ }
@@ -0,0 +1,183 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import { IndexEngine } from '../../engine/IndexEngine.js';
3
+ // Cache of index engines per collection
4
+ const indexEngines = new Map();
5
+ /**
6
+ * Get or create an IndexEngine for a collection
7
+ */
8
+ function getIndexEngine(storage, database, collection) {
9
+ const key = `${database}.${collection}`;
10
+ let engine = indexEngines.get(key);
11
+ if (!engine) {
12
+ engine = new IndexEngine(database, collection, storage);
13
+ indexEngines.set(key, engine);
14
+ }
15
+ return engine;
16
+ }
17
+ /**
18
+ * IndexHandler - Handles createIndexes, dropIndexes, listIndexes commands
19
+ */
20
+ export class IndexHandler {
21
+ async handle(context) {
22
+ const { command } = context;
23
+ if (command.createIndexes) {
24
+ return this.handleCreateIndexes(context);
25
+ }
26
+ else if (command.dropIndexes) {
27
+ return this.handleDropIndexes(context);
28
+ }
29
+ else if (command.listIndexes) {
30
+ return this.handleListIndexes(context);
31
+ }
32
+ return {
33
+ ok: 0,
34
+ errmsg: 'Unknown index command',
35
+ code: 59,
36
+ codeName: 'CommandNotFound',
37
+ };
38
+ }
39
+ /**
40
+ * Handle createIndexes command
41
+ */
42
+ async handleCreateIndexes(context) {
43
+ const { storage, database, command } = context;
44
+ const collection = command.createIndexes;
45
+ const indexes = command.indexes || [];
46
+ if (!Array.isArray(indexes)) {
47
+ return {
48
+ ok: 0,
49
+ errmsg: 'indexes must be an array',
50
+ code: 2,
51
+ codeName: 'BadValue',
52
+ };
53
+ }
54
+ // Ensure collection exists
55
+ await storage.createCollection(database, collection);
56
+ const indexEngine = getIndexEngine(storage, database, collection);
57
+ const createdNames = [];
58
+ let numIndexesBefore = 0;
59
+ let numIndexesAfter = 0;
60
+ try {
61
+ const existingIndexes = await indexEngine.listIndexes();
62
+ numIndexesBefore = existingIndexes.length;
63
+ for (const indexSpec of indexes) {
64
+ const key = indexSpec.key;
65
+ const options = {
66
+ name: indexSpec.name,
67
+ unique: indexSpec.unique,
68
+ sparse: indexSpec.sparse,
69
+ expireAfterSeconds: indexSpec.expireAfterSeconds,
70
+ background: indexSpec.background,
71
+ partialFilterExpression: indexSpec.partialFilterExpression,
72
+ };
73
+ const name = await indexEngine.createIndex(key, options);
74
+ createdNames.push(name);
75
+ }
76
+ const finalIndexes = await indexEngine.listIndexes();
77
+ numIndexesAfter = finalIndexes.length;
78
+ }
79
+ catch (error) {
80
+ return {
81
+ ok: 0,
82
+ errmsg: error.message || 'Failed to create index',
83
+ code: error.code || 1,
84
+ codeName: error.codeName || 'InternalError',
85
+ };
86
+ }
87
+ return {
88
+ ok: 1,
89
+ numIndexesBefore,
90
+ numIndexesAfter,
91
+ createdCollectionAutomatically: false,
92
+ commitQuorum: 'votingMembers',
93
+ };
94
+ }
95
+ /**
96
+ * Handle dropIndexes command
97
+ */
98
+ async handleDropIndexes(context) {
99
+ const { storage, database, command } = context;
100
+ const collection = command.dropIndexes;
101
+ const indexName = command.index;
102
+ // Check if collection exists
103
+ const exists = await storage.collectionExists(database, collection);
104
+ if (!exists) {
105
+ return {
106
+ ok: 0,
107
+ errmsg: `ns not found ${database}.${collection}`,
108
+ code: 26,
109
+ codeName: 'NamespaceNotFound',
110
+ };
111
+ }
112
+ const indexEngine = getIndexEngine(storage, database, collection);
113
+ try {
114
+ if (indexName === '*') {
115
+ // Drop all indexes except _id
116
+ await indexEngine.dropAllIndexes();
117
+ }
118
+ else if (typeof indexName === 'string') {
119
+ // Drop specific index by name
120
+ await indexEngine.dropIndex(indexName);
121
+ }
122
+ else if (typeof indexName === 'object') {
123
+ // Drop index by key specification
124
+ const indexes = await indexEngine.listIndexes();
125
+ const keyStr = JSON.stringify(indexName);
126
+ for (const idx of indexes) {
127
+ if (JSON.stringify(idx.key) === keyStr) {
128
+ await indexEngine.dropIndex(idx.name);
129
+ break;
130
+ }
131
+ }
132
+ }
133
+ return { ok: 1, nIndexesWas: 1 };
134
+ }
135
+ catch (error) {
136
+ return {
137
+ ok: 0,
138
+ errmsg: error.message || 'Failed to drop index',
139
+ code: error.code || 27,
140
+ codeName: error.codeName || 'IndexNotFound',
141
+ };
142
+ }
143
+ }
144
+ /**
145
+ * Handle listIndexes command
146
+ */
147
+ async handleListIndexes(context) {
148
+ const { storage, database, command } = context;
149
+ const collection = command.listIndexes;
150
+ const cursor = command.cursor || {};
151
+ const batchSize = cursor.batchSize || 101;
152
+ // Check if collection exists
153
+ const exists = await storage.collectionExists(database, collection);
154
+ if (!exists) {
155
+ return {
156
+ ok: 0,
157
+ errmsg: `ns not found ${database}.${collection}`,
158
+ code: 26,
159
+ codeName: 'NamespaceNotFound',
160
+ };
161
+ }
162
+ const indexEngine = getIndexEngine(storage, database, collection);
163
+ const indexes = await indexEngine.listIndexes();
164
+ // Format indexes for response
165
+ const indexDocs = indexes.map(idx => ({
166
+ v: idx.v || 2,
167
+ key: idx.key,
168
+ name: idx.name,
169
+ ...(idx.unique ? { unique: idx.unique } : {}),
170
+ ...(idx.sparse ? { sparse: idx.sparse } : {}),
171
+ ...(idx.expireAfterSeconds !== undefined ? { expireAfterSeconds: idx.expireAfterSeconds } : {}),
172
+ }));
173
+ return {
174
+ ok: 1,
175
+ cursor: {
176
+ id: plugins.bson.Long.fromNumber(0),
177
+ ns: `${database}.${collection}`,
178
+ firstBatch: indexDocs,
179
+ },
180
+ };
181
+ }
182
+ }
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5kZXhIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvdHNfc21hcnRkYi9zZXJ2ZXIvaGFuZGxlcnMvSW5kZXhIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFFNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTFELHdDQUF3QztBQUN4QyxNQUFNLFlBQVksR0FBNkIsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUV6RDs7R0FFRztBQUNILFNBQVMsY0FBYyxDQUFDLE9BQVksRUFBRSxRQUFnQixFQUFFLFVBQWtCO0lBQ3hFLE1BQU0sR0FBRyxHQUFHLEdBQUcsUUFBUSxJQUFJLFVBQVUsRUFBRSxDQUFDO0lBQ3hDLElBQUksTUFBTSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFbkMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxHQUFHLElBQUksV0FBVyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDeEQsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBQ3ZCLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBd0I7UUFDbkMsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUU1QixJQUFJLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQyxDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDL0IsT0FBTyxJQUFJLENBQUMsaUJBQWlC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
@@ -0,0 +1,8 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import type { ICommandHandler, IHandlerContext } from '../CommandRouter.js';
3
+ /**
4
+ * InsertHandler - Handles insert commands
5
+ */
6
+ export declare class InsertHandler implements ICommandHandler {
7
+ handle(context: IHandlerContext): Promise<plugins.bson.Document>;
8
+ }