Skip to content

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