( response: Response, libraryName: string, onEvent?: (event: GenerateStreamEvent) => void )
| 184 | } |
| 185 | |
| 186 | async function handleGenerateResponse( |
| 187 | response: Response, |
| 188 | libraryName: string, |
| 189 | onEvent?: (event: GenerateStreamEvent) => void |
| 190 | ): Promise<GenerateSkillResponse> { |
| 191 | if (!response.ok) { |
| 192 | const errorData = await response.json().catch(() => ({})); |
| 193 | return { |
| 194 | content: "", |
| 195 | libraryName, |
| 196 | error: (errorData as { message?: string }).message || `HTTP error ${response.status}`, |
| 197 | }; |
| 198 | } |
| 199 | |
| 200 | const reader = response.body?.getReader(); |
| 201 | if (!reader) { |
| 202 | return { content: "", libraryName, error: "No response body" }; |
| 203 | } |
| 204 | |
| 205 | const decoder = new TextDecoder(); |
| 206 | let content = ""; |
| 207 | let finalLibraryName = libraryName; |
| 208 | let error: string | undefined; |
| 209 | let buffer = ""; // Buffer for incomplete lines across chunks |
| 210 | |
| 211 | while (true) { |
| 212 | const { done, value } = await reader.read(); |
| 213 | if (done) break; |
| 214 | |
| 215 | const chunk = decoder.decode(value, { stream: true }); |
| 216 | buffer += chunk; |
| 217 | |
| 218 | // Split by newline but keep track of incomplete lines |
| 219 | const lines = buffer.split("\n"); |
| 220 | // Keep the last element (may be incomplete) in the buffer |
| 221 | buffer = lines.pop() || ""; |
| 222 | |
| 223 | for (const line of lines) { |
| 224 | const trimmedLine = line.trim(); |
| 225 | if (!trimmedLine) continue; |
| 226 | |
| 227 | try { |
| 228 | const data = JSON.parse(trimmedLine) as GenerateStreamEvent; |
| 229 | |
| 230 | if (onEvent) { |
| 231 | onEvent(data); |
| 232 | } |
| 233 | |
| 234 | if (data.type === "complete") { |
| 235 | content = data.content || ""; |
| 236 | finalLibraryName = data.libraryName || libraryName; |
| 237 | } else if (data.type === "error") { |
| 238 | error = data.message; |
| 239 | } |
| 240 | } catch { |
| 241 | // Ignore malformed JSON lines |
| 242 | } |
| 243 | } |
no outgoing calls
no test coverage detected