|
@@ -11,34 +11,9 @@ import pinia from "@/stores/index";
|
|
|
// @ts-ignore - Node.js require 在Electron环境中可用
|
|
// @ts-ignore - Node.js require 在Electron环境中可用
|
|
|
type NodeRequire = typeof require
|
|
type NodeRequire = typeof require
|
|
|
|
|
|
|
|
-// 使用 localStorage 来跨窗口共享服务器启动状态
|
|
|
|
|
-const SERVER_STARTED_KEY = 'generate_server_started'
|
|
|
|
|
-
|
|
|
|
|
-function isServerStarted(): boolean {
|
|
|
|
|
- try {
|
|
|
|
|
- return localStorage.getItem(SERVER_STARTED_KEY) === 'true'
|
|
|
|
|
- } catch {
|
|
|
|
|
- return false
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-function markServerStarted(): void {
|
|
|
|
|
- try {
|
|
|
|
|
- localStorage.setItem(SERVER_STARTED_KEY, 'true')
|
|
|
|
|
- } catch {
|
|
|
|
|
- // localStorage 不可用时的降级处理
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
export async function startGenerateServer( ) {
|
|
export async function startGenerateServer( ) {
|
|
|
setTimeout(() => {
|
|
setTimeout(() => {
|
|
|
|
|
|
|
|
- // 检查服务器是否已在其他窗口启动
|
|
|
|
|
- if (isServerStarted()) {
|
|
|
|
|
- console.log('[generateServer] server already started in another window')
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
// 仅在具有 Node 能力(Electron 渲染进程)时启动
|
|
// 仅在具有 Node 能力(Electron 渲染进程)时启动
|
|
|
const nodeRequire: NodeRequire | undefined = (window as any)?.require
|
|
const nodeRequire: NodeRequire | undefined = (window as any)?.require
|
|
|
if (!nodeRequire) {
|
|
if (!nodeRequire) {
|
|
@@ -49,48 +24,51 @@ export async function startGenerateServer( ) {
|
|
|
const PORT = appConfig?.PORT || 3001
|
|
const PORT = appConfig?.PORT || 3001
|
|
|
const http = nodeRequire('http')
|
|
const http = nodeRequire('http')
|
|
|
|
|
|
|
|
- // 标记服务器已启动(使用 localStorage 跨窗口共享)
|
|
|
|
|
- markServerStarted()
|
|
|
|
|
-
|
|
|
|
|
- http
|
|
|
|
|
- .createServer(async (req: any, res: any) => {
|
|
|
|
|
- // 仅支持 POST /generate
|
|
|
|
|
- if (req.method !== 'POST' || req.url !== '/generate') {
|
|
|
|
|
- res.statusCode = 404
|
|
|
|
|
- res.end('Not Found')
|
|
|
|
|
- return
|
|
|
|
|
|
|
+ const server = 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
|
|
|
|
|
+
|
|
|
|
|
+ // 简单的大小保护(500MB)
|
|
|
|
|
+ if (body.length > 500 * 1024 * 1024) {
|
|
|
|
|
+ res.statusCode = 413
|
|
|
|
|
+ res.end('Payload Too Large')
|
|
|
|
|
+ req.destroy()
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- let body = ''
|
|
|
|
|
- req.on('data', (chunk: any) => {
|
|
|
|
|
- body += chunk
|
|
|
|
|
-
|
|
|
|
|
- // 简单的大小保护(50MB)
|
|
|
|
|
- // 改成500
|
|
|
|
|
- if (body.length > 500 * 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`)
|
|
|
|
|
|
|
+
|
|
|
|
|
+ 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' }))
|
|
|
|
|
+ }
|
|
|
})
|
|
})
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ // 尝试启动服务器,如果端口被占用会自动失败
|
|
|
|
|
+ server.listen(PORT, () => {
|
|
|
|
|
+ console.log(`[generateServer] listening on http://localhost:${PORT}/generate`)
|
|
|
|
|
+ }).on('error', (err: any) => {
|
|
|
|
|
+ if (err.code === 'EADDRINUSE') {
|
|
|
|
|
+ console.log(`[generateServer] port ${PORT} already in use, skipping server start`)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ console.error('[generateServer] server start failed:', err.message)
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
}, 2000)
|
|
}, 2000)
|
|
|
}
|
|
}
|
|
|
|
|
|