| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| export async function postWithSSE(url, body, callbacks) { |
| const { onMessage, onError } = callbacks; |
|
|
| try { |
| const response = await fetch(url, { |
| method: 'POST', |
| headers: { |
| 'Content-Type': 'application/json', |
| 'Accept': 'text/event-stream' |
| }, |
| body: JSON.stringify(body), |
| }); |
|
|
| if (!response.ok) { |
| throw new Error(`HTTP error! status: ${response.status}`); |
| } |
|
|
| if (!response.body) { |
| throw new Error('Response body is null.'); |
| } |
|
|
| const reader = response.body.getReader(); |
| const decoder = new TextDecoder(); |
| let buffer = ''; |
|
|
| while (true) { |
| const { value, done } = await reader.read(); |
|
|
| |
| |
| const chunk = decoder.decode(value, { stream: true }); |
| buffer += chunk; |
|
|
| |
| |
| |
| let boundary; |
| while ((boundary = buffer.indexOf('\n\n')) !== -1) { |
| const messageString = buffer.substring(0, boundary); |
| buffer = buffer.substring(boundary + 2); |
|
|
| |
| if (messageString.trim() === '') { |
| continue; |
| } |
|
|
| |
| |
| if (messageString.startsWith('data:')) { |
| const jsonData = messageString.substring('data: '.length); |
| try { |
| const parsedData = JSON.parse(jsonData); |
| if (parsedData.status === "complete") |
| return parsedData; |
| else |
| onMessage(parsedData); |
| } catch (e) { |
| console.error("Failed to parse JSON from SSE message:", jsonData, e); |
| |
| if (onError) onError(new Error("Failed to parse JSON from SSE message.")); |
| } |
| } |
| } |
| } |
| } catch (error) { |
| throw error; |
| } |
| } |