claudecodeui/server/utils/taskmaster-websocket.js

135 lines
No EOL
3.9 KiB
JavaScript

/**
* TASKMASTER WEBSOCKET UTILITIES
* ==============================
*
* Utilities for broadcasting TaskMaster state changes via WebSocket.
* Integrates with the existing WebSocket system to provide real-time updates.
*/
/**
* Broadcast TaskMaster project update to all connected clients.
*
* The payload key is `projectId` post-migration so frontend listeners can
* match notifications against the DB-assigned project identifier they
* already use everywhere else.
*
* @param {WebSocket.Server} wss - WebSocket server instance
* @param {string} projectId - DB id of the updated project
* @param {Object} taskMasterData - Updated TaskMaster data
*/
export function broadcastTaskMasterProjectUpdate(wss, projectId, taskMasterData) {
if (!wss || !projectId) {
console.warn('TaskMaster WebSocket broadcast: Missing wss or projectId');
return;
}
const message = {
type: 'taskmaster-project-updated',
projectId,
taskMasterData,
timestamp: new Date().toISOString()
};
wss.clients.forEach((client) => {
if (client.readyState === 1) { // WebSocket.OPEN
try {
client.send(JSON.stringify(message));
} catch (error) {
console.error('Error sending TaskMaster project update:', error);
}
}
});
}
/**
* Broadcast TaskMaster tasks update for a specific project.
*
* @param {WebSocket.Server} wss - WebSocket server instance
* @param {string} projectId - DB id of the project with updated tasks
* @param {Object} tasksData - Updated tasks data
*/
export function broadcastTaskMasterTasksUpdate(wss, projectId, tasksData) {
if (!wss || !projectId) {
console.warn('TaskMaster WebSocket broadcast: Missing wss or projectId');
return;
}
const message = {
type: 'taskmaster-tasks-updated',
projectId,
tasksData,
timestamp: new Date().toISOString()
};
wss.clients.forEach((client) => {
if (client.readyState === 1) { // WebSocket.OPEN
try {
client.send(JSON.stringify(message));
} catch (error) {
console.error('Error sending TaskMaster tasks update:', error);
}
}
});
}
/**
* Broadcast MCP server status change
* @param {WebSocket.Server} wss - WebSocket server instance
* @param {Object} mcpStatus - Updated MCP server status
*/
export function broadcastMCPStatusChange(wss, mcpStatus) {
if (!wss) {
console.warn('TaskMaster WebSocket broadcast: Missing wss');
return;
}
const message = {
type: 'taskmaster-mcp-status-changed',
mcpStatus,
timestamp: new Date().toISOString()
};
wss.clients.forEach((client) => {
if (client.readyState === 1) { // WebSocket.OPEN
try {
client.send(JSON.stringify(message));
} catch (error) {
console.error('Error sending TaskMaster MCP status update:', error);
}
}
});
}
/**
* Broadcast general TaskMaster update notification
* @param {WebSocket.Server} wss - WebSocket server instance
* @param {string} updateType - Type of update (e.g., 'initialization', 'configuration')
* @param {Object} data - Additional data about the update
*/
export function broadcastTaskMasterUpdate(wss, updateType, data = {}) {
if (!wss || !updateType) {
console.warn('TaskMaster WebSocket broadcast: Missing wss or updateType');
return;
}
const message = {
type: 'taskmaster-update',
updateType,
data,
timestamp: new Date().toISOString()
};
wss.clients.forEach((client) => {
if (client.readyState === 1) { // WebSocket.OPEN
try {
client.send(JSON.stringify(message));
} catch (error) {
console.error('Error sending TaskMaster update:', error);
}
}
});
}