Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
Synchronet
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Main
Synchronet
Commits
22ed878a
Commit
22ed878a
authored
15 years ago
by
mcmlxxix
Browse files
Options
Downloads
Patches
Plain Diff
Added file synchronization functions.
Changed just about everything. See diff.
parent
632229ec
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
exec/commservice.js
+138
-69
138 additions, 69 deletions
exec/commservice.js
with
138 additions
and
69 deletions
exec/commservice.js
+
138
−
69
View file @
22ed878a
//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_s
ock
s
=
[];
var
remote_s
ock
s
=
[];
var
local_s
ession
s
=
[];
var
remote_s
ession
s
=
[];
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_s
ock
s
)
for
(
var
l
in
local_s
ession
s
)
{
for
(
var
s
=
0
;
s
<
local_s
ock
s
[
l
].
length
;
s
++
)
for
(
var
s
=
0
;
s
<
local_s
ession
s
[
l
].
length
;
s
++
)
{
var
s
ocket
=
local_s
ock
s
[
l
][
s
]
.
sock
;
if
(
sock
et
.
is_connected
)
var
s
ession
=
local_s
ession
s
[
l
][
s
];
if
(
session
.
sock
.
is_connected
)
{
if
(
sock
et
.
data_waiting
)
if
(
session
.
sock
.
data_waiting
)
{
socket_receive
(
sock
et
);
socket_receive
(
session
.
sock
);
}
}
else
...
...
@@ -102,21 +110,21 @@ function inbound()
}
}
}
for
(
var
r
=
0
;
r
<
remote_s
ock
s
.
length
;
r
++
)
for
(
var
r
=
0
;
r
<
remote_s
ession
s
.
length
;
r
++
)
{
var
node
=
remote_s
ock
s
[
r
];
if
(
node
.
sock
.
is_connected
)
var
session
=
remote_s
ession
s
[
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_s
ock
s
.
length
;
r
++
)
for
(
var
r
=
0
;
r
<
remote_s
ession
s
.
length
;
r
++
)
{
var
socket
=
remote_s
ock
s
[
r
].
sock
;
var
socket
=
remote_s
ession
s
[
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_s
ock
s
)
case
global
:
for
(
var
l
in
local_s
ession
s
)
{
for
(
var
s
=
0
;
s
<
local_s
ock
s
[
l
].
length
;
s
++
)
for
(
var
s
=
0
;
s
<
local_s
ession
s
[
l
].
length
;
s
++
)
{
var
socket
=
local_s
ock
s
[
l
][
s
].
sock
;
var
socket
=
local_s
ession
s
[
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_s
ock
s
[
data
.
session
]
&&
s
<
local_s
ock
s
[
data
.
session
].
length
;
s
++
)
for
(
var
s
=
0
;
local_s
ession
s
[
data
.
session
]
&&
s
<
local_s
ession
s
[
data
.
session
].
length
;
s
++
)
{
var
socket
=
local_s
ock
s
[
data
.
session
][
s
].
sock
;
var
socket
=
local_s
ession
s
[
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_s
ock
s
[
session_id
].
splice
(
index
,
1
);
local_s
ession
s
[
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
s
ession_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
s
cope
=
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_s
ock
s
[
index
].
sock
.
remote_ip_address
);
remote_s
ock
s
.
splice
(
index
,
1
);
log
(
"
remote socket connection terminated:
"
+
remote_s
ession
s
[
index
].
sock
.
remote_ip_address
);
remote_s
ession
s
.
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_s
ock
s
)
for
(
var
l
in
local_s
ession
s
)
{
if
(
local_s
ock
s
[
l
].
length
)
count
+=
local_s
ock
s
[
l
].
length
;
if
(
local_s
ession
s
[
l
].
length
)
count
+=
local_s
ession
s
[
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
;
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment