UNPKG

@aj-archipelago/cortex

Version:

Cortex is a GraphQL API for AI. It provides a simple, extensible interface for using AI services from OpenAI, Azure and others.

74 lines (59 loc) 2 kB
import axios from 'axios'; // Connects to an SSE endpoint and resolves when [DONE] is received. // Calls onEvent for each parsed SSE message JSON. export async function connectToSSEEndpoint(baseUrl, endpoint, payload, onEvent) { return new Promise(async (resolve, reject) => { let sawDone = false; const timeout = setTimeout(() => { reject(new Error('SSE timeout waiting for [DONE]')); }, 20000); // 20 second timeout try { const instance = axios.create({ baseURL: baseUrl, responseType: 'stream', }); const response = await instance.post(endpoint, payload); const responseData = response.data; const incomingMessage = Array.isArray(responseData) && responseData.length > 0 ? responseData[0] : responseData; let eventCount = 0; incomingMessage.on('data', data => { const events = data.toString().split('\n'); events.forEach(event => { if (event.trim() === '') return; eventCount++; if (event.trim() === 'data: [DONE]') { sawDone = true; clearTimeout(timeout); resolve(); return; } const message = event.replace(/^data: /, ''); try { const messageJson = JSON.parse(message); onEvent && onEvent(messageJson); } catch (_err) { // ignore lines that are not JSON } }); }); // If the underlying stream ends without a [DONE], treat as failure incomingMessage.on('end', () => { if (!sawDone) { clearTimeout(timeout); reject(new Error('SSE stream ended without [DONE]')); } }); incomingMessage.on('close', () => { if (!sawDone) { clearTimeout(timeout); reject(new Error('SSE stream closed without [DONE]')); } }); } catch (error) { clearTimeout(timeout); reject(error); } }); }