UNPKG

tardis-machine

Version:

Locally runnable server with built-in data caching, providing both tick-level historical and consolidated real-time cryptocurrency market data via HTTP and WebSocket APIs

116 lines (100 loc) 2.96 kB
#!/usr/bin/env node process.env.UWS_HTTP_MAX_HEADERS_SIZE = '20000' import { createRequire } from 'node:module' const require = createRequire(import.meta.url) const yargs = require('yargs') const os = require('node:os') const path = require('node:path') const cluster = require('node:cluster') const numCPUs = os.cpus().length const isDocker = require('is-docker') const pkg = require('../package.json') const { TardisMachine } = await import('../dist/index.js') const DEFAULT_PORT = 8000 const argv = yargs .scriptName('tardis-machine') .env('TM_') .strict() .option('api-key', { type: 'string', describe: 'API key for tardis.dev API access' }) .option('cache-dir', { type: 'string', describe: 'Local cache dir path ', default: path.join(os.tmpdir(), '.tardis-cache') }) .option('clear-cache', { type: 'boolean', describe: 'Clear cache dir on startup', default: false }) .option('port', { type: 'number', describe: 'Port to bind server on', default: DEFAULT_PORT }) .option('cluster-mode', { type: 'boolean', describe: 'Run tardis-machine as cluster of Node.js processes', default: false }) .option('debug', { type: 'boolean', describe: 'Enable debug logs.', default: false }) .help() .version() .usage('$0 [options]') .example('$0 --api-key=YOUR_API_KEY') .epilogue('See https://docs.tardis.dev/api/tardis-machine for more information.') .detectLocale(false).argv // if port ENV is defined use it otherwise use provided options const port = process.env.PORT ? +process.env.PORT : argv['port'] const enableDebug = argv['debug'] if (enableDebug) { process.env.DEBUG = 'tardis-dev:machine*,tardis-dev:realtime*' } async function start() { const machine = new TardisMachine({ apiKey: argv['api-key'], cacheDir: argv['cache-dir'], clearCache: argv['clear-cache'] }) let suffix = '' const runAsCluster = argv['cluster-mode'] if (runAsCluster) { cluster.schedulingPolicy = cluster.SCHED_RR suffix = '(cluster mode)' if (cluster.isPrimary) { for (let i = 0; i < numCPUs; i++) { cluster.fork() } } else { await machine.start(port) } } else { await machine.start(port) } if (!cluster.isPrimary) { return } if (isDocker() && !process.env.RUNKIT_HOST) { console.log(`tardis-machine server v${pkg.version} is running inside Docker container ${suffix}`) } else { console.log(`tardis-machine server v${pkg.version} is running ${suffix}`) console.log(`HTTP port: ${port}`) console.log(`WS port: ${port + 1}`) } console.log(`See https://docs.tardis.dev/api/tardis-machine for more information.`) } start() process .on('unhandledRejection', (reason, p) => { console.error('Unhandled Rejection at Promise', reason, p) }) .on('uncaughtException', (err) => { console.error('Uncaught Exception thrown', err) process.exit(1) })