#!/usr/bin/env node import { startServer, DEFAULT_BOARD } from './serve.mjs'; import { busReader } from './bus.mjs'; import { loadSystem, socketPath } from '../../cli/src/config.mjs'; import { ID_PATTERN } from '../../business/src/vocabulary.mjs'; const args = process.argv.slice(2); const usage = 'node packages/webui/src/cli.mjs serve [--port N] [--board http://127.0.0.1:7331] [--business ID]'; try { if (args.length === 1 && ['--help', '-h'].includes(args[0])) { console.log(usage); process.exit(0); } if (args.shift() !== 'serve') throw new Error(usage); const options = { board: DEFAULT_BOARD, port: 7330 }; while (args.length) { const flag = args.shift(), value = args.shift(); if (!value) throw new Error(`missing value for ${flag}`); if (flag === '--port') { if (!/^\d+$/.test(value) || Number(value) > 65535) throw new Error('port must be 0..65535'); options.port = Number(value); } else if (flag === '--board') options.board = value; else if (flag === '--business') { if (!ID_PATTERN.test(value)) throw new Error('business must be a business id'); options.business = value; } else throw new Error(`unknown option: ${flag}`); } // The bus views (slice 1 S5) need the system config. Without it the // board still serves and the bus routes answer not-configured. let bus = null, busLine; try { const { dataRoot } = loadSystem(); bus = busReader({ dataRoot, socket: socketPath(dataRoot), business: options.business ?? null }); busLine = `Bus: ${options.business ?? 'the running bus host\'s business'}`; } catch (err) { busLine = `Bus: not configured (${err.message})`; } const server = await startServer({ board: options.board, port: options.port, bus }); console.log(`Mosaic Console: http://127.0.0.1:${server.address().port}/\nBoard: ${options.board}\n${busLine}\nCtrl-C stops this server.`); for (const signal of ['SIGINT', 'SIGTERM']) process.once(signal, () => server.close()); } catch (err) { console.error(`refused: ${err.message}`); process.exitCode = 2; }