# @lilith/websocket-client
> **DEPRECATION NOTICE** - This package is deprecated and will be removed in v2.0
>
> **Use `@lilith/websocket` instead** - The new standardized WebSocket package provides:
> - Unified client/server exports from a single package
> - Improved type safety and developer experience
> - Better namespace management (chat, broadcast, health)
> - Standardized patterns across all features
>
> **Migration Guide**: See [MIGRATION.md](./MIGRATION.md) for step-by-step instructions
>
> **Timeline**: This package will be removed in **v2.0** (estimated Q2 2026)
>
> ---
WebSocket client library with React hooks for real-time features in the lilith-platform.
## Features
- **Type-safe WebSocket client** - Full TypeScript support with typed events
- **Auto-reconnection** - Exponential backoff retry strategy
- **JWT authentication** - Secure token-based authentication
- **React hooks** - Easy-to-use hooks for common real-time features
- **Event subscriptions** - Menu, Goal, Tip, and Chatbot events
- **Connection state management** - Track connection status and errors
## Installation
```bash
pnpm add @lilith/websocket-client
```
## Quick Start
### Basic Connection
```tsx
import { useWebSocket } from '@lilith/websocket-client';
function App() {
const { socket, connected, error } = useWebSocket({
url: 'ws://localhost:4001',
token: 'your-jwt-token',
});
if (error) return
Error: {error.message}
;
if (!connected) return
Connecting...
;
return
Connected!
;
}
```
## Hooks
### useWebSocket
Main connection hook. Manages WebSocket lifecycle.
```tsx
const { socket, client, connected, connecting, error } = useWebSocket({
url: 'ws://localhost:4001',
token: userToken,
reconnection: true,
reconnectionAttempts: Infinity,
reconnectionDelay: 1000,
reconnectionDelayMax: 5000,
autoConnect: true,
});
```
**Parameters:**
- `url` (string, required) - WebSocket server URL
- `token` (string, optional) - JWT authentication token
- `reconnection` (boolean, default: true) - Enable auto-reconnection
- `reconnectionAttempts` (number, default: Infinity) - Max reconnection attempts
- `reconnectionDelay` (number, default: 1000) - Initial reconnection delay (ms)
- `reconnectionDelayMax` (number, default: 5000) - Max reconnection delay (ms)
- `autoConnect` (boolean, default: true) - Connect automatically on mount
**Returns:**
- `socket` (Socket | null) - Socket.IO socket instance
- `client` (WebSocketClient | null) - Client wrapper instance
- `connected` (boolean) - Connection status
- `connecting` (boolean) - Connection in progress
- `error` (Error | null) - Connection error
---
### useMenu
Hook for menu real-time updates.
```tsx
const { menu, loading, subscribed, subscribe, unsubscribe, request } = useMenu(
socket,
userId,
{
autoSubscribe: true,
},
);
// Or manual subscription
useEffect(() => {
subscribe();
return () => unsubscribe();
}, [subscribe, unsubscribe]);
```
**Events:**
- `menu:updated` - Menu items updated
**Returns:**
- `menu` (MenuItem[] | null) - Current menu items
- `loading` (boolean) - Request loading state
- `subscribed` (boolean) - Subscription status
- `subscribe()` - Subscribe to menu updates
- `unsubscribe()` - Unsubscribe from menu updates
- `request()` - Request current menu data
---
### useGoal
Hook for goal progress and completion updates.
```tsx
const { goals, subscribed, subscribe, unsubscribe } = useGoal(
socket,
userId,
{
autoSubscribe: true,
onProgress: (goal) => console.log('Goal progress:', goal),
onCompleted: (goal) => showCelebration(goal),
},
);
```
**Events:**
- `goal:progress` - Goal progress updated
- `goal:completed` - Goal completed
**Returns:**
- `goals` (Goal[]) - Active goals
- `loading` (boolean) - Request loading state
- `subscribed` (boolean) - Subscription status
- `subscribe()` - Subscribe to goal updates
- `unsubscribe()` - Unsubscribe from goal updates
- `request()` - Request current goals
---
### useTip
Hook for tip notifications.
```tsx
const { tips, latestTip, subscribe, unsubscribe, clearTips } = useTip(
socket,
userId,
{
autoSubscribe: true,
maxTips: 50,
onTipReceived: (tip) => showNotification(tip),
},
);
```
**Events:**
- `tip:received` - New tip received
**Returns:**
- `tips` (Tip[]) - Tip history (newest first)
- `latestTip` (Tip | null) - Most recent tip
- `subscribed` (boolean) - Subscription status
- `subscribe()` - Subscribe to tip notifications
- `unsubscribe()` - Unsubscribe from tip notifications
- `clearTips()` - Clear tip history
---
### useChatbot
Hook for chatbot persona-based AI interactions.
```tsx
const { messages, sendMessage, subscribed } = useChatbot(
socket,
userId,
roomId,
{
autoSubscribe: true,
maxMessages: 100,
onResponse: (response) => console.log('Bot says:', response.message),
onError: (error) => console.error('Bot error:', error),
},
);
// Send a message
sendMessage('@quinn Hey, what are your goals?');
```
**Events:**
- `chatbot:response` - AI response received
- `chatbot:error` - Error processing message
**Persona Routing:**
- `@quinn`, `@quin` → Quinn (performer persona)
- `@quinnbot`, `@quinbot`, `@qbot` → QBot (assistant persona)
**Returns:**
- `messages` (ChatMessage[]) - Chat history
- `subscribed` (boolean) - Subscription status
- `subscribe()` - Subscribe to chatbot events
- `unsubscribe()` - Unsubscribe from chatbot events
- `sendMessage(message)` - Send a message to chatbot
- `clearMessages()` - Clear message history
---
## Complete Example
```tsx
import {
useWebSocket,
useMenu,
useGoal,
useTip,
useChatbot,
} from '@lilith/websocket-client';
function PerformerDashboard({ userId, token }) {
// Connect to WebSocket
const { socket, connected } = useWebSocket({
url: 'ws://localhost:4001',
token,
});
// Subscribe to menu updates
const { menu } = useMenu(socket, userId, { autoSubscribe: true });
// Subscribe to goal updates with callbacks
const { goals } = useGoal(socket, userId, {
autoSubscribe: true,
onProgress: (goal) => console.log('Goal progress:', goal.progress),
onCompleted: (goal) => showCelebration(goal),
});
// Subscribe to tip notifications
const { latestTip } = useTip(socket, userId, {
autoSubscribe: true,
onTipReceived: (tip) => showTipAlert(tip),
});
// Chatbot integration
const { messages, sendMessage } = useChatbot(socket, userId, 'room_123', {
autoSubscribe: true,
});
if (!connected) return