@iflow-mcp/xexr_mcp-libsql 1.1.0
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 +509 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +327 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/base-tool.d.ts +29 -0
- package/dist/lib/base-tool.d.ts.map +1 -0
- package/dist/lib/base-tool.js +175 -0
- package/dist/lib/base-tool.js.map +1 -0
- package/dist/lib/constants.d.ts +26 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +47 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/database.d.ts +39 -0
- package/dist/lib/database.d.ts.map +1 -0
- package/dist/lib/database.js +284 -0
- package/dist/lib/database.js.map +1 -0
- package/dist/lib/logger.d.ts +23 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +124 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/server-manager.d.ts +31 -0
- package/dist/lib/server-manager.d.ts.map +1 -0
- package/dist/lib/server-manager.js +283 -0
- package/dist/lib/server-manager.js.map +1 -0
- package/dist/schemas/alter-table.d.ts +23 -0
- package/dist/schemas/alter-table.d.ts.map +1 -0
- package/dist/schemas/alter-table.js +85 -0
- package/dist/schemas/alter-table.js.map +1 -0
- package/dist/schemas/create-table.d.ts +23 -0
- package/dist/schemas/create-table.d.ts.map +1 -0
- package/dist/schemas/create-table.js +81 -0
- package/dist/schemas/create-table.js.map +1 -0
- package/dist/schemas/describe-table.d.ts +26 -0
- package/dist/schemas/describe-table.d.ts.map +1 -0
- package/dist/schemas/describe-table.js +47 -0
- package/dist/schemas/describe-table.js.map +1 -0
- package/dist/schemas/list-tables.d.ts +29 -0
- package/dist/schemas/list-tables.d.ts.map +1 -0
- package/dist/schemas/list-tables.js +37 -0
- package/dist/schemas/list-tables.js.map +1 -0
- package/dist/schemas/read-query.d.ts +17 -0
- package/dist/schemas/read-query.d.ts.map +1 -0
- package/dist/schemas/read-query.js +66 -0
- package/dist/schemas/read-query.js.map +1 -0
- package/dist/schemas/write-query.d.ts +20 -0
- package/dist/schemas/write-query.d.ts.map +1 -0
- package/dist/schemas/write-query.js +58 -0
- package/dist/schemas/write-query.js.map +1 -0
- package/dist/tools/alter-table.d.ts +31 -0
- package/dist/tools/alter-table.d.ts.map +1 -0
- package/dist/tools/alter-table.js +139 -0
- package/dist/tools/alter-table.js.map +1 -0
- package/dist/tools/create-table.d.ts +31 -0
- package/dist/tools/create-table.d.ts.map +1 -0
- package/dist/tools/create-table.js +121 -0
- package/dist/tools/create-table.js.map +1 -0
- package/dist/tools/describe-table.d.ts +30 -0
- package/dist/tools/describe-table.d.ts.map +1 -0
- package/dist/tools/describe-table.js +165 -0
- package/dist/tools/describe-table.js.map +1 -0
- package/dist/tools/list-tables.d.ts +32 -0
- package/dist/tools/list-tables.d.ts.map +1 -0
- package/dist/tools/list-tables.js +210 -0
- package/dist/tools/list-tables.js.map +1 -0
- package/dist/tools/read-query.d.ts +17 -0
- package/dist/tools/read-query.d.ts.map +1 -0
- package/dist/tools/read-query.js +112 -0
- package/dist/tools/read-query.js.map +1 -0
- package/dist/tools/write-query.d.ts +20 -0
- package/dist/tools/write-query.d.ts.map +1 -0
- package/dist/tools/write-query.js +63 -0
- package/dist/tools/write-query.js.map +1 -0
- package/dist/types/index.d.ts +50 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/error-handler.d.ts +22 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +85 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/performance.d.ts +16 -0
- package/dist/utils/performance.d.ts.map +1 -0
- package/dist/utils/performance.js +40 -0
- package/dist/utils/performance.js.map +1 -0
- package/package.json +1 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type ResultSet } from '@libsql/client';
|
|
2
|
+
import type { DatabaseConfig, DatabaseConnection, ConnectionPool } from '../types/index.js';
|
|
3
|
+
declare class LibSQLConnection implements DatabaseConnection {
|
|
4
|
+
private config;
|
|
5
|
+
private client;
|
|
6
|
+
private isConnected;
|
|
7
|
+
constructor(config: DatabaseConfig);
|
|
8
|
+
connect(): Promise<void>;
|
|
9
|
+
execute(query: string, params?: any): Promise<ResultSet>;
|
|
10
|
+
transaction<T>(fn: (tx: any) => Promise<T>): Promise<T>;
|
|
11
|
+
close(): Promise<void>;
|
|
12
|
+
isHealthy(): Promise<boolean>;
|
|
13
|
+
}
|
|
14
|
+
declare class LibSQLConnectionPool implements ConnectionPool {
|
|
15
|
+
private connections;
|
|
16
|
+
private availableConnections;
|
|
17
|
+
private config;
|
|
18
|
+
private isShuttingDown;
|
|
19
|
+
constructor(config: DatabaseConfig);
|
|
20
|
+
initialize(): Promise<void>;
|
|
21
|
+
private createConnection;
|
|
22
|
+
private retryWithBackoff;
|
|
23
|
+
getConnection(): Promise<DatabaseConnection>;
|
|
24
|
+
private waitForConnection;
|
|
25
|
+
releaseConnection(connection: DatabaseConnection): void;
|
|
26
|
+
private removeConnection;
|
|
27
|
+
healthCheck(): Promise<boolean>;
|
|
28
|
+
close(): Promise<void>;
|
|
29
|
+
getStatus(): {
|
|
30
|
+
totalConnections: number;
|
|
31
|
+
availableConnections: number;
|
|
32
|
+
isShuttingDown: boolean;
|
|
33
|
+
minConnections: number;
|
|
34
|
+
maxConnections: number;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export { LibSQLConnection, LibSQLConnectionPool };
|
|
38
|
+
export type { DatabaseConnection, ConnectionPool };
|
|
39
|
+
//# sourceMappingURL=database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/lib/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAI5F,cAAM,gBAAiB,YAAW,kBAAkB;IAItC,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAkB;gBAEjB,MAAM,EAAE,cAAc;IAOpC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAuCxB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC;IAwCxD,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAoCvD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;CAQpC;AAED,cAAM,oBAAqB,YAAW,cAAc;IAClD,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,oBAAoB,CAA0B;IACtD,OAAO,CAAC,MAAM,CAAkF;IAChG,OAAO,CAAC,cAAc,CAAkB;gBAE5B,MAAM,EAAE,cAAc;IAO5B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAgBnB,gBAAgB;YAgBhB,gBAAgB;IA4BxB,aAAa,IAAI,OAAO,CAAC,kBAAkB,CAAC;YA6BpC,iBAAiB;IAoB/B,iBAAiB,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI;YAUzC,gBAAgB;IAoBxB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAW/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAc5B,SAAS,IAAI;QACX,gBAAgB,EAAE,MAAM,CAAC;QACzB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,cAAc,EAAE,OAAO,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;KACxB;CASF;AAED,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,CAAC;AAClD,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { createClient } from '@libsql/client';
|
|
2
|
+
import { DEFAULT_CONFIG } from './constants.js';
|
|
3
|
+
import { logger } from './logger.js';
|
|
4
|
+
class LibSQLConnection {
|
|
5
|
+
config;
|
|
6
|
+
client;
|
|
7
|
+
isConnected = false;
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
this.client = createClient({
|
|
11
|
+
url: config.url,
|
|
12
|
+
...(config.authToken && { authToken: config.authToken })
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
async connect() {
|
|
16
|
+
try {
|
|
17
|
+
// Test connection with a simple query
|
|
18
|
+
await this.client.execute('SELECT 1');
|
|
19
|
+
this.isConnected = true;
|
|
20
|
+
logger.info('Database connection established', {
|
|
21
|
+
url: this.config.url,
|
|
22
|
+
authTokenProvided: !!this.config.authToken
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
this.isConnected = false;
|
|
27
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
28
|
+
// Provide more helpful error messages for auth-related issues
|
|
29
|
+
if (this.config.authToken && errorMessage.toLowerCase().includes('auth')) {
|
|
30
|
+
logger.error('Database connection failed - authentication error', {
|
|
31
|
+
url: this.config.url,
|
|
32
|
+
authTokenProvided: !!this.config.authToken,
|
|
33
|
+
hint: 'Please verify your auth token is correct and has the necessary permissions'
|
|
34
|
+
}, error);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
logger.error('Failed to establish database connection', {
|
|
38
|
+
url: this.config.url,
|
|
39
|
+
authTokenProvided: !!this.config.authToken
|
|
40
|
+
}, error);
|
|
41
|
+
}
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
46
|
+
async execute(query, params) {
|
|
47
|
+
if (!this.isConnected) {
|
|
48
|
+
throw new Error('Database connection not established');
|
|
49
|
+
}
|
|
50
|
+
const startTime = Date.now();
|
|
51
|
+
try {
|
|
52
|
+
logger.debug('Executing query', { query, params });
|
|
53
|
+
const result = params && Array.isArray(params) && params.length > 0
|
|
54
|
+
? await this.client.execute({ sql: query, args: params })
|
|
55
|
+
: await this.client.execute(query);
|
|
56
|
+
const executionTime = Date.now() - startTime;
|
|
57
|
+
logger.debug('Query executed successfully', {
|
|
58
|
+
query,
|
|
59
|
+
executionTime,
|
|
60
|
+
rowsAffected: result.rowsAffected,
|
|
61
|
+
rowsReturned: result.rows.length
|
|
62
|
+
});
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
const executionTime = Date.now() - startTime;
|
|
67
|
+
logger.error('Query execution failed', {
|
|
68
|
+
query,
|
|
69
|
+
params,
|
|
70
|
+
executionTime
|
|
71
|
+
}, error);
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
76
|
+
async transaction(fn) {
|
|
77
|
+
if (!this.isConnected) {
|
|
78
|
+
throw new Error('Database connection not established');
|
|
79
|
+
}
|
|
80
|
+
const startTime = Date.now();
|
|
81
|
+
let tx;
|
|
82
|
+
try {
|
|
83
|
+
logger.debug('Starting transaction');
|
|
84
|
+
tx = await this.client.transaction('write');
|
|
85
|
+
const result = await fn(tx);
|
|
86
|
+
await tx.commit();
|
|
87
|
+
const executionTime = Date.now() - startTime;
|
|
88
|
+
logger.debug('Transaction committed successfully', { executionTime });
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
const executionTime = Date.now() - startTime;
|
|
93
|
+
if (tx) {
|
|
94
|
+
try {
|
|
95
|
+
await tx.rollback();
|
|
96
|
+
logger.debug('Transaction rolled back due to error', { executionTime });
|
|
97
|
+
}
|
|
98
|
+
catch (rollbackError) {
|
|
99
|
+
logger.error('Failed to rollback transaction', {}, rollbackError);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
logger.error('Transaction failed and rolled back', { executionTime }, error);
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async close() {
|
|
107
|
+
try {
|
|
108
|
+
this.client.close();
|
|
109
|
+
this.isConnected = false;
|
|
110
|
+
logger.info('Database connection closed');
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
logger.error('Error closing database connection', {}, error);
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async isHealthy() {
|
|
118
|
+
try {
|
|
119
|
+
await this.client.execute('SELECT 1');
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
class LibSQLConnectionPool {
|
|
128
|
+
connections = [];
|
|
129
|
+
availableConnections = [];
|
|
130
|
+
config;
|
|
131
|
+
isShuttingDown = false;
|
|
132
|
+
constructor(config) {
|
|
133
|
+
this.config = {
|
|
134
|
+
...DEFAULT_CONFIG,
|
|
135
|
+
...config
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
async initialize() {
|
|
139
|
+
logger.info('Initializing connection pool', {
|
|
140
|
+
minConnections: this.config.minConnections,
|
|
141
|
+
maxConnections: this.config.maxConnections
|
|
142
|
+
});
|
|
143
|
+
// Create minimum connections
|
|
144
|
+
for (let i = 0; i < this.config.minConnections; i++) {
|
|
145
|
+
await this.createConnection();
|
|
146
|
+
}
|
|
147
|
+
logger.info('Connection pool initialized', {
|
|
148
|
+
activeConnections: this.connections.length
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
async createConnection() {
|
|
152
|
+
if (this.connections.length >= this.config.maxConnections) {
|
|
153
|
+
throw new Error('Maximum connection limit reached');
|
|
154
|
+
}
|
|
155
|
+
const connection = new LibSQLConnection(this.config);
|
|
156
|
+
await this.retryWithBackoff(async () => {
|
|
157
|
+
await connection.connect();
|
|
158
|
+
});
|
|
159
|
+
this.connections.push(connection);
|
|
160
|
+
this.availableConnections.push(connection);
|
|
161
|
+
return connection;
|
|
162
|
+
}
|
|
163
|
+
async retryWithBackoff(operation, maxRetries = 3) {
|
|
164
|
+
let lastError;
|
|
165
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
166
|
+
try {
|
|
167
|
+
await operation();
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
lastError = error;
|
|
172
|
+
if (attempt === maxRetries) {
|
|
173
|
+
throw lastError;
|
|
174
|
+
}
|
|
175
|
+
const delay = this.config.retryInterval * attempt;
|
|
176
|
+
logger.warn(`Connection attempt ${attempt} failed, retrying in ${delay}ms`, {
|
|
177
|
+
attempt,
|
|
178
|
+
maxRetries,
|
|
179
|
+
error: lastError.message
|
|
180
|
+
});
|
|
181
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
throw lastError || new Error('Unknown error occurred during retry');
|
|
185
|
+
}
|
|
186
|
+
async getConnection() {
|
|
187
|
+
if (this.isShuttingDown) {
|
|
188
|
+
throw new Error('Connection pool is shutting down');
|
|
189
|
+
}
|
|
190
|
+
// Try to get an available connection
|
|
191
|
+
let connection = this.availableConnections.pop();
|
|
192
|
+
// If no available connections and we haven't reached max, create a new one
|
|
193
|
+
if (!connection && this.connections.length < this.config.maxConnections) {
|
|
194
|
+
connection = await this.createConnection();
|
|
195
|
+
this.availableConnections.pop(); // Remove it from available since we're using it
|
|
196
|
+
}
|
|
197
|
+
// If still no connection, wait for one to become available
|
|
198
|
+
if (!connection) {
|
|
199
|
+
connection = await this.waitForConnection();
|
|
200
|
+
}
|
|
201
|
+
// Verify connection health
|
|
202
|
+
if (!(await connection.isHealthy())) {
|
|
203
|
+
logger.warn('Unhealthy connection detected, creating new one');
|
|
204
|
+
await this.removeConnection(connection);
|
|
205
|
+
return this.getConnection(); // Recursive call to get a healthy connection
|
|
206
|
+
}
|
|
207
|
+
return connection;
|
|
208
|
+
}
|
|
209
|
+
async waitForConnection() {
|
|
210
|
+
return new Promise((resolve, reject) => {
|
|
211
|
+
const timeout = setTimeout(() => {
|
|
212
|
+
reject(new Error('Connection timeout: No connections available'));
|
|
213
|
+
}, this.config.connectionTimeout);
|
|
214
|
+
const checkForConnection = () => {
|
|
215
|
+
const connection = this.availableConnections.pop();
|
|
216
|
+
if (connection) {
|
|
217
|
+
clearTimeout(timeout);
|
|
218
|
+
resolve(connection);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
setTimeout(checkForConnection, 100); // Check every 100ms
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
checkForConnection();
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
releaseConnection(connection) {
|
|
228
|
+
const libsqlConnection = connection;
|
|
229
|
+
if (this.connections.includes(libsqlConnection) &&
|
|
230
|
+
!this.availableConnections.includes(libsqlConnection)) {
|
|
231
|
+
this.availableConnections.push(libsqlConnection);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
async removeConnection(connection) {
|
|
235
|
+
// Remove from both arrays
|
|
236
|
+
const connectionIndex = this.connections.indexOf(connection);
|
|
237
|
+
if (connectionIndex > -1) {
|
|
238
|
+
this.connections.splice(connectionIndex, 1);
|
|
239
|
+
}
|
|
240
|
+
const availableIndex = this.availableConnections.indexOf(connection);
|
|
241
|
+
if (availableIndex > -1) {
|
|
242
|
+
this.availableConnections.splice(availableIndex, 1);
|
|
243
|
+
}
|
|
244
|
+
// Close the connection
|
|
245
|
+
try {
|
|
246
|
+
await connection.close();
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
logger.error('Error closing removed connection', {}, error);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
async healthCheck() {
|
|
253
|
+
try {
|
|
254
|
+
const connection = await this.getConnection();
|
|
255
|
+
const isHealthy = await connection.isHealthy();
|
|
256
|
+
this.releaseConnection(connection);
|
|
257
|
+
return isHealthy;
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
async close() {
|
|
264
|
+
logger.info('Shutting down connection pool');
|
|
265
|
+
this.isShuttingDown = true;
|
|
266
|
+
// Close all connections
|
|
267
|
+
const closePromises = this.connections.map(connection => connection.close());
|
|
268
|
+
await Promise.allSettled(closePromises);
|
|
269
|
+
this.connections = [];
|
|
270
|
+
this.availableConnections = [];
|
|
271
|
+
logger.info('Connection pool shutdown complete');
|
|
272
|
+
}
|
|
273
|
+
getStatus() {
|
|
274
|
+
return {
|
|
275
|
+
totalConnections: this.connections.length,
|
|
276
|
+
availableConnections: this.availableConnections.length,
|
|
277
|
+
isShuttingDown: this.isShuttingDown,
|
|
278
|
+
minConnections: this.config.minConnections,
|
|
279
|
+
maxConnections: this.config.maxConnections
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
export { LibSQLConnection, LibSQLConnectionPool };
|
|
284
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/lib/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { LogLevel } from '../types/index.js';
|
|
2
|
+
export type LogMode = 'file' | 'console' | 'both' | 'none';
|
|
3
|
+
declare class Logger {
|
|
4
|
+
private logDir;
|
|
5
|
+
private logFile;
|
|
6
|
+
private currentLogLevel;
|
|
7
|
+
private directoryEnsured;
|
|
8
|
+
private logMode;
|
|
9
|
+
constructor(logDir?: string, logLevel?: keyof LogLevel, logMode?: LogMode);
|
|
10
|
+
private ensureLogDirectory;
|
|
11
|
+
private formatLogEntry;
|
|
12
|
+
private shouldLog;
|
|
13
|
+
private writeLog;
|
|
14
|
+
error(message: string, context?: Record<string, unknown>, error?: Error): void;
|
|
15
|
+
warn(message: string, context?: Record<string, unknown>): void;
|
|
16
|
+
info(message: string, context?: Record<string, unknown>): void;
|
|
17
|
+
debug(message: string, context?: Record<string, unknown>): void;
|
|
18
|
+
setLogLevel(level: keyof LogLevel): void;
|
|
19
|
+
getLogFilePath(): string;
|
|
20
|
+
}
|
|
21
|
+
export declare const logger: Logger;
|
|
22
|
+
export { Logger };
|
|
23
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3D,cAAM,MAAM;IACV,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,OAAO,CAAU;gBAEb,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,QAAiB,EAAE,OAAO,GAAE,OAAgB;YAQ3E,kBAAkB;IAiBhC,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,SAAS;YAOH,QAAQ;IAqCf,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAW9E,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAU9D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAU9D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAU/D,WAAW,CAAC,KAAK,EAAE,MAAM,QAAQ,GAAG,IAAI;IAIxC,cAAc,IAAI,MAAM;CAGhC;AAED,eAAO,MAAM,MAAM,QAAe,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
import { appendFile, mkdir } from 'fs/promises';
|
|
3
|
+
import { existsSync } from 'fs';
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
import { tmpdir } from 'os';
|
|
6
|
+
class Logger {
|
|
7
|
+
logDir;
|
|
8
|
+
logFile;
|
|
9
|
+
currentLogLevel;
|
|
10
|
+
directoryEnsured = false;
|
|
11
|
+
logMode;
|
|
12
|
+
constructor(logDir, logLevel = 'INFO', logMode = 'file') {
|
|
13
|
+
// Use temp directory by default for better cross-platform compatibility
|
|
14
|
+
this.logDir = logDir || join(tmpdir(), 'mcp-libsql-logs');
|
|
15
|
+
this.logFile = join(this.logDir, `mcp-libsql-${new Date().toISOString().split('T')[0]}.log`);
|
|
16
|
+
this.currentLogLevel = logLevel;
|
|
17
|
+
this.logMode = logMode;
|
|
18
|
+
}
|
|
19
|
+
async ensureLogDirectory() {
|
|
20
|
+
if (this.directoryEnsured) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
if (!existsSync(this.logDir)) {
|
|
25
|
+
await mkdir(this.logDir, { recursive: true });
|
|
26
|
+
}
|
|
27
|
+
this.directoryEnsured = true;
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
// If we can't create the directory, just log to console
|
|
31
|
+
console.warn(`Could not create log directory ${this.logDir}:`, error);
|
|
32
|
+
this.directoryEnsured = false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
formatLogEntry(entry) {
|
|
36
|
+
const contextStr = entry.context ? ` | Context: ${JSON.stringify(entry.context)}` : '';
|
|
37
|
+
const errorStr = entry.error ? ` | Error: ${entry.error.message}\n${entry.error.stack}` : '';
|
|
38
|
+
return `[${entry.timestamp}] ${entry.level.toUpperCase()}: ${entry.message}${contextStr}${errorStr}\n`;
|
|
39
|
+
}
|
|
40
|
+
shouldLog(level) {
|
|
41
|
+
const levels = ['DEBUG', 'INFO', 'WARN', 'ERROR'];
|
|
42
|
+
const currentIndex = levels.indexOf(this.currentLogLevel);
|
|
43
|
+
const messageIndex = levels.indexOf(level);
|
|
44
|
+
return messageIndex >= currentIndex;
|
|
45
|
+
}
|
|
46
|
+
async writeLog(entry) {
|
|
47
|
+
if (!this.shouldLog(entry.level) || this.logMode === 'none') {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const formattedEntry = this.formatLogEntry(entry);
|
|
51
|
+
// Write to console based on log mode
|
|
52
|
+
if (this.logMode === 'console' || this.logMode === 'both') {
|
|
53
|
+
const consoleMethod = entry.level === 'ERROR'
|
|
54
|
+
? console.error
|
|
55
|
+
: entry.level === 'WARN'
|
|
56
|
+
? console.warn
|
|
57
|
+
: entry.level === 'DEBUG'
|
|
58
|
+
? console.debug
|
|
59
|
+
: console.log;
|
|
60
|
+
consoleMethod(formattedEntry.trim());
|
|
61
|
+
}
|
|
62
|
+
// Write to file based on log mode
|
|
63
|
+
if (this.logMode === 'file' || this.logMode === 'both') {
|
|
64
|
+
try {
|
|
65
|
+
await this.ensureLogDirectory();
|
|
66
|
+
if (this.directoryEnsured) {
|
|
67
|
+
await appendFile(this.logFile, formattedEntry);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
// Silently fail file logging if we can't write - console logging still works
|
|
72
|
+
if (process.env['NODE_ENV'] !== 'production') {
|
|
73
|
+
console.warn('Failed to write to log file:', error);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
error(message, context, error) {
|
|
79
|
+
const entry = {
|
|
80
|
+
timestamp: new Date().toISOString(),
|
|
81
|
+
level: 'ERROR',
|
|
82
|
+
message,
|
|
83
|
+
...(context && { context }),
|
|
84
|
+
...(error && { error })
|
|
85
|
+
};
|
|
86
|
+
this.writeLog(entry).catch(err => console.error('Logger error:', err));
|
|
87
|
+
}
|
|
88
|
+
warn(message, context) {
|
|
89
|
+
const entry = {
|
|
90
|
+
timestamp: new Date().toISOString(),
|
|
91
|
+
level: 'WARN',
|
|
92
|
+
message,
|
|
93
|
+
...(context && { context })
|
|
94
|
+
};
|
|
95
|
+
this.writeLog(entry).catch(err => console.error('Logger error:', err));
|
|
96
|
+
}
|
|
97
|
+
info(message, context) {
|
|
98
|
+
const entry = {
|
|
99
|
+
timestamp: new Date().toISOString(),
|
|
100
|
+
level: 'INFO',
|
|
101
|
+
message,
|
|
102
|
+
...(context && { context })
|
|
103
|
+
};
|
|
104
|
+
this.writeLog(entry).catch(err => console.error('Logger error:', err));
|
|
105
|
+
}
|
|
106
|
+
debug(message, context) {
|
|
107
|
+
const entry = {
|
|
108
|
+
timestamp: new Date().toISOString(),
|
|
109
|
+
level: 'DEBUG',
|
|
110
|
+
message,
|
|
111
|
+
...(context && { context })
|
|
112
|
+
};
|
|
113
|
+
this.writeLog(entry).catch(err => console.error('Logger error:', err));
|
|
114
|
+
}
|
|
115
|
+
setLogLevel(level) {
|
|
116
|
+
this.currentLogLevel = level;
|
|
117
|
+
}
|
|
118
|
+
getLogFilePath() {
|
|
119
|
+
return this.logFile;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export const logger = new Logger();
|
|
123
|
+
export { Logger };
|
|
124
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { DatabaseConfig } from '../types/index.js';
|
|
2
|
+
export interface ServerManagerOptions {
|
|
3
|
+
config: DatabaseConfig;
|
|
4
|
+
enableHotReload?: boolean;
|
|
5
|
+
developmentMode?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare class ServerManager {
|
|
8
|
+
private options;
|
|
9
|
+
private server;
|
|
10
|
+
private pool;
|
|
11
|
+
private toolRegistry;
|
|
12
|
+
private transport;
|
|
13
|
+
private isRunning;
|
|
14
|
+
private isShuttingDown;
|
|
15
|
+
constructor(options: ServerManagerOptions);
|
|
16
|
+
start(): Promise<void>;
|
|
17
|
+
stop(): Promise<void>;
|
|
18
|
+
reload(newConfig?: DatabaseConfig): Promise<void>;
|
|
19
|
+
isServerRunning(): boolean;
|
|
20
|
+
getStatus(): {
|
|
21
|
+
running: boolean;
|
|
22
|
+
shuttingDown: boolean;
|
|
23
|
+
poolConnections?: number;
|
|
24
|
+
registeredTools?: number;
|
|
25
|
+
};
|
|
26
|
+
private setupDevelopmentFeatures;
|
|
27
|
+
private createToolRegistry;
|
|
28
|
+
private createMCPServer;
|
|
29
|
+
private cleanup;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=server-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-manager.d.ts","sourceRoot":"","sources":["../../src/lib/server-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIxD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,cAAc,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,aAAa;IAQZ,OAAO,CAAC,OAAO;IAP3B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,IAAI,CAAqC;IACjD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAS;gBAEX,OAAO,EAAE,oBAAoB;IAE3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA8DtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBrB,MAAM,CAAC,SAAS,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBvD,eAAe,IAAI,OAAO;IAI1B,SAAS,IAAI;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,YAAY,EAAE,OAAO,CAAC;QACtB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B;IAoBD,OAAO,CAAC,wBAAwB;YA6BlB,kBAAkB;YAoBlB,eAAe;YAsGf,OAAO;CAqCtB"}
|