mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Add session awareness to WebSocket node
This allows a websocket-in node to receive data, process it in a flow and then send it back to the originating websocket client via a websocket-out node.
This commit is contained in:
		@@ -43,6 +43,8 @@ function WebSocketListenerNode(n) {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    node._clients = {};
 | 
			
		||||
    
 | 
			
		||||
    RED.server.addListener('newListener',storeListener);
 | 
			
		||||
 | 
			
		||||
    // Create a WebSocket Server
 | 
			
		||||
@@ -53,8 +55,14 @@ function WebSocketListenerNode(n) {
 | 
			
		||||
    RED.server.removeListener('newListener',storeListener);
 | 
			
		||||
 | 
			
		||||
    node.server.on('connection', function(socket){
 | 
			
		||||
        var id = (1+Math.random()*4294967295).toString(16);
 | 
			
		||||
        node._clients[id] = socket;
 | 
			
		||||
        
 | 
			
		||||
        socket.on('close',function() {
 | 
			
		||||
            delete node._clients[id];
 | 
			
		||||
        });
 | 
			
		||||
        socket.on('message',function(data,flags){
 | 
			
		||||
            node.handleEvent(socket,'message',data,flags);
 | 
			
		||||
            node.handleEvent(id,socket,'message',data,flags);
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
@@ -80,9 +88,9 @@ WebSocketListenerNode.prototype.registerInputNode = function(/*Node*/handler){
 | 
			
		||||
    this._inputNodes.push(handler);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
WebSocketListenerNode.prototype.handleEvent = function(/*socket*/socket,/*String*/event,/*Object*/data,/*Object*/flags){
 | 
			
		||||
WebSocketListenerNode.prototype.handleEvent = function(id,/*socket*/socket,/*String*/event,/*Object*/data,/*Object*/flags){
 | 
			
		||||
    for (var i = 0; i < this._inputNodes.length; i++) {
 | 
			
		||||
        this._inputNodes[i].send({payload:data});
 | 
			
		||||
        this._inputNodes[i].send({session:{type:"websocket",id:id},payload:data});
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -92,6 +100,13 @@ WebSocketListenerNode.prototype.broadcast = function(data){
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
WebSocketListenerNode.prototype.send = function(id,data){
 | 
			
		||||
    var session = this._clients[id];
 | 
			
		||||
    if (session) {
 | 
			
		||||
        session.send(data);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function WebSocketInNode(n) {
 | 
			
		||||
    RED.nodes.createNode(this,n);
 | 
			
		||||
    this.server = n.server;
 | 
			
		||||
@@ -114,11 +129,23 @@ function WebSocketOutNode(n) {
 | 
			
		||||
        this.error("Missing server configuration");
 | 
			
		||||
    }
 | 
			
		||||
    this.on("input", function(msg) {
 | 
			
		||||
        node.serverConfig.broadcast(msg.payload,function(error){
 | 
			
		||||
        var payload = msg.payload;
 | 
			
		||||
        if (Buffer.isBuffer(payload)) {
 | 
			
		||||
            payload = payload.toString();
 | 
			
		||||
        } else if (typeof payload === "object") {
 | 
			
		||||
            payload = JSON.stringify(payload);
 | 
			
		||||
        } else if (typeof payload !== "string") {
 | 
			
		||||
            payload = ""+payload;
 | 
			
		||||
        }
 | 
			
		||||
        if (msg.session && msg.session.type == "websocket") {
 | 
			
		||||
            node.serverConfig.send(msg.session.id,payload);
 | 
			
		||||
        } else {
 | 
			
		||||
            node.serverConfig.broadcast(payload,function(error){
 | 
			
		||||
                if(!!error){
 | 
			
		||||
                    node.warn("An error occurred while sending:" + inspect(error));
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
RED.nodes.registerType("websocket out",WebSocketOutNode);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user