UNPKG

db-connections-util

Version:

A utility package for parsing, encrypting, and reconstructing database connection strings

302 lines (218 loc) 9.23 kB
# Database Connection Utils A comprehensive utility package for parsing, encrypting, and reconstructing database connection strings across multiple database types. ## Features - 🔍 **Parse connection strings** for multiple database types - 🔒 **Encrypt/decrypt sensitive data** in connection strings - 🔄 **Reconstruct connection strings** from parsed data - 🌐 **Multi-database support** with cloud and on-premise options - 📊 **Type detection** with detailed connection information - 🛡️ **Security-first** approach with built-in encryption ## Supported Databases - **MongoDB** (Atlas & Compass) - **Azure CosmosDB** (MongoDB & SQL API) - **MySQL** - **PostgreSQL** - **Redis** (including cluster support) - **SQL Server** (with instance support) ## Installation ```bash npm install db-connections-util ``` ## Quick Start ```javascript import { parseDatabaseConnection, reconstructConnectionString } from 'db-connections-util'; // Parse a connection string const connectionString = 'postgres://user:pass@localhost:5432/mydb'; const parsed = parseDatabaseConnection(connectionString, 'your-secret-key'); console.log(parsed); // Output: Detailed parsed object with encrypted sensitive data // Reconstruct the connection string const reconstructed = reconstructConnectionString(parsed, 'your-secret-key'); console.log(reconstructed); // Output: postgres://user:pass@localhost:5432/mydb ``` ## API Reference ### `parseDatabaseConnection(connectionString, secret?)` Parses a database connection string into a structured object. **Parameters:** - `connectionString` (string): The database connection string to parse - `secret` (string, optional): Secret key for encrypting sensitive data **Returns:** Object with the following structure: ```javascript { dbType: string, // Database type (e.g., 'postgresql', 'mongodb atlas') isCloud: boolean, // Whether it's a cloud database protocol: string, // Protocol used (e.g., 'postgres', 'mongodb+srv') username: string, // Username (encrypted if secret provided) password: string, // Password (encrypted if secret provided) host: string, // Database host port: string, // Database port dbName: string, // Database name params: object, // Additional parameters originalString: string // Original connection string (encrypted if secret provided) } ``` ### `reconstructConnectionString(parsedData, secret?)` Reconstructs a connection string from parsed data. **Parameters:** - `parsedData` (object): Parsed connection data object - `secret` (string, optional): Secret key for decrypting sensitive data **Returns:** Reconstructed connection string ### `encrypt(data, secret)` Encrypts sensitive data using AES-256-CBC encryption. **Parameters:** - `data` (string): Data to encrypt - `secret` (string): Secret key for encryption **Returns:** Encrypted string in format `iv:encryptedData` ### `decrypt(encryptedData, secret)` Decrypts encrypted data. **Parameters:** - `encryptedData` (string): Encrypted data in format `iv:encryptedData` - `secret` (string): Secret key for decryption **Returns:** Decrypted string ## Usage Examples ### PostgreSQL ```javascript import { parseDatabaseConnection, reconstructConnectionString } from 'db-connections-util'; const connectionString = 'postgres://user:pass@localhost:5432/mydb?sslmode=require'; const secret = 'my-secret-key'; const parsed = parseDatabaseConnection(connectionString, secret); console.log('Parsed:', parsed); /* Output: { "dbType": "postgresql", "isCloud": false, "protocol": "postgres", "username": "user", "password": "52f4ae52f12452966f4426d9962cc36b:6c0501fd7f90c0812ce5a090c25b1461", "host": "localhost", "port": "5432", "dbName": "mydb", "params": { "sslmode": "require" }, "originalString": "4102019b64b82780351c364f553f051f:5619b4598700f8a2c497862b88e2bd56..." } */ const reconstructed = reconstructConnectionString(parsed, secret); console.log('Reconstructed:', reconstructed); // Output: postgres://user:pass@localhost:5432/mydb?sslmode=require ``` ### MongoDB Atlas ```javascript const mongoAtlas = 'mongodb+srv://user:pass@cluster.mongodb.net/mydb?retryWrites=true&w=majority'; const parsed = parseDatabaseConnection(mongoAtlas, 'secret-key'); console.log('Database Type:', parsed.dbType); // mongodb atlas console.log('Is Cloud:', parsed.isCloud); // true console.log('Host:', parsed.host); // cluster.mongodb.net ``` ### MongoDB Local ```javascript const mongoLocal = 'mongodb://user:pass@localhost:27017/mydb?authSource=admin'; const parsed = parseDatabaseConnection(mongoLocal); console.log('Database Type:', parsed.dbType); // mongodb compass console.log('Port:', parsed.port); // 27017 console.log('Auth Source:', parsed.params.authSource); // admin ``` ### MySQL ```javascript const mysql = 'mysql://user:pass@localhost:3306/mydb?charset=utf8mb4&timezone=UTC'; const parsed = parseDatabaseConnection(mysql); console.log('Database Type:', parsed.dbType); // mysql console.log('Charset:', parsed.params.charset); // utf8mb4 ``` ### Redis ```javascript // Standard Redis const redis = 'redis://user:pass@localhost:6379/0'; const parsed = parseDatabaseConnection(redis); console.log('Database Type:', parsed.dbType); // redis console.log('DB Number:', parsed.dbName); // 0 // Redis Cluster const redisCluster = 'redis://user:pass@host1:6379,host2:6379,host3:6379'; const parsedCluster = parseDatabaseConnection(redisCluster); console.log('Is Cluster:', parsedCluster.params.isCluster); // true console.log('Cluster Hosts:', parsedCluster.params.clusterHosts); ``` ### SQL Server ```javascript // Standard SQL Server const sqlServer = 'mssql://user:pass@localhost:1433/mydb'; const parsed = parseDatabaseConnection(sqlServer); // SQL Server with Instance const sqlServerInstance = 'mssql://user:pass@localhost\\INSTANCE_NAME:1433/mydb'; const parsedInstance = parseDatabaseConnection(sqlServerInstance); console.log('Instance:', parsedInstance.params.instance); // INSTANCE_NAME // Semicolon format const sqlServerSemicolon = 'Server=localhost;Database=mydb;User Id=user;Password=pass;'; const parsedSemicolon = parseDatabaseConnection(sqlServerSemicolon); ``` ### Azure CosmosDB ```javascript // CosmosDB MongoDB API const cosmosDB = 'mongodb://account:key@account.mongo.cosmos.azure.com:10255/mydb?ssl=true&replicaSet=globaldb'; const parsed = parseDatabaseConnection(cosmosDB); // CosmosDB SQL API const cosmosSQL = 'AccountEndpoint=https://account.documents.azure.com:443/;AccountKey=key;Database=mydb'; const parsedSQL = parseDatabaseConnection(cosmosSQL); console.log('Database Type:', parsedSQL.dbType); // azure cosmosdb console.log('Is Cloud:', parsedSQL.isCloud); // true ``` ## Security Features ### Encryption When you provide a secret key, sensitive data is automatically encrypted: ```javascript const secret = 'your-secret-key'; const parsed = parseDatabaseConnection(connectionString, secret); // Password and original string are encrypted console.log('Encrypted password:', parsed.password); // Output: "iv:encryptedData" format // Manually encrypt/decrypt import { encrypt, decrypt } from 'db-connections-util'; const sensitive = "my-password"; const encrypted = encrypt(sensitive, secret); const decrypted = decrypt(encrypted, secret); console.log('Original:', sensitive); console.log('Encrypted:', encrypted); console.log('Decrypted:', decrypted); ``` ## Error Handling The package throws descriptive errors for various scenarios: ```javascript try { // Invalid connection string parseDatabaseConnection('invalid-string'); } catch (error) { console.log(error.message); // "Invalid connection string provided" } try { // Unsupported database type reconstructConnectionString({ dbType: 'unsupported' }); } catch (error) { console.log(error.message); // "Unsupported database type" } ``` ## Performance The package is optimized for performance: - Minimal dependencies - Efficient parsing algorithms - Cached regex patterns - Memory-efficient encryption Benchmark (approximate): - Parse: ~0.1ms per connection string - Reconstruct: ~0.05ms per operation - Encrypt/Decrypt: ~0.2ms per operation ## Contributing We welcome contributions! Please see our [Contributing Guidelines](CONTRIBUTING.md) for details. ## License MIT License - see [LICENSE](LICENSE) file for details. ## Support - 📧 Email: [abilashnarayanan2001@gmail.com](mailto:abilashnarayanan2001@gmail.com) - 🐛 Issues: [GitHub Issues](https://github.com/your-username/db-connections-util/issues) - 📖 Documentation: [GitHub Wiki](https://github.com/your-username/db-connections-util/wiki) ## Changelog ### v1.0.0 - Initial release - Support for 6 database types - Encryption/decryption functionality - Connection string reconstruction - Comprehensive error handling