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.

93 lines 8.02 kB
import * as plugins from './plugins.js'; import { SmartdataCollection } from './classes.collection.js'; import { EasyStore } from './classes.easystore.js'; import { logger } from './logging.js'; export class SmartdataDb { smartdataOptions; mongoDbClient; mongoDb; status; statusConnectedDeferred = plugins.smartpromise.defer(); smartdataCollectionMap = new plugins.lik.ObjectMap(); constructor(smartdataOptions) { this.smartdataOptions = smartdataOptions; this.status = 'initial'; } // easystore async createEasyStore(nameIdArg) { const easyStore = new EasyStore(nameIdArg, this); return easyStore; } // basic connection stuff ---------------------------------------------- /** * connects to the database that was specified during instance creation */ async init() { try { // Safely encode credentials to handle special characters const encodedUser = this.smartdataOptions.mongoDbUser ? encodeURIComponent(this.smartdataOptions.mongoDbUser) : ''; const encodedPass = this.smartdataOptions.mongoDbPass ? encodeURIComponent(this.smartdataOptions.mongoDbPass) : ''; const finalConnectionUrl = this.smartdataOptions.mongoDbUrl .replace('<USERNAME>', encodedUser) .replace('<username>', encodedUser) .replace('<USER>', encodedUser) .replace('<user>', encodedUser) .replace('<PASSWORD>', encodedPass) .replace('<password>', encodedPass) .replace('<DBNAME>', this.smartdataOptions.mongoDbName || '') .replace('<dbname>', this.smartdataOptions.mongoDbName || ''); const clientOptions = { maxPoolSize: this.smartdataOptions.maxPoolSize ?? 100, maxIdleTimeMS: this.smartdataOptions.maxIdleTimeMS ?? 300000, // 5 minutes default serverSelectionTimeoutMS: this.smartdataOptions.serverSelectionTimeoutMS ?? 30000, socketTimeoutMS: this.smartdataOptions.socketTimeoutMS ?? 30000, // 30 seconds default — prevents hung operations from holding connections retryWrites: true, }; this.mongoDbClient = await plugins.mongodb.MongoClient.connect(finalConnectionUrl, clientOptions); this.mongoDb = this.mongoDbClient.db(this.smartdataOptions.mongoDbName); this.status = 'connected'; this.statusConnectedDeferred.resolve(); logger.log('info', `Connected to database ${this.smartdataOptions.mongoDbName}`); } catch (error) { this.status = 'disconnected'; this.statusConnectedDeferred.reject(error); logger.log('error', `Failed to connect to database ${this.smartdataOptions.mongoDbName}: ${error.message}`); throw error; } } /** * closes the connection to the databse */ async close() { await this.mongoDbClient.close(); this.status = 'disconnected'; logger.log('info', `disconnected from database ${this.smartdataOptions.mongoDbName}`); } /** * Start a MongoDB client session for transactions */ startSession() { return this.mongoDbClient.startSession(); } // handle table to class distribution addCollection(SmartdataCollectionArg) { this.smartdataCollectionMap.add(SmartdataCollectionArg); } /** * Gets a collection's name and returns a SmartdataCollection instance * @param nameArg * @returns DbTable */ async getSmartdataCollectionByName(nameArg) { const resultCollection = await this.smartdataCollectionMap.find(async (dbTableArg) => { return dbTableArg.collectionName === nameArg; }); return resultCollection; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuZGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRW5ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFPdEMsTUFBTSxPQUFPLFdBQVc7SUFDdEIsZ0JBQWdCLENBQTRDO0lBQzVELGFBQWEsQ0FBK0I7SUFDNUMsT0FBTyxDQUFzQjtJQUM3QixNQUFNLENBQW9CO0lBQzFCLHVCQUF1QixHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdkQsc0JBQXNCLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBNEIsQ0FBQztJQUUvRSxZQUFZLGdCQUEyRDtRQUNyRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7UUFDekMsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVELFlBQVk7SUFDTCxLQUFLLENBQUMsZUFBZSxDQUFjLFNBQWlCO1FBQ3pELE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxDQUFJLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsd0VBQXdFO0lBRXhFOztPQUVHO0lBQ0ksS0FBSyxDQUFDLElBQUk7UUFDZixJQUFJLENBQUM7WUFDSCx5REFBeUQ7WUFDekQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVc7Z0JBQ25ELENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDO2dCQUN2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