/** * Lightweight HTTP bridge for image generation. * Listens on port 3001 (POST /generate) and returns base64 slices. * Runs only when Node integration is available (Electron renderer). */ import { generateImagesBase64 } from '@/views/components/marketingEdit/generateImagesRender' type NodeRequire = typeof require let started = false export function startGenerateServer() { if (started) return // 仅在具有 Node 能力(Electron 渲染进程)时启动 const nodeRequire: NodeRequire | undefined = (window as any)?.require if (!nodeRequire) { return } const http = nodeRequire('http') const PORT = 3001 started = true http .createServer(async (req: any, res: any) => { // 仅支持 POST /generate if (req.method !== 'POST' || req.url !== '/generate') { res.statusCode = 404 res.end('Not Found') return } let body = '' req.on('data', (chunk: any) => { body += chunk // 简单的大小保护(50MB) if (body.length > 50 * 1024 * 1024) { res.statusCode = 413 res.end('Payload Too Large') req.destroy() } }) req.on('end', async () => { res.setHeader('Content-Type', 'application/json') try { const payload = body ? JSON.parse(body) : {} const canvasList = payload.canvasList || [] const goodsList = payload.goodsList || [] const { images, plans } = await generateImagesBase64(canvasList, goodsList) res.end(JSON.stringify({ code: 0, images, plans })) } catch (e: any) { res.statusCode = 500 res.end(JSON.stringify({ code: 1, msg: e?.message || 'generate failed' })) } }) }) .listen(PORT, () => { console.log(`[generateServer] listening on http://localhost:${PORT}/generate`) }) } // 自动启动(在 Electron 渲染进程) if (typeof window !== 'undefined') { try { startGenerateServer() } catch (e) { console.warn('[generateServer] start failed', e) } }