@zintrust/core 0.1.20 → 0.1.22
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/package.json +2 -1
- package/src/boot/Application.d.ts.map +1 -1
- package/src/boot/Application.js +48 -10
- package/src/boot/bootstrap.js +2 -0
- package/src/cli/commands/MigrateCommand.d.ts.map +1 -1
- package/src/cli/commands/MigrateCommand.js +37 -4
- package/src/cli/d1/D1SqlMigrations.d.ts.map +1 -1
- package/src/cli/d1/D1SqlMigrations.js +10 -4
- package/src/cli/scaffolding/ControllerGenerator.js +4 -4
- package/src/cli/scaffolding/GovernanceScaffolder.js +1 -1
- package/src/cli/scaffolding/MigrationGenerator.js +1 -1
- package/src/cli/scaffolding/ModelGenerator.d.ts +1 -1
- package/src/cli/scaffolding/ModelGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/ModelGenerator.js +11 -3
- package/src/cli/scaffolding/RouteGenerator.js +1 -1
- package/src/cli/scaffolding/ServiceScaffolder.js +4 -4
- package/src/config/broadcast.d.ts +14 -28
- package/src/config/broadcast.d.ts.map +1 -1
- package/src/config/broadcast.js +69 -35
- package/src/config/cache.d.ts +13 -45
- package/src/config/cache.d.ts.map +1 -1
- package/src/config/cache.js +69 -25
- package/src/config/database.d.ts +22 -64
- package/src/config/database.d.ts.map +1 -1
- package/src/config/database.js +99 -31
- package/src/config/env.d.ts +6 -0
- package/src/config/env.d.ts.map +1 -1
- package/src/config/env.js +7 -0
- package/src/config/index.d.ts +32 -136
- package/src/config/index.d.ts.map +1 -1
- package/src/config/mail.d.ts +19 -55
- package/src/config/mail.d.ts.map +1 -1
- package/src/config/mail.js +63 -21
- package/src/config/middleware.d.ts +24 -0
- package/src/config/middleware.d.ts.map +1 -1
- package/src/config/middleware.js +72 -52
- package/src/config/notification.d.ts +14 -27
- package/src/config/notification.d.ts.map +1 -1
- package/src/config/notification.js +82 -36
- package/src/config/queue.d.ts +21 -51
- package/src/config/queue.d.ts.map +1 -1
- package/src/config/queue.js +72 -27
- package/src/config/storage.d.ts +27 -34
- package/src/config/storage.d.ts.map +1 -1
- package/src/config/storage.js +97 -56
- package/src/config/type.d.ts +23 -1
- package/src/config/type.d.ts.map +1 -1
- package/src/config/type.js +10 -1
- package/src/http/parsers/MultipartParser.d.ts.map +1 -1
- package/src/http/parsers/MultipartParser.js +69 -42
- package/src/index.d.ts +9 -5
- package/src/index.d.ts.map +1 -1
- package/src/index.js +1 -0
- package/src/microservices/PostgresAdapter.d.ts.map +1 -1
- package/src/microservices/PostgresAdapter.js +0 -1
- package/src/migrations/MigrationLoader.d.ts +1 -1
- package/src/migrations/MigrationLoader.d.ts.map +1 -1
- package/src/migrations/Migrator.d.ts +3 -3
- package/src/migrations/Migrator.d.ts.map +1 -1
- package/src/migrations/Migrator.js +1 -1
- package/src/migrations/MigratorFactory.d.ts +1 -1
- package/src/migrations/MigratorFactory.d.ts.map +1 -1
- package/src/migrations/MigratorFactory.js +21 -5
- package/src/migrations/enum/index.d.ts +93 -0
- package/src/migrations/enum/index.d.ts.map +1 -0
- package/src/migrations/enum/index.js +92 -0
- package/src/migrations/schema/Blueprint.d.ts +1 -1
- package/src/migrations/schema/Blueprint.d.ts.map +1 -1
- package/src/migrations/schema/Blueprint.js +27 -25
- package/src/migrations/schema/Schema.d.ts +1 -1
- package/src/migrations/schema/Schema.d.ts.map +1 -1
- package/src/migrations/schema/Schema.js +4 -3
- package/src/migrations/schema/SchemaCompiler.d.ts +1 -1
- package/src/migrations/schema/SchemaCompiler.d.ts.map +1 -1
- package/src/migrations/schema/SchemaCompiler.js +99 -91
- package/src/migrations/schema/index.d.ts +4 -4
- package/src/migrations/schema/index.d.ts.map +1 -1
- package/src/migrations/schema/index.js +3 -3
- package/src/migrations/schema/types.d.ts +2 -1
- package/src/migrations/schema/types.d.ts.map +1 -1
- package/src/node-singletons/fs.d.ts +1 -1
- package/src/node-singletons/fs.d.ts.map +1 -1
- package/src/node-singletons/fs.js +1 -1
- package/src/orm/ConnectionManager.d.ts +6 -4
- package/src/orm/ConnectionManager.d.ts.map +1 -1
- package/src/orm/ConnectionManager.js +213 -75
- package/src/orm/Database.d.ts +4 -2
- package/src/orm/Database.d.ts.map +1 -1
- package/src/orm/Database.js +110 -67
- package/src/orm/DatabaseAdapter.d.ts +4 -2
- package/src/orm/DatabaseAdapter.d.ts.map +1 -1
- package/src/orm/DatabaseAdapter.js +17 -0
- package/src/orm/DatabaseRuntimeRegistration.d.ts.map +1 -1
- package/src/orm/DatabaseRuntimeRegistration.js +12 -0
- package/src/orm/Model.d.ts.map +1 -1
- package/src/orm/Model.js +24 -2
- package/src/orm/QueryBuilder.d.ts +1 -1
- package/src/orm/QueryBuilder.d.ts.map +1 -1
- package/src/orm/QueryBuilder.js +4 -3
- package/src/orm/adapters/D1Adapter.d.ts.map +1 -1
- package/src/orm/adapters/D1Adapter.js +2 -1
- package/src/orm/adapters/D1RemoteAdapter.d.ts.map +1 -1
- package/src/orm/adapters/D1RemoteAdapter.js +2 -1
- package/src/orm/adapters/MySQLAdapter.d.ts.map +1 -1
- package/src/orm/adapters/MySQLAdapter.js +2 -1
- package/src/orm/adapters/SQLServerAdapter.d.ts.map +1 -1
- package/src/orm/adapters/SQLServerAdapter.js +2 -1
- package/src/orm/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/src/orm/adapters/SQLiteAdapter.js +3 -2
- package/src/orm/migrations/MigrationStore.d.ts.map +1 -1
- package/src/performance/Optimizer.d.ts +6 -6
- package/src/performance/Optimizer.d.ts.map +1 -1
- package/src/performance/Optimizer.js +174 -52
- package/src/profiling/RequestProfiler.d.ts.map +1 -1
- package/src/profiling/RequestProfiler.js +3 -1
- package/src/routing/doc.d.ts +4 -5
- package/src/routing/doc.d.ts.map +1 -1
- package/src/routing/doc.js +35 -20
- package/src/routing/publicRoot.d.ts +9 -0
- package/src/routing/publicRoot.d.ts.map +1 -1
- package/src/routing/publicRoot.js +63 -2
- package/src/runtime/StartupConfigFileRegistry.d.ts +21 -0
- package/src/runtime/StartupConfigFileRegistry.d.ts.map +1 -0
- package/src/runtime/StartupConfigFileRegistry.js +43 -0
- package/src/runtime/useFileLoader.d.ts +26 -0
- package/src/runtime/useFileLoader.d.ts.map +1 -0
- package/src/runtime/useFileLoader.js +188 -0
- package/src/scripts/TemplateSync.js +4 -4
- package/src/security/XssProtection.d.ts.map +1 -1
- package/src/security/XssProtection.js +62 -14
- package/src/templates/project/basic/config/broadcast.ts.tpl +33 -17
- package/src/templates/project/basic/config/cache.ts.tpl +35 -17
- package/src/templates/project/basic/config/database.ts.tpl +68 -32
- package/src/templates/project/basic/config/logging/HttpLogger.ts.tpl +7 -114
- package/src/templates/project/basic/config/mail.ts.tpl +59 -13
- package/src/templates/project/basic/config/notification.ts.tpl +28 -17
- package/src/templates/project/basic/config/queue.ts.tpl +49 -17
- package/src/templates/project/basic/config/storage.ts.tpl +55 -18
- package/src/templates/project/basic/config/type.ts.tpl +0 -1
- package/src/templates/project/basic/src/index.ts.tpl +3 -0
- package/src/templates/project/basic/config/logging/KvLogger.ts.tpl +0 -181
- package/src/templates/project/basic/config/logging/SlackLogger.ts.tpl +0 -156
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/migrations/schema/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/migrations/schema/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import * as fs from 'node:fs';
|
|
7
7
|
export * as fsPromises from 'node:fs/promises';
|
|
8
|
-
export { appendFileSync, copyFileSync, createReadStream, createWriteStream, existsSync, lstatSync, mkdirSync, mkdtempSync,
|
|
8
|
+
export { appendFileSync, copyFileSync, createReadStream, createWriteStream, existsSync, lstatSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, renameSync, rmSync, statSync, unlinkSync, utimesSync, writeFileSync, } from 'node:fs';
|
|
9
9
|
export type { ReadStream, Stats, WriteStream } from 'node:fs';
|
|
10
10
|
export { mkdir, mkdtemp, readFile, realpath, rm, stat, writeFile } from 'node:fs/promises';
|
|
11
11
|
export default fs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../../src/node-singletons/fs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAK9B,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EACL,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,SAAS,EACT,WAAW,EACX,YAAY,EACZ,
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../../src/node-singletons/fs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAK9B,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EACL,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,SAAS,EACT,WAAW,EACX,WAAW,EACX,YAAY,EACZ,UAAU,EACV,MAAM,EACN,QAAQ,EACR,UAAU,EACV,UAAU,EACV,aAAa,GACd,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE9D,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG3F,eAAe,EAAE,CAAC"}
|
|
@@ -8,7 +8,7 @@ import * as fs from 'node:fs';
|
|
|
8
8
|
// Exporting it here keeps imports consistent and makes Vitest mocking of
|
|
9
9
|
// `node:fs/promises` flow through this singleton layer.
|
|
10
10
|
export * as fsPromises from 'node:fs/promises';
|
|
11
|
-
export { appendFileSync, copyFileSync, createReadStream, createWriteStream, existsSync, lstatSync, mkdirSync, mkdtempSync,
|
|
11
|
+
export { appendFileSync, copyFileSync, createReadStream, createWriteStream, existsSync, lstatSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, renameSync, rmSync, statSync, unlinkSync, utimesSync, writeFileSync, } from 'node:fs';
|
|
12
12
|
export { mkdir, mkdtemp, readFile, realpath, rm, stat, writeFile } from 'node:fs/promises';
|
|
13
13
|
// Default export for compatibility
|
|
14
14
|
export default fs;
|
|
@@ -3,8 +3,10 @@
|
|
|
3
3
|
* Handles database connections across different runtime environments
|
|
4
4
|
* Supports: PostgreSQL, MySQL, SQL Server with connection pooling for Lambda
|
|
5
5
|
*/
|
|
6
|
+
import type { SupportedDriver } from '../migrations/enum';
|
|
7
|
+
import type { IDatabaseAdapter } from './DatabaseAdapter';
|
|
6
8
|
export interface ConnectionConfig {
|
|
7
|
-
adapter:
|
|
9
|
+
adapter: SupportedDriver;
|
|
8
10
|
host?: string;
|
|
9
11
|
port?: number;
|
|
10
12
|
database: string;
|
|
@@ -31,7 +33,7 @@ export interface ConnectionPool {
|
|
|
31
33
|
queued: number;
|
|
32
34
|
}
|
|
33
35
|
interface ConnectionManagerInstance {
|
|
34
|
-
getConnection(id?: string): Promise<
|
|
36
|
+
getConnection(id?: string): Promise<IDatabaseAdapter>;
|
|
35
37
|
releaseConnection(connectionId?: string): Promise<void>;
|
|
36
38
|
closeAll(): Promise<void>;
|
|
37
39
|
getPoolStats(): ConnectionPool;
|
|
@@ -58,7 +60,7 @@ export declare const ConnectionManager: Readonly<{
|
|
|
58
60
|
/**
|
|
59
61
|
* Get or create database connection
|
|
60
62
|
*/
|
|
61
|
-
getConnection(id?: string): Promise<
|
|
63
|
+
getConnection(id?: string): Promise<IDatabaseAdapter>;
|
|
62
64
|
/**
|
|
63
65
|
* Release connection back to pool (but keep persistent)
|
|
64
66
|
*/
|
|
@@ -97,7 +99,7 @@ export interface AuroraQueryResult {
|
|
|
97
99
|
/**
|
|
98
100
|
* Get database credentials from AWS Secrets Manager
|
|
99
101
|
*/
|
|
100
|
-
export declare function getDatabaseSecret(
|
|
102
|
+
export declare function getDatabaseSecret(secretName: string): Promise<DatabaseSecret>;
|
|
101
103
|
/**
|
|
102
104
|
* Get database credentials from environment variables
|
|
103
105
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConnectionManager.d.ts","sourceRoot":"","sources":["../../../src/orm/ConnectionManager.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAKH,MAAM,
|
|
1
|
+
{"version":3,"file":"ConnectionManager.d.ts","sourceRoot":"","sources":["../../../src/orm/ConnectionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,41 +8,36 @@
|
|
|
8
8
|
import { Env } from '../config/env.js';
|
|
9
9
|
import { Logger } from '../config/logger.js';
|
|
10
10
|
import { ErrorFactory } from '../exceptions/ZintrustError.js';
|
|
11
|
+
import { D1Adapter } from './adapters/D1Adapter.js';
|
|
12
|
+
import { D1RemoteAdapter } from './adapters/D1RemoteAdapter.js';
|
|
13
|
+
import { MySQLAdapter } from './adapters/MySQLAdapter.js';
|
|
14
|
+
import { PostgreSQLAdapter } from './adapters/PostgreSQLAdapter.js';
|
|
15
|
+
import { SQLiteAdapter } from './adapters/SQLiteAdapter.js';
|
|
16
|
+
import { SQLServerAdapter } from './adapters/SQLServerAdapter.js';
|
|
17
|
+
import { DatabaseAdapterRegistry } from './DatabaseAdapterRegistry.js';
|
|
11
18
|
let instance;
|
|
12
19
|
/**
|
|
13
20
|
* Close a specific connection
|
|
14
21
|
*/
|
|
15
22
|
const closeConnection = async (conn) => {
|
|
16
|
-
if (conn
|
|
17
|
-
conn
|
|
18
|
-
typeof conn === 'object' &&
|
|
19
|
-
'close' in conn &&
|
|
20
|
-
typeof conn.close === 'function') {
|
|
21
|
-
await conn.close();
|
|
23
|
+
if (isDatabaseAdapter(conn)) {
|
|
24
|
+
await conn.disconnect();
|
|
22
25
|
}
|
|
23
26
|
};
|
|
24
27
|
/**
|
|
25
28
|
* Test if connection is still alive
|
|
26
29
|
*/
|
|
27
|
-
const testConnection = async (
|
|
30
|
+
const testConnection = async (_config, conn) => {
|
|
31
|
+
if (!isDatabaseAdapter(conn))
|
|
32
|
+
return false;
|
|
33
|
+
if (!conn.isConnected())
|
|
34
|
+
return false;
|
|
28
35
|
try {
|
|
29
|
-
|
|
30
|
-
// SELECT 1 for PostgreSQL/MySQL
|
|
31
|
-
await new Promise((resolve, reject) => {
|
|
32
|
-
const timeout = globalThis.setTimeout(() => reject(ErrorFactory.createConnectionError('Connection test timeout')), 5000);
|
|
33
|
-
try {
|
|
34
|
-
// In real implementation, query the connection
|
|
35
|
-
resolve(true);
|
|
36
|
-
}
|
|
37
|
-
finally {
|
|
38
|
-
clearTimeout(timeout);
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
}
|
|
36
|
+
await conn.ping();
|
|
42
37
|
return true;
|
|
43
38
|
}
|
|
44
39
|
catch (error) {
|
|
45
|
-
|
|
40
|
+
Logger.warn('Connection health check failed', error);
|
|
46
41
|
return false;
|
|
47
42
|
}
|
|
48
43
|
};
|
|
@@ -57,38 +52,134 @@ const updateConnectionUsage = (connectionPool, id) => {
|
|
|
57
52
|
entry.isActive = true;
|
|
58
53
|
}
|
|
59
54
|
};
|
|
55
|
+
const isDatabaseAdapter = (value) => {
|
|
56
|
+
if (typeof value !== 'object' || value === null)
|
|
57
|
+
return false;
|
|
58
|
+
const candidate = value;
|
|
59
|
+
return (typeof candidate.connect === 'function' &&
|
|
60
|
+
typeof candidate.disconnect === 'function' &&
|
|
61
|
+
typeof candidate.ping === 'function' &&
|
|
62
|
+
typeof candidate.isConnected === 'function');
|
|
63
|
+
};
|
|
64
|
+
const createAdapterFromConfig = (config) => {
|
|
65
|
+
if (config.adapter === 'aurora-data-api') {
|
|
66
|
+
throw ErrorFactory.createConfigError('Aurora Data API connections should be created via getAuroraDataApiConnection()');
|
|
67
|
+
}
|
|
68
|
+
const driver = config.adapter;
|
|
69
|
+
const adapterConfig = {
|
|
70
|
+
driver,
|
|
71
|
+
database: config.database,
|
|
72
|
+
host: config.host,
|
|
73
|
+
port: config.port,
|
|
74
|
+
username: config.username,
|
|
75
|
+
password: config.password,
|
|
76
|
+
};
|
|
77
|
+
const registered = DatabaseAdapterRegistry.get(driver);
|
|
78
|
+
if (registered !== undefined) {
|
|
79
|
+
return registered(adapterConfig);
|
|
80
|
+
}
|
|
81
|
+
switch (driver) {
|
|
82
|
+
case 'postgresql':
|
|
83
|
+
return PostgreSQLAdapter.create(adapterConfig);
|
|
84
|
+
case 'mysql':
|
|
85
|
+
return MySQLAdapter.create(adapterConfig);
|
|
86
|
+
case 'sqlserver':
|
|
87
|
+
return SQLServerAdapter.create(adapterConfig);
|
|
88
|
+
case 'd1':
|
|
89
|
+
return D1Adapter.create(adapterConfig);
|
|
90
|
+
case 'd1-remote':
|
|
91
|
+
return D1RemoteAdapter.create(adapterConfig);
|
|
92
|
+
case 'sqlite':
|
|
93
|
+
default:
|
|
94
|
+
return SQLiteAdapter.create(adapterConfig);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
60
97
|
/**
|
|
61
98
|
* Create new database connection
|
|
62
99
|
*/
|
|
63
100
|
const createConnection = async (config, id) => {
|
|
64
101
|
Logger.info(`Creating ${config.adapter} connection (${id}) to ${config.host}:${config.port}`);
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
throw ErrorFactory.createDatabaseError(`Query execution not implemented for ${config.adapter}`);
|
|
72
|
-
},
|
|
73
|
-
close: async () => {
|
|
74
|
-
Logger.info(`Connection ${id} closed`);
|
|
75
|
-
},
|
|
76
|
-
};
|
|
102
|
+
if (config.adapter === 'aurora-data-api') {
|
|
103
|
+
throw ErrorFactory.createConfigError('Aurora Data API connections should be created via getAuroraDataApiConnection()');
|
|
104
|
+
}
|
|
105
|
+
const adapter = createAdapterFromConfig(config);
|
|
106
|
+
await adapter.connect();
|
|
107
|
+
return adapter;
|
|
77
108
|
};
|
|
78
109
|
/**
|
|
79
110
|
* Create Aurora Data API connection
|
|
80
111
|
*/
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
})
|
|
112
|
+
function isMissingEsmPackage(error, packageName) {
|
|
113
|
+
if (typeof error !== 'object' || error === null)
|
|
114
|
+
return false;
|
|
115
|
+
const maybe = error;
|
|
116
|
+
const code = typeof maybe.code === 'string' ? maybe.code : '';
|
|
117
|
+
const message = typeof maybe.message === 'string' ? maybe.message : '';
|
|
118
|
+
if (code === 'ERR_MODULE_NOT_FOUND' && message.length === 0)
|
|
119
|
+
return true;
|
|
120
|
+
if (code === 'ERR_MODULE_NOT_FOUND' && message.includes(`'${packageName}'`))
|
|
121
|
+
return true;
|
|
122
|
+
if (message.includes(`Cannot find package '${packageName}'`))
|
|
123
|
+
return true;
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
async function importOptionalModule(modulePath) {
|
|
127
|
+
return import(modulePath);
|
|
128
|
+
}
|
|
129
|
+
const loadClientRdsDataModule = async () => {
|
|
130
|
+
try {
|
|
131
|
+
return (await importOptionalModule('@zintrust/client-rds-data'));
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
if (isMissingEsmPackage(error, '@zintrust/client-rds-data')) {
|
|
135
|
+
throw ErrorFactory.createConfigError("Aurora Data API requires '@zintrust/client-rds-data' (install the package to enable AWS Data API support).");
|
|
136
|
+
}
|
|
137
|
+
throw ErrorFactory.createTryCatchError('Failed to load @zintrust/client-rds-data', {
|
|
138
|
+
cause: error,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
const createAuroraDataApiConnection = () => {
|
|
143
|
+
const getClient = async () => {
|
|
144
|
+
const mod = await loadClientRdsDataModule();
|
|
145
|
+
return mod.getRdsDataClient(Env.AWS_REGION);
|
|
146
|
+
};
|
|
147
|
+
const resourceArn = Env.get('AURORA_RESOURCE_ARN');
|
|
148
|
+
const secretArn = Env.get('AURORA_SECRET_ARN');
|
|
149
|
+
const database = Env.get('AURORA_DATABASE', Env.DB_DATABASE);
|
|
150
|
+
const assertConfig = () => {
|
|
151
|
+
if (resourceArn.length === 0 || secretArn.length === 0) {
|
|
152
|
+
throw ErrorFactory.createConfigError('Aurora Data API requires AURORA_RESOURCE_ARN and AURORA_SECRET_ARN env vars');
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
const executeStatement = async (sql, params) => {
|
|
156
|
+
assertConfig();
|
|
157
|
+
const client = await getClient();
|
|
158
|
+
const input = {
|
|
159
|
+
resourceArn,
|
|
160
|
+
secretArn,
|
|
161
|
+
database,
|
|
162
|
+
sql,
|
|
163
|
+
parameters: (params ?? []).map((value) => ({ value: { stringValue: String(value) } })),
|
|
164
|
+
};
|
|
165
|
+
const response = (await client.executeStatement(input));
|
|
166
|
+
return {
|
|
167
|
+
numberOfRecordsUpdated: response.numberOfRecordsUpdated ?? 0,
|
|
168
|
+
records: response.records ?? [],
|
|
169
|
+
};
|
|
170
|
+
};
|
|
171
|
+
return {
|
|
172
|
+
execute: executeStatement,
|
|
173
|
+
batch: async (statements) => {
|
|
174
|
+
const results = [];
|
|
175
|
+
for (const statement of statements) {
|
|
176
|
+
const result = await executeStatement(statement.sql, statement.params);
|
|
177
|
+
results.push(result);
|
|
178
|
+
}
|
|
179
|
+
return results;
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
};
|
|
92
183
|
/**
|
|
93
184
|
* Get healthy existing connection if available
|
|
94
185
|
*/
|
|
@@ -113,48 +204,43 @@ const findIdleConnection = (state) => {
|
|
|
113
204
|
return null;
|
|
114
205
|
const lru = idleConnections.reduce((prev, current) => (prev.lastUsedAt < current.lastUsedAt ? prev : current), idleConnections[0]);
|
|
115
206
|
updateConnectionUsage(state.connectionPool, lru.id);
|
|
116
|
-
|
|
207
|
+
const conn = state.connections.get(lru.id);
|
|
208
|
+
return conn ?? null;
|
|
117
209
|
};
|
|
118
210
|
/**
|
|
119
211
|
* Wait for a connection to become available
|
|
120
212
|
*/
|
|
121
213
|
const waitForIdleConnection = async (state) => {
|
|
122
214
|
return new Promise((resolve, reject) => {
|
|
123
|
-
let settled = false;
|
|
124
215
|
let timeoutId;
|
|
125
|
-
const checkInterval = setInterval(() => {
|
|
126
|
-
const idle = state.connectionPool.find((c) => !c.isActive);
|
|
127
|
-
if (idle !== undefined) {
|
|
128
|
-
if (settled)
|
|
129
|
-
return;
|
|
130
|
-
settled = true;
|
|
131
|
-
cleanup();
|
|
132
|
-
updateConnectionUsage(state.connectionPool, idle.id);
|
|
133
|
-
resolve(state.connections.get(idle.id));
|
|
134
|
-
}
|
|
135
|
-
}, 100);
|
|
136
216
|
const cleanup = () => {
|
|
137
|
-
clearInterval(checkInterval);
|
|
138
217
|
if (timeoutId !== undefined) {
|
|
139
|
-
clearTimeout(timeoutId);
|
|
218
|
+
globalThis.clearTimeout(timeoutId);
|
|
140
219
|
timeoutId = undefined;
|
|
141
220
|
}
|
|
142
221
|
};
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
222
|
+
const waiter = {
|
|
223
|
+
resolve: (conn) => {
|
|
224
|
+
cleanup();
|
|
225
|
+
resolve(conn);
|
|
226
|
+
},
|
|
227
|
+
reject: (err) => {
|
|
228
|
+
cleanup();
|
|
229
|
+
reject(err);
|
|
230
|
+
},
|
|
231
|
+
timeoutId,
|
|
232
|
+
cleanup,
|
|
233
|
+
};
|
|
234
|
+
timeoutId = globalThis.setTimeout(() => {
|
|
235
|
+
state.waiters = state.waiters.filter((entry) => entry !== waiter);
|
|
152
236
|
cleanup();
|
|
153
237
|
reject(ErrorFactory.createConnectionError('Connection pool exhausted - timeout waiting for available connection'));
|
|
154
238
|
}, 30000);
|
|
239
|
+
waiter.timeoutId = timeoutId;
|
|
155
240
|
if (isUnrefableTimer(timeoutId)) {
|
|
156
241
|
timeoutId.unref();
|
|
157
242
|
}
|
|
243
|
+
state.waiters.push(waiter);
|
|
158
244
|
});
|
|
159
245
|
};
|
|
160
246
|
function isUnrefableTimer(value) {
|
|
@@ -194,6 +280,9 @@ const startIdleConnectionCleanup = (state, idleTimeout) => {
|
|
|
194
280
|
Logger.info(`Removed idle connection: ${id}`);
|
|
195
281
|
}
|
|
196
282
|
}, 300000); // Every 5 minutes
|
|
283
|
+
if (isUnrefableTimer(state.cleanupInterval)) {
|
|
284
|
+
state.cleanupInterval.unref();
|
|
285
|
+
}
|
|
197
286
|
};
|
|
198
287
|
/**
|
|
199
288
|
* Create and register a new connection
|
|
@@ -219,6 +308,15 @@ const closeAllConnections = async (state) => {
|
|
|
219
308
|
clearInterval(state.cleanupInterval);
|
|
220
309
|
state.cleanupInterval = undefined;
|
|
221
310
|
}
|
|
311
|
+
if (state.waiters.length > 0) {
|
|
312
|
+
const err = ErrorFactory.createConnectionError('Connection manager shutting down');
|
|
313
|
+
for (const waiter of state.waiters) {
|
|
314
|
+
if (waiter.timeoutId !== undefined)
|
|
315
|
+
clearTimeout(waiter.timeoutId);
|
|
316
|
+
waiter.reject(err);
|
|
317
|
+
}
|
|
318
|
+
state.waiters = [];
|
|
319
|
+
}
|
|
222
320
|
for (const [id, conn] of state.connections.entries()) {
|
|
223
321
|
try {
|
|
224
322
|
await closeConnection(conn);
|
|
@@ -240,7 +338,7 @@ const getPoolStatistics = (state) => {
|
|
|
240
338
|
total: state.connectionPool.length,
|
|
241
339
|
active,
|
|
242
340
|
idle,
|
|
243
|
-
queued:
|
|
341
|
+
queued: state.waiters.length,
|
|
244
342
|
};
|
|
245
343
|
};
|
|
246
344
|
/**
|
|
@@ -255,6 +353,7 @@ const ConnectionManagerImpl = {
|
|
|
255
353
|
const state = {
|
|
256
354
|
connections: new Map(),
|
|
257
355
|
connectionPool: [],
|
|
356
|
+
waiters: [],
|
|
258
357
|
};
|
|
259
358
|
const maxConnections = config.maxConnections ?? 10;
|
|
260
359
|
const idleTimeout = config.idleTimeout ?? 900000; // 15 minutes
|
|
@@ -278,10 +377,23 @@ const ConnectionManagerImpl = {
|
|
|
278
377
|
*/
|
|
279
378
|
async releaseConnection(connectionId = 'default') {
|
|
280
379
|
const poolEntry = state.connectionPool.find((c) => c.id === connectionId);
|
|
281
|
-
if (poolEntry
|
|
282
|
-
|
|
283
|
-
|
|
380
|
+
if (poolEntry === undefined)
|
|
381
|
+
return;
|
|
382
|
+
poolEntry.isActive = false;
|
|
383
|
+
poolEntry.lastUsedAt = Date.now();
|
|
384
|
+
if (state.waiters.length === 0)
|
|
385
|
+
return;
|
|
386
|
+
const waiter = state.waiters.shift();
|
|
387
|
+
if (waiter === undefined)
|
|
388
|
+
return;
|
|
389
|
+
waiter.cleanup();
|
|
390
|
+
const conn = state.connections.get(connectionId);
|
|
391
|
+
if (conn === undefined) {
|
|
392
|
+
waiter.reject(ErrorFactory.createConnectionError('Released connection not found'));
|
|
393
|
+
return;
|
|
284
394
|
}
|
|
395
|
+
updateConnectionUsage(state.connectionPool, connectionId);
|
|
396
|
+
waiter.resolve(conn);
|
|
285
397
|
},
|
|
286
398
|
/**
|
|
287
399
|
* Close all connections (graceful shutdown)
|
|
@@ -341,6 +453,7 @@ export const ConnectionManager = Object.freeze({
|
|
|
341
453
|
if (instance !== undefined) {
|
|
342
454
|
try {
|
|
343
455
|
await instance.closeAll();
|
|
456
|
+
instance = undefined;
|
|
344
457
|
}
|
|
345
458
|
catch (err) {
|
|
346
459
|
Logger.error('Error while shutting down ConnectionManager:', err);
|
|
@@ -387,9 +500,34 @@ export const ConnectionManager = Object.freeze({
|
|
|
387
500
|
/**
|
|
388
501
|
* Get database credentials from AWS Secrets Manager
|
|
389
502
|
*/
|
|
390
|
-
export async function getDatabaseSecret(
|
|
391
|
-
|
|
392
|
-
|
|
503
|
+
export async function getDatabaseSecret(secretName) {
|
|
504
|
+
try {
|
|
505
|
+
const mod = await loadClientRdsDataModule();
|
|
506
|
+
const client = await mod.getSecretsManagerClient(Env.AWS_REGION);
|
|
507
|
+
const response = await client.getSecretValue(secretName);
|
|
508
|
+
const secretString = response.SecretString;
|
|
509
|
+
if (secretString === undefined || secretString === null || secretString.trim().length === 0) {
|
|
510
|
+
throw ErrorFactory.createConfigError('Secrets Manager returned an empty secret');
|
|
511
|
+
}
|
|
512
|
+
const parsed = JSON.parse(secretString);
|
|
513
|
+
if (parsed.username === undefined ||
|
|
514
|
+
parsed.password === undefined ||
|
|
515
|
+
parsed.host === undefined ||
|
|
516
|
+
parsed.port === undefined ||
|
|
517
|
+
parsed.database === undefined) {
|
|
518
|
+
throw ErrorFactory.createConfigError('Secrets Manager secret is missing required fields');
|
|
519
|
+
}
|
|
520
|
+
return {
|
|
521
|
+
username: parsed.username,
|
|
522
|
+
password: parsed.password,
|
|
523
|
+
host: parsed.host,
|
|
524
|
+
port: Number(parsed.port),
|
|
525
|
+
database: parsed.database,
|
|
526
|
+
};
|
|
527
|
+
}
|
|
528
|
+
catch (error) {
|
|
529
|
+
throw ErrorFactory.createTryCatchError('Failed to fetch database secret', { cause: error });
|
|
530
|
+
}
|
|
393
531
|
}
|
|
394
532
|
/**
|
|
395
533
|
* Get database credentials from environment variables
|
package/src/orm/Database.d.ts
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* Database Manager
|
|
3
3
|
* Central database connection management and query execution
|
|
4
4
|
*/
|
|
5
|
-
import type {
|
|
5
|
+
import type { SupportedDriver } from '../migrations/enum';
|
|
6
|
+
import type { DatabaseConfig, IDatabaseAdapter, QueryResult } from './DatabaseAdapter';
|
|
6
7
|
import type { IQueryBuilder } from './QueryBuilder';
|
|
7
8
|
export interface IDatabase {
|
|
8
9
|
connect(): Promise<void>;
|
|
@@ -10,6 +11,7 @@ export interface IDatabase {
|
|
|
10
11
|
isConnected(): boolean;
|
|
11
12
|
query(sql: string, parameters?: unknown[], isRead?: boolean): Promise<unknown[]>;
|
|
12
13
|
queryOne(sql: string, parameters?: unknown[], isRead?: boolean): Promise<unknown>;
|
|
14
|
+
execute(sql: string, parameters?: unknown[], isRead?: boolean): Promise<QueryResult>;
|
|
13
15
|
transaction<T>(callback: (db: IDatabase) => Promise<T>): Promise<T>;
|
|
14
16
|
table(name: string): IQueryBuilder;
|
|
15
17
|
onBeforeQuery(handler: (query: string, params: unknown[]) => void): void;
|
|
@@ -17,7 +19,7 @@ export interface IDatabase {
|
|
|
17
19
|
offBeforeQuery(handler: (query: string, params: unknown[]) => void): void;
|
|
18
20
|
offAfterQuery(handler: (query: string, params: unknown[], duration: number) => void): void;
|
|
19
21
|
getAdapterInstance(isRead?: boolean): IDatabaseAdapter;
|
|
20
|
-
getType():
|
|
22
|
+
getType(): SupportedDriver;
|
|
21
23
|
getConfig(): DatabaseConfig;
|
|
22
24
|
dispose(): void;
|
|
23
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Database.d.ts","sourceRoot":"","sources":["../../../src/orm/Database.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"Database.d.ts","sourceRoot":"","sources":["../../../src/orm/Database.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAQxD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE1F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,MAAM,WAAW,SAAS;IACxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,WAAW,IAAI,OAAO,CAAC;IACvB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACjF,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACrF,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC;IACnC,aAAa,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACzE,YAAY,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1F,cAAc,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1E,aAAa,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3F,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;IACvD,OAAO,IAAI,eAAe,CAAC;IAC3B,SAAS,IAAI,cAAc,CAAC;IAC5B,OAAO,IAAI,IAAI,CAAC;CACjB;AA0YD,eAAO,MAAM,QAAQ;IACnB;;OAEG;oBACa,cAAc,GAAG,SAAS;EAI1C,CAAC;AAIH,eAAO,MAAM,oBAAoB,GAC/B,kBAAkB,EAClB,uBAA0B,KACzB,OAAO,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAMxC,CAAC;AAEF,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,UAAU,SAAY,GAAG,SAAS,CAgBtF;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAWnD"}
|