UNPKG

multibridge

Version:

A multi-database connection framework with centralized configuration

113 lines (112 loc) 4.02 kB
"use strict"; /** * Sequelize ORM adapter for MultiBridge * Supports: PostgreSQL, MySQL */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getSequelizeInstance = getSequelizeInstance; exports.closeSequelizeInstance = closeSequelizeInstance; exports.closeAllSequelizeInstances = closeAllSequelizeInstances; const sequelize_1 = require("sequelize"); const base_1 = require("./base"); const loggers_1 = __importDefault(require("../utils/loggers")); const errors_1 = require("../utils/errors"); // Cache for Sequelize instances per tenant const sequelizeInstances = new Map(); /** * Get or create a Sequelize instance for the current tenant * * @param options - Optional Sequelize configuration options * @returns Sequelize instance configured for the current tenant * * @example * ```typescript * await runWithTenant(tenant, async () => { * const sequelize = await getSequelizeInstance(); * const User = sequelize.define('User', { ... }); * await User.findAll(); * }); * ``` */ async function getSequelizeInstance(options) { const { tenant, connectionData, dbType } = await (0, base_1.getTenantConnection)(); // Validate database type (0, base_1.validateORMSupport)(dbType, ["postgres", "mysql"]); const cacheKey = `${tenant.appid}-${tenant.orgid}-${tenant.appdbname}`; // Check cache const cached = sequelizeInstances.get(cacheKey); if (cached) { loggers_1.default.debug(`Reusing cached Sequelize instance for ${cacheKey}`); return cached; } // Create Sequelize instance based on database type let sequelize; if (dbType === "postgres") { const pool = connectionData.connection; const schema = connectionData.config?.schema || tenant.appdbname; sequelize = new sequelize_1.Sequelize({ dialect: "postgres", pool: pool, // Use MultiBridge's pool schema: schema, logging: options?.logging || false, define: { schema: schema, ...options?.define, }, ...options, }); } else if (dbType === "mysql") { const pool = connectionData.connection; const database = tenant.appdbname; sequelize = new sequelize_1.Sequelize({ dialect: "mysql", pool: pool, // Use MultiBridge's pool database: database, logging: options?.logging || false, ...options, }); } else { throw new errors_1.ConnectionError(`Unsupported database type for Sequelize: ${dbType}`, { dbType, }); } // Cache the instance sequelizeInstances.set(cacheKey, sequelize); loggers_1.default.info(`Created Sequelize instance for ${cacheKey}`, { dbType, schema: connectionData.config?.schema, }); return sequelize; } /** * Close Sequelize instance for a specific tenant */ async function closeSequelizeInstance(tenant) { if (!tenant) { const { tenant: currentTenant } = await (0, base_1.getTenantConnection)(); tenant = currentTenant; } const cacheKey = `${tenant.appid}-${tenant.orgid}-${tenant.appdbname}`; const instance = sequelizeInstances.get(cacheKey); if (instance) { await instance.close(); sequelizeInstances.delete(cacheKey); loggers_1.default.debug(`Closed Sequelize instance for ${cacheKey}`); } } /** * Close all Sequelize instances */ async function closeAllSequelizeInstances() { const closePromises = Array.from(sequelizeInstances.values()).map((instance) => instance.close().catch((error) => { loggers_1.default.warn(`Error closing Sequelize instance: ${error.message}`); })); await Promise.all(closePromises); sequelizeInstances.clear(); loggers_1.default.info("All Sequelize instances closed"); }