import { WebSocketHelper } from '@bytekit/utils';
interface ChatMessage {
id: string;
user: string;
text: string;
timestamp: number;
}
interface UserStatus {
userId: string;
status: 'online' | 'offline' | 'away';
}
class ChatClient {
private ws: WebSocketHelper;
private currentUser: string;
private messageHandlers: ((message: ChatMessage) => void)[] = [];
constructor(serverUrl: string, username: string) {
this.currentUser = username;
this.ws = new WebSocketHelper(serverUrl, {
reconnect: true,
maxReconnectAttempts: 10,
reconnectDelayMs: 3000
});
this.setupEventHandlers();
}
async connect() {
await this.ws.connect();
// Authenticate
await this.ws.request('auth:login', {
username: this.currentUser
});
console.log('Connected and authenticated');
}
private setupEventHandlers() {
// Handle incoming messages
this.ws.on<ChatMessage>('chat:message', (message) => {
this.messageHandlers.forEach(handler => handler(message));
});
// Handle user status changes
this.ws.on<UserStatus>('user:status', (status) => {
console.log(`${status.userId} is now ${status.status}`);
this.updateUserStatus(status);
});
// Handle errors
this.ws.onError((error) => {
console.error('WebSocket error:', error);
this.showError(error.message);
});
}
sendMessage(room: string, text: string) {
this.ws.send('chat:message', {
room,
text,
user: this.currentUser,
timestamp: Date.now()
});
}
async getMessageHistory(room: string, limit = 50): Promise<ChatMessage[]> {
return this.ws.request<{ room: string; limit: number }, ChatMessage[]>(
'chat:history',
{ room, limit }
);
}
onMessage(handler: (message: ChatMessage) => void) {
this.messageHandlers.push(handler);
}
updateStatus(status: 'online' | 'offline' | 'away') {
this.ws.send('user:status', {
userId: this.currentUser,
status
});
}
private updateUserStatus(status: UserStatus) {
// Update UI with user status
const userEl = document.getElementById(`user-${status.userId}`);
if (userEl) {
userEl.className = `user-status ${status.status}`;
}
}
private showError(message: string) {
// Show error notification
alert(`Error: ${message}`);
}
disconnect() {
this.ws.close();
}
}
// Usage
const chat = new ChatClient('wss://chat.example.com', 'john_doe');
// Connect
await chat.connect();
// Listen for messages
chat.onMessage((message) => {
const messageEl = document.createElement('div');
messageEl.className = 'message';
messageEl.innerHTML = `
<strong>${message.user}:</strong> ${message.text}
`;
document.getElementById('messages')!.appendChild(messageEl);
});
// Send messages
document.getElementById('send-btn')!.addEventListener('click', () => {
const input = document.getElementById('message-input') as HTMLInputElement;
chat.sendMessage('general', input.value);
input.value = '';
});
// Update status
window.addEventListener('beforeunload', () => {
chat.updateStatus('offline');
chat.disconnect();
});