@coherent.js/database 1.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +74 -0
- package/dist/database/adapters/memory.d.ts +48 -0
- package/dist/database/adapters/memory.d.ts.map +1 -0
- package/dist/database/adapters/memory.js +250 -0
- package/dist/database/adapters/memory.js.map +1 -0
- package/dist/database/adapters/mongodb.d.ts +15 -0
- package/dist/database/adapters/mongodb.d.ts.map +1 -0
- package/dist/database/adapters/mongodb.js +216 -0
- package/dist/database/adapters/mongodb.js.map +1 -0
- package/dist/database/adapters/mysql.d.ts +12 -0
- package/dist/database/adapters/mysql.d.ts.map +1 -0
- package/dist/database/adapters/mysql.js +171 -0
- package/dist/database/adapters/mysql.js.map +1 -0
- package/dist/database/adapters/postgresql.d.ts +12 -0
- package/dist/database/adapters/postgresql.d.ts.map +1 -0
- package/dist/database/adapters/postgresql.js +177 -0
- package/dist/database/adapters/postgresql.js.map +1 -0
- package/dist/database/adapters/sqlite.d.ts +15 -0
- package/dist/database/adapters/sqlite.d.ts.map +1 -0
- package/dist/database/adapters/sqlite.js +241 -0
- package/dist/database/adapters/sqlite.js.map +1 -0
- package/dist/database/connection-manager.d.ts +148 -0
- package/dist/database/connection-manager.d.ts.map +1 -0
- package/dist/database/connection-manager.js +377 -0
- package/dist/database/connection-manager.js.map +1 -0
- package/dist/database/index.d.ts +38 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +63 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/middleware.d.ts +122 -0
- package/dist/database/middleware.d.ts.map +1 -0
- package/dist/database/middleware.js +403 -0
- package/dist/database/middleware.js.map +1 -0
- package/dist/database/migration.d.ts +168 -0
- package/dist/database/migration.d.ts.map +1 -0
- package/dist/database/migration.js +946 -0
- package/dist/database/migration.js.map +1 -0
- package/dist/database/model.d.ts +81 -0
- package/dist/database/model.d.ts.map +1 -0
- package/dist/database/model.js +686 -0
- package/dist/database/model.js.map +1 -0
- package/dist/database/query-builder.d.ts +136 -0
- package/dist/database/query-builder.d.ts.map +1 -0
- package/dist/database/query-builder.js +248 -0
- package/dist/database/query-builder.js.map +1 -0
- package/dist/database/utils.d.ts +196 -0
- package/dist/database/utils.d.ts.map +1 -0
- package/dist/database/utils.js +372 -0
- package/dist/database/utils.js.map +1 -0
- package/dist/index.cjs +2286 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.js +2240 -0
- package/dist/index.js.map +7 -0
- package/package.json +52 -0
- package/types/index.d.ts +732 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory function to create a DatabaseManager instance
|
|
3
|
+
*
|
|
4
|
+
* @param {Object} config - Database configuration
|
|
5
|
+
* @returns {DatabaseManager} Database manager instance
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* const db = createDatabaseManager({
|
|
9
|
+
* type: 'sqlite',
|
|
10
|
+
* database: './app.db'
|
|
11
|
+
* });
|
|
12
|
+
*/
|
|
13
|
+
export function createDatabaseManager(config: Object): DatabaseManager;
|
|
14
|
+
/**
|
|
15
|
+
* Database Connection Manager
|
|
16
|
+
*
|
|
17
|
+
* @class DatabaseManager
|
|
18
|
+
* @extends EventEmitter
|
|
19
|
+
* @description Manages database connections with pooling, health checks, and adapter abstraction.
|
|
20
|
+
* Provides a unified interface for different database engines.
|
|
21
|
+
*
|
|
22
|
+
* @param {Object} config - Database configuration
|
|
23
|
+
* @param {string} config.type - Database type ('postgresql', 'mysql', 'sqlite', 'mongodb')
|
|
24
|
+
* @param {string} [config.host='localhost'] - Database host
|
|
25
|
+
* @param {number} [config.port] - Database port (auto-detected by type)
|
|
26
|
+
* @param {string} config.database - Database name
|
|
27
|
+
* @param {string} [config.username] - Database username
|
|
28
|
+
* @param {string} [config.password] - Database password
|
|
29
|
+
* @param {Object} [config.pool] - Connection pool configuration
|
|
30
|
+
* @param {boolean} [config.debug=false] - Enable debug logging
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* const db = new DatabaseManager({
|
|
34
|
+
* type: 'postgresql',
|
|
35
|
+
* host: 'localhost',
|
|
36
|
+
* database: 'myapp',
|
|
37
|
+
* username: 'user',
|
|
38
|
+
* password: 'pass',
|
|
39
|
+
* pool: { min: 2, max: 10 }
|
|
40
|
+
* });
|
|
41
|
+
*
|
|
42
|
+
* await db.connect();
|
|
43
|
+
* const users = await db.query('SELECT * FROM users WHERE active = ?', [true]);
|
|
44
|
+
*/
|
|
45
|
+
export class DatabaseManager extends EventEmitter<[never]> {
|
|
46
|
+
constructor(config: any);
|
|
47
|
+
config: Object;
|
|
48
|
+
adapter: Object | null;
|
|
49
|
+
pool: any;
|
|
50
|
+
isConnected: boolean;
|
|
51
|
+
connectionAttempts: number;
|
|
52
|
+
maxRetries: number;
|
|
53
|
+
healthCheckInterval: NodeJS.Timeout | null;
|
|
54
|
+
healthCheckFrequency: number;
|
|
55
|
+
stats: {
|
|
56
|
+
totalConnections: number;
|
|
57
|
+
activeConnections: number;
|
|
58
|
+
failedConnections: number;
|
|
59
|
+
queriesExecuted: number;
|
|
60
|
+
averageQueryTime: number;
|
|
61
|
+
lastHealthCheck: null;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Validate database configuration
|
|
65
|
+
*
|
|
66
|
+
* @private
|
|
67
|
+
* @param {Object} config - Configuration to validate
|
|
68
|
+
* @returns {Object} Validated configuration
|
|
69
|
+
* @throws {Error} If configuration is invalid
|
|
70
|
+
*/
|
|
71
|
+
private validateConfig;
|
|
72
|
+
/**
|
|
73
|
+
* Connect to the database
|
|
74
|
+
*
|
|
75
|
+
* @returns {Promise<void>}
|
|
76
|
+
* @throws {Error} If connection fails after retries
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* await db.connect();
|
|
80
|
+
* console.log('Database connected successfully');
|
|
81
|
+
*/
|
|
82
|
+
connect(): Promise<void>;
|
|
83
|
+
/**
|
|
84
|
+
* Load database adapter
|
|
85
|
+
*
|
|
86
|
+
* @private
|
|
87
|
+
* @param {string} type - Database type
|
|
88
|
+
* @returns {Object} Database adapter
|
|
89
|
+
*/
|
|
90
|
+
private loadAdapter;
|
|
91
|
+
/**
|
|
92
|
+
* Test database connection
|
|
93
|
+
*
|
|
94
|
+
* @private
|
|
95
|
+
* @returns {Promise<void>}
|
|
96
|
+
*/
|
|
97
|
+
private testConnection;
|
|
98
|
+
/**
|
|
99
|
+
* Execute a database query
|
|
100
|
+
*
|
|
101
|
+
* @param {string} sql - SQL query string
|
|
102
|
+
* @param {Array} [params=[]] - Query parameters
|
|
103
|
+
* @param {Object} [options={}] - Query options
|
|
104
|
+
* @returns {Promise<Object>} Query result
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* const users = await db.query('SELECT * FROM users WHERE age > ?', [18]);
|
|
108
|
+
* const user = await db.query('SELECT * FROM users WHERE id = ?', [123], { single: true });
|
|
109
|
+
*/
|
|
110
|
+
query(operation: any, params?: any[]): Promise<Object>;
|
|
111
|
+
/**
|
|
112
|
+
* Start a database transaction
|
|
113
|
+
*
|
|
114
|
+
* @returns {Promise<Object>} Transaction object
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* const tx = await db.transaction();
|
|
118
|
+
* try {
|
|
119
|
+
* await tx.query('INSERT INTO users (name) VALUES (?)', ['John']);
|
|
120
|
+
* await tx.query('INSERT INTO profiles (user_id) VALUES (?)', [userId]);
|
|
121
|
+
* await tx.commit();
|
|
122
|
+
* } catch (error) {
|
|
123
|
+
* await tx.rollback();
|
|
124
|
+
* throw error;
|
|
125
|
+
* }
|
|
126
|
+
*/
|
|
127
|
+
transaction(): Promise<Object>;
|
|
128
|
+
/**
|
|
129
|
+
* Start health check monitoring
|
|
130
|
+
*
|
|
131
|
+
* @private
|
|
132
|
+
*/
|
|
133
|
+
private startHealthCheck;
|
|
134
|
+
/**
|
|
135
|
+
* Get connection statistics
|
|
136
|
+
*
|
|
137
|
+
* @returns {Object} Connection statistics
|
|
138
|
+
*/
|
|
139
|
+
getStats(): Object;
|
|
140
|
+
/**
|
|
141
|
+
* Close database connection
|
|
142
|
+
*
|
|
143
|
+
* @returns {Promise<void>}
|
|
144
|
+
*/
|
|
145
|
+
close(): Promise<void>;
|
|
146
|
+
}
|
|
147
|
+
import { EventEmitter } from 'events';
|
|
148
|
+
//# sourceMappingURL=connection-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-manager.d.ts","sourceRoot":"","sources":["../../../../src/database/connection-manager.js"],"names":[],"mappings":"AA6ZA;;;;;;;;;;;GAWG;AACH,8CATW,MAAM,GACJ,eAAe,CAU3B;AAlaD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH;IACE,yBAuBC;IApBC,eAAyC;IACzC,uBAAmB;IACnB,UAAgB;IAChB,qBAAwB;IACxB,2BAA2B;IAC3B,mBAAmB;IAGnB,2CAA+B;IAC/B,6BAAiC;IAGjC;;;;;;;MAOC;IAGH;;;;;;;OAOG;IACH,uBA8DC;IAED;;;;;;;;;OASG;IACH,WAPa,OAAO,CAAC,IAAI,CAAC,CA4CzB;IAED;;;;;;OAMG;IACH,oBAsCC;IAED;;;;;OAKG;IACH,uBAoBC;IAED;;;;;;;;;;;OAWG;IACH,uCANa,OAAO,CAAC,MAAM,CAAC,CAiD3B;IAED;;;;;;;;;;;;;;;OAeG;IACH,eAba,OAAO,CAAC,MAAM,CAAC,CAmB3B;IAED;;;;OAIG;IACH,yBAiBC;IAED;;;;OAIG;IACH,YAFa,MAAM,CAQlB;IAED;;;;OAIG;IACH,SAFa,OAAO,CAAC,IAAI,CAAC,CA2BzB;CACF;6BApZ4B,QAAQ"}
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Connection Manager for Coherent.js
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Manages database connections, connection pooling, and adapter selection
|
|
5
|
+
* with support for multiple database engines and automatic failover.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
/**
|
|
9
|
+
* Database Connection Manager
|
|
10
|
+
*
|
|
11
|
+
* @class DatabaseManager
|
|
12
|
+
* @extends EventEmitter
|
|
13
|
+
* @description Manages database connections with pooling, health checks, and adapter abstraction.
|
|
14
|
+
* Provides a unified interface for different database engines.
|
|
15
|
+
*
|
|
16
|
+
* @param {Object} config - Database configuration
|
|
17
|
+
* @param {string} config.type - Database type ('postgresql', 'mysql', 'sqlite', 'mongodb')
|
|
18
|
+
* @param {string} [config.host='localhost'] - Database host
|
|
19
|
+
* @param {number} [config.port] - Database port (auto-detected by type)
|
|
20
|
+
* @param {string} config.database - Database name
|
|
21
|
+
* @param {string} [config.username] - Database username
|
|
22
|
+
* @param {string} [config.password] - Database password
|
|
23
|
+
* @param {Object} [config.pool] - Connection pool configuration
|
|
24
|
+
* @param {boolean} [config.debug=false] - Enable debug logging
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* const db = new DatabaseManager({
|
|
28
|
+
* type: 'postgresql',
|
|
29
|
+
* host: 'localhost',
|
|
30
|
+
* database: 'myapp',
|
|
31
|
+
* username: 'user',
|
|
32
|
+
* password: 'pass',
|
|
33
|
+
* pool: { min: 2, max: 10 }
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* await db.connect();
|
|
37
|
+
* const users = await db.query('SELECT * FROM users WHERE active = ?', [true]);
|
|
38
|
+
*/
|
|
39
|
+
export class DatabaseManager extends EventEmitter {
|
|
40
|
+
constructor(config) {
|
|
41
|
+
super();
|
|
42
|
+
this.config = this.validateConfig(config);
|
|
43
|
+
this.adapter = null;
|
|
44
|
+
this.pool = null;
|
|
45
|
+
this.isConnected = false;
|
|
46
|
+
this.connectionAttempts = 0;
|
|
47
|
+
this.maxRetries = 3;
|
|
48
|
+
// Health check interval
|
|
49
|
+
this.healthCheckInterval = null;
|
|
50
|
+
this.healthCheckFrequency = 30000; // 30 seconds
|
|
51
|
+
// Connection statistics
|
|
52
|
+
this.stats = {
|
|
53
|
+
totalConnections: 0,
|
|
54
|
+
activeConnections: 0,
|
|
55
|
+
failedConnections: 0,
|
|
56
|
+
queriesExecuted: 0,
|
|
57
|
+
averageQueryTime: 0,
|
|
58
|
+
lastHealthCheck: null
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Validate database configuration
|
|
63
|
+
*
|
|
64
|
+
* @private
|
|
65
|
+
* @param {Object} config - Configuration to validate
|
|
66
|
+
* @returns {Object} Validated configuration
|
|
67
|
+
* @throws {Error} If configuration is invalid
|
|
68
|
+
*/
|
|
69
|
+
validateConfig(config) {
|
|
70
|
+
if (!config || typeof config !== 'object') {
|
|
71
|
+
throw new Error('Database configuration is required');
|
|
72
|
+
}
|
|
73
|
+
// New adapter-based configuration
|
|
74
|
+
if (config.adapter) {
|
|
75
|
+
if (typeof config.adapter !== 'object' ||
|
|
76
|
+
typeof config.adapter.createPool !== 'function') {
|
|
77
|
+
throw new Error('Invalid adapter provided. Adapter must be an object with a createPool method');
|
|
78
|
+
}
|
|
79
|
+
// Set default store config if not provided
|
|
80
|
+
if (!config.store) {
|
|
81
|
+
config.store = { name: 'default' };
|
|
82
|
+
}
|
|
83
|
+
else if (typeof config.store === 'string') {
|
|
84
|
+
config.store = { name: config.store };
|
|
85
|
+
}
|
|
86
|
+
return config;
|
|
87
|
+
}
|
|
88
|
+
// Legacy type-based configuration
|
|
89
|
+
const { type, database } = config;
|
|
90
|
+
if (!type) {
|
|
91
|
+
throw new Error('Either database type or adapter is required');
|
|
92
|
+
}
|
|
93
|
+
const supportedTypes = ['postgresql', 'mysql', 'sqlite', 'mongodb'];
|
|
94
|
+
if (!supportedTypes.includes(type)) {
|
|
95
|
+
throw new Error(`Unsupported database type: ${type}. Supported types: ${supportedTypes.join(', ')}`);
|
|
96
|
+
}
|
|
97
|
+
if (!database) {
|
|
98
|
+
throw new Error('Database name is required for type-based configuration');
|
|
99
|
+
}
|
|
100
|
+
// Set default ports based on database type
|
|
101
|
+
const defaultPorts = {
|
|
102
|
+
postgresql: 5432,
|
|
103
|
+
mysql: 3306,
|
|
104
|
+
mongodb: 27017,
|
|
105
|
+
sqlite: null
|
|
106
|
+
};
|
|
107
|
+
return {
|
|
108
|
+
host: config.host || 'localhost',
|
|
109
|
+
port: config.port || defaultPorts[type],
|
|
110
|
+
...config,
|
|
111
|
+
pool: {
|
|
112
|
+
min: 2,
|
|
113
|
+
max: 10,
|
|
114
|
+
acquireTimeoutMillis: 30000,
|
|
115
|
+
createTimeoutMillis: 30000,
|
|
116
|
+
destroyTimeoutMillis: 5000,
|
|
117
|
+
idleTimeoutMillis: 30000,
|
|
118
|
+
reapIntervalMillis: 1000,
|
|
119
|
+
createRetryIntervalMillis: 200,
|
|
120
|
+
...config.pool
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Connect to the database
|
|
126
|
+
*
|
|
127
|
+
* @returns {Promise<void>}
|
|
128
|
+
* @throws {Error} If connection fails after retries
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* await db.connect();
|
|
132
|
+
* console.log('Database connected successfully');
|
|
133
|
+
*/
|
|
134
|
+
async connect() {
|
|
135
|
+
if (this.isConnected) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
// Load appropriate adapter
|
|
140
|
+
this.adapter = await this.loadAdapter(this.config.type);
|
|
141
|
+
// Create connection pool
|
|
142
|
+
this.pool = await this.adapter.createPool(this.config);
|
|
143
|
+
// Test connection
|
|
144
|
+
await this.testConnection();
|
|
145
|
+
this.isConnected = true;
|
|
146
|
+
this.connectionAttempts = 0;
|
|
147
|
+
// Start health checks if supported by the adapter
|
|
148
|
+
if (this.adapter.startHealthChecks) {
|
|
149
|
+
this.startHealthChecks();
|
|
150
|
+
}
|
|
151
|
+
return this;
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
this.connectionAttempts++;
|
|
155
|
+
this.stats.failedConnections++;
|
|
156
|
+
this.emit('error', error);
|
|
157
|
+
if (this.connectionAttempts < this.maxRetries) {
|
|
158
|
+
console.warn(`Connection attempt ${this.connectionAttempts} failed. Retrying in 2 seconds...`);
|
|
159
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
160
|
+
return this.connect();
|
|
161
|
+
}
|
|
162
|
+
throw new Error(`Failed to connect to database after ${this.connectionAttempts} attempts: ${error.message}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Load database adapter
|
|
167
|
+
*
|
|
168
|
+
* @private
|
|
169
|
+
* @param {string} type - Database type
|
|
170
|
+
* @returns {Object} Database adapter
|
|
171
|
+
*/
|
|
172
|
+
loadAdapter(type) {
|
|
173
|
+
// If using direct adapter instance (for custom adapters like MemoryAdapter)
|
|
174
|
+
if (this.config.adapter) {
|
|
175
|
+
return this.config.adapter;
|
|
176
|
+
}
|
|
177
|
+
// For built-in adapters
|
|
178
|
+
const adapterMap = {
|
|
179
|
+
postgresql: './adapters/postgresql.js',
|
|
180
|
+
mysql: './adapters/mysql.js',
|
|
181
|
+
sqlite: './adapters/sqlite.js',
|
|
182
|
+
mongodb: './adapters/mongodb.js',
|
|
183
|
+
memory: './adapters/memory.js'
|
|
184
|
+
};
|
|
185
|
+
const adapterPath = adapterMap[type];
|
|
186
|
+
if (!adapterPath) {
|
|
187
|
+
throw new Error(`No adapter found for database type: ${type}`);
|
|
188
|
+
}
|
|
189
|
+
// Use dynamic import for ESM compatibility
|
|
190
|
+
return import(adapterPath)
|
|
191
|
+
.then(adapterModule => {
|
|
192
|
+
// Try both the default export and the named export pattern
|
|
193
|
+
if (adapterModule.default) {
|
|
194
|
+
return new adapterModule.default();
|
|
195
|
+
}
|
|
196
|
+
const AdapterClass = adapterModule[`${type.charAt(0).toUpperCase() + type.slice(1)}Adapter`];
|
|
197
|
+
if (AdapterClass) {
|
|
198
|
+
return new AdapterClass();
|
|
199
|
+
}
|
|
200
|
+
throw new Error(`No valid adapter found in ${adapterPath}`);
|
|
201
|
+
})
|
|
202
|
+
.catch(error => {
|
|
203
|
+
throw new Error(`Failed to load ${type} adapter: ${error.message}`);
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Test database connection
|
|
208
|
+
*
|
|
209
|
+
* @private
|
|
210
|
+
* @returns {Promise<void>}
|
|
211
|
+
*/
|
|
212
|
+
async testConnection() {
|
|
213
|
+
const startTime = Date.now();
|
|
214
|
+
try {
|
|
215
|
+
if (typeof this.adapter.testConnection === 'function') {
|
|
216
|
+
await this.adapter.testConnection();
|
|
217
|
+
}
|
|
218
|
+
else if (this.adapter.ping) {
|
|
219
|
+
// Try ping if available
|
|
220
|
+
await this.adapter.ping();
|
|
221
|
+
}
|
|
222
|
+
// If no test method is available, we'll assume the connection is good
|
|
223
|
+
const duration = Date.now() - startTime;
|
|
224
|
+
this.stats.lastHealthCheck = new Date();
|
|
225
|
+
this.emit('connect:test', { duration });
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
this.emit('error', error);
|
|
229
|
+
throw new Error(`Database connection test failed: ${error.message}`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Execute a database query
|
|
234
|
+
*
|
|
235
|
+
* @param {string} sql - SQL query string
|
|
236
|
+
* @param {Array} [params=[]] - Query parameters
|
|
237
|
+
* @param {Object} [options={}] - Query options
|
|
238
|
+
* @returns {Promise<Object>} Query result
|
|
239
|
+
*
|
|
240
|
+
* @example
|
|
241
|
+
* const users = await db.query('SELECT * FROM users WHERE age > ?', [18]);
|
|
242
|
+
* const user = await db.query('SELECT * FROM users WHERE id = ?', [123], { single: true });
|
|
243
|
+
*/
|
|
244
|
+
async query(operation, params = {}) {
|
|
245
|
+
if (!this.isConnected) {
|
|
246
|
+
throw new Error('Database not connected. Call connect() first.');
|
|
247
|
+
}
|
|
248
|
+
const startTime = Date.now();
|
|
249
|
+
try {
|
|
250
|
+
let result;
|
|
251
|
+
// Handle MemoryAdapter's query method
|
|
252
|
+
if (typeof this.pool.query === 'function') {
|
|
253
|
+
result = await this.pool.query(operation, params);
|
|
254
|
+
}
|
|
255
|
+
// Handle SQL adapters
|
|
256
|
+
else if (typeof this.adapter.query === 'function') {
|
|
257
|
+
result = await this.adapter.query(this.pool, operation, params);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
throw new Error('No valid query method found on adapter or pool');
|
|
261
|
+
}
|
|
262
|
+
// Update statistics
|
|
263
|
+
const duration = Date.now() - startTime;
|
|
264
|
+
this.stats.queriesExecuted++;
|
|
265
|
+
this.stats.averageQueryTime = ((this.stats.averageQueryTime * (this.stats.queriesExecuted - 1) + duration) /
|
|
266
|
+
this.stats.queriesExecuted);
|
|
267
|
+
if (this.config.debug) {
|
|
268
|
+
console.log(`Query executed in ${duration}ms: ${operation}`, params);
|
|
269
|
+
}
|
|
270
|
+
this.emit('query', { operation, params, duration });
|
|
271
|
+
return result;
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
const duration = Date.now() - startTime;
|
|
275
|
+
this.emit('queryError', { operation, params, duration, error: error.message });
|
|
276
|
+
throw new Error(`Query failed: ${error.message}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Start a database transaction
|
|
281
|
+
*
|
|
282
|
+
* @returns {Promise<Object>} Transaction object
|
|
283
|
+
*
|
|
284
|
+
* @example
|
|
285
|
+
* const tx = await db.transaction();
|
|
286
|
+
* try {
|
|
287
|
+
* await tx.query('INSERT INTO users (name) VALUES (?)', ['John']);
|
|
288
|
+
* await tx.query('INSERT INTO profiles (user_id) VALUES (?)', [userId]);
|
|
289
|
+
* await tx.commit();
|
|
290
|
+
* } catch (error) {
|
|
291
|
+
* await tx.rollback();
|
|
292
|
+
* throw error;
|
|
293
|
+
* }
|
|
294
|
+
*/
|
|
295
|
+
async transaction() {
|
|
296
|
+
if (!this.isConnected) {
|
|
297
|
+
throw new Error('Database not connected. Call connect() first.');
|
|
298
|
+
}
|
|
299
|
+
return await this.adapter.transaction(this.pool);
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Start health check monitoring
|
|
303
|
+
*
|
|
304
|
+
* @private
|
|
305
|
+
*/
|
|
306
|
+
startHealthCheck() {
|
|
307
|
+
if (this.healthCheckInterval) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
this.healthCheckInterval = setInterval(async () => {
|
|
311
|
+
try {
|
|
312
|
+
await this.testConnection();
|
|
313
|
+
this.emit('healthCheck', { status: 'healthy', timestamp: new Date() });
|
|
314
|
+
}
|
|
315
|
+
catch (error) {
|
|
316
|
+
this.emit('healthCheck', { status: 'unhealthy', error: error.message, timestamp: new Date() });
|
|
317
|
+
if (this.config.debug) {
|
|
318
|
+
console.error('Database health check failed:', error.message);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}, this.healthCheckFrequency);
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Get connection statistics
|
|
325
|
+
*
|
|
326
|
+
* @returns {Object} Connection statistics
|
|
327
|
+
*/
|
|
328
|
+
getStats() {
|
|
329
|
+
return {
|
|
330
|
+
...this.stats,
|
|
331
|
+
isConnected: this.isConnected,
|
|
332
|
+
poolStats: this.pool ? this.adapter.getPoolStats(this.pool) : null
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Close database connection
|
|
337
|
+
*
|
|
338
|
+
* @returns {Promise<void>}
|
|
339
|
+
*/
|
|
340
|
+
async close() {
|
|
341
|
+
if (!this.isConnected) {
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
// Stop health checks
|
|
345
|
+
if (this.healthCheckInterval) {
|
|
346
|
+
clearInterval(this.healthCheckInterval);
|
|
347
|
+
this.healthCheckInterval = null;
|
|
348
|
+
}
|
|
349
|
+
// Close connection pool
|
|
350
|
+
if (this.pool && this.adapter) {
|
|
351
|
+
await this.adapter.closePool(this.pool);
|
|
352
|
+
}
|
|
353
|
+
this.isConnected = false;
|
|
354
|
+
this.pool = null;
|
|
355
|
+
this.adapter = null;
|
|
356
|
+
this.emit('disconnected');
|
|
357
|
+
if (this.config.debug) {
|
|
358
|
+
console.log('Database connection closed');
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Factory function to create a DatabaseManager instance
|
|
364
|
+
*
|
|
365
|
+
* @param {Object} config - Database configuration
|
|
366
|
+
* @returns {DatabaseManager} Database manager instance
|
|
367
|
+
*
|
|
368
|
+
* @example
|
|
369
|
+
* const db = createDatabaseManager({
|
|
370
|
+
* type: 'sqlite',
|
|
371
|
+
* database: './app.db'
|
|
372
|
+
* });
|
|
373
|
+
*/
|
|
374
|
+
export function createDatabaseManager(config) {
|
|
375
|
+
return new DatabaseManager(config);
|
|
376
|
+
}
|
|
377
|
+
//# sourceMappingURL=connection-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-manager.js","sourceRoot":"","sources":["../../../../src/database/connection-manager.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quick setup function for common database configurations
|
|
3
|
+
*
|
|
4
|
+
* @param {Object} config - Database configuration
|
|
5
|
+
* @returns {DatabaseManager} Configured database manager
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* import { setupDatabase } from '@coherent/database';
|
|
9
|
+
*
|
|
10
|
+
* const db = setupDatabase({
|
|
11
|
+
* type: 'postgresql',
|
|
12
|
+
* host: 'localhost',
|
|
13
|
+
* database: 'myapp',
|
|
14
|
+
* username: 'user',
|
|
15
|
+
* password: 'pass'
|
|
16
|
+
* });
|
|
17
|
+
*/
|
|
18
|
+
export function setupDatabase(config?: Object): DatabaseManager;
|
|
19
|
+
export { createModel } from "./model.js";
|
|
20
|
+
export { createMigration } from "./migration.js";
|
|
21
|
+
export { createDatabaseManager } from "./connection-manager.js";
|
|
22
|
+
export { createPostgreSQLAdapter as PostgreSQLAdapter } from "./adapters/postgresql.js";
|
|
23
|
+
export { createMySQLAdapter as MySQLAdapter } from "./adapters/mysql.js";
|
|
24
|
+
export { createSQLiteAdapter as SQLiteAdapter } from "./adapters/sqlite.js";
|
|
25
|
+
export { createMongoDBAdapter as MongoDBAdapter } from "./adapters/mongodb.js";
|
|
26
|
+
export namespace DEFAULT_DB_CONFIG {
|
|
27
|
+
let type: string;
|
|
28
|
+
let database: string;
|
|
29
|
+
let synchronize: boolean;
|
|
30
|
+
let logging: boolean;
|
|
31
|
+
let entities: never[];
|
|
32
|
+
let migrations: never[];
|
|
33
|
+
let subscribers: never[];
|
|
34
|
+
}
|
|
35
|
+
export { createQuery, executeQuery } from "./query-builder.js";
|
|
36
|
+
export { withDatabase, withTransaction, withModel, withPagination } from "./middleware.js";
|
|
37
|
+
export { createConnection, runMigrations } from "./utils.js";
|
|
38
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/database/index.js"],"names":[],"mappings":"AA0CA;;;;;;;;;;;;;;;;GAgBG;AACH,uCAdW,MAAM,GACJ,eAAe,CAuB3B"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Integration Layer for Coherent.js
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Provides database connectivity, query building, and ORM functionality
|
|
5
|
+
* with support for multiple database engines (PostgreSQL, MySQL, SQLite, MongoDB).
|
|
6
|
+
*
|
|
7
|
+
* @author Coherent.js Team
|
|
8
|
+
* @version 1.0.0
|
|
9
|
+
*/
|
|
10
|
+
// Factory functions preferred over classes for pure JS object architecture
|
|
11
|
+
export { createQuery, executeQuery } from './query-builder.js';
|
|
12
|
+
export { createModel } from './model.js';
|
|
13
|
+
export { createMigration } from './migration.js';
|
|
14
|
+
export { createDatabaseManager } from './connection-manager.js';
|
|
15
|
+
export { withDatabase, withTransaction, withModel, withPagination } from './middleware.js';
|
|
16
|
+
// Import for internal use
|
|
17
|
+
import { createDatabaseManager } from './connection-manager.js';
|
|
18
|
+
// Database adapters
|
|
19
|
+
export { createPostgreSQLAdapter as PostgreSQLAdapter } from './adapters/postgresql.js';
|
|
20
|
+
export { createMySQLAdapter as MySQLAdapter } from './adapters/mysql.js';
|
|
21
|
+
export { createSQLiteAdapter as SQLiteAdapter } from './adapters/sqlite.js';
|
|
22
|
+
export { createMongoDBAdapter as MongoDBAdapter } from './adapters/mongodb.js';
|
|
23
|
+
// Utilities
|
|
24
|
+
export { createConnection, runMigrations } from './utils.js';
|
|
25
|
+
/**
|
|
26
|
+
* Default database configuration
|
|
27
|
+
*/
|
|
28
|
+
export const DEFAULT_DB_CONFIG = {
|
|
29
|
+
type: 'sqlite',
|
|
30
|
+
database: ':memory:',
|
|
31
|
+
synchronize: true,
|
|
32
|
+
logging: false,
|
|
33
|
+
entities: [],
|
|
34
|
+
migrations: [],
|
|
35
|
+
subscribers: []
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Quick setup function for common database configurations
|
|
39
|
+
*
|
|
40
|
+
* @param {Object} config - Database configuration
|
|
41
|
+
* @returns {DatabaseManager} Configured database manager
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* import { setupDatabase } from '@coherent/database';
|
|
45
|
+
*
|
|
46
|
+
* const db = setupDatabase({
|
|
47
|
+
* type: 'postgresql',
|
|
48
|
+
* host: 'localhost',
|
|
49
|
+
* database: 'myapp',
|
|
50
|
+
* username: 'user',
|
|
51
|
+
* password: 'pass'
|
|
52
|
+
* });
|
|
53
|
+
*/
|
|
54
|
+
export function setupDatabase(config = {}) {
|
|
55
|
+
const mergedConfig = { ...DEFAULT_DB_CONFIG, ...config };
|
|
56
|
+
const dbManager = createDatabaseManager(mergedConfig);
|
|
57
|
+
// Auto-connect if autoConnect is not explicitly set to false
|
|
58
|
+
if (mergedConfig.autoConnect !== false) {
|
|
59
|
+
dbManager.connect().catch(console.error);
|
|
60
|
+
}
|
|
61
|
+
return dbManager;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/database/index.js"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,2EAA2E;AAC3E,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE3F,0BAA0B;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,oBAAoB;AACpB,OAAO,EAAE,uBAAuB,IAAI,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,kBAAkB,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,mBAAmB,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE/E,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE7D;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,IAAI;IACjB,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,EAAE;IACd,WAAW,EAAE,EAAE;CAChB,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAAC,MAAM,GAAG,EAAE;IACvC,MAAM,YAAY,GAAG,EAAE,GAAG,iBAAiB,EAAE,GAAG,MAAM,EAAE,CAAC;IACzD,MAAM,SAAS,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IAEtD,6DAA6D;IAC7D,IAAI,YAAY,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;QACvC,SAAS,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|