diff --git a/exec/commservice.js b/exec/commservice.js index 1b0145d270522fef485582915e89a108378423a3..14f3bc4537dc38ca23ebfab67bcbdb17a5521870 100644 --- a/exec/commservice.js +++ b/exec/commservice.js @@ -1,4 +1,3 @@ -//load("commsync.js"); /* Inter-BBS/Inter-Node socket service for Synchronet v3.15+ @@ -30,24 +29,32 @@ */ -const normal_scope= "#"; -const global_scope= "!"; -const node_prefix= "*"; -const local_prefix= "&"; +//Data type constants +const normal= "#"; +const global= "!"; +const priv= "~"; +const query= "?"; + +//Connection type constants +const remote= "*"; +const local= "&"; +const filesync= "@"; const hub_address=argv[0]; const hub_port=argv[1]; const connection_timeout=2; const connection_attempts=5; -var local_socks=[]; -var remote_socks=[]; +var local_sessions=[]; +var remote_sessions=[]; var data_queue=[]; -var remote_hub=false; +var background=[]; +var hub=false; //main service loop while(!server.terminated) { + if(server.terminated) break; sock_cycle(); if(server.socket.poll()<1) { @@ -63,7 +70,7 @@ function sock_cycle() { if(hub_address && hub_port) { - if(!remote_hub || !remote_hub.is_connected) + if(!hub || !hub.is_connected) hub_connect(); } else if(hub_address || hub_port) @@ -72,10 +79,11 @@ function sock_cycle() } inbound(); outbound(); + send_updates(); } else { - if(remote_hub && remote_hub.is_connected) + if(hub && hub.is_connected) { hub_disconnect(); } @@ -84,16 +92,16 @@ function sock_cycle() function inbound() { //read data from each socket - for(var l in local_socks) + for(var l in local_sessions) { - for(var s=0;s<local_socks[l].length;s++) + for(var s=0;s<local_sessions[l].length;s++) { - var socket=local_socks[l][s].sock; - if(socket.is_connected) + var session=local_sessions[l][s]; + if(session.sock.is_connected) { - if(socket.data_waiting) + if(session.sock.data_waiting) { - socket_receive(socket); + socket_receive(session.sock); } } else @@ -102,21 +110,21 @@ function inbound() } } } - for(var r=0;r<remote_socks.length;r++) + for(var r=0;r<remote_sessions.length;r++) { - var node=remote_socks[r]; - if(node.sock.is_connected) + var session=remote_sessions[r]; + if(session.sock.is_connected) { - socket_receive(node.sock); + socket_receive(session.sock); } else { r=delete_remote_session(r); } } - if(remote_hub && remote_hub.is_connected) + if(hub && hub.is_connected) { - socket_receive(remote_hub); + socket_receive(hub); } } function outbound() @@ -126,14 +134,14 @@ function outbound() { var data=data_queue[d]; //if the central hub is connected and was not the origin of the data, send thru - if(remote_hub && remote_hub.is_connected) + if(hub && hub.is_connected) { - socket_send_remote(data,remote_hub); + socket_send_remote(data,hub); } //send data to all remotely connected nodes - for(var r=0;r<remote_socks.length;r++) + for(var r=0;r<remote_sessions.length;r++) { - var socket=remote_socks[r].sock; + var socket=remote_sessions[r].sock; if(socket.is_connected) { socket_send_remote(data,socket); @@ -146,12 +154,12 @@ function outbound() switch(data.scope) { //if data is meant to be sent to all connected clients, do so (usually chat messages) - case global_scope: - for(var l in local_socks) + case global: + for(var l in local_sessions) { - for(var s=0;s<local_socks[l].length;s++) + for(var s=0;s<local_sessions[l].length;s++) { - var socket=local_socks[l][s].sock; + var socket=local_sessions[l][s].sock; if(socket.is_connected) { socket_send_local(data,socket); @@ -164,11 +172,11 @@ function outbound() } break; //distribute data to appropriate local sessions - case normal_scope: + case normal: default: - for(var s=0;local_socks[data.session] && s<local_socks[data.session].length;s++) + for(var s=0;local_sessions[data.session] && s<local_sessions[data.session].length;s++) { - var socket=local_socks[data.session][s].sock; + var socket=local_sessions[data.session][s].sock; if(socket.is_connected) { socket_send_local(data,socket); @@ -186,7 +194,7 @@ function outbound() function delete_local_session(session_id,index) { log("local socket connection terminated: " + session_id); - local_socks[session_id].splice(index,1); + local_sessions[session_id].splice(index,1); return index-1; } function socket_receive(socket) @@ -194,12 +202,24 @@ function socket_receive(socket) if(socket.data_waiting) { //store data in master array to be distributed later - var raw=socket.recvline(4092,connection_timeout); - var scope=raw.charAt(0); - var session_id=raw.substring(1,raw.indexOf(":")); - var data=raw.substr(raw.indexOf(":")+1); + var raw=socket.recvline(16384,connection_timeout); + var data=raw.split(""); + var scope=data[0].charAt(0); + var session=data[0].substr(1); - data_queue.push(new Packet(scope,session_id,socket.descriptor,data)); + switch(scope) + { + case global: + case normal: + data_queue.push(new Packet(scope,socket.descriptor,session,data[1])); + break; + case query: + handle_query(socket,data); + break; + default: + log("received unknown data type"); + break; + } } } function socket_send_local(data,socket) @@ -214,61 +234,65 @@ function socket_send_remote(data,socket) { if(socket.descriptor!=data.descriptor) { - var d=data.scope + data.session + ":" + data.data + "\r\n"; + var d=data.scope + data.session + "" + data.data + "\r\n"; socket.write(d); } } function delete_remote_session(index) { - log("remote socket connection terminated: " + remote_socks[index].sock.remote_ip_address); - remote_socks.splice(index,1); + log("remote socket connection terminated: " + remote_sessions[index].sock.remote_ip_address); + remote_sessions.splice(index,1); return index-1; } function hub_connect() { - remote_hub=new Socket(); - remote_hub.bind(0,server.interface_ip_address); + log("connecting to hub"); + hub=new Socket(); + hub.bind(0,server.interface_ip_address); //if a central hub address is provided, attempt connection for(var t=0;t<connection_attempts;t++) { - if(remote_hub.connect(hub_address,hub_port,connection_timeout)) + if(hub.connect(hub_address,hub_port,connection_timeout)) { //send node identifier and bbs name so hub knows this is a distribution point - remote_hub.send(node_prefix + system.name + "\r\n"); + hub.send(remote + system.name + "\r\n"); log("connection to " + hub_address + " successful"); return true; } mswait(50); } - log("connection to " + hub_address + " failed with error " + remote_hub.error); + log("connection to " + hub_address + " failed with error " + hub.error); return false; } function hub_disconnect() { log("disconnecting from main hub: " + hub_address); - remote_hub.close(); + hub.close(); } function store_socket(sock) { //receive connection identifier from incoming socket connection (should always be first transmission) - var handshake=sock.recvline(4092,connection_timeout); + var handshake=sock.recvline(1024,connection_timeout); var identifier=handshake.charAt(0); var session_id=handshake.substr(1); - switch(identifier) { - case node_prefix: - remote_socks.push(new Node(sock,session_id)); - log("remote node connection from: " + session_id + "@" + sock.remote_ip_address); + case remote: + log("remote connection from: " + sock.remote_ip_address + ":" + session_id); + remote_sessions.push(new Session(sock,session_id)); + break; + case local: + log("local connection from: " + sock.remote_ip_address + ":" + session_id); + if(!local_sessions[session_id]) local_sessions[session_id]=[]; + local_sessions[session_id].push(new Session(sock,session_id)); break; - case local_prefix: - if(!local_socks[session_id]) local_socks[session_id]=[]; - local_socks[session_id].push(new Session(sock)); - log("local node connection: " + session_id); + case filesync: + log("file sync connection from: " + sock.remote_ip_address + ":" + session_id); + distribute_files(sock,handshake); break; default: - log("unknown connection type"); + log("unknown connection type: " + identifier); sock.close(); break; } @@ -276,18 +300,68 @@ function store_socket(sock) function count_local_sockets() { var count=0; - for(var l in local_socks) + for(var l in local_sessions) { - if(local_socks[l].length) count+=local_socks[l].length; + if(local_sessions[l].length) count+=local_sessions[l].length; } return count; } function count_remote_sockets() { - return remote_socks.length; + return remote_sessions.length; +} +function handle_query(socket,query) +{ + var data=query.split(""); + var session_id=data[0].substr(1); + var descriptor=data[1]; + var task= data[2]; + + switch(task) + { + case "#who": + whos_online(socket); + break; + case "#finduser": + find_user(socket,data); + break; + case "#pageuser": + page_user(socket,data); + break; + default: + log("unknown query type: " + task); + break; + } +} +function distribute_files(socket,query) +{ + background.push(load(true,"filesync.js",socket.descriptor,query,hub_address,hub_port)); +} +function send_updates(socket) +{ + while(background.length) + { + var bgq=background.shift(); + while(bgq.data_waiting) + { + var data=bgq.read(); + for(var r=0;r<remote_sessions.length;r++) + { + var sock=remote_sessions[r].sock; + if(data.remote_ip_address != socket.remote_ip_address) + { + var query=("@" + data.session_id + "#send" + data.filename + "" + data.filedate); + load(true,"filesync.js",sock.descriptor,query); + } + } + } + } } //TODO +function whos_online() +{ +} function find_user() { } @@ -295,20 +369,15 @@ function page_user() { } -function Packet(scope,session,descriptor,data) -{ +function Packet(scope,descriptor,session,data) +{ this.session=session; this.descriptor=descriptor; this.data=data; this.scope=scope; } -function Node(socket,name) -{ - this.sock=socket; - this.name=name; -} function Session(socket,session) { this.sock=socket; - this.data=[]; + this.session=session; }