New protocol version released: This page may contain outdated information.
API Reference
Complete reference documentation for the HAIP Server API, including all methods, events, and configuration options.
Server Class
HAIPServer
The main server class that handles all HAI Protocol operations.
import { HAIPServer } from "./src/server";
const server = new HAIPServer(config);
Constructor
constructor(config: Partial<HAIPServerConfig> = {})
Parameters:
config - Configuration object (optional)
Returns: HAIPServer instance
Example:
const server = new HAIPServer({
port: 8080,
host: "0.0.0.0",
jwtSecret: "your-secret-key",
maxConnections: 1000,
});
Configuration
HAIPServerConfig
interface HAIPServerConfig {
// Basic settings
port: number;
host: string;
jwtSecret: string;
jwtExpiresIn: string;
// Connection limits
maxConnections: number;
heartbeatInterval: number;
heartbeatTimeout: number;
// Flow control
flowControl: FlowControlConfig;
// Run management
maxConcurrentRuns: number;
replayWindowSize: number;
replayWindowTime: number;
// Feature toggles
enableCORS: boolean;
enableCompression: boolean;
enableLogging: boolean;
}
FlowControlConfig
interface FlowControlConfig {
enabled: boolean;
initialCredits: number;
minCredits: number;
maxCredits: number;
creditThreshold: number;
backPressureThreshold: number;
adaptiveAdjustment: boolean;
initialCreditMessages: number;
initialCreditBytes: number;
}
Public Methods
start()
Start the server and begin accepting connections.
Example:
stop()
Stop the server and close all connections.
Example:
Register a new tool with the server.
registerTool(tool: HAIPToolDefinition): void
Parameters:
tool - Tool definition object
Example:
server.registerTool({
name: "calculator",
description: "Perform mathematical operations",
inputSchema: {
type: "object",
properties: {
operation: { type: "string" },
a: { type: "number" },
b: { type: "number" },
},
required: ["operation", "a", "b"],
},
outputSchema: {
type: "object",
properties: {
result: { type: "number" },
},
},
});
Remove a tool from the server.
unregisterTool(toolName: string): void
Parameters:
toolName - Name of the tool to remove
Example:
server.unregisterTool("calculator");
Get all registered tools.
getTools(): HAIPToolDefinition[]
Returns: Array of tool definitions
Example:
const tools = server.getTools();
console.log(
"Available tools:",
tools.map((t) => t.name)
);
getSession()
Get a specific session by ID.
getSession(sessionId: string): HAIPSession | undefined
Parameters:
sessionId - Session identifier
Returns: Session object or undefined
Example:
const session = server.getSession("session-123");
if (session) {
console.log("Session user:", session.userId);
console.log("Connected:", session.connected);
}
getStats()
Get current server statistics.
getStats(): HAIPServerStats
Returns: Server statistics object
Example:
const stats = server.getStats();
console.log("Active connections:", stats.activeConnections);
console.log("Total messages:", stats.totalMessages);
console.log("Error rate:", stats.errorRate);
broadcast()
Send a message to all connected sessions.
broadcast(message: HAIPMessage): void
Parameters:
message - HAIP message to broadcast
Example:
const notification = HAIPServerUtils.createTextMessageStart("broadcast", {
message_id: "notification-1",
content_type: "text/plain",
});
server.broadcast(notification);
sendMessage()
Send a message to a specific session.
sendMessage(sessionId: string, message: HAIPMessage): void
Parameters:
sessionId - Target session ID
message - HAIP message to send
Example:
const response = HAIPServerUtils.createPongMessage(sessionId, {
nonce: "test-nonce",
});
server.sendMessage(sessionId, response);
Send a tool completion message to a session.
sendToolDone(sessionId: string, callId: string, status: string, result?: any): void
Parameters:
sessionId - Target session ID
callId - Tool call identifier
status - Completion status (‘OK’, ‘ERROR’, ‘CANCELLED’)
result - Tool result (optional)
Example:
server.sendToolDone(sessionId, "call-123", "OK", {
result: 42,
});
closeAllConnections()
Close all WebSocket connections.
closeAllConnections(): void
Example:
server.closeAllConnections();
Events
The HAIPServer extends EventEmitter and emits various events.
Server Events
’started’
Emitted when the server starts successfully.
server.on("started", () => {
console.log("Server started successfully");
});
‘stopped’
Emitted when the server stops.
server.on("stopped", () => {
console.log("Server stopped");
});
Connection Events
’connect’
Emitted when a new client connects.
server.on("connect", (sessionId: string) => {
const session = server.getSession(sessionId);
console.log(`User ${session?.userId} connected with session ${sessionId}`);
});
‘disconnect’
Emitted when a client disconnects.
server.on("disconnect", (sessionId: string) => {
const session = server.getSession(sessionId);
console.log(`User ${session?.userId} disconnected from session ${sessionId}`);
});
‘handshake’
Emitted when a client completes handshake.
server.on("handshake", (sessionId: string, payload: HAIPHandshakePayload) => {
console.log(`Handshake completed for session ${sessionId}`);
console.log("HAIP version:", payload.haip_version);
});
Message Events
’textMessage’
Emitted when a text message is received.
server.on("textMessage", (sessionId: string, message: HAIPMessage) => {
console.log(`Text message from ${sessionId}:`, message.payload);
});
‘audioChunk’
Emitted when an audio chunk is received.
server.on("audioChunk", (sessionId: string, message: HAIPMessage) => {
console.log(`Audio chunk from ${sessionId}:`, message.payload);
});
‘binary’
Emitted when binary data is received.
server.on("binary", (sessionId: string, data: Buffer) => {
console.log(`Binary data from ${sessionId}:`, data.length, "bytes");
});
Run Events
’runStarted’
Emitted when a run starts.
server.on("runStarted", (sessionId: string, run: HAIPRun) => {
console.log(`Run started: ${run.runId} by session ${sessionId}`);
});
‘runFinished’
Emitted when a run finishes.
server.on("runFinished", (sessionId: string, run: HAIPRun) => {
console.log(`Run finished: ${run.runId} with status ${run.status}`);
});
‘runCancelled’
Emitted when a run is cancelled.
server.on("runCancelled", (sessionId: string, run: HAIPRun) => {
console.log(`Run cancelled: ${run.runId} by session ${sessionId}`);
});
Emitted when a tool is called.
server.on("toolCall", (sessionId: string, execution: HAIPToolExecution) => {
console.log(`Tool call: ${execution.toolName} by session ${sessionId}`);
console.log("Arguments:", execution.arguments);
});
Error Events
’error’
Emitted when an error occurs.
server.on("error", (error: Error) => {
console.error("Server error:", error);
});
HTTP Endpoints
Health Check
Endpoint: GET /health
Response:
{
"status": "ok",
"uptime": 12345,
"activeConnections": 5,
"totalConnections": 25
}
Statistics
Endpoint: GET /stats
Response:
{
"totalConnections": 25,
"activeConnections": 5,
"totalMessages": 1250,
"messagesPerSecond": 2.5,
"averageLatency": 15,
"errorRate": 0.02,
"uptime": 12345
}
WebSocket Endpoints
WebSocket Connection
Endpoint: ws://localhost:8080/haip/websocket?token=<jwt-token>
Parameters:
token - JWT authentication token (required)
Example:
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...";
const ws = new WebSocket(`ws://localhost:8080/haip/websocket?token=${token}`);
SSE Endpoints
Server-Sent Events
Endpoint: GET /haip/sse?token=<jwt-token>
Parameters:
token - JWT authentication token (required)
Example:
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...";
const eventSource = new EventSource(
`http://localhost:8080/haip/sse?token=${token}`
);
HTTP Streaming Endpoints
HTTP Streaming
Endpoint: POST /haip/stream
Headers:
Authorization: Bearer <jwt-token> (required)
Content-Type: application/json
Example:
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...";
const response = await fetch("http://localhost:8080/haip/stream", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify(handshakeMessage),
});
Types
HAIPSession
interface HAIPSession {
id: string;
userId: string;
connected: boolean;
handshakeCompleted: boolean;
lastActivity: number;
credits: Map<HAIPChannel, number>;
byteCredits: Map<HAIPChannel, number>;
pausedChannels: Set<HAIPChannel>;
lastAck: string;
lastDeliveredSeq: string;
replayWindow: Map<string, HAIPMessage>;
activeRuns: Set<string>;
pendingMessages: Map<string, HAIPMessage>;
ws?: WebSocket;
sseResponse?: any;
httpResponse?: any;
}
HAIPServerStats
interface HAIPServerStats {
totalConnections: number;
activeConnections: number;
totalMessages: number;
messagesPerSecond: number;
averageLatency: number;
errorRate: number;
uptime: number;
}
HAIPRun
interface HAIPRun {
runId: string;
threadId?: string;
status: "active" | "finished" | "cancelled" | "error";
startTime: number;
endTime?: number;
metadata?: any;
summary?: any;
error?: any;
}
interface HAIPToolExecution {
callId: string;
toolName: string;
arguments: any;
status: "pending" | "running" | "completed" | "cancelled" | "error";
startTime: number;
endTime?: number;
result?: any;
progress?: number;
partial?: any;
}
interface HAIPToolDefinition {
name: string;
description: string;
inputSchema: object; // JSON Schema
outputSchema: object; // JSON Schema
execute?: (
params: any,
sessionId?: string,
callId?: string,
server?: HAIPServer
) => Promise<any>;
}
Error Codes
Authentication Errors
INVALID_TOKEN - JWT token is invalid or expired
MISSING_TOKEN - JWT token is required but not provided
Message Errors
INVALID_MESSAGE - Message format is invalid
UNSUPPORTED_TYPE - Message type is not supported
TOOL_NOT_FOUND - Requested tool does not exist
TOOL_EXECUTION_ERROR - Tool execution failed
Flow Control Errors
INSUFFICIENT_CREDITS - Not enough credits for the channel
CHANNEL_PAUSED - Channel is paused
Run Errors
MISSING_RUN_ID - Run ID is required but not provided
RUN_NOT_FOUND - Run does not exist
MAX_RUNS_EXCEEDED - Maximum concurrent runs exceeded
Environment Variables
Required
JWT_SECRET - Secret key for JWT token signing
Optional
PORT - Server port (default: 8080)
HOST - Server host (default: 0.0.0.0)
NODE_ENV - Environment (development/production)
JWT_EXPIRES_IN - JWT expiration time (default: 24h)
MAX_CONNECTIONS - Maximum connections (default: 1000)
HEARTBEAT_INTERVAL - Heartbeat interval in ms (default: 30000)
HEARTBEAT_TIMEOUT - Heartbeat timeout in ms (default: 5000)
ENABLE_CORS - Enable CORS (default: true)
ENABLE_COMPRESSION - Enable compression (default: true)
ENABLE_LOGGING - Enable logging (default: true)
Flow Control
FLOW_CONTROL_ENABLED - Enable flow control (default: true)
FLOW_CONTROL_INITIAL_CREDITS - Initial credits (default: 1000)
FLOW_CONTROL_MIN_CREDITS - Minimum credits (default: 100)
FLOW_CONTROL_MAX_CREDITS - Maximum credits (default: 10000)
FLOW_CONTROL_CREDIT_THRESHOLD - Credit threshold (default: 200)
FLOW_CONTROL_BACK_PRESSURE_THRESHOLD - Back-pressure threshold (default: 0.8)
FLOW_CONTROL_ADAPTIVE_ADJUSTMENT - Adaptive adjustment (default: true)
FLOW_CONTROL_INITIAL_CREDIT_MESSAGES - Initial message credits (default: 1000)
FLOW_CONTROL_INITIAL_CREDIT_BYTES - Initial byte credits (default: 1048576)
Examples
Basic Server Setup
import { HAIPServer } from "./src/server";
const server = new HAIPServer({
port: 8080,
host: "0.0.0.0",
jwtSecret: "your-secret-key",
maxConnections: 1000,
flowControl: {
enabled: true,
initialCredits: 1000,
},
});
// Listen for events
server.on("started", () => {
console.log("Server started");
});
server.on("connect", (sessionId) => {
console.log("Client connected:", sessionId);
});
server.on("disconnect", (sessionId) => {
console.log("Client disconnected:", sessionId);
});
// Start the server
server.start();
// Register a custom tool
server.registerTool({
name: "custom_calculator",
description: "Advanced calculator with multiple operations",
inputSchema: {
type: "object",
properties: {
operation: {
type: "string",
enum: ["add", "subtract", "multiply", "divide", "power"],
},
numbers: {
type: "array",
items: { type: "number" },
minItems: 2,
},
},
required: ["operation", "numbers"],
},
outputSchema: {
type: "object",
properties: {
result: { type: "number" },
operation: { type: "string" },
},
},
execute: async (params, sessionId, callId, server) => {
const { operation, numbers } = params;
// Send progress update
server.sendToolUpdate(sessionId, callId, "RUNNING", 50);
let result;
switch (operation) {
case "add":
result = numbers.reduce((a, b) => a + b, 0);
break;
case "subtract":
result = numbers.reduce((a, b) => a - b);
break;
case "multiply":
result = numbers.reduce((a, b) => a * b, 1);
break;
case "divide":
result = numbers.reduce((a, b) => a / b);
break;
case "power":
result = Math.pow(numbers[0], numbers[1]);
break;
default:
throw new Error(`Unknown operation: ${operation}`);
}
return {
result,
operation,
};
},
});
Monitoring and Statistics
// Monitor server performance
setInterval(() => {
const stats = server.getStats();
console.log("=== Server Statistics ===");
console.log(`Active Connections: ${stats.activeConnections}`);
console.log(`Total Connections: ${stats.totalConnections}`);
console.log(`Messages/Second: ${stats.messagesPerSecond.toFixed(2)}`);
console.log(`Average Latency: ${stats.averageLatency}ms`);
console.log(`Error Rate: ${(stats.errorRate * 100).toFixed(2)}%`);
console.log(`Uptime: ${Math.floor(stats.uptime / 1000)}s`);
console.log("========================");
}, 5000);
// Monitor for high error rates
server.on("error", (error) => {
const stats = server.getStats();
if (stats.errorRate > 0.05) {
console.error("High error rate detected:", stats.errorRate);
}
});
Next Steps