* 处理流式响应
(
reader: ReadableStreamDefaultReader<Uint8Array>,
parser: ReturnType<typeof createParser>,
event: Electron.IpcMainInvokeEvent,
eventChannel: string,
fullResponse: { value: string },
fullReasoning: { value: string }
)
| 244 | * 处理流式响应 |
| 245 | */ |
| 246 | private async processStreamResponse( |
| 247 | reader: ReadableStreamDefaultReader<Uint8Array>, |
| 248 | parser: ReturnType<typeof createParser>, |
| 249 | event: Electron.IpcMainInvokeEvent, |
| 250 | eventChannel: string, |
| 251 | fullResponse: { value: string }, |
| 252 | fullReasoning: { value: string } |
| 253 | ): Promise<void> { |
| 254 | const decoder = new TextDecoder() |
| 255 | |
| 256 | try { |
| 257 | while (true) { |
| 258 | const { done, value } = await reader.read() |
| 259 | if (done) break |
| 260 | |
| 261 | const chunk = decoder.decode(value, { stream: true }) |
| 262 | parser.feed(chunk) |
| 263 | } |
| 264 | |
| 265 | this.sendComplete(event, eventChannel, fullResponse.value, fullReasoning.value) |
| 266 | } catch (error) { |
| 267 | if (error instanceof Error && error.name === 'AbortError') { |
| 268 | this.sendComplete(event, eventChannel, fullResponse.value, fullReasoning.value) |
| 269 | } else { |
| 270 | this.sendError( |
| 271 | event, |
| 272 | eventChannel, |
| 273 | error instanceof Error ? error.message : 'Unknown error' |
| 274 | ) |
| 275 | } |
| 276 | } |
| 277 | } |
| 278 | |
| 279 | public async sendMessageStreaming( |
| 280 | event: Electron.IpcMainInvokeEvent, |
no test coverage detected