@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.
Files changed (87) hide show
  1. package/.turbo/turbo-build.log +8 -0
  2. package/DUAL_POOL_CONFIG.md +188 -0
  3. package/Dockerfile +35 -0
  4. package/LICENSE +92 -0
  5. package/README.md +487 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +206 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/config/subscription-config.d.ts +80 -0
  11. package/dist/config/subscription-config.d.ts.map +1 -0
  12. package/dist/config/subscription-config.js +158 -0
  13. package/dist/config/subscription-config.js.map +1 -0
  14. package/dist/index.d.ts +1 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +11 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/plugins/all-fields-filter-plugin.d.ts +4 -0
  19. package/dist/plugins/all-fields-filter-plugin.d.ts.map +1 -0
  20. package/dist/plugins/all-fields-filter-plugin.js +132 -0
  21. package/dist/plugins/all-fields-filter-plugin.js.map +1 -0
  22. package/dist/plugins/database-introspector.d.ts +23 -0
  23. package/dist/plugins/database-introspector.d.ts.map +1 -0
  24. package/dist/plugins/database-introspector.js +96 -0
  25. package/dist/plugins/database-introspector.js.map +1 -0
  26. package/dist/plugins/enhanced-playground.d.ts +9 -0
  27. package/dist/plugins/enhanced-playground.d.ts.map +1 -0
  28. package/dist/plugins/enhanced-playground.js +113 -0
  29. package/dist/plugins/enhanced-playground.js.map +1 -0
  30. package/dist/plugins/enhanced-server-manager.d.ts +29 -0
  31. package/dist/plugins/enhanced-server-manager.d.ts.map +1 -0
  32. package/dist/plugins/enhanced-server-manager.js +262 -0
  33. package/dist/plugins/enhanced-server-manager.js.map +1 -0
  34. package/dist/plugins/index.d.ts +9 -0
  35. package/dist/plugins/index.d.ts.map +1 -0
  36. package/dist/plugins/index.js +26 -0
  37. package/dist/plugins/index.js.map +1 -0
  38. package/dist/plugins/postgraphile-config.d.ts +94 -0
  39. package/dist/plugins/postgraphile-config.d.ts.map +1 -0
  40. package/dist/plugins/postgraphile-config.js +138 -0
  41. package/dist/plugins/postgraphile-config.js.map +1 -0
  42. package/dist/plugins/query-filter.d.ts +4 -0
  43. package/dist/plugins/query-filter.d.ts.map +1 -0
  44. package/dist/plugins/query-filter.js +42 -0
  45. package/dist/plugins/query-filter.js.map +1 -0
  46. package/dist/plugins/simple-naming.d.ts +4 -0
  47. package/dist/plugins/simple-naming.d.ts.map +1 -0
  48. package/dist/plugins/simple-naming.js +79 -0
  49. package/dist/plugins/simple-naming.js.map +1 -0
  50. package/dist/plugins/welcome-page.d.ts +11 -0
  51. package/dist/plugins/welcome-page.d.ts.map +1 -0
  52. package/dist/plugins/welcome-page.js +203 -0
  53. package/dist/plugins/welcome-page.js.map +1 -0
  54. package/dist/server.d.ts +21 -0
  55. package/dist/server.d.ts.map +1 -0
  56. package/dist/server.js +265 -0
  57. package/dist/server.js.map +1 -0
  58. package/dist/universal-subscriptions.d.ts +32 -0
  59. package/dist/universal-subscriptions.d.ts.map +1 -0
  60. package/dist/universal-subscriptions.js +318 -0
  61. package/dist/universal-subscriptions.js.map +1 -0
  62. package/dist/utils/logger/index.d.ts +80 -0
  63. package/dist/utils/logger/index.d.ts.map +1 -0
  64. package/dist/utils/logger/index.js +230 -0
  65. package/dist/utils/logger/index.js.map +1 -0
  66. package/docker-compose.yml +46 -0
  67. package/eslint.config.mjs +3 -0
  68. package/package.json +78 -0
  69. package/src/cli.ts +232 -0
  70. package/src/config/subscription-config.ts +243 -0
  71. package/src/index.ts +11 -0
  72. package/src/plugins/README.md +138 -0
  73. package/src/plugins/all-fields-filter-plugin.ts +158 -0
  74. package/src/plugins/database-introspector.ts +126 -0
  75. package/src/plugins/enhanced-playground.ts +121 -0
  76. package/src/plugins/enhanced-server-manager.ts +314 -0
  77. package/src/plugins/index.ts +9 -0
  78. package/src/plugins/postgraphile-config.ts +182 -0
  79. package/src/plugins/query-filter.ts +50 -0
  80. package/src/plugins/simple-naming.ts +105 -0
  81. package/src/plugins/welcome-page.ts +218 -0
  82. package/src/server.ts +324 -0
  83. package/src/universal-subscriptions.ts +397 -0
  84. package/src/utils/logger/README.md +209 -0
  85. package/src/utils/logger/index.ts +275 -0
  86. package/sui-indexer-schema.graphql +3691 -0
  87. 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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"}