/** * @description 开发启动脚本:为 Vite 与本地登录代理生成同一实例标识,便于前端按实例发现对应代理端口。 */ import { spawn } from 'node:child_process'; import { randomUUID } from 'node:crypto'; import { dirname, resolve } from 'node:path'; import process from 'node:process'; import { fileURLToPath } from 'node:url'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const pkgRoot = resolve(__dirname, '..'); const cliArgs = process.argv.slice(2); const modeFlagIndex = cliArgs.findIndex(arg => arg === '--mode'); const modeArg = modeFlagIndex >= 0 ? String(cliArgs[modeFlagIndex + 1] || '').trim() : ''; const mode = modeArg || String(process.env.BUSINESS_RULES_MODE || 'dev').trim() || 'dev'; const instanceId = process.env.LOCAL_AUTH_INSTANCE_ID || `lcdp-local-auth-${randomUUID()}`; /** * @description 终止子进程。 * @param {import('node:child_process').ChildProcess | null} child 子进程。 */ function stopChild(child) { if (!child || child.killed) { return; } child.kill('SIGTERM'); } const sharedEnv = { ...process.env, BUSINESS_RULES_MODE: mode, LOCAL_AUTH_INSTANCE_ID: instanceId, VITE_LOCAL_AUTH_INSTANCE_ID: instanceId, }; console.log(`[dev-local-auth] mode: ${mode}`); console.log(`[dev-local-auth] local auth instance: ${instanceId}`); const children = /** @type {import('node:child_process').ChildProcess[]} */ ([]); let shuttingDown = false; function shutdownAll() { if (shuttingDown) { return; } shuttingDown = true; for (const child of children) { stopChild(child); } } for (const signal of ['SIGINT', 'SIGTERM']) { process.on(signal, () => { shutdownAll(); }); } const viteChild = spawn('node', ['./scripts/dev-vite.mjs', '--mode', mode], { cwd: pkgRoot, env: sharedEnv, stdio: 'inherit', }); children.push(viteChild); const authChild = spawn('node', ['./scripts/local-auth-proxy.mjs', '--mode', mode], { cwd: pkgRoot, env: sharedEnv, stdio: 'inherit', }); children.push(authChild); const exitCode = await new Promise((resolvePromise, rejectPromise) => { const handleChildError = (error) => { shutdownAll(); rejectPromise(error); }; for (const child of children) { child.on('error', handleChildError); } const handleExit = (name, code, signal) => { shutdownAll(); if (signal) { resolvePromise(1); return; } resolvePromise(code ?? 0); }; viteChild.on('exit', (code, signal) => handleExit('vite', code, signal)); authChild.on('exit', (code, signal) => handleExit('local-auth', code, signal)); }); process.exit(exitCode);