From 22ed878a5954b3a862ed9ab2d382f5df343082f1 Mon Sep 17 00:00:00 2001
From: mcmlxxix <>
Date: Mon, 1 Feb 2010 20:19:46 +0000
Subject: [PATCH] Added file synchronization functions. Changed just about
 everything. See diff.

---
 exec/commservice.js | 207 +++++++++++++++++++++++++++++---------------
 1 file changed, 138 insertions(+), 69 deletions(-)

diff --git a/exec/commservice.js b/exec/commservice.js
index 1b0145d270..14f3bc4537 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;
 }
-- 
GitLab