mongolite-ts 0.5.0 → 0.6.2

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.
@@ -0,0 +1,339 @@
1
+ import { EventEmitter } from 'events';
2
+ /**
3
+ * MongoDB Cloud Sync Plugin
4
+ *
5
+ * This plugin provides optional synchronization between MongoLite and MongoDB Cloud.
6
+ * It hooks into MongoLite operations and replicates them to a MongoDB instance.
7
+ */
8
+ export class MongoDBSyncPlugin extends EventEmitter {
9
+ constructor(options) {
10
+ super();
11
+ this.operationQueue = [];
12
+ this.isProcessing = false;
13
+ this.queueTimer = null;
14
+ this.mongoClient = null;
15
+ this.mongoDb = null;
16
+ this.isConnected = false;
17
+ this.options = {
18
+ connectionString: options.connectionString,
19
+ databaseName: options.databaseName || 'mongolite_sync',
20
+ enableDirtyReads: options.enableDirtyReads || false,
21
+ retryConfig: {
22
+ maxRetries: 3,
23
+ initialDelayMs: 1000,
24
+ maxDelayMs: 10000,
25
+ ...options.retryConfig,
26
+ },
27
+ verbose: options.verbose || false,
28
+ batchSize: options.batchSize || 100,
29
+ queueTimeoutMs: options.queueTimeoutMs || 1000,
30
+ };
31
+ this.log('MongoDB Sync Plugin initialized');
32
+ }
33
+ /**
34
+ * Initialize connection to MongoDB Cloud
35
+ */
36
+ async initialize() {
37
+ try {
38
+ // Dynamically import MongoDB driver to avoid making it a required dependency
39
+ let mongodb;
40
+ try {
41
+ // Use eval to avoid TypeScript module resolution at compile time
42
+ mongodb = await eval('import("mongodb")');
43
+ }
44
+ catch (error) {
45
+ throw new Error('MongoDB driver not found. Install it with: npm install mongodb');
46
+ }
47
+ const mongoModule = mongodb;
48
+ const MongoClient = mongoModule.MongoClient;
49
+ this.mongoClient = new MongoClient(this.options.connectionString);
50
+ await this.mongoClient.connect();
51
+ this.mongoDb = this.mongoClient.db(this.options.databaseName);
52
+ this.isConnected = true;
53
+ this.log('Connected to MongoDB Cloud');
54
+ this.emit('connected');
55
+ }
56
+ catch (error) {
57
+ this.log('Failed to connect to MongoDB:', error);
58
+ this.emit('error', {
59
+ type: 'connection_error',
60
+ error: error instanceof Error ? error.message : 'Unknown error',
61
+ });
62
+ throw error;
63
+ }
64
+ }
65
+ /**
66
+ * Disconnect from MongoDB
67
+ */
68
+ async disconnect() {
69
+ if (this.queueTimer) {
70
+ clearTimeout(this.queueTimer);
71
+ this.queueTimer = null;
72
+ }
73
+ // Process any remaining operations
74
+ if (this.operationQueue.length > 0) {
75
+ await this.processQueue();
76
+ }
77
+ if (this.mongoClient) {
78
+ await this.mongoClient.close();
79
+ this.mongoClient = null;
80
+ this.mongoDb = null;
81
+ this.isConnected = false;
82
+ this.log('Disconnected from MongoDB Cloud');
83
+ this.emit('disconnected');
84
+ }
85
+ }
86
+ /**
87
+ * Check if the plugin is connected to MongoDB
88
+ */
89
+ get connected() {
90
+ return this.isConnected;
91
+ }
92
+ /**
93
+ * Hook for insert operations
94
+ */
95
+ async onInsert(collection, document, result) {
96
+ const operation = {
97
+ type: 'insert',
98
+ collection,
99
+ data: { ...document, _id: result.insertedId },
100
+ timestamp: new Date(),
101
+ localId: result.insertedId,
102
+ };
103
+ await this.queueOperation(operation);
104
+ }
105
+ /**
106
+ * Hook for update operations
107
+ */
108
+ async onUpdate(collection, filter, update, _result) {
109
+ const operation = {
110
+ type: 'update',
111
+ collection,
112
+ filter,
113
+ update,
114
+ timestamp: new Date(),
115
+ };
116
+ await this.queueOperation(operation);
117
+ }
118
+ /**
119
+ * Hook for delete operations
120
+ */
121
+ async onDelete(collection, filter, _result) {
122
+ const operation = {
123
+ type: 'delete',
124
+ collection,
125
+ filter,
126
+ timestamp: new Date(),
127
+ };
128
+ await this.queueOperation(operation);
129
+ }
130
+ /**
131
+ * Perform a dirty read from MongoDB (optional functionality)
132
+ */
133
+ async getDirtyRead(collection, filter) {
134
+ if (!this.isConnected || !this.mongoDb) {
135
+ throw new Error('MongoDB sync is not initialized or not connected');
136
+ }
137
+ try {
138
+ const mongoCollection = this.mongoDb.collection(collection);
139
+ const results = await mongoCollection.find(filter || {}).toArray();
140
+ // Transform results and type cast with validation
141
+ return results;
142
+ }
143
+ catch (error) {
144
+ this.emit('error', {
145
+ type: 'dirty_read_error',
146
+ error: error instanceof Error ? error.message : 'Unknown error',
147
+ details: { collection, filter },
148
+ });
149
+ throw error;
150
+ }
151
+ }
152
+ /**
153
+ * Queue an operation for batch processing
154
+ */
155
+ async queueOperation(operation) {
156
+ if (!this.isConnected) {
157
+ this.log('Not connected to MongoDB, skipping operation:', operation.type);
158
+ return;
159
+ }
160
+ this.operationQueue.push(operation);
161
+ this.log(`Queued ${operation.type} operation for collection ${operation.collection}`);
162
+ // Start queue timer if not already running
163
+ if (!this.queueTimer) {
164
+ this.queueTimer = setTimeout(() => {
165
+ this.processQueue().catch((error) => {
166
+ this.log('Error processing queue:', error);
167
+ this.emit('error', error);
168
+ });
169
+ }, this.options.queueTimeoutMs);
170
+ }
171
+ // Process immediately if queue is full
172
+ if (this.operationQueue.length >= this.options.batchSize) {
173
+ if (this.queueTimer) {
174
+ clearTimeout(this.queueTimer);
175
+ this.queueTimer = null;
176
+ }
177
+ await this.processQueue();
178
+ }
179
+ }
180
+ /**
181
+ * Process the operation queue
182
+ */
183
+ async processQueue() {
184
+ if (this.isProcessing || this.operationQueue.length === 0) {
185
+ return;
186
+ }
187
+ this.isProcessing = true;
188
+ this.queueTimer = null;
189
+ const operations = [...this.operationQueue];
190
+ this.operationQueue = [];
191
+ this.log(`Processing ${operations.length} queued operations`);
192
+ try {
193
+ const results = await this.processBatch(operations);
194
+ // Emit results
195
+ for (const result of results) {
196
+ if (result.success) {
197
+ this.emit('synced', result);
198
+ }
199
+ else {
200
+ this.emit('syncError', result);
201
+ }
202
+ }
203
+ this.log(`Successfully processed ${results.filter((r) => r.success).length}/${results.length} operations`);
204
+ }
205
+ catch (error) {
206
+ this.log('Error processing operation batch:', error);
207
+ this.emit('error', error);
208
+ // Re-queue failed operations for retry
209
+ this.operationQueue.unshift(...operations);
210
+ }
211
+ finally {
212
+ this.isProcessing = false;
213
+ }
214
+ }
215
+ /**
216
+ * Process a batch of operations
217
+ */
218
+ async processBatch(operations) {
219
+ if (!this.isConnected || !this.mongoDb) {
220
+ throw new Error('MongoDB is not connected');
221
+ }
222
+ const results = [];
223
+ // Group operations by collection for efficiency
224
+ const operationsByCollection = new Map();
225
+ for (const operation of operations) {
226
+ if (!operationsByCollection.has(operation.collection)) {
227
+ operationsByCollection.set(operation.collection, []);
228
+ }
229
+ operationsByCollection.get(operation.collection).push(operation);
230
+ }
231
+ // Process each collection's operations
232
+ for (const [collectionName, collectionOps] of operationsByCollection) {
233
+ const mongoCollection = this.mongoDb.collection(collectionName);
234
+ for (const operation of collectionOps) {
235
+ const result = await this.executeOperation(mongoCollection, operation);
236
+ results.push(result);
237
+ }
238
+ }
239
+ return results;
240
+ }
241
+ /**
242
+ * Execute a single operation on MongoDB
243
+ */
244
+ async executeOperation(mongoCollection, operation) {
245
+ const { retryConfig } = this.options;
246
+ const maxRetries = retryConfig?.maxRetries ?? 3;
247
+ const initialDelayMs = retryConfig?.initialDelayMs ?? 1000;
248
+ const maxDelayMs = retryConfig?.maxDelayMs ?? 10000;
249
+ let lastError = null;
250
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
251
+ try {
252
+ let mongodbResult;
253
+ switch (operation.type) {
254
+ case 'insert':
255
+ if (!operation.data) {
256
+ throw new Error('Insert operation requires data');
257
+ }
258
+ if (Array.isArray(operation.data)) {
259
+ mongodbResult = await mongoCollection.insertMany(operation.data);
260
+ }
261
+ else {
262
+ mongodbResult = await mongoCollection.insertOne(operation.data);
263
+ }
264
+ break;
265
+ case 'update':
266
+ if (!operation.filter || !operation.update) {
267
+ throw new Error('Update operation requires filter and update data');
268
+ }
269
+ mongodbResult = await mongoCollection.updateMany(operation.filter, operation.update);
270
+ break;
271
+ case 'delete':
272
+ if (!operation.filter) {
273
+ throw new Error('Delete operation requires filter');
274
+ }
275
+ mongodbResult = await mongoCollection.deleteMany(operation.filter);
276
+ break;
277
+ default:
278
+ throw new Error(`Unsupported operation type: ${operation.type}`);
279
+ }
280
+ this.log(`Successfully executed ${operation.type} on MongoDB collection ${operation.collection}`);
281
+ return {
282
+ success: true,
283
+ operation,
284
+ mongodbResult,
285
+ };
286
+ }
287
+ catch (error) {
288
+ lastError = error;
289
+ this.log(`Attempt ${attempt + 1} failed for ${operation.type} operation:`, error);
290
+ if (attempt < maxRetries) {
291
+ const delay = Math.min(initialDelayMs * Math.pow(2, attempt), maxDelayMs);
292
+ await new Promise((resolve) => setTimeout(resolve, delay));
293
+ }
294
+ }
295
+ }
296
+ return {
297
+ success: false,
298
+ operation,
299
+ error: lastError || new Error('Unknown error'),
300
+ };
301
+ }
302
+ /**
303
+ * Get queue status
304
+ */
305
+ getQueueStatus() {
306
+ return {
307
+ queueLength: this.operationQueue.length,
308
+ isProcessing: this.isProcessing,
309
+ isConnected: this.isConnected,
310
+ };
311
+ }
312
+ /**
313
+ * Flush the queue (process immediately)
314
+ */
315
+ async flush() {
316
+ if (this.queueTimer) {
317
+ clearTimeout(this.queueTimer);
318
+ this.queueTimer = null;
319
+ }
320
+ await this.processQueue();
321
+ }
322
+ /**
323
+ * Log messages if verbose mode is enabled
324
+ */
325
+ log(...args) {
326
+ if (this.options.verbose) {
327
+ console.log('[MongoDBSync]', ...args);
328
+ }
329
+ }
330
+ }
331
+ /**
332
+ * Factory function to create and initialize a MongoDB sync plugin
333
+ */
334
+ export async function createMongoDBSyncPlugin(options) {
335
+ const plugin = new MongoDBSyncPlugin(options);
336
+ await plugin.initialize();
337
+ return plugin;
338
+ }
339
+ //# sourceMappingURL=mongodbSync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongodbSync.js","sourceRoot":"","sources":["../../src/plugins/mongodbSync.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -41,6 +41,7 @@ export interface QueryOperators<T> {
41
41
  $lte?: T;
42
42
  $in?: T[];
43
43
  $nin?: T[];
44
+ $all?: T extends unknown[] ? T : never;
44
45
  $exists?: boolean;
45
46
  $not?: QueryOperators<T>;
46
47
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mongolite-ts",
3
- "version": "0.5.0",
3
+ "version": "0.6.2",
4
4
  "description": "A MongoDB-like client using SQLite as a persistent store, written in TypeScript.",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -13,6 +13,7 @@
13
13
  "test": "node --import tsx --test tests/*.test.ts",
14
14
  "test:coverage": "c8 --reporter=lcov --reporter=text node --import tsx --test tests/*.test.ts",
15
15
  "prepare": "npm run build",
16
+ "prepublish": "npm run build",
16
17
  "lint": "eslint src/**/*.ts tests/**/*.ts",
17
18
  "lint:fix": "eslint src/**/*.ts tests/**/*.ts --fix",
18
19
  "verify-build": "node --import tsx scripts/verify-build.js",