@push.rocks/smartmongo 2.1.0 → 3.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.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/index.d.ts +1 -1
- package/dist_ts/index.js +3 -3
- package/dist_ts/tsmdb/engine/AggregationEngine.js +189 -0
- package/dist_ts/tsmdb/engine/IndexEngine.js +376 -0
- package/dist_ts/tsmdb/engine/QueryEngine.js +271 -0
- package/dist_ts/{congodb → tsmdb}/engine/TransactionEngine.d.ts +1 -1
- package/dist_ts/tsmdb/engine/TransactionEngine.js +287 -0
- package/dist_ts/tsmdb/engine/UpdateEngine.js +461 -0
- package/dist_ts/{congodb/errors/CongoErrors.d.ts → tsmdb/errors/TsmdbErrors.d.ts} +16 -16
- package/dist_ts/tsmdb/errors/TsmdbErrors.js +155 -0
- package/dist_ts/{congodb → tsmdb}/index.d.ts +4 -4
- package/dist_ts/tsmdb/index.js +26 -0
- package/dist_ts/{congodb → tsmdb}/server/CommandRouter.d.ts +4 -4
- package/dist_ts/tsmdb/server/CommandRouter.js +132 -0
- package/dist_ts/{congodb/server/CongoServer.d.ts → tsmdb/server/TsmdbServer.d.ts} +6 -6
- package/dist_ts/tsmdb/server/TsmdbServer.js +227 -0
- package/dist_ts/{congodb → tsmdb}/server/WireProtocol.d.ts +1 -1
- package/dist_ts/tsmdb/server/WireProtocol.js +298 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/AdminHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/AdminHandler.js +568 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/AggregateHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/AggregateHandler.js +277 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/DeleteHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/DeleteHandler.js +83 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/FindHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/FindHandler.js +261 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/HelloHandler.d.ts +1 -1
- package/dist_ts/{congodb → tsmdb}/server/handlers/HelloHandler.js +2 -2
- package/dist_ts/{congodb → tsmdb}/server/handlers/IndexHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/IndexHandler.js +183 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/InsertHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/InsertHandler.js +76 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/UpdateHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/UpdateHandler.js +270 -0
- package/dist_ts/tsmdb/server/handlers/index.js +10 -0
- package/dist_ts/{congodb → tsmdb}/server/index.d.ts +2 -2
- package/dist_ts/tsmdb/server/index.js +7 -0
- package/dist_ts/{congodb → tsmdb}/storage/FileStorageAdapter.d.ts +2 -2
- package/dist_ts/tsmdb/storage/FileStorageAdapter.js +396 -0
- package/dist_ts/{congodb → tsmdb}/storage/IStorageAdapter.d.ts +2 -2
- package/dist_ts/{congodb → tsmdb}/storage/IStorageAdapter.js +1 -1
- package/dist_ts/{congodb → tsmdb}/storage/MemoryStorageAdapter.d.ts +2 -2
- package/dist_ts/tsmdb/storage/MemoryStorageAdapter.js +367 -0
- package/dist_ts/{congodb → tsmdb}/storage/OpLog.d.ts +1 -1
- package/dist_ts/tsmdb/storage/OpLog.js +221 -0
- package/dist_ts/tsmdb/tsmdb.plugins.js +14 -0
- package/dist_ts/{congodb → tsmdb}/types/interfaces.d.ts +3 -3
- package/dist_ts/{congodb → tsmdb}/types/interfaces.js +1 -1
- package/package.json +1 -1
- package/readme.hints.md +7 -12
- package/readme.md +398 -44
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/index.ts +2 -2
- package/ts/{congodb → tsmdb}/engine/AggregationEngine.ts +1 -1
- package/ts/{congodb → tsmdb}/engine/IndexEngine.ts +7 -7
- package/ts/{congodb → tsmdb}/engine/QueryEngine.ts +1 -1
- package/ts/{congodb → tsmdb}/engine/TransactionEngine.ts +12 -12
- package/ts/{congodb → tsmdb}/engine/UpdateEngine.ts +1 -1
- package/ts/{congodb/errors/CongoErrors.ts → tsmdb/errors/TsmdbErrors.ts} +34 -34
- package/ts/{congodb → tsmdb}/index.ts +7 -7
- package/ts/{congodb → tsmdb}/server/CommandRouter.ts +5 -5
- package/ts/{congodb/server/CongoServer.ts → tsmdb/server/TsmdbServer.ts} +8 -8
- package/ts/{congodb → tsmdb}/server/WireProtocol.ts +1 -1
- package/ts/{congodb → tsmdb}/server/handlers/AdminHandler.ts +6 -6
- package/ts/{congodb → tsmdb}/server/handlers/AggregateHandler.ts +1 -1
- package/ts/{congodb → tsmdb}/server/handlers/DeleteHandler.ts +1 -1
- package/ts/{congodb → tsmdb}/server/handlers/FindHandler.ts +1 -1
- package/ts/{congodb → tsmdb}/server/handlers/HelloHandler.ts +1 -1
- package/ts/{congodb → tsmdb}/server/handlers/IndexHandler.ts +1 -1
- package/ts/{congodb → tsmdb}/server/handlers/InsertHandler.ts +1 -1
- package/ts/{congodb → tsmdb}/server/handlers/UpdateHandler.ts +1 -1
- package/ts/{congodb → tsmdb}/server/index.ts +2 -2
- package/ts/{congodb → tsmdb}/storage/FileStorageAdapter.ts +2 -2
- package/ts/{congodb → tsmdb}/storage/IStorageAdapter.ts +2 -2
- package/ts/{congodb → tsmdb}/storage/MemoryStorageAdapter.ts +2 -2
- package/ts/{congodb → tsmdb}/storage/OpLog.ts +1 -1
- package/ts/{congodb → tsmdb}/types/interfaces.ts +3 -3
- package/dist_ts/congodb/congodb.plugins.js +0 -14
- package/dist_ts/congodb/engine/AggregationEngine.js +0 -189
- package/dist_ts/congodb/engine/IndexEngine.js +0 -376
- package/dist_ts/congodb/engine/QueryEngine.js +0 -271
- package/dist_ts/congodb/engine/TransactionEngine.js +0 -287
- package/dist_ts/congodb/engine/UpdateEngine.js +0 -461
- package/dist_ts/congodb/errors/CongoErrors.js +0 -155
- package/dist_ts/congodb/index.js +0 -26
- package/dist_ts/congodb/server/CommandRouter.js +0 -132
- package/dist_ts/congodb/server/CongoServer.js +0 -227
- package/dist_ts/congodb/server/WireProtocol.js +0 -298
- package/dist_ts/congodb/server/handlers/AdminHandler.js +0 -568
- package/dist_ts/congodb/server/handlers/AggregateHandler.js +0 -277
- package/dist_ts/congodb/server/handlers/DeleteHandler.js +0 -83
- package/dist_ts/congodb/server/handlers/FindHandler.js +0 -261
- package/dist_ts/congodb/server/handlers/IndexHandler.js +0 -183
- package/dist_ts/congodb/server/handlers/InsertHandler.js +0 -76
- package/dist_ts/congodb/server/handlers/UpdateHandler.js +0 -270
- package/dist_ts/congodb/server/handlers/index.js +0 -10
- package/dist_ts/congodb/server/index.js +0 -7
- package/dist_ts/congodb/storage/FileStorageAdapter.js +0 -396
- package/dist_ts/congodb/storage/MemoryStorageAdapter.js +0 -367
- package/dist_ts/congodb/storage/OpLog.js +0 -221
- /package/dist_ts/{congodb → tsmdb}/engine/AggregationEngine.d.ts +0 -0
- /package/dist_ts/{congodb → tsmdb}/engine/IndexEngine.d.ts +0 -0
- /package/dist_ts/{congodb → tsmdb}/engine/QueryEngine.d.ts +0 -0
- /package/dist_ts/{congodb → tsmdb}/engine/UpdateEngine.d.ts +0 -0
- /package/dist_ts/{congodb → tsmdb}/server/handlers/index.d.ts +0 -0
- /package/dist_ts/{congodb/congodb.plugins.d.ts → tsmdb/tsmdb.plugins.d.ts} +0 -0
- /package/ts/{congodb → tsmdb}/server/handlers/index.ts +0 -0
- /package/ts/{congodb/congodb.plugins.ts → tsmdb/tsmdb.plugins.ts} +0 -0
package/dist_ts/congodb/index.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
// CongoDB - MongoDB Wire Protocol compatible in-memory database server
|
|
2
|
-
// Use the official MongoDB driver to connect to CongoServer
|
|
3
|
-
// Re-export plugins for external use
|
|
4
|
-
import * as plugins from './congodb.plugins.js';
|
|
5
|
-
export { plugins };
|
|
6
|
-
// Export BSON types for convenience
|
|
7
|
-
export { ObjectId, Binary, Timestamp, Long, Decimal128, UUID } from 'bson';
|
|
8
|
-
// Export all types
|
|
9
|
-
export * from './types/interfaces.js';
|
|
10
|
-
// Export errors
|
|
11
|
-
export * from './errors/CongoErrors.js';
|
|
12
|
-
export { MemoryStorageAdapter } from './storage/MemoryStorageAdapter.js';
|
|
13
|
-
export { FileStorageAdapter } from './storage/FileStorageAdapter.js';
|
|
14
|
-
export { OpLog } from './storage/OpLog.js';
|
|
15
|
-
// Export engines
|
|
16
|
-
export { QueryEngine } from './engine/QueryEngine.js';
|
|
17
|
-
export { UpdateEngine } from './engine/UpdateEngine.js';
|
|
18
|
-
export { AggregationEngine } from './engine/AggregationEngine.js';
|
|
19
|
-
export { IndexEngine } from './engine/IndexEngine.js';
|
|
20
|
-
export { TransactionEngine } from './engine/TransactionEngine.js';
|
|
21
|
-
// Export server (the main entry point for using CongoDB)
|
|
22
|
-
export { CongoServer } from './server/CongoServer.js';
|
|
23
|
-
// Export wire protocol utilities (for advanced usage)
|
|
24
|
-
export { WireProtocol } from './server/WireProtocol.js';
|
|
25
|
-
export { CommandRouter } from './server/CommandRouter.js';
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jb25nb2RiL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVFQUF1RTtBQUN2RSw0REFBNEQ7QUFFNUQscUNBQXFDO0FBQ3JDLE9BQU8sS0FBSyxPQUFPLE1BQU0sc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBRW5CLG9DQUFvQztBQUNwQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFM0UsbUJBQW1CO0FBQ25CLGNBQWMsdUJBQXVCLENBQUM7QUFFdEMsZ0JBQWdCO0FBQ2hCLGNBQWMseUJBQXlCLENBQUM7QUFJeEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDckUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNDLGlCQUFpQjtBQUNqQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVsRSx5REFBeUQ7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBR3RELHNEQUFzRDtBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDIn0=
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../congodb.plugins.js';
|
|
2
|
-
// Import handlers
|
|
3
|
-
import { HelloHandler } from './handlers/HelloHandler.js';
|
|
4
|
-
import { InsertHandler } from './handlers/InsertHandler.js';
|
|
5
|
-
import { FindHandler } from './handlers/FindHandler.js';
|
|
6
|
-
import { UpdateHandler } from './handlers/UpdateHandler.js';
|
|
7
|
-
import { DeleteHandler } from './handlers/DeleteHandler.js';
|
|
8
|
-
import { AggregateHandler } from './handlers/AggregateHandler.js';
|
|
9
|
-
import { IndexHandler } from './handlers/IndexHandler.js';
|
|
10
|
-
import { AdminHandler } from './handlers/AdminHandler.js';
|
|
11
|
-
/**
|
|
12
|
-
* CommandRouter - Routes incoming commands to appropriate handlers
|
|
13
|
-
*/
|
|
14
|
-
export class CommandRouter {
|
|
15
|
-
storage;
|
|
16
|
-
server;
|
|
17
|
-
handlers = new Map();
|
|
18
|
-
// Cursor state for getMore operations
|
|
19
|
-
cursors = new Map();
|
|
20
|
-
cursorIdCounter = BigInt(1);
|
|
21
|
-
constructor(storage, server) {
|
|
22
|
-
this.storage = storage;
|
|
23
|
-
this.server = server;
|
|
24
|
-
this.registerHandlers();
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Register all command handlers
|
|
28
|
-
*/
|
|
29
|
-
registerHandlers() {
|
|
30
|
-
// Create handler instances with shared state
|
|
31
|
-
const helloHandler = new HelloHandler();
|
|
32
|
-
const findHandler = new FindHandler(this.cursors, () => this.cursorIdCounter++);
|
|
33
|
-
const insertHandler = new InsertHandler();
|
|
34
|
-
const updateHandler = new UpdateHandler();
|
|
35
|
-
const deleteHandler = new DeleteHandler();
|
|
36
|
-
const aggregateHandler = new AggregateHandler(this.cursors, () => this.cursorIdCounter++);
|
|
37
|
-
const indexHandler = new IndexHandler();
|
|
38
|
-
const adminHandler = new AdminHandler();
|
|
39
|
-
// Handshake commands
|
|
40
|
-
this.handlers.set('hello', helloHandler);
|
|
41
|
-
this.handlers.set('ismaster', helloHandler);
|
|
42
|
-
this.handlers.set('isMaster', helloHandler);
|
|
43
|
-
// CRUD commands
|
|
44
|
-
this.handlers.set('find', findHandler);
|
|
45
|
-
this.handlers.set('insert', insertHandler);
|
|
46
|
-
this.handlers.set('update', updateHandler);
|
|
47
|
-
this.handlers.set('delete', deleteHandler);
|
|
48
|
-
this.handlers.set('findAndModify', updateHandler);
|
|
49
|
-
this.handlers.set('getMore', findHandler);
|
|
50
|
-
this.handlers.set('killCursors', findHandler);
|
|
51
|
-
// Aggregation
|
|
52
|
-
this.handlers.set('aggregate', aggregateHandler);
|
|
53
|
-
this.handlers.set('count', findHandler);
|
|
54
|
-
this.handlers.set('distinct', findHandler);
|
|
55
|
-
// Index operations
|
|
56
|
-
this.handlers.set('createIndexes', indexHandler);
|
|
57
|
-
this.handlers.set('dropIndexes', indexHandler);
|
|
58
|
-
this.handlers.set('listIndexes', indexHandler);
|
|
59
|
-
// Admin/Database operations
|
|
60
|
-
this.handlers.set('ping', adminHandler);
|
|
61
|
-
this.handlers.set('listDatabases', adminHandler);
|
|
62
|
-
this.handlers.set('listCollections', adminHandler);
|
|
63
|
-
this.handlers.set('drop', adminHandler);
|
|
64
|
-
this.handlers.set('dropDatabase', adminHandler);
|
|
65
|
-
this.handlers.set('create', adminHandler);
|
|
66
|
-
this.handlers.set('serverStatus', adminHandler);
|
|
67
|
-
this.handlers.set('buildInfo', adminHandler);
|
|
68
|
-
this.handlers.set('whatsmyuri', adminHandler);
|
|
69
|
-
this.handlers.set('getLog', adminHandler);
|
|
70
|
-
this.handlers.set('hostInfo', adminHandler);
|
|
71
|
-
this.handlers.set('replSetGetStatus', adminHandler);
|
|
72
|
-
this.handlers.set('isMaster', helloHandler);
|
|
73
|
-
this.handlers.set('saslStart', adminHandler);
|
|
74
|
-
this.handlers.set('saslContinue', adminHandler);
|
|
75
|
-
this.handlers.set('endSessions', adminHandler);
|
|
76
|
-
this.handlers.set('abortTransaction', adminHandler);
|
|
77
|
-
this.handlers.set('commitTransaction', adminHandler);
|
|
78
|
-
this.handlers.set('collStats', adminHandler);
|
|
79
|
-
this.handlers.set('dbStats', adminHandler);
|
|
80
|
-
this.handlers.set('connectionStatus', adminHandler);
|
|
81
|
-
this.handlers.set('currentOp', adminHandler);
|
|
82
|
-
this.handlers.set('collMod', adminHandler);
|
|
83
|
-
this.handlers.set('renameCollection', adminHandler);
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Route a command to its handler
|
|
87
|
-
*/
|
|
88
|
-
async route(parsedCommand) {
|
|
89
|
-
const { commandName, command, database, documentSequences } = parsedCommand;
|
|
90
|
-
// Create handler context
|
|
91
|
-
const context = {
|
|
92
|
-
storage: this.storage,
|
|
93
|
-
server: this.server,
|
|
94
|
-
database,
|
|
95
|
-
command,
|
|
96
|
-
documentSequences,
|
|
97
|
-
};
|
|
98
|
-
// Find handler
|
|
99
|
-
const handler = this.handlers.get(commandName);
|
|
100
|
-
if (!handler) {
|
|
101
|
-
// Unknown command
|
|
102
|
-
return {
|
|
103
|
-
ok: 0,
|
|
104
|
-
errmsg: `no such command: '${commandName}'`,
|
|
105
|
-
code: 59,
|
|
106
|
-
codeName: 'CommandNotFound',
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
try {
|
|
110
|
-
return await handler.handle(context);
|
|
111
|
-
}
|
|
112
|
-
catch (error) {
|
|
113
|
-
// Handle known error types
|
|
114
|
-
if (error.code) {
|
|
115
|
-
return {
|
|
116
|
-
ok: 0,
|
|
117
|
-
errmsg: error.message,
|
|
118
|
-
code: error.code,
|
|
119
|
-
codeName: error.codeName || 'UnknownError',
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
// Generic error
|
|
123
|
-
return {
|
|
124
|
-
ok: 0,
|
|
125
|
-
errmsg: error.message || 'Internal error',
|
|
126
|
-
code: 1,
|
|
127
|
-
codeName: 'InternalError',
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tbWFuZFJvdXRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2NvbmdvZGIvc2VydmVyL0NvbW1hbmRSb3V0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSx1QkFBdUIsQ0FBQztBQUtqRCxrQkFBa0I7QUFDbEIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBb0IxRDs7R0FFRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBQ2hCLE9BQU8sQ0FBa0I7SUFDekIsTUFBTSxDQUFjO0lBQ3BCLFFBQVEsR0FBaUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUUzRCxzQ0FBc0M7SUFDOUIsT0FBTyxHQUE4QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQy9DLGVBQWUsR0FBVyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFNUMsWUFBWSxPQUF3QixFQUFFLE1BQW1CO1FBQ3ZELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQjtRQUN0Qiw2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
|
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
import * as net from 'net';
|
|
2
|
-
import * as plugins from '../congodb.plugins.js';
|
|
3
|
-
import { WireProtocol, OP_QUERY } from './WireProtocol.js';
|
|
4
|
-
import { CommandRouter } from './CommandRouter.js';
|
|
5
|
-
import { MemoryStorageAdapter } from '../storage/MemoryStorageAdapter.js';
|
|
6
|
-
import { FileStorageAdapter } from '../storage/FileStorageAdapter.js';
|
|
7
|
-
/**
|
|
8
|
-
* CongoServer - MongoDB Wire Protocol compatible server
|
|
9
|
-
*
|
|
10
|
-
* This server implements the MongoDB wire protocol (OP_MSG) to allow
|
|
11
|
-
* official MongoDB drivers to connect and perform operations.
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```typescript
|
|
15
|
-
* import { CongoServer } from '@push.rocks/smartmongo/congodb';
|
|
16
|
-
* import { MongoClient } from 'mongodb';
|
|
17
|
-
*
|
|
18
|
-
* const server = new CongoServer({ port: 27017 });
|
|
19
|
-
* await server.start();
|
|
20
|
-
*
|
|
21
|
-
* const client = new MongoClient('mongodb://127.0.0.1:27017');
|
|
22
|
-
* await client.connect();
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
export class CongoServer {
|
|
26
|
-
options;
|
|
27
|
-
server = null;
|
|
28
|
-
storage;
|
|
29
|
-
commandRouter;
|
|
30
|
-
connections = new Map();
|
|
31
|
-
connectionIdCounter = 0;
|
|
32
|
-
isRunning = false;
|
|
33
|
-
startTime = new Date();
|
|
34
|
-
constructor(options = {}) {
|
|
35
|
-
this.options = {
|
|
36
|
-
port: options.port ?? 27017,
|
|
37
|
-
host: options.host ?? '127.0.0.1',
|
|
38
|
-
storage: options.storage ?? 'memory',
|
|
39
|
-
storagePath: options.storagePath ?? './data',
|
|
40
|
-
persistPath: options.persistPath ?? '',
|
|
41
|
-
persistIntervalMs: options.persistIntervalMs ?? 60000,
|
|
42
|
-
};
|
|
43
|
-
// Create storage adapter
|
|
44
|
-
if (this.options.storage === 'file') {
|
|
45
|
-
this.storage = new FileStorageAdapter(this.options.storagePath);
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
this.storage = new MemoryStorageAdapter({
|
|
49
|
-
persistPath: this.options.persistPath || undefined,
|
|
50
|
-
persistIntervalMs: this.options.persistPath ? this.options.persistIntervalMs : undefined,
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
// Create command router
|
|
54
|
-
this.commandRouter = new CommandRouter(this.storage, this);
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Get the storage adapter (for testing/debugging)
|
|
58
|
-
*/
|
|
59
|
-
getStorage() {
|
|
60
|
-
return this.storage;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Get server uptime in seconds
|
|
64
|
-
*/
|
|
65
|
-
getUptime() {
|
|
66
|
-
return Math.floor((Date.now() - this.startTime.getTime()) / 1000);
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Get current connection count
|
|
70
|
-
*/
|
|
71
|
-
getConnectionCount() {
|
|
72
|
-
return this.connections.size;
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Start the server
|
|
76
|
-
*/
|
|
77
|
-
async start() {
|
|
78
|
-
if (this.isRunning) {
|
|
79
|
-
throw new Error('Server is already running');
|
|
80
|
-
}
|
|
81
|
-
// Initialize storage
|
|
82
|
-
await this.storage.initialize();
|
|
83
|
-
return new Promise((resolve, reject) => {
|
|
84
|
-
this.server = net.createServer((socket) => {
|
|
85
|
-
this.handleConnection(socket);
|
|
86
|
-
});
|
|
87
|
-
this.server.on('error', (err) => {
|
|
88
|
-
if (!this.isRunning) {
|
|
89
|
-
reject(err);
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
console.error('Server error:', err);
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
this.server.listen(this.options.port, this.options.host, () => {
|
|
96
|
-
this.isRunning = true;
|
|
97
|
-
this.startTime = new Date();
|
|
98
|
-
resolve();
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Stop the server
|
|
104
|
-
*/
|
|
105
|
-
async stop() {
|
|
106
|
-
if (!this.isRunning || !this.server) {
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
// Close all connections
|
|
110
|
-
for (const conn of this.connections.values()) {
|
|
111
|
-
conn.socket.destroy();
|
|
112
|
-
}
|
|
113
|
-
this.connections.clear();
|
|
114
|
-
// Close storage
|
|
115
|
-
await this.storage.close();
|
|
116
|
-
return new Promise((resolve) => {
|
|
117
|
-
this.server.close(() => {
|
|
118
|
-
this.isRunning = false;
|
|
119
|
-
this.server = null;
|
|
120
|
-
resolve();
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Handle a new client connection
|
|
126
|
-
*/
|
|
127
|
-
handleConnection(socket) {
|
|
128
|
-
const connectionId = ++this.connectionIdCounter;
|
|
129
|
-
const state = {
|
|
130
|
-
id: connectionId,
|
|
131
|
-
socket,
|
|
132
|
-
buffer: Buffer.alloc(0),
|
|
133
|
-
authenticated: true, // No auth required for now
|
|
134
|
-
database: 'test',
|
|
135
|
-
};
|
|
136
|
-
this.connections.set(connectionId, state);
|
|
137
|
-
socket.on('data', (data) => {
|
|
138
|
-
this.handleData(state, Buffer.isBuffer(data) ? data : Buffer.from(data));
|
|
139
|
-
});
|
|
140
|
-
socket.on('close', () => {
|
|
141
|
-
this.connections.delete(connectionId);
|
|
142
|
-
});
|
|
143
|
-
socket.on('error', (err) => {
|
|
144
|
-
// Connection errors are expected when clients disconnect
|
|
145
|
-
this.connections.delete(connectionId);
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Handle incoming data from a client
|
|
150
|
-
*/
|
|
151
|
-
handleData(state, data) {
|
|
152
|
-
// Append new data to buffer
|
|
153
|
-
state.buffer = Buffer.concat([state.buffer, data]);
|
|
154
|
-
// Process messages from buffer
|
|
155
|
-
this.processMessages(state);
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Process complete messages from the buffer
|
|
159
|
-
*/
|
|
160
|
-
async processMessages(state) {
|
|
161
|
-
while (state.buffer.length >= 16) {
|
|
162
|
-
try {
|
|
163
|
-
const result = WireProtocol.parseMessage(state.buffer);
|
|
164
|
-
if (!result) {
|
|
165
|
-
// Not enough data for a complete message
|
|
166
|
-
break;
|
|
167
|
-
}
|
|
168
|
-
const { command, bytesConsumed } = result;
|
|
169
|
-
// Remove processed bytes from buffer
|
|
170
|
-
state.buffer = state.buffer.subarray(bytesConsumed);
|
|
171
|
-
// Process the command
|
|
172
|
-
const response = await this.commandRouter.route(command);
|
|
173
|
-
// Encode and send response
|
|
174
|
-
let responseBuffer;
|
|
175
|
-
if (command.opCode === OP_QUERY) {
|
|
176
|
-
// Legacy OP_QUERY gets OP_REPLY response
|
|
177
|
-
responseBuffer = WireProtocol.encodeOpReplyResponse(command.requestID, [response]);
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
// OP_MSG gets OP_MSG response
|
|
181
|
-
responseBuffer = WireProtocol.encodeOpMsgResponse(command.requestID, response);
|
|
182
|
-
}
|
|
183
|
-
if (!state.socket.destroyed) {
|
|
184
|
-
state.socket.write(responseBuffer);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
catch (error) {
|
|
188
|
-
// Send error response
|
|
189
|
-
const errorResponse = WireProtocol.encodeErrorResponse(0, // We don't have the requestID at this point
|
|
190
|
-
1, error.message || 'Internal error');
|
|
191
|
-
if (!state.socket.destroyed) {
|
|
192
|
-
state.socket.write(errorResponse);
|
|
193
|
-
}
|
|
194
|
-
// Clear buffer on parse errors to avoid infinite loops
|
|
195
|
-
if (error.message?.includes('opCode') || error.message?.includes('section')) {
|
|
196
|
-
state.buffer = Buffer.alloc(0);
|
|
197
|
-
}
|
|
198
|
-
break;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Get the connection URI for this server
|
|
204
|
-
*/
|
|
205
|
-
getConnectionUri() {
|
|
206
|
-
return `mongodb://${this.options.host}:${this.options.port}`;
|
|
207
|
-
}
|
|
208
|
-
/**
|
|
209
|
-
* Check if the server is running
|
|
210
|
-
*/
|
|
211
|
-
get running() {
|
|
212
|
-
return this.isRunning;
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* Get the port the server is listening on
|
|
216
|
-
*/
|
|
217
|
-
get port() {
|
|
218
|
-
return this.options.port;
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Get the host the server is bound to
|
|
222
|
-
*/
|
|
223
|
-
get host() {
|
|
224
|
-
return this.options.host;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZ29TZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jb25nb2RiL3NlcnZlci9Db25nb1NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssR0FBRyxNQUFNLEtBQUssQ0FBQztBQUMzQixPQUFPLEtBQUssT0FBTyxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBZ0N0RTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUNkLE9BQU8sQ0FBZ0M7SUFDdkMsTUFBTSxHQUFzQixJQUFJLENBQUM7SUFDakMsT0FBTyxDQUFrQjtJQUN6QixhQUFhLENBQWdCO0lBQzdCLFdBQVcsR0FBa0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN2RCxtQkFBbUIsR0FBRyxDQUFDLENBQUM7SUFDeEIsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNsQixTQUFTLEdBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUVyQyxZQUFZLFVBQStCLEVBQUU7UUFDM0MsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLEtBQUs7WUFDM0IsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksV0FBVztZQUNqQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sSUFBSSxRQUFRO1lBQ3BDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLFFBQVE7WUFDNUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXLElBQUksRUFBRTtZQUN0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
|