const path = require('path'); const { randomBytes } = require('crypto'); const { writeJson } = require('../shared/fs'); const { dataDir } = require('../shared/paths'); function getArg(flag, fallback) { const index = process.argv.indexOf(flag); if (index === -1 || index + 1 >= process.argv.length) { return fallback; } return process.argv[index + 1]; } function nowIso() { return new Date().toISOString(); } function randomTokenHex(bytes) { return randomBytes(bytes).toString('hex'); } async function registerNode({ nodeId, role, region, token }) { const createdAt = nowIso(); const nodeFile = path.join(dataDir, 'resources', 'nodes', `${nodeId}.json`); const tokenFile = path.join(dataDir, 'auth', 'nodes', `${nodeId}.json`); await writeJson(nodeFile, { id: nodeId, resource_type: 'node', schema_version: 'v1', desired_state: { enabled: true, labels: { role, region, }, }, current_state: {}, last_applied_state: {}, metadata: {}, created_at: createdAt, updated_at: createdAt, }); await writeJson(tokenFile, { node_id: nodeId, token, schema_version: 'v1', updated_at: createdAt, }); return { node_id: nodeId, token, node_file: nodeFile, token_file: tokenFile, }; } async function main() { const nodeId = getArg('--node-id', process.env.NODE_ID); const role = getArg('--role', process.env.NODE_ROLE || 'worker'); const region = getArg('--region', process.env.NODE_REGION || 'default'); const token = getArg('--token', process.env.NODE_TOKEN || randomTokenHex(32)); if (!nodeId) { throw new Error('Missing node id. Use --node-id or NODE_ID=.'); } const result = await registerNode({ nodeId, role, region, token }); process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); } if (require.main === module) { main().catch((error) => { process.stderr.write(`${error.message}\n`); process.exit(1); }); } module.exports = { registerNode, randomTokenHex, };