71 lines
1.5 KiB
JavaScript
71 lines
1.5 KiB
JavaScript
const mysql = require('mysql2/promise');
|
|
|
|
let pool;
|
|
const IS_SERVERLESS = [
|
|
process.env.SERVERLESS,
|
|
process.env.VERCEL,
|
|
process.env.AWS_LAMBDA_FUNCTION_NAME,
|
|
process.env.NETLIFY,
|
|
process.env.FUNCTION_TARGET,
|
|
process.env.K_SERVICE
|
|
].some(Boolean);
|
|
|
|
function getConnectionLimit() {
|
|
const parsed = parseInt(process.env.MYSQL_CONNECTION_LIMIT, 10);
|
|
if (!Number.isNaN(parsed) && parsed > 0) {
|
|
return parsed;
|
|
}
|
|
return IS_SERVERLESS ? 2 : 10;
|
|
}
|
|
|
|
function createPool() {
|
|
return mysql.createPool({
|
|
host: process.env.MYSQL_HOST || 'localhost',
|
|
port: parseInt(process.env.MYSQL_PORT, 10) || 3306,
|
|
user: process.env.MYSQL_USER || 'root',
|
|
password: process.env.MYSQL_PASSWORD || '',
|
|
database: process.env.MYSQL_DATABASE || 'display_wall',
|
|
waitForConnections: true,
|
|
connectionLimit: getConnectionLimit(),
|
|
queueLimit: 0,
|
|
enableKeepAlive: true,
|
|
keepAliveInitialDelay: 0
|
|
});
|
|
}
|
|
|
|
function getPool() {
|
|
if (!pool) {
|
|
pool = createPool();
|
|
}
|
|
return pool;
|
|
}
|
|
|
|
function initPool({ force = false } = {}) {
|
|
if (pool && !force) {
|
|
return pool;
|
|
}
|
|
|
|
if (pool) {
|
|
pool.end().catch(e => console.error('Error closing pool:', e));
|
|
}
|
|
|
|
pool = createPool();
|
|
return pool;
|
|
}
|
|
|
|
async function checkHealth() {
|
|
try {
|
|
await getPool().query('SELECT 1');
|
|
return { status: 'up' };
|
|
} catch (err) {
|
|
return { status: 'down', error: err.message };
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
query: (...args) => getPool().query(...args),
|
|
getPool,
|
|
initPool,
|
|
checkHealth
|
|
};
|