UNPKG

@push.rocks/smartdata

Version:

An advanced library for NoSQL data organization and manipulation using TypeScript with support for MongoDB, data validation, collections, and custom data types.

66 lines 4.55 kB
import { SmartDataDbDoc } from './classes.doc.js'; import * as plugins from './plugins.js'; import { EventEmitter } from 'node:events'; /** * a wrapper for the native mongodb cursor. Exposes better */ /** * Wraps a MongoDB ChangeStream with RxJS and EventEmitter support. */ export class SmartdataDbWatcher extends EventEmitter { // STATIC readyDeferred = plugins.smartpromise.defer(); // INSTANCE changeStream; rawSubject; /** Emits change documents (or arrays of documents if buffered) */ changeSubject; /** * @param changeStreamArg native MongoDB ChangeStream * @param smartdataDbDocArg document class for instance creation * @param opts.bufferTimeMs optional milliseconds to buffer events via RxJS */ constructor(changeStreamArg, smartdataDbDocArg, opts) { super(); this.rawSubject = new plugins.smartrx.rxjs.Subject(); // Apply buffering if requested if (opts && opts.bufferTimeMs) { this.changeSubject = this.rawSubject.pipe(plugins.smartrx.rxjs.ops.bufferTime(opts.bufferTimeMs)); } else { this.changeSubject = this.rawSubject; } this.changeStream = changeStreamArg; this.changeStream.on('change', async (item) => { let docInstance = null; if (item.fullDocument) { docInstance = smartdataDbDocArg.createInstanceFromMongoDbNativeDoc(item.fullDocument); } // Notify subscribers this.rawSubject.next(docInstance); this.emit('change', docInstance); }); // Signal readiness after one tick plugins.smartdelay.delayFor(0).then(() => { this.readyDeferred.resolve(); }); } /** * Close the change stream, complete the RxJS subject, and remove listeners. */ async close() { // Close MongoDB ChangeStream await this.changeStream.close(); // Complete the subject to teardown any buffering operators this.rawSubject.complete(); // Remove all EventEmitter listeners this.removeAllListeners(); } /** * Alias for close(), matching README usage */ async stop() { return this.close(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53YXRjaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy53YXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTNDOztHQUVHO0FBQ0g7O0dBRUc7QUFDSCxNQUFNLE9BQU8sa0JBQTRCLFNBQVEsWUFBWTtJQUMzRCxTQUFTO0lBQ0YsYUFBYSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7SUFFcEQsV0FBVztJQUNILFlBQVksQ0FBb0M7SUFDaEQsVUFBVSxDQUFrQztJQUNwRCxrRUFBa0U7SUFDM0QsYUFBYSxDQUFNO0lBQzFCOzs7O09BSUc7SUFDSCxZQUNFLGVBQWtELEVBQ2xELGlCQUF3QyxFQUN4QyxJQUFnQztRQUVoQyxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUssQ0FBQztRQUN4RCwrQkFBK0I7UUFDL0IsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUNwRyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxlQUFlLENBQUM7UUFDcEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFTLEVBQUUsRUFBRTtZQUNqRCxJQUFJLFdBQVcsR0FBYSxJQUFJLENBQUM7WUFDakMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxrQ0FBa0MsQ0FDaEUsSUFBSSxDQUFDLFlBQVksQ0FDTixDQUFDO1lBQ2hCLENBQUM7WUFDRCxxQkFBcUI7WUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBZ0IsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBQ0gsa0NBQWtDO1FBQ2xDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDdkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLDZCQUE2QjtRQUM3QixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEMsMkRBQTJEO1FBQzNELElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDM0Isb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFDRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxJQUFJO1FBQ2YsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQztDQUNGIn0=