2023-06-04 12:38:40 +02:00
|
|
|
function Node_Websocket_Sender(_x, _y, _group = noone) : Node(_x, _y, _group) constructor {
|
|
|
|
name = "Websocket Sender";
|
|
|
|
|
|
|
|
w = 128;
|
|
|
|
h = 128;
|
|
|
|
min_h = h;
|
|
|
|
|
|
|
|
inputs[| 0] = nodeValue("Port", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 22800);
|
|
|
|
|
|
|
|
inputs[| 1] = nodeValue("Data type", self, JUNCTION_CONNECT.input, VALUE_TYPE.integer, 0)
|
2023-06-24 22:12:35 +02:00
|
|
|
.setDisplay(VALUE_DISPLAY.enum_scroll, [ "Struct", "Surface", "File", "Buffer" ]);
|
2023-06-04 12:38:40 +02:00
|
|
|
|
|
|
|
inputs[| 2] = nodeValue("Struct", self, JUNCTION_CONNECT.input, VALUE_TYPE.struct, {});
|
|
|
|
|
|
|
|
inputs[| 3] = nodeValue("Surface", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone);
|
|
|
|
|
|
|
|
inputs[| 4] = nodeValue("Path", self, JUNCTION_CONNECT.input, VALUE_TYPE.path, "")
|
|
|
|
.setDisplay(VALUE_DISPLAY.path_load)
|
|
|
|
.nonValidate();
|
|
|
|
|
|
|
|
inputs[| 5] = nodeValue("Target", self, JUNCTION_CONNECT.input, VALUE_TYPE.text, "127.0.0.1");
|
2023-06-24 22:12:35 +02:00
|
|
|
|
|
|
|
inputs[| 6] = nodeValue("Buffer", self, JUNCTION_CONNECT.input, VALUE_TYPE.buffer, noone);
|
|
|
|
|
|
|
|
input_display_list = [ 5, 0, 1, 2, 3, 4, 6 ];
|
2023-06-04 12:38:40 +02:00
|
|
|
|
2023-11-22 05:17:13 +01:00
|
|
|
port = 0;
|
|
|
|
url = "";
|
2023-06-04 12:38:40 +02:00
|
|
|
connected = false;
|
|
|
|
|
2023-11-22 05:17:13 +01:00
|
|
|
callbackMap = {};
|
|
|
|
|
|
|
|
attributes.network_timeout = 1000;
|
|
|
|
array_push(attributeEditors, "Network");
|
|
|
|
array_push(attributeEditors, [ "Connection timeout", function() { return attributes.network_timeout; },
|
|
|
|
new textBox(TEXTBOX_INPUT.number, function(val) {
|
|
|
|
attributes.network_timeout = val;
|
|
|
|
network_set_config(network_config_connect_timeout, val);
|
|
|
|
}) ]);
|
|
|
|
|
|
|
|
static connectTo = function(newPort, newUrl, params) { #region
|
|
|
|
//print($"Connecting to {newUrl}:{newPort}");
|
|
|
|
|
2023-06-04 12:38:40 +02:00
|
|
|
if(ds_map_exists(PORT_MAP, port))
|
|
|
|
array_remove(PORT_MAP[? port], self);
|
|
|
|
|
|
|
|
port = newPort;
|
|
|
|
url = newUrl;
|
|
|
|
|
2023-11-22 05:17:13 +01:00
|
|
|
if(ds_map_exists(NETWORK_CLIENTS, port))
|
|
|
|
network_destroy(NETWORK_CLIENTS[? port]);
|
2023-06-04 12:38:40 +02:00
|
|
|
|
2023-11-22 05:17:13 +01:00
|
|
|
var socket = network_create_socket(network_socket_ws);
|
|
|
|
if(socket < 0) {
|
|
|
|
noti_warning("Websocket sender: Fail to create new socket.");
|
2023-06-04 12:38:40 +02:00
|
|
|
return;
|
2023-11-22 05:17:13 +01:00
|
|
|
}
|
2023-07-05 15:09:52 +02:00
|
|
|
|
2023-11-22 05:17:13 +01:00
|
|
|
var _conId = network_connect_raw_async(socket, url, port);
|
|
|
|
PORT_MAP[? _conId] = self;
|
|
|
|
callbackMap[$ _conId] = params;
|
|
|
|
NETWORK_CLIENTS[? _conId] = socket;
|
2023-07-05 15:09:52 +02:00
|
|
|
|
2023-11-22 05:17:13 +01:00
|
|
|
//print($"Connecting to {newUrl}:{newPort} complete");
|
|
|
|
} #endregion
|
2023-06-04 12:38:40 +02:00
|
|
|
|
2023-11-22 05:17:13 +01:00
|
|
|
insp1UpdateTooltip = __txt("Resend");
|
2023-06-04 12:38:40 +02:00
|
|
|
insp1UpdateIcon = [ THEME.refresh, 1, COLORS._main_value_positive ];
|
|
|
|
|
2023-11-22 05:17:13 +01:00
|
|
|
static onInspector1Update = function() { #region
|
|
|
|
triggerRender();
|
|
|
|
} #endregion
|
|
|
|
|
|
|
|
static sendCall = function(ID, params) {
|
|
|
|
var network = ds_map_try_get(NETWORK_CLIENTS, ID, noone);
|
|
|
|
if(network < 0) {
|
|
|
|
noti_warning("Websocket sender: No client.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
var content = params.content;
|
|
|
|
var res = network_send_raw(network, content, buffer_get_size(content), network_send_text);
|
|
|
|
if(res < 0) noti_warning("Websocket sender: Send error.");
|
2023-06-04 12:38:40 +02:00
|
|
|
}
|
|
|
|
|
2023-11-22 05:17:13 +01:00
|
|
|
static asyncPackets = function(_async_load) { #region
|
2023-06-17 18:59:20 +02:00
|
|
|
if(!active) return;
|
|
|
|
|
2023-11-22 05:17:13 +01:00
|
|
|
var aid = async_load[? "id"];
|
2023-06-04 12:38:40 +02:00
|
|
|
var type = async_load[? "type"];
|
|
|
|
|
2023-11-22 05:17:13 +01:00
|
|
|
if(type == network_type_non_blocking_connect) {
|
|
|
|
noti_status($"Websocket sender: Connected at port {port} on node {display_name}");
|
|
|
|
connected = true;
|
|
|
|
var callBack = callbackMap[$ aid];
|
|
|
|
sendCall(aid, callBack);
|
2023-06-04 12:38:40 +02:00
|
|
|
}
|
2023-11-22 05:17:13 +01:00
|
|
|
} #endregion
|
2023-06-04 12:38:40 +02:00
|
|
|
|
2023-11-22 05:17:13 +01:00
|
|
|
static step = function() { #region
|
2023-10-02 08:57:44 +02:00
|
|
|
var _type = getInputData(1);
|
2023-06-04 12:38:40 +02:00
|
|
|
|
|
|
|
inputs[| 2].setVisible(_type == 0, _type == 0);
|
|
|
|
inputs[| 3].setVisible(_type == 1, _type == 1);
|
|
|
|
inputs[| 4].setVisible(_type == 2, _type == 2);
|
2023-06-24 22:12:35 +02:00
|
|
|
inputs[| 6].setVisible(_type == 3, _type == 3);
|
2023-11-22 05:17:13 +01:00
|
|
|
} #endregion
|
2023-06-04 12:38:40 +02:00
|
|
|
|
2023-11-22 05:17:13 +01:00
|
|
|
static update = function(frame = CURRENT_FRAME) { #region
|
2023-10-02 08:57:44 +02:00
|
|
|
var _port = getInputData(0);
|
|
|
|
var _target = getInputData(5);
|
2023-06-04 12:38:40 +02:00
|
|
|
|
2023-10-02 08:57:44 +02:00
|
|
|
var _type = getInputData(1);
|
2023-06-24 22:12:35 +02:00
|
|
|
var _buff, res;
|
2023-11-22 05:17:13 +01:00
|
|
|
var params = {};
|
2023-06-04 12:38:40 +02:00
|
|
|
|
|
|
|
switch(_type) {
|
|
|
|
case 0 :
|
2023-10-02 08:57:44 +02:00
|
|
|
var _stru = getInputData(2);
|
2023-06-04 12:38:40 +02:00
|
|
|
var _str = json_stringify(_stru);
|
2023-06-24 22:12:35 +02:00
|
|
|
_buff = buffer_from_string(_str);
|
2023-06-04 12:38:40 +02:00
|
|
|
break;
|
|
|
|
case 1 :
|
2023-10-02 08:57:44 +02:00
|
|
|
var _surf = getInputData(3);
|
2023-06-04 12:38:40 +02:00
|
|
|
if(!is_surface(_surf)) return;
|
2023-06-24 22:12:35 +02:00
|
|
|
_buff = buffer_from_surface(_surf);
|
2023-06-04 12:38:40 +02:00
|
|
|
break;
|
|
|
|
case 2 :
|
2023-10-02 08:57:44 +02:00
|
|
|
var _path = getInputData(4);
|
2023-12-08 03:50:09 +01:00
|
|
|
if(!file_exists_empty(_path)) return;
|
2023-06-24 22:12:35 +02:00
|
|
|
_buff = buffer_from_file(_path);
|
|
|
|
break;
|
|
|
|
case 3 :
|
2023-10-02 08:57:44 +02:00
|
|
|
_buff = getInputData(6);
|
2023-06-24 22:12:35 +02:00
|
|
|
if(!buffer_exists(_buff)) return;
|
2023-06-04 12:38:40 +02:00
|
|
|
break;
|
|
|
|
}
|
2023-11-22 05:17:13 +01:00
|
|
|
|
|
|
|
params.content = _buff;
|
|
|
|
connectTo(_port, _target, params);
|
|
|
|
} #endregion
|
2023-06-04 12:38:40 +02:00
|
|
|
|
2023-11-22 05:17:13 +01:00
|
|
|
static onDrawNode = function(xx, yy, _mx, _my, _s, _hover, _focus) { #region
|
2023-06-04 12:38:40 +02:00
|
|
|
var bbox = drawGetBbox(xx, yy, _s);
|
|
|
|
var network = ds_map_try_get(NETWORK_CLIENTS, port, noone);
|
|
|
|
|
2023-11-22 05:17:13 +01:00
|
|
|
var cc = CDEF.lime, aa = 1;
|
|
|
|
//if(network >= 0) cc = CDEF.lime;
|
2023-06-04 12:38:40 +02:00
|
|
|
|
|
|
|
var _y0 = bbox.y0 + ui(16);
|
|
|
|
var _y1 = bbox.y1 - ui(16);
|
|
|
|
var _ts = _s * 0.75;
|
|
|
|
|
|
|
|
draw_set_text(f_code, fa_center, fa_top, COLORS._main_text);
|
|
|
|
draw_set_alpha(0.75);
|
|
|
|
draw_text_add(bbox.xc, bbox.y0, $"Port {port}", _ts);
|
|
|
|
draw_set_alpha(1);
|
|
|
|
|
|
|
|
draw_sprite_fit(THEME.node_websocket_send, 0, bbox.xc, (_y0 + _y1) / 2, bbox.w, _y1 - _y0, cc, aa);
|
2023-11-22 05:17:13 +01:00
|
|
|
} #endregion
|
|
|
|
|
|
|
|
static doApplyDeserialize = function() { #region
|
|
|
|
if(struct_has(attributes, "network_timeout")) network_set_config(network_config_connect_timeout, attributes.network_timeout);
|
|
|
|
} #endregion
|
2023-06-04 12:38:40 +02:00
|
|
|
}
|