Files
LupiNex-Connect/database/pools.js
T
2026-08-30 15:25:31 +02:00

87 lines
2.5 KiB
JavaScript

/*
! /database/pools.js
? The main database pool (connection) manager
*/
// % imports
import mariadb from 'mariadb';
// % database credentials mapping
const CREDENTIALS_MAP = {
read: { user: process.env.DB_READ_USER, pass: process.env.DB_READ_PASS },
write: { user: process.env.DB_WRITE_USER, pass: process.env.DB_WRITE_PASS },
delete: { user: process.env.DB_DELETE_USER, pass: process.env.DB_DELETE_PASS },
backup: { user: process.env.DB_BACKUP_USER, pass: process.env.DB_BACKUP_PASS }
}
// $ get database credentials
function getCredentials(protocol = 'read') {
const key = String(protocol).toLowerCase();
return CREDENTIALS_MAP[key] ?? CREDENTIALS_MAP.read;
}
// = pool manager class
class PoolManager {
constructor() {
this.pools = new Map();
}
// $ function to add a connection
async add(config) {
// ~ check if this pool is already existing → then return
if (this.pools.has(config.name)) {
return { pool: this.pools.get(config.name), connStat: true };
}
// ~ get database credentials by protocol
const { user, pass } = getCredentials(config.protocol);
// ~ create the mariadb pool
const pool = mariadb.createPool({
host: config.address,
port: Number(process.env.DB_CONN_PORT),
user,
password: pass,
database: config.database,
waitForConnections: true,
connectionLimit: 5,
queueLimit: 0,
enableKeepAlive: true,
keepAliveInitialDelay: 10000
});
// ~ add the pool to the map
this.pools.set(config.name, pool);
// ~ return the pool
return { pool, connStat: true };
}
// $ function to remove a connection
async remove(name) {
if (this.pools.has(name)) {
const pool = this.pools.get(name);
await pool.end();
this.pools.delete(name);
}
return { connStat: false };
}
// $ function to get the status of a connection
async status(name) {
if (this.pools.has(name)) {
try {
const pool = this.pools.get(name);
await pool.query('SELECT 1');
return { pool, connStat: true };
} catch(err) {
return { connStat: false, msg: err }
}
} else {
return { connStat: false };
}
}
}
// $ export the pool manager
export default new PoolManager();