interface SSEEvent {
type: "chat_metadata" | "processing" | "visualization" | "message" | "error";
data: any;
}
async function sendChatMessage(
message: string,
integrationId: string,
token: string,
onEvent: (event: SSEEvent) => void
): Promise<void> {
const response = await fetch("https://api.trellis.sh/v1/chats", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
Accept: "text/event-stream",
},
body: JSON.stringify({
message,
integration_id: integrationId,
}),
});
const reader = response.body?.getReader();
const decoder = new TextDecoder();
let buffer = "";
while (reader) {
const { done, value } = await reader.read();
if (done) break;
buffer += decoder.decode(value, { stream: true });
const lines = buffer.split("\n");
buffer = lines.pop() || "";
let currentEvent = "";
for (const line of lines) {
if (line.startsWith("event: ")) {
currentEvent = line.slice(7);
} else if (line.startsWith("data: ") && currentEvent) {
const data = JSON.parse(line.slice(6));
onEvent({ type: currentEvent as SSEEvent["type"], data });
currentEvent = "";
}
}
}
}
// Usage
sendChatMessage(
"Show me top 10 customers by revenue",
"integration_id_here",
"your_token",
(event) => {
switch (event.type) {
case "chat_metadata":
console.log("New chat:", event.data.id);
break;
case "processing":
showLoadingIndicator();
break;
case "message":
displayMessage(event.data.content);
break;
case "error":
showError(event.data.error);
break;
}
}
);