Files
ComfyUI_frontend/src/nodes/network.js
2019-04-01 20:15:17 +02:00

337 lines
7.5 KiB
JavaScript

//event related nodes
(function(global){
var LiteGraph = global.LiteGraph;
function LGWebSocket()
{
this.size = [60,20];
this.addInput("send", LiteGraph.ACTION);
this.addOutput("received", LiteGraph.EVENT);
this.addInput("in", 0 );
this.addOutput("out", 0 );
this.properties = {
url: "",
room: "lgraph", //allows to filter messages,
only_send_changes: true
};
this._ws = null;
this._last_sent_data = [];
this._last_received_data = [];
}
LGWebSocket.title = "WebSocket";
LGWebSocket.desc = "Send data through a websocket";
LGWebSocket.prototype.onPropertyChanged = function(name,value)
{
if(name == "url")
this.connectSocket();
}
LGWebSocket.prototype.onExecute = function()
{
if(!this._ws && this.properties.url)
this.connectSocket();
if(!this._ws || this._ws.readyState != WebSocket.OPEN )
return;
var room = this.properties.room;
var only_changes = this.properties.only_send_changes;
for(var i = 1; i < this.inputs.length; ++i)
{
var data = this.getInputData(i);
if(data == null)
continue;
var json;
try
{
json = JSON.stringify({ type: 0, room: room, channel: i, data: data });
}
catch (err)
{
continue;
}
if( only_changes && this._last_sent_data[i] == json )
continue;
this._last_sent_data[i] = json;
this._ws.send( json );
}
for(var i = 1; i < this.outputs.length; ++i)
this.setOutputData( i, this._last_received_data[i] );
if( this.boxcolor == "#AFA" )
this.boxcolor = "#6C6";
}
LGWebSocket.prototype.connectSocket = function()
{
var that = this;
var url = this.properties.url;
if( url.substr(0,2) != "ws" )
url = "ws://" + url;
this._ws = new WebSocket( url );
this._ws.onopen = function()
{
console.log("ready");
that.boxcolor = "#6C6";
}
this._ws.onmessage = function(e)
{
that.boxcolor = "#AFA";
var data = JSON.parse( e.data );
if( data.room && data.room != this.properties.room )
return;
if( e.data.type == 1 )
{
if(data.data.object_class && LiteGraph[data.data.object_class] )
{
var obj = null;
try
{
obj = new LiteGraph[data.data.object_class](data.data);
that.triggerSlot( 0, obj );
}
catch (err)
{
return;
}
}
else
that.triggerSlot( 0, data.data );
}
else
that._last_received_data[ e.data.channel || 0 ] = data.data;
}
this._ws.onerror = function(e)
{
console.log("couldnt connect to websocket");
that.boxcolor = "#E88";
}
this._ws.onclose = function(e)
{
console.log("connection closed");
that.boxcolor = "#000";
}
}
LGWebSocket.prototype.send = function(data)
{
if(!this._ws || this._ws.readyState != WebSocket.OPEN )
return;
this._ws.send( JSON.stringify({ type:1, msg: data }) );
}
LGWebSocket.prototype.onAction = function( action, param )
{
if(!this._ws || this._ws.readyState != WebSocket.OPEN )
return;
this._ws.send( { type: 1, room: this.properties.room, action: action, data: param } );
}
LGWebSocket.prototype.onGetInputs = function()
{
return [["in",0]];
}
LGWebSocket.prototype.onGetOutputs = function()
{
return [["out",0]];
}
LiteGraph.registerNodeType("network/websocket", LGWebSocket );
//It is like a websocket but using the SillyServer.js server that bounces packets back to all clients connected:
//For more information: https://github.com/jagenjo/SillyServer.js
function LGSillyClient()
{
//this.size = [60,20];
this.room_widget = this.addWidget("text","Room","lgraph",this.setRoom.bind(this));
this.addWidget("button","Reconnect",null,this.connectSocket.bind(this));
this.addInput("send", LiteGraph.ACTION);
this.addOutput("received", LiteGraph.EVENT);
this.addInput("in", 0 );
this.addOutput("out", 0 );
this.properties = {
url: "tamats.com:55000",
room: "lgraph",
only_send_changes: true
};
this._server = null;
this.connectSocket();
this._last_sent_data = [];
this._last_received_data = [];
}
LGSillyClient.title = "SillyClient";
LGSillyClient.desc = "Connects to SillyServer to broadcast messages";
LGSillyClient.prototype.onPropertyChanged = function(name,value)
{
if(name == "room")
this.room_widget.value = value;
this.connectSocket();
}
LGSillyClient.prototype.setRoom = function(room_name)
{
this.properties.room = room_name;
this.room_widget.value = room_name;
this.connectSocket();
}
//force label names
LGSillyClient.prototype.onDrawForeground = function()
{
for(var i = 1; i < this.inputs.length; ++i)
{
var slot = this.inputs[i];
slot.label = "in_" + i;
}
for(var i = 1; i < this.outputs.length; ++i)
{
var slot = this.outputs[i];
slot.label = "out_" + i;
}
}
LGSillyClient.prototype.onExecute = function()
{
if(!this._server || !this._server.is_connected)
return;
var only_send_changes = this.properties.only_send_changes;
for(var i = 1; i < this.inputs.length; ++i)
{
var data = this.getInputData(i);
if(data != null)
{
if( only_send_changes && this._last_sent_data[i] == data )
continue;
this._server.sendMessage( { type: 0, channel: i, data: data } );
this._last_sent_data[i] = data;
}
}
for(var i = 1; i < this.outputs.length; ++i)
this.setOutputData( i, this._last_received_data[i] );
if( this.boxcolor == "#AFA" )
this.boxcolor = "#6C6";
}
LGSillyClient.prototype.connectSocket = function()
{
var that = this;
if(typeof(SillyClient) == "undefined")
{
if(!this._error)
console.error("SillyClient node cannot be used, you must include SillyServer.js");
this._error = true;
return;
}
this._server = new SillyClient();
this._server.on_ready = function()
{
console.log("ready");
that.boxcolor = "#6C6";
}
this._server.on_message = function(id,msg)
{
var data = null;
try
{
data = JSON.parse( msg );
}
catch (err)
{
return;
}
if(data.type == 1) //EVENT slot
{
if(data.data.object_class && LiteGraph[data.data.object_class] )
{
var obj = null;
try
{
obj = new LiteGraph[data.data.object_class](data.data);
that.triggerSlot( 0, obj );
}
catch (err)
{
return;
}
}
else
that.triggerSlot( 0, data.data );
}
else //for FLOW slots
that._last_received_data[ data.channel || 0 ] = data.data;
that.boxcolor = "#AFA";
}
this._server.on_error = function(e)
{
console.log("couldnt connect to websocket");
that.boxcolor = "#E88";
}
this._server.on_close = function(e)
{
console.log("connection closed");
that.boxcolor = "#000";
}
if(this.properties.url && this.properties.room)
{
try
{
this._server.connect( this.properties.url, this.properties.room );
}
catch (err)
{
console.error("SillyServer error: " + err );
this._server = null;
return;
}
this._final_url = (this.properties.url + "/" + this.properties.room);
}
}
LGSillyClient.prototype.send = function(data)
{
if(!this._server || !this._server.is_connected)
return;
this._server.sendMessage( { type:1, data: data } );
}
LGSillyClient.prototype.onAction = function( action, param )
{
if(!this._server || !this._server.is_connected)
return;
this._server.sendMessage( { type: 1, action: action, data: param } );
}
LGSillyClient.prototype.onGetInputs = function()
{
return [["in",0]];
}
LGSillyClient.prototype.onGetOutputs = function()
{
return [["out",0]];
}
LiteGraph.registerNodeType("network/sillyclient", LGSillyClient );
})(this);