@0xobelisk/graphql-server 1.2.0-pre.100
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/.turbo/turbo-build.log +8 -0
- package/DUAL_POOL_CONFIG.md +188 -0
- package/Dockerfile +35 -0
- package/LICENSE +92 -0
- package/README.md +487 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +206 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/subscription-config.d.ts +80 -0
- package/dist/config/subscription-config.d.ts.map +1 -0
- package/dist/config/subscription-config.js +158 -0
- package/dist/config/subscription-config.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -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 +113 -0
- package/dist/plugins/enhanced-playground.js.map +1 -0
- package/dist/plugins/enhanced-server-manager.d.ts +29 -0
- package/dist/plugins/enhanced-server-manager.d.ts.map +1 -0
- package/dist/plugins/enhanced-server-manager.js +262 -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 +138 -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/server.d.ts +21 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +265 -0
- package/dist/server.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 +230 -0
- package/dist/utils/logger/index.js.map +1 -0
- package/docker-compose.yml +46 -0
- package/eslint.config.mjs +3 -0
- package/package.json +78 -0
- package/src/cli.ts +232 -0
- package/src/config/subscription-config.ts +243 -0
- package/src/index.ts +11 -0
- package/src/plugins/README.md +138 -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 +121 -0
- package/src/plugins/enhanced-server-manager.ts +314 -0
- package/src/plugins/index.ts +9 -0
- package/src/plugins/postgraphile-config.ts +182 -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/server.ts +324 -0
- package/src/universal-subscriptions.ts +397 -0
- package/src/utils/logger/README.md +209 -0
- package/src/utils/logger/index.ts +275 -0
- package/sui-indexer-schema.graphql +3691 -0
- package/tsconfig.json +28 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.startServer = void 0;
|
|
37
|
+
const postgraphile_1 = require("postgraphile");
|
|
38
|
+
const pg_1 = require("pg");
|
|
39
|
+
const dotenv = __importStar(require("dotenv"));
|
|
40
|
+
const logger_1 = require("./utils/logger");
|
|
41
|
+
const plugins_1 = require("./plugins");
|
|
42
|
+
const enhanced_server_manager_1 = require("./plugins/enhanced-server-manager");
|
|
43
|
+
const subscription_config_1 = require("./config/subscription-config");
|
|
44
|
+
const universal_subscriptions_1 = require("./universal-subscriptions");
|
|
45
|
+
// Load environment variables
|
|
46
|
+
dotenv.config();
|
|
47
|
+
// Start server
|
|
48
|
+
const startServer = async (config) => {
|
|
49
|
+
// Set log level from config to environment (for logger compatibility)
|
|
50
|
+
process.env.LOG_LEVEL = config.debug ? 'debug' : 'info';
|
|
51
|
+
// Extract variables from config
|
|
52
|
+
const { port: PORT, databaseUrl: DATABASE_URL, schema: PG_SCHEMA, endpoint: GRAPHQL_ENDPOINT, cors: ENABLE_CORS, subscriptions: ENABLE_SUBSCRIPTIONS_BOOL, env: NODE_ENV } = config;
|
|
53
|
+
// Convert boolean values to string format
|
|
54
|
+
const ENABLE_SUBSCRIPTIONS = ENABLE_SUBSCRIPTIONS_BOOL ? 'true' : 'false';
|
|
55
|
+
// Build subscription configuration and refresh
|
|
56
|
+
logger_1.systemLogger.info('Refreshing subscription configuration with new settings...');
|
|
57
|
+
const subscriptionConfigInput = {
|
|
58
|
+
enableSubscriptions: ENABLE_SUBSCRIPTIONS_BOOL,
|
|
59
|
+
databaseUrl: DATABASE_URL,
|
|
60
|
+
port: PORT,
|
|
61
|
+
// Use configuration from ServerConfig instead of defaults
|
|
62
|
+
enableLiveQueries: config.enableLiveQueries,
|
|
63
|
+
enablePgSubscriptions: config.enablePgSubscriptions,
|
|
64
|
+
enableNativeWebSocket: config.enableNativeWebSocket,
|
|
65
|
+
realtimePort: config.realtimePort?.toString(),
|
|
66
|
+
maxConnections: config.maxConnections.toString(),
|
|
67
|
+
heartbeatInterval: config.heartbeatInterval.toString(),
|
|
68
|
+
debugNotifications: config.debugNotifications,
|
|
69
|
+
enableMetrics: config.enableMetrics
|
|
70
|
+
};
|
|
71
|
+
subscription_config_1.subscriptionConfig.refresh(subscriptionConfigInput);
|
|
72
|
+
// === Unified Connection Pool Architecture: Single pool handles all operations ===
|
|
73
|
+
logger_1.systemLogger.info('🔄 Connection pool configuration', {
|
|
74
|
+
maxConnections: config.maxConnections,
|
|
75
|
+
strategy: 'single-pool-unified',
|
|
76
|
+
operations: ['query', 'mutation', 'subscription']
|
|
77
|
+
});
|
|
78
|
+
// Unified connection pool - handles all GraphQL operations
|
|
79
|
+
const pgPool = new pg_1.Pool({
|
|
80
|
+
connectionString: DATABASE_URL,
|
|
81
|
+
// === Connection Pool Configuration ===
|
|
82
|
+
max: config.maxConnections, // Use configured maximum connections
|
|
83
|
+
min: Math.min(5, Math.floor(config.maxConnections * 0.1)), // Keep minimum connections
|
|
84
|
+
// === Balanced Configuration: Support both short-term queries and long-term subscriptions ===
|
|
85
|
+
connectionTimeoutMillis: 10000, // 10 second timeout (balanced value)
|
|
86
|
+
idleTimeoutMillis: 600000, // 10 minute idle cleanup (support subscriptions but not too long)
|
|
87
|
+
maxLifetimeSeconds: 3600, // 1 hour rotation (prevent connection leaks)
|
|
88
|
+
allowExitOnIdle: config.env === 'development'
|
|
89
|
+
});
|
|
90
|
+
// Add connection pool event listeners
|
|
91
|
+
pgPool.on('connect', (_client) => {
|
|
92
|
+
logger_1.dbLogger.debug('📤 New connection established', {
|
|
93
|
+
totalCount: pgPool.totalCount,
|
|
94
|
+
idleCount: pgPool.idleCount,
|
|
95
|
+
waitingCount: pgPool.waitingCount
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
pgPool.on('error', (err, _client) => {
|
|
99
|
+
logger_1.dbLogger.error('❌ Connection pool error', err, {
|
|
100
|
+
totalCount: pgPool.totalCount
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
const startTime = Date.now();
|
|
104
|
+
try {
|
|
105
|
+
// 1. Test database connection and scan table structure
|
|
106
|
+
logger_1.systemLogger.info('Initializing database connection and scanning table structure...', {
|
|
107
|
+
schema: PG_SCHEMA,
|
|
108
|
+
databaseUrl: DATABASE_URL.replace(/:[^:]*@/, ':****@') // Hide password
|
|
109
|
+
});
|
|
110
|
+
const introspector = new plugins_1.DatabaseIntrospector(pgPool, PG_SCHEMA);
|
|
111
|
+
const isConnected = await introspector.testConnection();
|
|
112
|
+
if (!isConnected) {
|
|
113
|
+
throw new Error('Database connection failed');
|
|
114
|
+
}
|
|
115
|
+
logger_1.dbLogger.info('Database connection successful', { schema: PG_SCHEMA });
|
|
116
|
+
const allTables = await introspector.getAllTables();
|
|
117
|
+
const tableNames = allTables.map((t) => t.table_name);
|
|
118
|
+
logger_1.dbLogger.info('Table structure scan completed', {
|
|
119
|
+
tableCount: allTables.length,
|
|
120
|
+
storeTableCount: tableNames.filter((name) => name.startsWith('store_')).length,
|
|
121
|
+
tableNames: tableNames.slice(0, 10) // Only show first 10 table names
|
|
122
|
+
});
|
|
123
|
+
// 2. Display subscription configuration status
|
|
124
|
+
const subscriptionConfigData = subscription_config_1.subscriptionConfig.getConfig();
|
|
125
|
+
logger_1.subscriptionLogger.info('📡 Subscription system configuration status', {
|
|
126
|
+
enableSubscriptions: subscriptionConfigData.enableSubscriptions,
|
|
127
|
+
capabilities: {
|
|
128
|
+
pgSubscriptions: subscriptionConfigData.capabilities.pgSubscriptions
|
|
129
|
+
},
|
|
130
|
+
recommendedMethod: 'pg-subscriptions',
|
|
131
|
+
walLevel: subscriptionConfigData.walLevel
|
|
132
|
+
});
|
|
133
|
+
// 3. Pre-generate store table information for dynamic queries
|
|
134
|
+
logger_1.subscriptionLogger.info('Pre-generating store table information for tool queries...');
|
|
135
|
+
const storeTablesInfo = await (0, universal_subscriptions_1.generateStoreTablesInfo)(pgPool);
|
|
136
|
+
const storeTableNames = Object.keys(storeTablesInfo);
|
|
137
|
+
logger_1.subscriptionLogger.info(`Discovered store tables: ${storeTableNames.join(', ')}`);
|
|
138
|
+
// 4. Create PostGraphile configuration
|
|
139
|
+
const postgraphileConfigOptions = {
|
|
140
|
+
port: PORT,
|
|
141
|
+
nodeEnv: NODE_ENV,
|
|
142
|
+
graphqlEndpoint: GRAPHQL_ENDPOINT,
|
|
143
|
+
enableSubscriptions: ENABLE_SUBSCRIPTIONS,
|
|
144
|
+
enableCors: ENABLE_CORS ? 'true' : 'false',
|
|
145
|
+
databaseUrl: DATABASE_URL,
|
|
146
|
+
availableTables: tableNames,
|
|
147
|
+
// Pass additional configuration from CLI
|
|
148
|
+
disableQueryLog: !config.debug, // Disable query log unless debug mode
|
|
149
|
+
enableQueryLog: config.debug, // Enable query log in debug mode
|
|
150
|
+
queryTimeout: config.queryTimeout
|
|
151
|
+
};
|
|
152
|
+
logger_1.serverLogger.info('Creating PostGraphile configuration', {
|
|
153
|
+
endpoint: GRAPHQL_ENDPOINT,
|
|
154
|
+
enableCors: ENABLE_CORS,
|
|
155
|
+
enableSubscriptions: ENABLE_SUBSCRIPTIONS,
|
|
156
|
+
debug: config.debug,
|
|
157
|
+
disableQueryLog: !config.debug,
|
|
158
|
+
enableQueryLog: config.debug
|
|
159
|
+
});
|
|
160
|
+
// Use simplified configuration
|
|
161
|
+
const postgraphileConfig = {
|
|
162
|
+
...(0, plugins_1.createPostGraphileConfig)(postgraphileConfigOptions),
|
|
163
|
+
...subscription_config_1.subscriptionConfig.generatePostGraphileConfig()
|
|
164
|
+
};
|
|
165
|
+
// Add tools query plugin
|
|
166
|
+
const toolsPlugin = (0, universal_subscriptions_1.createUniversalSubscriptionsPlugin)(storeTablesInfo);
|
|
167
|
+
postgraphileConfig.appendPlugins = [...(postgraphileConfig.appendPlugins || []), toolsPlugin];
|
|
168
|
+
// 5. Create PostGraphile middleware
|
|
169
|
+
console.log('🔧 Creating PostGraphile middleware...');
|
|
170
|
+
const postgraphileMiddleware = (0, postgraphile_1.postgraphile)(pgPool, PG_SCHEMA, {
|
|
171
|
+
...postgraphileConfig
|
|
172
|
+
});
|
|
173
|
+
console.log('✅ PostGraphile middleware creation completed:', typeof postgraphileMiddleware);
|
|
174
|
+
// 6. Configure welcome page
|
|
175
|
+
const welcomeConfig = {
|
|
176
|
+
port: PORT,
|
|
177
|
+
graphqlEndpoint: GRAPHQL_ENDPOINT,
|
|
178
|
+
nodeEnv: NODE_ENV,
|
|
179
|
+
schema: PG_SCHEMA,
|
|
180
|
+
enableCors: ENABLE_CORS ? 'true' : 'false',
|
|
181
|
+
enableSubscriptions: ENABLE_SUBSCRIPTIONS
|
|
182
|
+
};
|
|
183
|
+
// 7. Create Express server manager
|
|
184
|
+
const serverManager = new enhanced_server_manager_1.EnhancedServerManager();
|
|
185
|
+
// 8. Create Express server
|
|
186
|
+
await serverManager.createEnhancedServer({
|
|
187
|
+
postgraphileMiddleware,
|
|
188
|
+
pgPool,
|
|
189
|
+
tableNames,
|
|
190
|
+
databaseUrl: DATABASE_URL,
|
|
191
|
+
allTables,
|
|
192
|
+
welcomeConfig,
|
|
193
|
+
postgraphileConfigOptions
|
|
194
|
+
});
|
|
195
|
+
// 9. Start Express server
|
|
196
|
+
await serverManager.startServer();
|
|
197
|
+
(0, logger_1.logPerformance)('Express server startup', startTime, {
|
|
198
|
+
port: PORT,
|
|
199
|
+
tableCount: allTables.length,
|
|
200
|
+
storeTableCount: storeTableNames.length,
|
|
201
|
+
nodeEnv: NODE_ENV,
|
|
202
|
+
framework: 'Express',
|
|
203
|
+
capabilities: {
|
|
204
|
+
pgSubscriptions: subscriptionConfigData.capabilities.pgSubscriptions
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
// 10. Display usage instructions
|
|
208
|
+
if (NODE_ENV === 'development') {
|
|
209
|
+
console.log('\n' + '='.repeat(80));
|
|
210
|
+
console.log('📖 Quick Access (Express Architecture):');
|
|
211
|
+
console.log(`Visit http://localhost:${PORT}/ to view homepage`);
|
|
212
|
+
console.log(`Visit http://localhost:${PORT}/playground to use GraphQL Playground`);
|
|
213
|
+
console.log(`Visit http://localhost:${PORT}/health to check server status`);
|
|
214
|
+
console.log(`Visit http://localhost:${PORT}/subscription-config to get client configuration`);
|
|
215
|
+
console.log(`Visit http://localhost:${PORT}/subscription-docs to view configuration guide`);
|
|
216
|
+
console.log('='.repeat(80) + '\n');
|
|
217
|
+
}
|
|
218
|
+
// 11. Set up simple and direct shutdown handling
|
|
219
|
+
let isShuttingDown = false;
|
|
220
|
+
const quickShutdown = (signal) => {
|
|
221
|
+
if (isShuttingDown) {
|
|
222
|
+
logger_1.systemLogger.info('⚡ Force exiting process...');
|
|
223
|
+
process.exit(0);
|
|
224
|
+
}
|
|
225
|
+
isShuttingDown = true;
|
|
226
|
+
logger_1.systemLogger.info(`🛑 Received ${signal} signal, shutting down Express server...`);
|
|
227
|
+
// Set 1 second force exit timeout
|
|
228
|
+
setTimeout(() => {
|
|
229
|
+
logger_1.systemLogger.info('⚡ Quick exit');
|
|
230
|
+
process.exit(0);
|
|
231
|
+
}, 1000);
|
|
232
|
+
// Try to shutdown Express server quickly
|
|
233
|
+
serverManager.quickShutdown().finally(() => {
|
|
234
|
+
process.exit(0);
|
|
235
|
+
});
|
|
236
|
+
};
|
|
237
|
+
process.on('SIGINT', () => quickShutdown('SIGINT'));
|
|
238
|
+
process.on('SIGTERM', () => quickShutdown('SIGTERM'));
|
|
239
|
+
// Simplified exception handling
|
|
240
|
+
process.on('unhandledRejection', (reason) => {
|
|
241
|
+
console.error('❌ Unhandled Promise rejection:', reason);
|
|
242
|
+
});
|
|
243
|
+
process.on('uncaughtException', (error) => {
|
|
244
|
+
console.error('❌ Uncaught exception:', error.message);
|
|
245
|
+
process.exit(1);
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
logger_1.systemLogger.error('Failed to start Express server', error, {
|
|
250
|
+
databaseUrl: DATABASE_URL.replace(/:[^:]*@/, ':****@'),
|
|
251
|
+
schema: PG_SCHEMA,
|
|
252
|
+
port: PORT
|
|
253
|
+
});
|
|
254
|
+
logger_1.systemLogger.info('💡 Possible causes:');
|
|
255
|
+
logger_1.systemLogger.info('1. Database connection failed - check DATABASE_URL');
|
|
256
|
+
logger_1.systemLogger.info('2. Expected table structure not found in database - ensure dubhe-indexer is running');
|
|
257
|
+
logger_1.systemLogger.info('3. Permission issues - ensure database user has sufficient permissions');
|
|
258
|
+
logger_1.systemLogger.info('4. Missing dependencies - run pnpm install');
|
|
259
|
+
// Display subscription configuration help
|
|
260
|
+
console.log('\n' + subscription_config_1.subscriptionConfig.generateDocumentation());
|
|
261
|
+
process.exit(1);
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
exports.startServer = startServer;
|
|
265
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
interface TableInfo {
|
|
2
|
+
tableName: string;
|
|
3
|
+
fullTableName: string;
|
|
4
|
+
columns: ColumnInfo[];
|
|
5
|
+
primaryKeys: string[];
|
|
6
|
+
statistics?: {
|
|
7
|
+
rowCount: number;
|
|
8
|
+
totalSize: string;
|
|
9
|
+
tableSize: string;
|
|
10
|
+
};
|
|
11
|
+
generatedAt?: string;
|
|
12
|
+
}
|
|
13
|
+
interface ColumnInfo {
|
|
14
|
+
columnName: string;
|
|
15
|
+
dataType: string;
|
|
16
|
+
isNullable: boolean;
|
|
17
|
+
defaultValue?: any;
|
|
18
|
+
maxLength?: number;
|
|
19
|
+
precision?: number;
|
|
20
|
+
scale?: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Generate pre-built table information - called at server startup
|
|
24
|
+
*/
|
|
25
|
+
export declare function generateStoreTablesInfo(pgPool: any): Promise<Record<string, TableInfo>>;
|
|
26
|
+
/**
|
|
27
|
+
* Simplified tools plugin - only provides basic query functionality, let PostGraphile's built-in listen subscriptions work normally
|
|
28
|
+
*/
|
|
29
|
+
export declare function createUniversalSubscriptionsPlugin(preGeneratedTables?: Record<string, TableInfo>): import("postgraphile").Plugin;
|
|
30
|
+
export declare const UniversalSubscriptionsPlugin: import("postgraphile").Plugin;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=universal-subscriptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"universal-subscriptions.d.ts","sourceRoot":"","sources":["../src/universal-subscriptions.ts"],"names":[],"mappings":"AAIA,UAAU,SAAS;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,UAAU;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkDD;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAW7F;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,iCAyEhG;AAGD,eAAO,MAAM,4BAA4B,+BAAuC,CAAC"}
|
|
@@ -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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"}
|