db-connections-util
Version:
A utility package for parsing, encrypting, and reconstructing database connection strings
302 lines (218 loc) • 9.23 kB
Markdown
# 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