@0xobelisk/graphql-server 1.2.0-pre.24
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/Dockerfile +31 -0
- package/EXPRESS_MIGRATION.md +176 -0
- package/LICENSE +92 -0
- package/README.md +908 -0
- package/dist/config/subscription-config.d.ts +47 -0
- package/dist/config/subscription-config.d.ts.map +1 -0
- package/dist/config/subscription-config.js +133 -0
- package/dist/config/subscription-config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +217 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/all-fields-filter-plugin.d.ts +4 -0
- package/dist/plugins/all-fields-filter-plugin.d.ts.map +1 -0
- package/dist/plugins/all-fields-filter-plugin.js +132 -0
- package/dist/plugins/all-fields-filter-plugin.js.map +1 -0
- package/dist/plugins/database-introspector.d.ts +23 -0
- package/dist/plugins/database-introspector.d.ts.map +1 -0
- package/dist/plugins/database-introspector.js +96 -0
- package/dist/plugins/database-introspector.js.map +1 -0
- package/dist/plugins/enhanced-playground.d.ts +9 -0
- package/dist/plugins/enhanced-playground.d.ts.map +1 -0
- package/dist/plugins/enhanced-playground.js +97 -0
- package/dist/plugins/enhanced-playground.js.map +1 -0
- package/dist/plugins/enhanced-server-manager.d.ts +28 -0
- package/dist/plugins/enhanced-server-manager.d.ts.map +1 -0
- package/dist/plugins/enhanced-server-manager.js +232 -0
- package/dist/plugins/enhanced-server-manager.js.map +1 -0
- package/dist/plugins/index.d.ts +9 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +26 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/postgraphile-config.d.ts +94 -0
- package/dist/plugins/postgraphile-config.d.ts.map +1 -0
- package/dist/plugins/postgraphile-config.js +183 -0
- package/dist/plugins/postgraphile-config.js.map +1 -0
- package/dist/plugins/query-filter.d.ts +4 -0
- package/dist/plugins/query-filter.d.ts.map +1 -0
- package/dist/plugins/query-filter.js +42 -0
- package/dist/plugins/query-filter.js.map +1 -0
- package/dist/plugins/simple-naming.d.ts +4 -0
- package/dist/plugins/simple-naming.d.ts.map +1 -0
- package/dist/plugins/simple-naming.js +79 -0
- package/dist/plugins/simple-naming.js.map +1 -0
- package/dist/plugins/welcome-page.d.ts +11 -0
- package/dist/plugins/welcome-page.d.ts.map +1 -0
- package/dist/plugins/welcome-page.js +203 -0
- package/dist/plugins/welcome-page.js.map +1 -0
- package/dist/universal-subscriptions.d.ts +32 -0
- package/dist/universal-subscriptions.d.ts.map +1 -0
- package/dist/universal-subscriptions.js +318 -0
- package/dist/universal-subscriptions.js.map +1 -0
- package/dist/utils/logger/index.d.ts +80 -0
- package/dist/utils/logger/index.d.ts.map +1 -0
- package/dist/utils/logger/index.js +232 -0
- package/dist/utils/logger/index.js.map +1 -0
- package/docker-compose.yml +87 -0
- package/package.json +71 -0
- package/server.log +62 -0
- package/src/config/subscription-config.ts +186 -0
- package/src/index.ts +239 -0
- package/src/plugins/README.md +123 -0
- package/src/plugins/all-fields-filter-plugin.ts +158 -0
- package/src/plugins/database-introspector.ts +126 -0
- package/src/plugins/enhanced-playground.ts +105 -0
- package/src/plugins/enhanced-server-manager.ts +282 -0
- package/src/plugins/index.ts +9 -0
- package/src/plugins/postgraphile-config.ts +226 -0
- package/src/plugins/query-filter.ts +50 -0
- package/src/plugins/simple-naming.ts +105 -0
- package/src/plugins/welcome-page.ts +218 -0
- package/src/universal-subscriptions.ts +397 -0
- package/src/utils/logger/README.md +193 -0
- package/src/utils/logger/index.ts +315 -0
- package/sui-indexer-schema.graphql +1004 -0
- package/test-express.js +124 -0
- package/test_listen_subscription.js +121 -0
- package/test_notification.js +63 -0
- package/tsconfig.json +28 -0
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UniversalSubscriptionsPlugin = void 0;
|
|
4
|
+
exports.generateStoreTablesInfo = generateStoreTablesInfo;
|
|
5
|
+
exports.createUniversalSubscriptionsPlugin = createUniversalSubscriptionsPlugin;
|
|
6
|
+
const postgraphile_1 = require("postgraphile");
|
|
7
|
+
const logger_1 = require("./utils/logger");
|
|
8
|
+
// Cached table information
|
|
9
|
+
let cachedTables = {};
|
|
10
|
+
let schemaGenerated = false;
|
|
11
|
+
/**
|
|
12
|
+
* Dynamically retrieve schema information for all store tables
|
|
13
|
+
*/
|
|
14
|
+
async function discoverStoreTables(pgClient) {
|
|
15
|
+
if (schemaGenerated && Object.keys(cachedTables).length > 0) {
|
|
16
|
+
return cachedTables;
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
logger_1.subscriptionLogger.info('Starting discovery of database store table structure...');
|
|
20
|
+
// 1. Get all store_* tables
|
|
21
|
+
const tablesResult = await pgClient.query(`
|
|
22
|
+
SELECT table_name
|
|
23
|
+
FROM information_schema.tables
|
|
24
|
+
WHERE table_schema = 'public'
|
|
25
|
+
AND table_name LIKE 'store_%'
|
|
26
|
+
ORDER BY table_name
|
|
27
|
+
`);
|
|
28
|
+
const tables = {};
|
|
29
|
+
// 2. Get detailed information for each table
|
|
30
|
+
for (const tableRow of tablesResult.rows) {
|
|
31
|
+
const fullTableName = tableRow.table_name;
|
|
32
|
+
const tableName = fullTableName.replace(/^store_/, '');
|
|
33
|
+
const tableInfo = await getTableInfo(pgClient, fullTableName);
|
|
34
|
+
tables[tableName] = tableInfo;
|
|
35
|
+
}
|
|
36
|
+
cachedTables = tables;
|
|
37
|
+
schemaGenerated = true;
|
|
38
|
+
logger_1.subscriptionLogger.info(`Discovered ${Object.keys(tables).length} store tables: ${Object.keys(tables).join(', ')}`);
|
|
39
|
+
return tables;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
logger_1.subscriptionLogger.error('Failed to discover store tables', error);
|
|
43
|
+
return {};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Generate pre-built table information - called at server startup
|
|
48
|
+
*/
|
|
49
|
+
async function generateStoreTablesInfo(pgPool) {
|
|
50
|
+
const pgClient = await pgPool.connect();
|
|
51
|
+
try {
|
|
52
|
+
const tables = await discoverStoreTables(pgClient);
|
|
53
|
+
logger_1.subscriptionLogger.info(`Pre-generated schema information for ${Object.keys(tables).length} tables`);
|
|
54
|
+
return tables;
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
pgClient.release();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Simplified tools plugin - only provides basic query functionality, let PostGraphile's built-in listen subscriptions work normally
|
|
62
|
+
*/
|
|
63
|
+
function createUniversalSubscriptionsPlugin(preGeneratedTables) {
|
|
64
|
+
return (0, postgraphile_1.makeExtendSchemaPlugin)((build) => {
|
|
65
|
+
logger_1.subscriptionLogger.info('Enabling simplified tools plugin - only keeping basic query functionality');
|
|
66
|
+
// Use pre-generated table information if available
|
|
67
|
+
if (preGeneratedTables && Object.keys(preGeneratedTables).length > 0) {
|
|
68
|
+
cachedTables = preGeneratedTables;
|
|
69
|
+
schemaGenerated = true;
|
|
70
|
+
}
|
|
71
|
+
const tableNames = Object.keys(cachedTables);
|
|
72
|
+
logger_1.subscriptionLogger.info(`Discovered store tables: ${tableNames.join(', ')}`);
|
|
73
|
+
return {
|
|
74
|
+
typeDefs: (0, postgraphile_1.gql) `
|
|
75
|
+
extend type Query {
|
|
76
|
+
"""
|
|
77
|
+
Get Schema information for all store tables
|
|
78
|
+
"""
|
|
79
|
+
storeSchema: JSON
|
|
80
|
+
|
|
81
|
+
"""
|
|
82
|
+
Query data from specified store table
|
|
83
|
+
"""
|
|
84
|
+
storeData(table: String!): JSON
|
|
85
|
+
|
|
86
|
+
"""
|
|
87
|
+
Get list of all available store table names
|
|
88
|
+
"""
|
|
89
|
+
availableStoreTables: [String!]!
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
# Removed custom subscription types, now only use PostGraphile's built-in listen subscriptions
|
|
93
|
+
`,
|
|
94
|
+
resolvers: {
|
|
95
|
+
Query: {
|
|
96
|
+
storeSchema: async (root, args, context, info) => {
|
|
97
|
+
const { pgClient } = context;
|
|
98
|
+
try {
|
|
99
|
+
const tables = await discoverStoreTables(pgClient);
|
|
100
|
+
return {
|
|
101
|
+
tables,
|
|
102
|
+
generatedAt: new Date().toISOString()
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
return {
|
|
107
|
+
error: error.message,
|
|
108
|
+
tables: {}
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
storeData: async (root, args, context, info) => {
|
|
113
|
+
return await executeTableQuery(context, args.table);
|
|
114
|
+
},
|
|
115
|
+
availableStoreTables: async (root, args, context, info) => {
|
|
116
|
+
const { pgClient } = context;
|
|
117
|
+
try {
|
|
118
|
+
const tables = await discoverStoreTables(pgClient);
|
|
119
|
+
return Object.keys(tables);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
logger_1.subscriptionLogger.error('Failed to get available table list', error);
|
|
123
|
+
return [];
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
// Default plugin export (for backward compatibility)
|
|
132
|
+
exports.UniversalSubscriptionsPlugin = createUniversalSubscriptionsPlugin();
|
|
133
|
+
// =========================
|
|
134
|
+
// Database query functions
|
|
135
|
+
// =========================
|
|
136
|
+
/**
|
|
137
|
+
* Get detailed table information (columns, primary keys, data statistics, etc.)
|
|
138
|
+
*/
|
|
139
|
+
async function getTableInfo(pgClient, fullTableName) {
|
|
140
|
+
const tableName = fullTableName.replace(/^store_/, '');
|
|
141
|
+
// 1. Get column information
|
|
142
|
+
const columnsResult = await pgClient.query(`
|
|
143
|
+
SELECT
|
|
144
|
+
column_name,
|
|
145
|
+
data_type,
|
|
146
|
+
is_nullable,
|
|
147
|
+
column_default,
|
|
148
|
+
character_maximum_length,
|
|
149
|
+
numeric_precision,
|
|
150
|
+
numeric_scale
|
|
151
|
+
FROM information_schema.columns
|
|
152
|
+
WHERE table_name = $1
|
|
153
|
+
ORDER BY ordinal_position
|
|
154
|
+
`, [fullTableName]);
|
|
155
|
+
// 2. Get primary key information
|
|
156
|
+
const primaryKeysResult = await pgClient.query(`
|
|
157
|
+
SELECT column_name
|
|
158
|
+
FROM information_schema.table_constraints tc
|
|
159
|
+
JOIN information_schema.key_column_usage kcu
|
|
160
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
161
|
+
WHERE tc.table_name = $1
|
|
162
|
+
AND tc.constraint_type = 'PRIMARY KEY'
|
|
163
|
+
ORDER BY kcu.ordinal_position
|
|
164
|
+
`, [fullTableName]);
|
|
165
|
+
// 3. Try to get primary key information from table_fields table (if exists)
|
|
166
|
+
let tableFieldsKeys = [];
|
|
167
|
+
try {
|
|
168
|
+
const tableFieldsResult = await pgClient.query(`
|
|
169
|
+
SELECT field_name
|
|
170
|
+
FROM table_fields
|
|
171
|
+
WHERE table_name = $1 AND is_key = true
|
|
172
|
+
ORDER BY field_name
|
|
173
|
+
`, [tableName]);
|
|
174
|
+
tableFieldsKeys = tableFieldsResult.rows.map((row) => row.field_name);
|
|
175
|
+
}
|
|
176
|
+
catch (e) {
|
|
177
|
+
// table_fields table may not exist, ignore error
|
|
178
|
+
}
|
|
179
|
+
// 4. Get data statistics
|
|
180
|
+
const statsResult = await pgClient.query(`
|
|
181
|
+
SELECT count(*) as row_count
|
|
182
|
+
FROM ${fullTableName}
|
|
183
|
+
`);
|
|
184
|
+
// 5. Get table size information
|
|
185
|
+
const sizeResult = await pgClient.query(`
|
|
186
|
+
SELECT
|
|
187
|
+
pg_size_pretty(pg_total_relation_size($1)) as total_size,
|
|
188
|
+
pg_size_pretty(pg_relation_size($1)) as table_size
|
|
189
|
+
`, [fullTableName]);
|
|
190
|
+
const columns = columnsResult.rows.map((row) => ({
|
|
191
|
+
columnName: row.column_name,
|
|
192
|
+
dataType: row.data_type,
|
|
193
|
+
isNullable: row.is_nullable === 'YES',
|
|
194
|
+
defaultValue: row.column_default,
|
|
195
|
+
maxLength: row.character_maximum_length,
|
|
196
|
+
precision: row.numeric_precision,
|
|
197
|
+
scale: row.numeric_scale
|
|
198
|
+
}));
|
|
199
|
+
const primaryKeys = primaryKeysResult.rows.map((row) => row.column_name);
|
|
200
|
+
return {
|
|
201
|
+
tableName,
|
|
202
|
+
fullTableName,
|
|
203
|
+
columns,
|
|
204
|
+
primaryKeys: primaryKeys.length > 0 ? primaryKeys : tableFieldsKeys,
|
|
205
|
+
statistics: {
|
|
206
|
+
rowCount: parseInt(statsResult.rows[0]?.row_count || '0'),
|
|
207
|
+
totalSize: sizeResult.rows[0]?.total_size || 'unknown',
|
|
208
|
+
tableSize: sizeResult.rows[0]?.table_size || 'unknown'
|
|
209
|
+
},
|
|
210
|
+
generatedAt: new Date().toISOString()
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Dynamically execute table queries
|
|
215
|
+
*/
|
|
216
|
+
async function executeTableQuery(context, tableName) {
|
|
217
|
+
const { pgClient } = context;
|
|
218
|
+
const fullTableName = `store_${tableName}`;
|
|
219
|
+
try {
|
|
220
|
+
logger_1.subscriptionLogger.debug(`Executing table query: ${fullTableName}`);
|
|
221
|
+
// 1. Get table information
|
|
222
|
+
const tableInfo = cachedTables[tableName] || (await getTableInfo(pgClient, fullTableName));
|
|
223
|
+
if (tableInfo.columns.length === 0) {
|
|
224
|
+
return {
|
|
225
|
+
nodes: [],
|
|
226
|
+
totalCount: 0,
|
|
227
|
+
tableName,
|
|
228
|
+
generatedAt: new Date().toISOString()
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
// 2. Build dynamic nodeId expression
|
|
232
|
+
const nodeIdExpression = buildNodeIdExpression(tableInfo);
|
|
233
|
+
// 3. Build query fields
|
|
234
|
+
const columnFields = tableInfo.columns
|
|
235
|
+
.map((col) => `'${col.columnName}', ${col.columnName}`)
|
|
236
|
+
.join(', ');
|
|
237
|
+
// 4. Build WHERE condition
|
|
238
|
+
const whereCondition = buildWhereCondition(tableInfo);
|
|
239
|
+
// 5. Execute query
|
|
240
|
+
const sql = `
|
|
241
|
+
SELECT
|
|
242
|
+
COALESCE(
|
|
243
|
+
json_agg(
|
|
244
|
+
json_build_object(
|
|
245
|
+
'nodeId', ${nodeIdExpression},
|
|
246
|
+
${columnFields}
|
|
247
|
+
)
|
|
248
|
+
),
|
|
249
|
+
'[]'::json
|
|
250
|
+
) as nodes,
|
|
251
|
+
count(*) as total_count
|
|
252
|
+
FROM ${fullTableName}
|
|
253
|
+
WHERE ${whereCondition}
|
|
254
|
+
`;
|
|
255
|
+
logger_1.subscriptionLogger.debug(`Executing SQL: ${sql}`);
|
|
256
|
+
const result = await pgClient.query(sql);
|
|
257
|
+
const row = result.rows[0];
|
|
258
|
+
const data = {
|
|
259
|
+
nodes: row?.nodes || [],
|
|
260
|
+
totalCount: parseInt(row?.total_count || '0'),
|
|
261
|
+
tableName,
|
|
262
|
+
generatedAt: new Date().toISOString()
|
|
263
|
+
};
|
|
264
|
+
logger_1.subscriptionLogger.debug(`Query result: ${fullTableName} found ${data.totalCount} records`);
|
|
265
|
+
return data;
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
logger_1.subscriptionLogger.error(`Failed to query ${fullTableName}`, error);
|
|
269
|
+
return {
|
|
270
|
+
nodes: [],
|
|
271
|
+
totalCount: 0,
|
|
272
|
+
tableName,
|
|
273
|
+
generatedAt: new Date().toISOString(),
|
|
274
|
+
error: error.message
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Dynamically build NodeId expression
|
|
280
|
+
*/
|
|
281
|
+
function buildNodeIdExpression(tableInfo) {
|
|
282
|
+
const { tableName, primaryKeys, columns } = tableInfo;
|
|
283
|
+
if (primaryKeys.length > 0) {
|
|
284
|
+
// Use primary keys to build nodeId
|
|
285
|
+
const keyExpression = primaryKeys
|
|
286
|
+
.map((key) => `COALESCE(${key}::text, 'null')`)
|
|
287
|
+
.join(" || ':' || ");
|
|
288
|
+
return `encode(('${tableName}:' || ${keyExpression})::bytea, 'base64')`;
|
|
289
|
+
}
|
|
290
|
+
// If no primary key, use first column
|
|
291
|
+
const firstColumn = columns[0]?.columnName || 'unknown';
|
|
292
|
+
return `encode(('${tableName}:' || COALESCE(${firstColumn}::text, 'unknown'))::bytea, 'base64')`;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Dynamically build WHERE condition - completely generic, no hardcoded field names
|
|
296
|
+
*/
|
|
297
|
+
function buildWhereCondition(tableInfo) {
|
|
298
|
+
const { primaryKeys, columns } = tableInfo;
|
|
299
|
+
// 1. Prioritize primary key fields as filter conditions (most reliable)
|
|
300
|
+
if (primaryKeys.length > 0) {
|
|
301
|
+
const conditions = primaryKeys.map((key) => `${key} IS NOT NULL`);
|
|
302
|
+
return conditions.join(' AND ');
|
|
303
|
+
}
|
|
304
|
+
// 2. If no primary key, find first non-null field (reduce empty data)
|
|
305
|
+
const nonNullableColumns = columns.filter((col) => !col.isNullable);
|
|
306
|
+
if (nonNullableColumns.length > 0) {
|
|
307
|
+
return `${nonNullableColumns[0].columnName} IS NOT NULL`;
|
|
308
|
+
}
|
|
309
|
+
// 3. If all fields can be null, use first field for basic filtering
|
|
310
|
+
if (columns.length > 0) {
|
|
311
|
+
return `${columns[0].columnName} IS NOT NULL`;
|
|
312
|
+
}
|
|
313
|
+
// 4. Final fallback - return all rows (no filtering)
|
|
314
|
+
return 'true';
|
|
315
|
+
}
|
|
316
|
+
// Removed getLatestInsertedData function, now only use listen subscriptions
|
|
317
|
+
// Removed getLatestInsertedDataSince function, now only use simple listen subscriptions
|
|
318
|
+
//# sourceMappingURL=universal-subscriptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"universal-subscriptions.js","sourceRoot":"","sources":["../src/universal-subscriptions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import pino from 'pino';
|
|
2
|
+
export interface LoggerConfig {
|
|
3
|
+
level?: string;
|
|
4
|
+
service?: string;
|
|
5
|
+
component?: string;
|
|
6
|
+
enableFileLogging?: boolean;
|
|
7
|
+
logsDir?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ComponentLoggerMethods {
|
|
10
|
+
debug: (message: string, meta?: any) => void;
|
|
11
|
+
info: (message: string, meta?: any) => void;
|
|
12
|
+
warn: (message: string, meta?: any) => void;
|
|
13
|
+
error: (message: string, error?: any, meta?: any) => void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 基于Pino的高性能日志系统
|
|
17
|
+
*/
|
|
18
|
+
export declare class Logger {
|
|
19
|
+
private pinoInstance;
|
|
20
|
+
private config;
|
|
21
|
+
constructor(config?: LoggerConfig);
|
|
22
|
+
/**
|
|
23
|
+
* 确保日志目录存在
|
|
24
|
+
*/
|
|
25
|
+
private ensureLogsDirectory;
|
|
26
|
+
/**
|
|
27
|
+
* 创建Pino实例
|
|
28
|
+
*/
|
|
29
|
+
private createPinoInstance;
|
|
30
|
+
/**
|
|
31
|
+
* 设置异常处理器
|
|
32
|
+
*/
|
|
33
|
+
private setupExceptionHandlers;
|
|
34
|
+
/**
|
|
35
|
+
* 创建带组件上下文的logger
|
|
36
|
+
*/
|
|
37
|
+
createComponentLogger(component: string): ComponentLoggerMethods;
|
|
38
|
+
/**
|
|
39
|
+
* 获取原始Pino实例
|
|
40
|
+
*/
|
|
41
|
+
getPinoInstance(): pino.Logger;
|
|
42
|
+
/**
|
|
43
|
+
* 记录性能指标
|
|
44
|
+
*/
|
|
45
|
+
logPerformance(operation: string, startTime: number, meta?: any): void;
|
|
46
|
+
/**
|
|
47
|
+
* 记录Express HTTP请求
|
|
48
|
+
*/
|
|
49
|
+
logExpress(method: string, path: string, statusCode: number, startTime: number, meta?: any): void;
|
|
50
|
+
/**
|
|
51
|
+
* 记录数据库操作
|
|
52
|
+
*/
|
|
53
|
+
logDatabaseOperation(operation: string, table?: string, meta?: any): void;
|
|
54
|
+
/**
|
|
55
|
+
* 记录WebSocket事件
|
|
56
|
+
*/
|
|
57
|
+
logWebSocketEvent(event: string, clientCount?: number, meta?: any): void;
|
|
58
|
+
/**
|
|
59
|
+
* 记录GraphQL查询
|
|
60
|
+
*/
|
|
61
|
+
logGraphQLQuery(operation: string, query?: string, variables?: any): void;
|
|
62
|
+
}
|
|
63
|
+
export declare const dbLogger: ComponentLoggerMethods;
|
|
64
|
+
export declare const serverLogger: ComponentLoggerMethods;
|
|
65
|
+
export declare const httpLogger: ComponentLoggerMethods;
|
|
66
|
+
export declare const wsLogger: ComponentLoggerMethods;
|
|
67
|
+
export declare const gqlLogger: ComponentLoggerMethods;
|
|
68
|
+
export declare const subscriptionLogger: ComponentLoggerMethods;
|
|
69
|
+
export declare const systemLogger: ComponentLoggerMethods;
|
|
70
|
+
export declare const authLogger: ComponentLoggerMethods;
|
|
71
|
+
export declare const perfLogger: ComponentLoggerMethods;
|
|
72
|
+
export declare const createComponentLogger: (component: string) => ComponentLoggerMethods;
|
|
73
|
+
export declare const logPerformance: (operation: string, startTime: number, meta?: any) => void;
|
|
74
|
+
export declare const logExpress: (method: string, path: string, statusCode: number, startTime: number, meta?: any) => void;
|
|
75
|
+
export declare const logDatabaseOperation: (operation: string, table?: string, meta?: any) => void;
|
|
76
|
+
export declare const logWebSocketEvent: (event: string, clientCount?: number, meta?: any) => void;
|
|
77
|
+
export declare const logGraphQLQuery: (operation: string, query?: string, variables?: any) => void;
|
|
78
|
+
declare const _default: pino.Logger<never>;
|
|
79
|
+
export default _default;
|
|
80
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/logger/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.logGraphQLQuery = exports.logWebSocketEvent = exports.logDatabaseOperation = exports.logExpress = exports.logPerformance = exports.createComponentLogger = exports.perfLogger = exports.authLogger = exports.systemLogger = exports.subscriptionLogger = exports.gqlLogger = exports.wsLogger = exports.httpLogger = exports.serverLogger = exports.dbLogger = exports.Logger = void 0;
|
|
7
|
+
const pino_1 = __importDefault(require("pino"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
/**
|
|
11
|
+
* 基于Pino的高性能日志系统
|
|
12
|
+
*/
|
|
13
|
+
class Logger {
|
|
14
|
+
pinoInstance;
|
|
15
|
+
config;
|
|
16
|
+
constructor(config = {}) {
|
|
17
|
+
this.config = {
|
|
18
|
+
level: config.level || process.env.LOG_LEVEL || 'info',
|
|
19
|
+
service: config.service || 'dubhe-graphql-server',
|
|
20
|
+
component: config.component || 'default',
|
|
21
|
+
enableFileLogging: config.enableFileLogging !== false,
|
|
22
|
+
logsDir: config.logsDir || path_1.default.join(process.cwd(), 'logs'),
|
|
23
|
+
};
|
|
24
|
+
this.ensureLogsDirectory();
|
|
25
|
+
this.pinoInstance = this.createPinoInstance();
|
|
26
|
+
this.setupExceptionHandlers();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 确保日志目录存在
|
|
30
|
+
*/
|
|
31
|
+
ensureLogsDirectory() {
|
|
32
|
+
if (this.config.enableFileLogging &&
|
|
33
|
+
!fs_1.default.existsSync(this.config.logsDir)) {
|
|
34
|
+
fs_1.default.mkdirSync(this.config.logsDir, { recursive: true });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 创建Pino实例
|
|
39
|
+
*/
|
|
40
|
+
createPinoInstance() {
|
|
41
|
+
const pinoOptions = {
|
|
42
|
+
level: this.config.level,
|
|
43
|
+
base: {
|
|
44
|
+
service: this.config.service,
|
|
45
|
+
pid: process.pid,
|
|
46
|
+
},
|
|
47
|
+
timestamp: pino_1.default.stdTimeFunctions.isoTime,
|
|
48
|
+
formatters: {
|
|
49
|
+
level(label) {
|
|
50
|
+
return { level: label };
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
serializers: {
|
|
54
|
+
error: pino_1.default.stdSerializers.err,
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
// 如果启用文件日志,使用multistream
|
|
58
|
+
if (this.config.enableFileLogging) {
|
|
59
|
+
const streams = [
|
|
60
|
+
// Pretty打印到控制台
|
|
61
|
+
{
|
|
62
|
+
stream: pino_1.default.transport({
|
|
63
|
+
target: 'pino-pretty',
|
|
64
|
+
options: {
|
|
65
|
+
colorize: true,
|
|
66
|
+
translateTime: 'yyyy-mm-dd HH:MM:ss.l',
|
|
67
|
+
ignore: 'pid,hostname,service,component',
|
|
68
|
+
messageFormat: '[{component}]: {msg}',
|
|
69
|
+
singleLine: true,
|
|
70
|
+
hideObject: false,
|
|
71
|
+
},
|
|
72
|
+
}),
|
|
73
|
+
},
|
|
74
|
+
// JSON格式到文件
|
|
75
|
+
{
|
|
76
|
+
stream: pino_1.default.destination({
|
|
77
|
+
dest: path_1.default.join(this.config.logsDir, 'combined.log'),
|
|
78
|
+
sync: false,
|
|
79
|
+
}),
|
|
80
|
+
},
|
|
81
|
+
];
|
|
82
|
+
return (0, pino_1.default)(pinoOptions, pino_1.default.multistream(streams));
|
|
83
|
+
}
|
|
84
|
+
// 只输出到控制台的pretty格式
|
|
85
|
+
return (0, pino_1.default)({
|
|
86
|
+
...pinoOptions,
|
|
87
|
+
transport: {
|
|
88
|
+
target: 'pino-pretty',
|
|
89
|
+
options: {
|
|
90
|
+
colorize: true,
|
|
91
|
+
translateTime: 'yyyy-mm-dd HH:MM:ss.l',
|
|
92
|
+
ignore: 'pid,hostname,service',
|
|
93
|
+
messageFormat: '[{component}]: {msg}',
|
|
94
|
+
singleLine: true,
|
|
95
|
+
hideObject: false,
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 设置异常处理器
|
|
102
|
+
*/
|
|
103
|
+
setupExceptionHandlers() {
|
|
104
|
+
process.on('uncaughtException', error => {
|
|
105
|
+
this.pinoInstance.fatal({ error }, 'Uncaught Exception');
|
|
106
|
+
process.exit(1);
|
|
107
|
+
});
|
|
108
|
+
process.on('unhandledRejection', (reason, promise) => {
|
|
109
|
+
this.pinoInstance.fatal({ reason, promise }, 'Unhandled Promise Rejection');
|
|
110
|
+
process.exit(1);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 创建带组件上下文的logger
|
|
115
|
+
*/
|
|
116
|
+
createComponentLogger(component) {
|
|
117
|
+
const componentLogger = this.pinoInstance.child({ component });
|
|
118
|
+
return {
|
|
119
|
+
debug: (message, meta) => componentLogger.debug(meta || {}, message),
|
|
120
|
+
info: (message, meta) => componentLogger.info(meta || {}, message),
|
|
121
|
+
warn: (message, meta) => componentLogger.warn(meta || {}, message),
|
|
122
|
+
error: (message, error, meta) => {
|
|
123
|
+
const errorData = error instanceof Error
|
|
124
|
+
? {
|
|
125
|
+
error: {
|
|
126
|
+
message: error.message,
|
|
127
|
+
stack: error.stack,
|
|
128
|
+
name: error.name,
|
|
129
|
+
},
|
|
130
|
+
...meta,
|
|
131
|
+
}
|
|
132
|
+
: { error, ...meta };
|
|
133
|
+
componentLogger.error(errorData, message);
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* 获取原始Pino实例
|
|
139
|
+
*/
|
|
140
|
+
getPinoInstance() {
|
|
141
|
+
return this.pinoInstance;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* 记录性能指标
|
|
145
|
+
*/
|
|
146
|
+
logPerformance(operation, startTime, meta) {
|
|
147
|
+
const duration = Date.now() - startTime;
|
|
148
|
+
const perfLogger = this.createComponentLogger('performance');
|
|
149
|
+
perfLogger.info(operation, {
|
|
150
|
+
duration: `${duration}ms`,
|
|
151
|
+
...meta,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* 记录Express HTTP请求
|
|
156
|
+
*/
|
|
157
|
+
logExpress(method, path, statusCode, startTime, meta) {
|
|
158
|
+
const duration = Date.now() - startTime;
|
|
159
|
+
const httpLogger = this.createComponentLogger('express');
|
|
160
|
+
const message = `${method} ${path} - ${statusCode} (${duration}ms)`;
|
|
161
|
+
// 根据状态码选择日志级别
|
|
162
|
+
if (statusCode >= 500) {
|
|
163
|
+
httpLogger.error(message, meta);
|
|
164
|
+
}
|
|
165
|
+
else if (statusCode >= 400) {
|
|
166
|
+
httpLogger.warn(message, meta);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
httpLogger.info(message, meta);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* 记录数据库操作
|
|
174
|
+
*/
|
|
175
|
+
logDatabaseOperation(operation, table, meta) {
|
|
176
|
+
const dbLogger = this.createComponentLogger('database');
|
|
177
|
+
dbLogger.info(`Database operation: ${operation}`, {
|
|
178
|
+
table,
|
|
179
|
+
...meta,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* 记录WebSocket事件
|
|
184
|
+
*/
|
|
185
|
+
logWebSocketEvent(event, clientCount, meta) {
|
|
186
|
+
const wsLogger = this.createComponentLogger('websocket');
|
|
187
|
+
wsLogger.info(`WebSocket event: ${event}`, {
|
|
188
|
+
clientCount,
|
|
189
|
+
...meta,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* 记录GraphQL查询
|
|
194
|
+
*/
|
|
195
|
+
logGraphQLQuery(operation, query, variables) {
|
|
196
|
+
const gqlLogger = this.createComponentLogger('graphql');
|
|
197
|
+
gqlLogger.info(`GraphQL ${operation}`, {
|
|
198
|
+
query: query?.substring(0, 200) +
|
|
199
|
+
(query && query.length > 200 ? '...' : ''),
|
|
200
|
+
variableCount: variables ? Object.keys(variables).length : 0,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
exports.Logger = Logger;
|
|
205
|
+
// 创建默认logger实例
|
|
206
|
+
const defaultLogger = new Logger();
|
|
207
|
+
// 导出预定义的组件logger(保持向后兼容)
|
|
208
|
+
exports.dbLogger = defaultLogger.createComponentLogger('database');
|
|
209
|
+
exports.serverLogger = defaultLogger.createComponentLogger('server');
|
|
210
|
+
exports.httpLogger = defaultLogger.createComponentLogger('express');
|
|
211
|
+
exports.wsLogger = defaultLogger.createComponentLogger('websocket');
|
|
212
|
+
exports.gqlLogger = defaultLogger.createComponentLogger('graphql');
|
|
213
|
+
exports.subscriptionLogger = defaultLogger.createComponentLogger('subscription');
|
|
214
|
+
exports.systemLogger = defaultLogger.createComponentLogger('system');
|
|
215
|
+
exports.authLogger = defaultLogger.createComponentLogger('auth');
|
|
216
|
+
exports.perfLogger = defaultLogger.createComponentLogger('performance');
|
|
217
|
+
// 导出工具函数(保持向后兼容)
|
|
218
|
+
const createComponentLogger = (component) => defaultLogger.createComponentLogger(component);
|
|
219
|
+
exports.createComponentLogger = createComponentLogger;
|
|
220
|
+
const logPerformance = (operation, startTime, meta) => defaultLogger.logPerformance(operation, startTime, meta);
|
|
221
|
+
exports.logPerformance = logPerformance;
|
|
222
|
+
const logExpress = (method, path, statusCode, startTime, meta) => defaultLogger.logExpress(method, path, statusCode, startTime, meta);
|
|
223
|
+
exports.logExpress = logExpress;
|
|
224
|
+
const logDatabaseOperation = (operation, table, meta) => defaultLogger.logDatabaseOperation(operation, table, meta);
|
|
225
|
+
exports.logDatabaseOperation = logDatabaseOperation;
|
|
226
|
+
const logWebSocketEvent = (event, clientCount, meta) => defaultLogger.logWebSocketEvent(event, clientCount, meta);
|
|
227
|
+
exports.logWebSocketEvent = logWebSocketEvent;
|
|
228
|
+
const logGraphQLQuery = (operation, query, variables) => defaultLogger.logGraphQLQuery(operation, query, variables);
|
|
229
|
+
exports.logGraphQLQuery = logGraphQLQuery;
|
|
230
|
+
// 默认导出(保持向后兼容)
|
|
231
|
+
exports.default = defaultLogger.getPinoInstance();
|
|
232
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/logger/index.ts"],"names":[],"mappings":"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"}
|