From 303a74f8fd6bc949fc2e7c513f9c214f4f924ce7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Wed, 7 May 2025 17:14:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=83=8C=E5=8E=8B=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- launcher/NapCatWinBootMain.exe | Bin 35328 -> 35328 bytes src/shell/pipe.ts | 54 +++++++++++++++++++++++++++++++-- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/launcher/NapCatWinBootMain.exe b/launcher/NapCatWinBootMain.exe index 66f69e091b54acb7eda6c2cbe25fc31e45606b19..99a69b9e4663ffeff4325b9d88be4b555184b42a 100644 GIT binary patch delta 10493 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 { // 清除超时 clearTimeout(timeoutId); + // 优化网络性能设置 + pipeSocket.setNoDelay(true); // 减少延迟 + + // 设置更高的高水位线,允许更多数据缓冲 + logger.log(`[StdOut] 已重定向到命名管道: ${pipePath}`); + + // 创建拥有更优雅背压处理的 Writable 流 + const pipeWritable = new Writable({ + highWaterMark: 1024 * 64, // 64KB 高水位线 + write(chunk, encoding, callback) { + if (!pipeSocket.writable) { + // 如果管道不可写,退回到原始stdout + logger.log('[StdOut] 管道不可写,回退到控制台输出'); + return originalStdoutWrite(chunk, encoding, callback); + } + + // 尝试写入数据到管道 + const canContinue = pipeSocket.write(chunk, encoding, () => { + // 数据已被发送或放入内部缓冲区 + }); + + if (canContinue) { + // 如果返回true,表示可以继续写入更多数据 + // 立即通知写入流可以继续 + process.nextTick(callback); + } else { + // 如果返回false,表示内部缓冲区已满 + // 等待drain事件再恢复写入 + pipeSocket.once('drain', () => { + callback(); + }); + } + // 明确返回true,表示写入已处理 + return true; + } + }); + + // 重定向stdout process.stdout.write = ( chunk: any, encoding?: BufferEncoding | (() => void), @@ -40,8 +79,11 @@ export function connectToNamedPipe(logger: LogWrapper, timeoutMs: number = 5000) cb = encoding; encoding = undefined; } - return pipeSocket.write(chunk, encoding as BufferEncoding, cb); + + // 使用优化的writable流处理写入 + return pipeWritable.write(chunk, encoding as BufferEncoding, cb as () => void); }; + // 提供断开连接的方法 const disconnect = () => { process.stdout.write = originalStdoutWrite; @@ -53,6 +95,7 @@ export function connectToNamedPipe(logger: LogWrapper, timeoutMs: number = 5000) resolve({ disconnect }); }); + // 管道错误处理 pipeSocket.on('error', (err) => { clearTimeout(timeoutId); process.stdout.write = originalStdoutWrite; @@ -60,11 +103,18 @@ export function connectToNamedPipe(logger: LogWrapper, timeoutMs: number = 5000) reject(err); }); + // 管道关闭处理 pipeSocket.on('end', () => { process.stdout.write = originalStdoutWrite; logger.log('命名管道连接已关闭'); }); + // 确保在连接意外关闭时恢复stdout + pipeSocket.on('close', () => { + process.stdout.write = originalStdoutWrite; + logger.log('命名管道连接已关闭'); + }); + } catch (error) { clearTimeout(timeoutId); logger.log(`尝试连接命名管道 ${pipePath} 时发生异常:`, error);