n8n-nodes-websocket
Version:
Enhanced WebSocket nodes for n8n with bidirectional communication support
101 lines • 4.54 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.WebSocketConnectionManager = exports.globalWebSocketConnections = void 0;
const ws_1 = require("ws");
exports.globalWebSocketConnections = new Map();
exports.WebSocketConnectionManager = {
addConnection: (connectionId, ws, connectionInfo) => {
exports.globalWebSocketConnections.set(connectionId, {
ws,
connectionInfo,
lastActivity: new Date(),
});
console.log(`WebSocket connection added: ${connectionId} (Total: ${exports.globalWebSocketConnections.size})`);
},
removeConnection: (connectionId) => {
const removed = exports.globalWebSocketConnections.delete(connectionId);
if (removed) {
console.log(`WebSocket connection removed: ${connectionId} (Total: ${exports.globalWebSocketConnections.size})`);
}
return removed;
},
sendToConnection: (connectionId, message) => {
const connection = exports.globalWebSocketConnections.get(connectionId);
if (connection && connection.ws.readyState === ws_1.WebSocket.OPEN) {
try {
connection.ws.send(message);
connection.lastActivity = new Date();
console.log(`Message sent to ${connectionId}: ${message.substring(0, 100)}...`);
return true;
}
catch (error) {
console.error(`Error sending to ${connectionId}:`, error);
exports.globalWebSocketConnections.delete(connectionId);
return false;
}
}
console.warn(`Connection ${connectionId} not found or not open`);
return false;
},
broadcastToAll: (message) => {
let sent = 0;
exports.globalWebSocketConnections.forEach((connection, connectionId) => {
if (exports.WebSocketConnectionManager.sendToConnection(connectionId, message)) {
sent++;
}
});
console.log(`Broadcast message sent to ${sent}/${exports.globalWebSocketConnections.size} connections`);
return sent;
},
getActiveConnections: () => {
return Array.from(exports.globalWebSocketConnections.entries()).map(([id, conn]) => ({
connectionId: id,
connectionInfo: conn.connectionInfo,
lastActivity: conn.lastActivity,
isOpen: conn.ws.readyState === ws_1.WebSocket.OPEN,
}));
},
getConnectionCount: () => {
return exports.globalWebSocketConnections.size;
},
cleanupDeadConnections: () => {
const toDelete = [];
exports.globalWebSocketConnections.forEach((connection, connectionId) => {
if (connection.ws.readyState !== ws_1.WebSocket.OPEN) {
toDelete.push(connectionId);
}
});
toDelete.forEach(id => {
exports.globalWebSocketConnections.delete(id);
});
if (toDelete.length > 0) {
console.log(`Cleaned up ${toDelete.length} dead connections`);
}
return toDelete.length;
},
updateActivity: (connectionId) => {
const connection = exports.globalWebSocketConnections.get(connectionId);
if (connection) {
connection.lastActivity = new Date();
}
},
isConnectionActive: (connectionId) => {
const connection = exports.globalWebSocketConnections.get(connectionId);
return connection ? connection.ws.readyState === ws_1.WebSocket.OPEN : false;
},
getConnectionInfo: (connectionId) => {
const connection = exports.globalWebSocketConnections.get(connectionId);
return connection ? connection.connectionInfo : null;
},
processMessageTemplate: (template, connectionInfo) => {
const timestamp = new Date().toISOString();
const connections = exports.globalWebSocketConnections.size;
return template
.replace(/\{\{timestamp\}\}/g, timestamp)
.replace(/\{\{connections\}\}/g, connections.toString())
.replace(/\{\{connectionId\}\}/g, (connectionInfo === null || connectionInfo === void 0 ? void 0 : connectionInfo.connectionId) || 'unknown')
.replace(/\{\{date\}\}/g, new Date().toLocaleDateString())
.replace(/\{\{time\}\}/g, new Date().toLocaleTimeString());
},
};
//# sourceMappingURL=WebSocketConnections.js.map