From a34f3cf240f58cd89f76022a8e6eb7a34c16f0f1 Mon Sep 17 00:00:00 2001 From: cocos02 Date: Mon, 15 Jun 2026 11:36:50 +0800 Subject: [PATCH] fix: prevent double response with responded guard in spawn handlers --- vite.config.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/vite.config.ts b/vite.config.ts index 3288c62..2c7522e 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -67,15 +67,20 @@ function apiSavePlugin() { let stdout = '' let stderr = '' + let responded = false child.stdout.on('data', (d: Buffer) => stdout += d.toString()) child.stderr.on('data', (d: Buffer) => stderr += d.toString()) - child.on('error', (err) => { + child.on('error', () => { + if (responded) return + responded = true res.writeHead(503) res.end(JSON.stringify({ error: 'opencode 未安装,请运行 npm install' })) }) child.on('close', async (code) => { + if (responded) return + responded = true if (code !== 0) { res.writeHead(500) res.end(JSON.stringify({ error: 'opencode exited with code ' + code, stderr })) @@ -131,12 +136,17 @@ function apiSavePlugin() { try { const child = spawn('npx', ['opencode', 'session', 'list', '--format', 'json'], { timeout: 5000 }) let stdout = '' + let responded = false child.stdout.on('data', (d: Buffer) => stdout += d.toString()) child.on('error', () => { + if (responded) return + responded = true res.writeHead(200, { 'Content-Type': 'application/json' }) res.end('[]') }) child.on('close', () => { + if (responded) return + responded = true res.writeHead(200, { 'Content-Type': 'application/json' }) res.end(stdout || '[]') })