@kitiumai/database
v2.0.0
Published
TypeScript database toolkit for PostgreSQL (Prisma) and MongoDB with pooling, migrations, seeding, health checks, retries, and observability.
Maintainers
Keywords
Readme
@kitiumai/database
Enterprise-ready database package built on Prisma with hardened defaults, resiliency, and observability for PostgreSQL and MongoDB.
What is this package?
@kitiumai/database is a comprehensive, production-grade database abstraction layer designed for modern SaaS applications. It provides a unified interface for PostgreSQL and MongoDB databases with enterprise features like connection pooling, automatic migrations, observability, and resilience patterns.
The package combines the power of Prisma ORM with additional enterprise capabilities including:
- Multi-database support with API parity
- Production-ready connection pooling
- Automated schema migrations and rollback
- Comprehensive observability and monitoring
- Built-in security features and guardrails
- Type-safe database operations with full TypeScript support
Why do we need this package?
In modern SaaS development, database operations are critical for application reliability, performance, and maintainability. Raw database connections and basic ORMs often lack the enterprise features needed for production applications:
- Connection Management: Proper pooling prevents connection exhaustion
- Resilience: Retry logic and circuit breakers handle transient failures
- Observability: Metrics and logging enable performance monitoring
- Security: Prepared statements and audit trails protect against vulnerabilities
- Migrations: Automated schema changes with rollback capabilities
- Multi-Database: Unified APIs across different database engines
This package addresses these needs by providing battle-tested patterns used by big tech companies, wrapped in a developer-friendly API.
Competitor Comparison
| Feature | @kitiumai/database | Prisma Client | TypeORM | Drizzle | MikroORM | |---------|-------------------|---------------|---------|---------|----------| | Multi-Database | ✅ PostgreSQL + MongoDB | ❌ Single DB | ✅ Multiple | ❌ Single DB | ✅ Multiple | | Connection Pooling | ✅ PgBouncer-style | ❌ Manual | ✅ Basic | ❌ Manual | ✅ Basic | | Observability | ✅ Built-in metrics | ❌ External | ❌ External | ❌ External | ❌ External | | Migration Rollback | ✅ Automated | ❌ Manual | ✅ Basic | ❌ Manual | ✅ Basic | | Health Checks | ✅ Readiness/Liveness | ❌ Manual | ❌ Manual | ❌ Manual | ❌ Manual | | Circuit Breaker | ✅ Built-in | ❌ Manual | ❌ Manual | ❌ Manual | ❌ Manual | | Type Safety | ✅ Full TypeScript | ✅ Generated | ✅ Decorators | ✅ SQL-first | ✅ Identity Map | | Enterprise Ready | ✅ Production hardened | ⚠️ Requires setup | ⚠️ Requires setup | ⚠️ Requires setup | ⚠️ Requires setup |
Unique Selling Proposition (USP)
"Enterprise Database Operations Made Simple"
What sets @kitiumai/database apart:
- Big Tech Standards: Implements patterns used by Google, Amazon, and Microsoft database services
- Zero-Config Production: Sensible defaults that work in production without extensive tuning
- Unified Multi-Database: Single API for both SQL and NoSQL databases
- Built-in Resilience: Circuit breakers, retry logic, and graceful degradation
- Comprehensive Observability: Metrics, tracing, and health checks out of the box
- Security First: Prepared statements, audit trails, and destructive operation guards
- Developer Experience: Type-safe, auto-generated APIs with excellent IDE support
Installation
npm install @kitiumai/database
# or
yarn add @kitiumai/databaseQuick Start
# Copy environment file
cp .env.example .env
# Install deps and generate Prisma client
npm install
npm run db:generate
# Run migrations and seed
npm run db:migrate:deploy
npm run db:seedUse the client in your application:
import { initializeDatabase, getDatabase, readinessCheck } from '@kitiumai/database';
await initializeDatabase({
retry: { maxRetries: 5, retryDelay: 200 },
observability: { enableMetrics: true },
});
const ready = await readinessCheck();
if (ready.status !== 'ready') throw new Error('Database not ready');
const db = getDatabase();
const users = await db.user.findMany();Configuration
loadDatabaseConfig normalizes environment variables and merges overrides. Key variables:
DATABASE_URL– PostgreSQL connection stringDATABASE_POOL_MIN/DATABASE_POOL_MAX/DATABASE_POOL_IDLE_TIMEOUT/DATABASE_POOL_CONNECTION_TIMEOUT– poolingDATABASE_MAX_RETRIES/DATABASE_RETRY_DELAY– retry/backoff for startupDATABASE_ENABLE_LOGGING/DATABASE_LOG_LEVEL– structured log controlsDATABASE_ENABLE_METRICS/DATABASE_ENABLE_TRACING– observability togglesDATABASE_SHUTDOWN_TIMEOUT– graceful shutdown wait (ms)DEFAULT_ADMIN_PASSWORD– seed default password (hashed automatically)ALLOW_CLEAR_DATABASE– set totrueto enable destructiveclearDatabaseMONGODB_URL/MONGODB_DB/MONGODB_POOL_SIZE– MongoDB connectivity
Call validateDatabaseConfig to enforce required values in CI/CD.
API Reference
Core Database Operations
Initialization and Health
initializeDatabase(config?: Partial<DatabaseConfig>): Promise<PrismaClient>– Initialize PostgreSQL database with pooling, retry/backoff, structured logging, and graceful shutdown hooksinitializeMongoDatabase(config?: Partial<DatabaseConfig>): Promise<MongoClient>– Initialize MongoDB connection with pooling and readiness checksgetDatabase(): PrismaClient– Get the initialized Prisma client instancegetMongoDatabase(): MongoClient– Get the initialized MongoDB client instancedisconnectDatabase(options?: { wait?: boolean; timeoutMs?: number }): Promise<void>– Graceful shutdown with configurable timeoutdisconnectMongoDatabase(): Promise<void>– Disconnect MongoDB clienthealthCheck(): Promise<boolean>– Liveness probe for database connectivityreadinessCheck(): Promise<HealthReport>– Readiness probe with detailed diagnosticsmongoHealthCheck(): Promise<boolean>– Health check for MongoDB connectivity
Configuration
loadDatabaseConfig(overrides?: Partial<DatabaseConfig>): DatabaseConfig– Load and normalize database configuration from environmentvalidateDatabaseConfig(config: DatabaseConfig): void– Validate required configuration values
Data Access
executeQuery<T>(query: Prisma.Sql, operation?: string): Promise<T[]>– Execute parameterized raw SQL queries with metrics and tracingexecuteUnsafeQuery<T>(query: string, params?: unknown[]): Promise<T[]>– Execute raw SQL queries (escape hatch for legacy code)
Connection Pooling
createConnectionPool(databaseUrl: string, config: PoolingConfig): string– Create pooled database connection URLgetPoolingConfigFromEnvironment(): PoolingConfig– Load pooling configuration from environment variablesgeneratePgBouncerConfig(databaseUrl: string, config: PoolingConfig, pgBouncerPort?: number): string– Generate PgBouncer configuration file
Migrations
migrationRunner(): Promise<MigrationResult[]>– Execute pending migrations and return resultsrollbackToMigration(migrationId: string): Promise<boolean>– Rollback to specific migrationgetMigrationHistory(): Promise<MigrationResult[]>– Get migration execution historyisMigrationsUpToDate(): Promise<boolean>– Check if all migrations are appliedvalidateSchema(): Promise<boolean>– Validate schema against migrations
Seeding and Data Management
seedDatabase(config?: Partial<DatabaseConfig>): Promise<SeedResult>– Execute database seeding with hashed passwords and idempotent operationsclearDatabase(config?: Partial<DatabaseConfig>): Promise<SeedResult>– Clear all data (requiresALLOW_CLEAR_DATABASE=true)
Observability
databaseMetrics(): Record<string, unknown>– Get in-memory query metrics snapshotconfigureObservability(options?: ObservabilityOptions): void– Configure observability settingsgetMetricsSnapshot(): MetricsSnapshot– Get detailed metrics snapshotlogStructured(level: 'debug' | 'info' | 'warn' | 'error', message: string, meta?: Record<string, unknown>): void– Structured logging
Advanced Architecture (New)
Dependency Injection
registerBindings(): void– Register all service bindings in DI containerregisterTestBindings(): void– Register test-specific bindingsDIContainer– Dependency injection container instance
Core Services
RetryCoordinator– Manages retry logic and backoff strategiesHealthCheckOrchestrator– Orchestrates health checks across databasesMigrationExecutor– Executes database migrations with statisticsDatabaseCleaner– Safely clears database with statisticsSeedOrchestrator– Orchestrates seeding operations
Database Adapters
PostgresAdapter– PostgreSQL database adapter implementationMongoAdapter– MongoDB database adapter implementationPostgresHealthCheck– PostgreSQL-specific health checksMongoHealthCheck– MongoDB-specific health checks
Infrastructure
PrismaClientFactory– Factory for creating Prisma clientsMongoClientFactory– Factory for creating MongoDB clientsConfigurationLoader– Loads configuration from various sourcesConfigurationValidator– Validates configuration schemasMetricsCollector– Collects and aggregates metricsQueryLogger– Logs database queries with context
Retry Strategies
ExponentialBackoffStrategy– Exponential backoff retry strategyExponentialBackoffWithJitterStrategy– Exponential backoff with jitterLinearBackoffStrategy– Linear backoff retry strategy
TypeScript Types
Configuration Types
DatabaseConfig– Main database configuration interfacePoolingConfig– Connection pooling configurationRetryConfig– Retry and backoff configurationObservabilityOptions– Observability and monitoring optionsShutdownConfig– Graceful shutdown configurationMongoConfig– MongoDB-specific configuration
Result Types
MigrationResult– Migration execution resultSeedResult– Seeding operation resultHealthReport– Health check reportMetricsSnapshot– Metrics data snapshotMigrationStats– Migration execution statisticsSeedingStats– Seeding operation statisticsClearingStats– Database clearing statistics
Interface Types
IDatabaseAdapter– Database adapter interfaceIRetryStrategy– Retry strategy interfaceIConfigProvider– Configuration provider interfaceIHealthCheckProvider– Health check provider interfaceICommandExecutor– Command execution interface
Metric Types
ConnectionMetric– Connection pool metricsQueryMetric– Query execution metricsQueryContext– Query execution context
Examples
Basic Usage
import { initializeDatabase, getDatabase, readinessCheck } from '@kitiumai/database';
// Initialize with default configuration
await initializeDatabase();
// Check readiness
const health = await readinessCheck();
if (health.status !== 'ready') {
throw new Error('Database not ready');
}
// Use the database
const db = getDatabase();
const users = await db.user.findMany();Advanced Configuration
import { initializeDatabase, loadDatabaseConfig } from '@kitiumai/database';
const config = loadDatabaseConfig({
pooling: {
min: 5,
max: 20,
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 5000,
},
retry: {
maxRetries: 5,
retryDelay: 1000,
},
observability: {
enableMetrics: true,
enableTracing: true,
logLevel: 'info',
},
});
await initializeDatabase(config);Safe Query Execution
import { executeQuery } from '@kitiumai/database';
import { Prisma } from '@prisma/client';
// Parameterized query (recommended)
const admins = await executeQuery<{ id: string; email: string }>(
Prisma.sql`SELECT id, email FROM "User" WHERE role = ${'ADMIN'}`,
'get-admins'
);
// Complex query with multiple parameters
const users = await executeQuery<{ id: string; name: string }>(
Prisma.sql`
SELECT id, name FROM "User"
WHERE created_at > ${new Date('2024-01-01')}
AND active = ${true}
ORDER BY name
LIMIT ${10}
`,
'get-recent-active-users'
);Migration Management
import { migrationRunner, rollbackToMigration, getMigrationHistory } from '@kitiumai/database';
// Run pending migrations
const results = await migrationRunner();
console.log(`Applied ${results.length} migrations`);
// Get migration history
const history = await getMigrationHistory();
console.log('Migration history:', history);
// Rollback to specific migration
const success = await rollbackToMigration('20241201000000_initial_schema');
if (success) {
console.log('Rollback completed');
}Health Checks and Monitoring
import { healthCheck, readinessCheck, databaseMetrics } from '@kitiumai/database';
// Simple health check
const isHealthy = await healthCheck();
console.log('Database healthy:', isHealthy);
// Detailed readiness check
const report = await readinessCheck();
console.log('Readiness report:', report);
// Get metrics
const metrics = databaseMetrics();
console.log('Query metrics:', metrics);Multi-Database Setup
import {
initializeDatabase,
initializeMongoDatabase,
getDatabase,
getMongoDatabase
} from '@kitiumai/database';
// Initialize both databases
await initializeDatabase({
databaseUrl: process.env.DATABASE_URL,
});
await initializeMongoDatabase({
mongo: {
mongodbUrl: process.env.MONGODB_URL,
dbName: 'myapp',
},
});
// Use both databases
const postgresDb = getDatabase();
const mongoDb = getMongoDatabase();
// PostgreSQL operations
const users = await postgresDb.user.findMany();
// MongoDB operations
const documents = await mongoDb.collection('logs').find({}).toArray();Seeding with Security
import { seedDatabase, clearDatabase } from '@kitiumai/database';
// Seed database (passwords automatically hashed)
const seedResult = await seedDatabase({
defaultAdminPassword: 'secure-admin-password',
});
console.log('Seeding result:', seedResult);
// Clear database (requires ALLOW_CLEAR_DATABASE=true)
if (process.env.ALLOW_CLEAR_DATABASE === 'true') {
const clearResult = await clearDatabase();
console.log('Clear result:', clearResult);
}Custom Observability
import { configureObservability, logStructured } from '@kitiumai/database';
// Configure observability
configureObservability({
enableMetrics: true,
enableTracing: true,
loggerName: 'my-app-database',
logLevel: 'debug',
});
// Structured logging
logStructured('info', 'Database operation started', {
operation: 'user-creation',
userId: '12345',
timestamp: new Date().toISOString(),
});
logStructured('error', 'Database query failed', {
operation: 'user-lookup',
error: 'Connection timeout',
duration: 5000,
});Using Dependency Injection
import { DIContainer, registerBindings } from '@kitiumai/database';
// Register all bindings
registerBindings();
// Get services from container
const retryCoordinator = DIContainer.get('RetryCoordinator');
const healthOrchestrator = DIContainer.get('HealthCheckOrchestrator');
// Use services
await retryCoordinator.executeWithRetry(async () => {
// Database operation
});
const healthReport = await healthOrchestrator.checkAll();CLI Commands
npm run migration:create # Create a new migration
npm run db:migrate:deploy # Apply migrations
npm run db:migrate:dev # Create/apply migrations in development
npm run db:reset # Drop, recreate, migrate, seed
npm run db:seed # Seed with initial data
npm run db:studio # Open Prisma Studio
npm run db:generate # Generate Prisma client
npm run db:validate # Validate Prisma schemaSecurity Notes
- Prepared statements by default; unsafe helper provided for legacy flows only.
- Seed passwords are hashed with bcrypt; override via
DEFAULT_ADMIN_PASSWORDorpasswordHasherconfig. - Destructive operations require explicit opt-in (
ALLOW_CLEAR_DATABASE=true).
Changelog
See CHANGELOG.md for unreleased and historical updates.
