@simplepg/dservice
Version:
JavaScript implementation of the SimplePage backend service
135 lines (119 loc) • 4.42 kB
JavaScript
import { Command, Option } from 'commander'
import { DService } from '../src/dservice.js'
import { handleListCommand } from '../src/listCommand.js'
import { handleIndexerDataCommand } from '../src/indexerDataCommand.js'
import packageJson from '../package.json' with { type: 'json' }
const program = new Command()
const startServer = () => {
// Only start the server if no subcommands were used
if (process.argv.length > 2) {
// Check if the second argument is a subcommand
const subcommands = ['allow-list', 'block-list'];
if (subcommands.includes(process.argv[2])) {
return; // Don't start server if a subcommand is being used
}
}
const opts = program.opts()
// Pass TLS file paths if provided
let tls = undefined
if (opts.tlsKey && opts.tlsCert) {
tls = {
key: opts.tlsKey,
cert: opts.tlsCert
}
}
const config = {
version: packageJson.version,
ipfs: {
api: opts.ipfsApi,
},
api: {
port: parseInt(opts.apiPort),
host: opts.apiHost,
tls // Pass TLS file paths if present
},
blockchain: {
rpcUrl: opts.rpc,
startBlock: parseInt(opts.startBlock),
chainId: parseInt(opts.chainId),
disableIndexing: opts.disableIndexing,
universalResolver: opts.universalResolver,
simplePageAddress: opts.simplepage
},
logLevel: opts.logLevel,
silent: opts.silent,
logDir: opts.logDir
}
console.log('Starting SimplePage DService...')
console.log('Configuration:', {
ipfsApi: config.ipfs.api,
apiPort: config.api.port,
apiHost: config.api.host,
rpcUrl: config.blockchain.rpcUrl,
logLevel: config.logLevel,
logDir: config.logDir
})
const dservice = new DService(config)
// Handle graceful shutdown
const shutdown = async () => {
console.log('\nShutting down gracefully...')
try {
await dservice.stop()
console.log('DService stopped successfully')
process.exit(0)
} catch (error) {
console.error('Error during shutdown:', error)
process.exit(1)
}
}
// Listen for shutdown signals
process.on('SIGINT', shutdown)
process.on('SIGTERM', shutdown)
// Start the service
dservice.start().catch((error) => {
console.error('Failed to start DService:', error.message)
process.exit(1)
})
}
program
.version(packageJson.version)
.option('-i, --ipfs-api <url>', 'IPFS API URL', 'http://localhost:5001')
.option('-p, --api-port <number>', 'API port', '3000')
.option('-a, --api-host <string>', 'API host', 'localhost')
.option('-r, --rpc <url>', 'Ethereum RPC URL', 'http://localhost:8545')
.option('-b, --start-block <number>', 'Starting block number for indexing')
.option('-c, --chain-id <number>', 'Chain ID')
.option('-d, --disable-indexing', 'Disable indexing')
.option('-l, --log-level <level>', 'Stdout log level (error, warn, info, debug)', 'info')
.option('--silent', 'Disable console logging')
.option('--log-dir <path>', 'Log directory path', './logs')
.option('--tls-key <path>', 'Path to TLS private key (PEM)')
.option('--tls-cert <path>', 'Path to TLS certificate (PEM)')
.addOption(new Option('-u, --universal-resolver <address>', 'ENS Universal Resolver address (optional)').hideHelp())
.addOption(new Option('-s, --simplepage <address>', 'SimplePage address (optional)').hideHelp())
.action(startServer)
// Add allow-list command
program
.command('allow-list')
.description('Manage allow list')
.argument('<action>', 'Action to perform (show|add|rm)')
.argument('[name]', 'ENS domain to add or remove (e.g., example.eth)')
.action((action, name) => handleListCommand('allow', action, name, program.opts().ipfsApi))
// Add block-list command
program
.command('block-list')
.description('Manage block list')
.argument('<action>', 'Action to perform (show|add|rm)')
.argument('[name]', 'ENS domain to add or remove (e.g., example.eth)')
.action((action, name) => handleListCommand('block', action, name, program.opts().ipfsApi))
// Add indexer-data command
program
.command('indexer-data')
.description('Show or reset indexing-related data (domains, resolvers, contenthash_{domain} lists)')
.argument('<action>', 'Action to perform (show|reset)')
.action((action) => {
const opts = program.opts();
handleIndexerDataCommand(action, opts.ipfsApi);
});
program.parse()