| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- /**
- * 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)
- }
- }
|