generateServer.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /**
  2. * Lightweight HTTP bridge for image generation.
  3. * Listens on port 3001 (POST /generate) and returns base64 slices.
  4. * Runs only when Node integration is available (Electron renderer).
  5. */
  6. import { generateImagesBase64 } from '@/views/components/marketingEdit/generateImagesRender'
  7. type NodeRequire = typeof require
  8. let started = false
  9. export function startGenerateServer() {
  10. if (started) return
  11. // 仅在具有 Node 能力(Electron 渲染进程)时启动
  12. const nodeRequire: NodeRequire | undefined = (window as any)?.require
  13. if (!nodeRequire) {
  14. return
  15. }
  16. const http = nodeRequire('http')
  17. const PORT = 3001
  18. started = true
  19. http
  20. .createServer(async (req: any, res: any) => {
  21. // 仅支持 POST /generate
  22. if (req.method !== 'POST' || req.url !== '/generate') {
  23. res.statusCode = 404
  24. res.end('Not Found')
  25. return
  26. }
  27. let body = ''
  28. req.on('data', (chunk: any) => {
  29. body += chunk
  30. // 简单的大小保护(50MB)
  31. if (body.length > 50 * 1024 * 1024) {
  32. res.statusCode = 413
  33. res.end('Payload Too Large')
  34. req.destroy()
  35. }
  36. })
  37. req.on('end', async () => {
  38. res.setHeader('Content-Type', 'application/json')
  39. try {
  40. const payload = body ? JSON.parse(body) : {}
  41. const canvasList = payload.canvasList || []
  42. const goodsList = payload.goodsList || []
  43. const { images, plans } = await generateImagesBase64(canvasList, goodsList)
  44. res.end(JSON.stringify({ code: 0, images, plans }))
  45. } catch (e: any) {
  46. res.statusCode = 500
  47. res.end(JSON.stringify({ code: 1, msg: e?.message || 'generate failed' }))
  48. }
  49. })
  50. })
  51. .listen(PORT, () => {
  52. console.log(`[generateServer] listening on http://localhost:${PORT}/generate`)
  53. })
  54. }
  55. // 自动启动(在 Electron 渲染进程)
  56. if (typeof window !== 'undefined') {
  57. try {
  58. startGenerateServer()
  59. } catch (e) {
  60. console.warn('[generateServer] start failed', e)
  61. }
  62. }