@0xobelisk/graphql-server
Version:
Tookit for interacting with dubhe graphql server
206 lines • 8.49 kB
JavaScript
#!/usr/bin/env node
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const yargs_1 = __importDefault(require("yargs"));
const helpers_1 = require("yargs/helpers");
const dotenv = __importStar(require("dotenv"));
const server_1 = require("./server");
const logger_1 = require("./utils/logger");
const package_json_1 = __importDefault(require("../package.json"));
// Load environment variables
dotenv.config();
// Helper function to get environment variable or default value
const getEnvOrDefault = (envKey, defaultValue) => {
return process.env[envKey] || defaultValue;
};
const getBooleanEnvOrDefault = (envKey, defaultValue) => {
const envValue = process.env[envKey];
if (envValue === undefined)
return defaultValue;
return envValue.toLowerCase() === 'true';
};
const cli = (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
.scriptName('dubhe-graphql-server')
.usage('$0 <command> [options]')
.version(package_json_1.default.version)
.help('help')
.alias('h', 'help')
.alias('v', 'version')
.demandCommand(1, 'You need to specify a command')
.recommendCommands()
.strict();
// Start command
cli.command('start', 'Start GraphQL server', (yargs) => {
return (yargs
.option('port', {
alias: 'p',
type: 'string',
default: getEnvOrDefault('PORT', '4000'),
describe: 'Server port (env: PORT)'
})
.option('database-url', {
alias: 'd',
type: 'string',
default: getEnvOrDefault('DATABASE_URL', 'postgres://postgres:postgres@127.0.0.1:5432/postgres'),
describe: 'Database connection URL (env: DATABASE_URL)'
})
.option('schema', {
alias: 's',
type: 'string',
default: getEnvOrDefault('PG_SCHEMA', 'public'),
describe: 'PostgreSQL schema name (env: PG_SCHEMA)'
})
.option('endpoint', {
alias: 'e',
type: 'string',
default: getEnvOrDefault('GRAPHQL_ENDPOINT', '/graphql'),
describe: 'GraphQL endpoint path (env: GRAPHQL_ENDPOINT)'
})
.option('cors', {
type: 'boolean',
default: getBooleanEnvOrDefault('ENABLE_CORS', true),
describe: 'Enable CORS (env: ENABLE_CORS)'
})
.option('subscriptions', {
type: 'boolean',
default: getBooleanEnvOrDefault('ENABLE_SUBSCRIPTIONS', true),
describe: 'Enable GraphQL subscriptions (env: ENABLE_SUBSCRIPTIONS)'
})
.option('env', {
type: 'string',
default: getEnvOrDefault('NODE_ENV', 'development'),
choices: ['development', 'production'],
describe: 'Environment mode (env: NODE_ENV)'
})
// Debug configuration
.option('debug', {
type: 'boolean',
default: getBooleanEnvOrDefault('DEBUG', false),
describe: 'Enable debug mode (verbose logging + query logs) (env: DEBUG)'
})
// Performance configuration
.option('query-timeout', {
type: 'number',
default: parseInt(getEnvOrDefault('QUERY_TIMEOUT', '30000')),
describe: 'GraphQL query timeout in milliseconds (env: QUERY_TIMEOUT)'
})
.option('max-connections', {
type: 'number',
default: parseInt(getEnvOrDefault('MAX_CONNECTIONS', '1000')),
describe: 'Maximum database connections (env: MAX_CONNECTIONS)'
})
.option('heartbeat-interval', {
type: 'number',
default: parseInt(getEnvOrDefault('HEARTBEAT_INTERVAL', '30000')),
describe: 'WebSocket heartbeat interval in milliseconds (env: HEARTBEAT_INTERVAL)'
})
.option('enable-metrics', {
type: 'boolean',
default: getBooleanEnvOrDefault('ENABLE_METRICS', false),
describe: 'Enable performance metrics (env: ENABLE_METRICS)'
})
// Subscription capabilities
.option('enable-live-queries', {
type: 'boolean',
default: getBooleanEnvOrDefault('ENABLE_LIVE_QUERIES', true),
describe: 'Enable GraphQL live queries (env: ENABLE_LIVE_QUERIES)'
})
.option('enable-pg-subscriptions', {
type: 'boolean',
default: getBooleanEnvOrDefault('ENABLE_PG_SUBSCRIPTIONS', true),
describe: 'Enable PostgreSQL subscriptions (env: ENABLE_PG_SUBSCRIPTIONS)'
})
.option('enable-native-websocket', {
type: 'boolean',
default: getBooleanEnvOrDefault('ENABLE_NATIVE_WEBSOCKET', true),
describe: 'Enable native WebSocket support (env: ENABLE_NATIVE_WEBSOCKET)'
})
.option('realtime-port', {
type: 'number',
default: process.env.REALTIME_PORT ? parseInt(process.env.REALTIME_PORT) : undefined,
describe: 'Realtime WebSocket port (env: REALTIME_PORT)'
})
.example('$0 start -p 4000 -d postgres://user:pass@localhost/db', 'Start server with custom port and database')
.example('$0 start --no-cors --no-subscriptions', 'Start server with CORS and subscriptions disabled')
.example('$0 start --debug', 'Start server in debug mode (verbose logging + notifications)')
.example('$0 start --debug --enable-metrics', 'Start server in debug mode with performance metrics'));
}, async (argv) => {
try {
logger_1.systemLogger.info('🚀 Starting Dubhe GraphQL server via CLI...', {
port: argv.port,
schema: argv.schema,
endpoint: argv.endpoint,
environment: argv.env
});
// Build server configuration object
const serverConfig = {
// Basic server configuration
port: argv.port,
databaseUrl: argv['database-url'],
schema: argv.schema,
endpoint: argv.endpoint,
cors: argv.cors,
subscriptions: argv.subscriptions,
env: argv.env,
// Debug configuration (explicit control)
debug: argv.debug,
// Performance configuration
queryTimeout: argv['query-timeout'],
maxConnections: argv['max-connections'],
heartbeatInterval: argv['heartbeat-interval'],
// Subscription capabilities
enableLiveQueries: argv['enable-live-queries'],
enablePgSubscriptions: argv['enable-pg-subscriptions'],
enableNativeWebSocket: argv['enable-native-websocket'],
realtimePort: argv['realtime-port'],
// Debug configuration (notifications only in development or when debug is enabled)
debugNotifications: argv.debug || argv.env === 'development',
enableMetrics: argv['enable-metrics']
};
// Pass configuration object directly to startServer
await (0, server_1.startServer)(serverConfig);
}
catch (error) {
logger_1.systemLogger.error('Failed to start server via CLI', error);
process.exit(1);
}
});
// Parse command line arguments
cli.parse();
//# sourceMappingURL=cli.js.map