Appearance
WebSocket Integration
Complete guide for integrating the SDK with WebSocket.
Basic Setup
typescript
import WebSocket from "ws";
import { AiFlowAssistant } from "@sipgate/ai-flow-sdk";
const wss = new WebSocket.Server({
port: 8080,
perMessageDeflate: false,
});
const assistant = AiFlowAssistant.create({
onUserSpeak: async (event) => {
return "Hello from WebSocket!";
},
});
wss.on("connection", (ws, req) => {
console.log("New WebSocket connection");
ws.on("message", assistant.ws(ws));
ws.on("error", (error) => {
console.error("WebSocket error:", error);
});
ws.on("close", () => {
console.log("WebSocket connection closed");
});
});
console.log("WebSocket server listening on port 8080");Complete Example
Here's a complete example with error handling and connection management:
typescript
import WebSocket from "ws";
import { AiFlowAssistant } from "@sipgate/ai-flow-sdk";
const wss = new WebSocket.Server({
port: 8080,
perMessageDeflate: false,
});
const assistant = AiFlowAssistant.create({
debug: true,
onSessionStart: async (event) => {
console.log(`Session started: ${event.session.id}`);
return "Welcome!";
},
onUserSpeak: async (event) => {
return processUserInput(event.text);
},
onSessionEnd: async (event) => {
console.log(`Session ended: ${event.session.id}`);
},
});
wss.on("connection", (ws, req) => {
console.log("New WebSocket connection from", req.socket.remoteAddress);
// Handle messages
ws.on("message", async (data) => {
try {
await assistant.ws(ws)(data);
} catch (error) {
console.error("Error processing message:", error);
ws.send(JSON.stringify({ error: "Internal server error" }));
}
});
// Error handling
ws.on("error", (error) => {
console.error("WebSocket error:", error);
});
// Connection cleanup
ws.on("close", (code, reason) => {
console.log(`Connection closed: ${code} - ${reason}`);
});
// Send welcome message
ws.send(JSON.stringify({ type: "connected" }));
});
console.log("WebSocket server listening on port 8080");Message Format
The SDK expects messages in JSON format:
typescript
{
"type": "session_start",
"session": {
"id": "uuid",
"account_id": "account-id",
"phone_number": "+1234567890",
// ...
}
}Custom Message Handling
You can handle messages manually:
typescript
wss.on("connection", (ws) => {
ws.on("message", async (data) => {
try {
const event = JSON.parse(data.toString());
const action = await assistant.onEvent(event);
if (action) {
ws.send(JSON.stringify(action));
}
} catch (error) {
console.error("Error:", error);
}
});
});Connection Management
Track active connections:
typescript
const connections = new Map();
wss.on("connection", (ws, req) => {
const connectionId = generateId();
connections.set(connectionId, ws);
ws.on("close", () => {
connections.delete(connectionId);
});
});Next Steps
- Express.js Integration - Express.js integration guide
- Examples - More integration examples