Real-time Events
Subscribe to real-time events from your machines.
Overview
Cmdop uses WebSockets (via Centrifugo) for real-time communication:
- Machine status changes
- Command output streaming
- File system events
- Metrics updates
Subscribe to Machine
const subscription = client.subscribe('machine-id');
subscription.on('connect', () => {
console.log('Connected');
});
subscription.on('disconnect', () => {
console.log('Disconnected');
});
// Cleanup
subscription.unsubscribe();Event Types
Status Events
subscription.on('status', (event) => {
console.log(event.status); // 'online' | 'offline'
console.log(event.timestamp);
});Output Events
Command output in real-time:
subscription.on('output', (event) => {
console.log(event.type); // 'stdout' | 'stderr'
console.log(event.data);
console.log(event.commandId);
});Metrics Events
System metrics:
subscription.on('metrics', (event) => {
console.log(event.cpu.usage);
console.log(event.memory.used);
console.log(event.disk.used);
});File Events
File system changes:
subscription.on('file', (event) => {
console.log(event.type); // 'created' | 'modified' | 'deleted'
console.log(event.path);
});Subscribe to Multiple Machines
const subscription = client.subscribeMany([
'machine-1',
'machine-2',
]);
subscription.on('status', (event) => {
console.log(event.machineId, event.status);
});React Hook
import { useRealtime } from '@cmdop/react';
function StatusMonitor({ machineId }) {
const { status, metrics, connected } = useRealtime(machineId);
return (
<div>
<p>Connected: {connected ? 'Yes' : 'No'}</p>
<p>Status: {status}</p>
<p>CPU: {metrics?.cpu.usage}%</p>
</div>
);
}Connection Options
const subscription = client.subscribe('machine-id', {
reconnect: true,
reconnectDelay: 1000,
maxReconnectAttempts: 10,
});Error Handling
subscription.on('error', (error) => {
console.error('Subscription error:', error);
});
subscription.on('reconnecting', (attempt) => {
console.log(`Reconnecting (attempt ${attempt})...`);
});Channel Filtering
Subscribe to specific event types:
const subscription = client.subscribe('machine-id', {
channels: ['status', 'metrics'], // Only these events
});Presence
See who’s connected:
subscription.on('presence', (event) => {
console.log('Users viewing:', event.users);
});
const presence = await subscription.presence();
console.log(presence.users);