@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
JavaScript
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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