A React hook for channel-based WebSocket communication using Socket.IO. This library provides a simple and intuitive way to connect to WebSocket servers, join specific channels, and exchange real-time messages.
- Simple React hook interface
- Channel-based message broadcasting
- Automatic connection management
- TypeScript support
- Real-time message synchronization
- Connection status tracking
npm install broadcast-socket-client- React 19.1.0 or higher
- Socket.IO server with channel support
import { useBroadcastSocket } from 'broadcast-socket-client';
function ChatApp() {
const { messages, isConnected, sendMessage, connect, disconnect } = useBroadcastSocket();
// Connect to server and join a channel
const handleConnect = () => {
connect('http://localhost:12000', 'my-channel');
};
// Send a message
const handleSend = () => {
sendMessage({ text: 'Hello, World!' });
};
return (
<div>
<button onClick={handleConnect}>
{isConnected ? 'Disconnect' : 'Connect'}
</button>
{isConnected && (
<button onClick={handleSend}>Send Message</button>
)}
<div>
{messages.map((msg, idx) => (
<div key={idx}>
<span>{new Date(msg.timestamp).toLocaleTimeString()}</span>
<pre>{JSON.stringify(msg.data, null, 2)}</pre>
</div>
))}
</div>
</div>
);
}import { useBroadcastSocket } from 'broadcast-socket-client';
import { useState } from 'react';
function MultiChannelApp() {
const [serverUrl] = useState('http://localhost:12000');
const [channel, setChannel] = useState('home');
const { messages, isConnected, sendMessage, connect, disconnect } = useBroadcastSocket();
const handleChannelChange = (newChannel: string) => {
setChannel(newChannel);
if (isConnected) {
// Disconnect and reconnect to new channel
disconnect();
connect(serverUrl, newChannel);
}
};
const handleSubmit = (text: string) => {
if (isConnected && text.trim()) {
sendMessage({
text,
userId: 'user-123',
timestamp: Date.now()
});
}
};
return (
<div>
<select
value={channel}
onChange={(e) => handleChannelChange(e.target.value)}
disabled={isConnected}
>
<option value="home">Home</option>
<option value="sports">Sports</option>
<option value="news">News</option>
</select>
<button onClick={() => isConnected ? disconnect() : connect(serverUrl, channel)}>
{isConnected ? 'Disconnect' : 'Connect'}
</button>
<div>
<h3>Channel: {channel}</h3>
<p>Status: {isConnected ? 'Connected' : 'Disconnected'}</p>
{messages.map((msg, idx) => (
<div key={idx}>
<small>{msg.sender || 'Unknown'}</small>
<p>{msg.data.text}</p>
</div>
))}
</div>
</div>
);
}import { useBroadcastSocket } from 'broadcast-socket-client';
import { useEffect } from 'react';
function NotificationSystem() {
const { messages, isConnected, connect } = useBroadcastSocket();
useEffect(() => {
// Auto-connect to notifications channel on mount
connect('http://localhost:12000', 'notifications');
}, []);
// Show toast notification for new messages
useEffect(() => {
if (messages.length > 0) {
const latestMessage = messages[messages.length - 1];
showToast(latestMessage.data);
}
}, [messages]);
const showToast = (data: any) => {
// Your toast notification logic here
console.log('New notification:', data);
};
return (
<div>
<div>Connection: {isConnected ? '🟢 Online' : '🔴 Offline'}</div>
<div>
<h3>Recent Notifications ({messages.length})</h3>
{messages.slice(-5).map((msg, idx) => (
<div key={idx}>
<span>{new Date(msg.timestamp).toLocaleString()}</span>
<p>{msg.data.message}</p>
</div>
))}
</div>
</div>
);
}Returns an object with the following properties and methods:
messages:BroadcastMessage[]- Array of received messagesisConnected:boolean- Current connection status
connect(serverUrl: string, channel: string): void- Connect to a WebSocket server and join a channeldisconnect(): void- Disconnect from the current connectionsendMessage(data: any): void- Send a message to the current channel
interface BroadcastMessage {
data: any;
timestamp: number;
sender?: string;
}Your Socket.IO server should support the following:
- Accept a
channelquery parameter during connection - Emit
messageevents to clients - Listen for
messageevents from clients
Example server setup:
io.on('connection', (socket) => {
const channel = socket.handshake.query.channel;
socket.join(channel);
socket.on('message', (data) => {
io.to(channel).emit('message', {
data,
timestamp: Date.now(),
sender: socket.id
});
});
});MIT
Contributions are welcome! Please feel free to submit a Pull Request.