Skip to content

Commit

Permalink
fix: fix a bunch of bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
purpose233 committed May 15, 2019
1 parent 15cd842 commit 17bca38
Show file tree
Hide file tree
Showing 13 changed files with 82 additions and 37 deletions.
2 changes: 1 addition & 1 deletion src/client.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ const {createUdpController} = require('./udpClient');

program.version('0.0.1');

const filePath = '../test/client.json';
const filePath = './test/client.json';

const parseResult = parseClientConfig(filePath);
if (typeof parseResult !== 'object') {
Expand Down
11 changes: 10 additions & 1 deletion src/common/config.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
const fs = require('fs');
const {ConfigErrors} = require('./log');

const getMetaConfig = (fileName) => {
Expand Down Expand Up @@ -35,7 +36,7 @@ const isValidClientProxies = (proxies) => {
return false;
}
for (const proxy of proxies) {
if (!isValidPort(proxy.listenPort) ||
if (!isValidPort(proxy.localPort) ||
!isValidPort(proxy.remotePort)) {
return false;
}
Expand Down Expand Up @@ -95,6 +96,10 @@ const getClientProxiesLocalPorts = (proxies) => {

const parseServerConfig = (filePath) => {
const metaConfig = getMetaConfig(filePath);
if (typeof metaConfig !== 'object') {
return metaConfig;
}

if (typeof metaConfig.common !== 'object') {
return ConfigErrors.MISSING_COMMON_CONFIG;
}
Expand Down Expand Up @@ -129,6 +134,10 @@ const parseServerConfig = (filePath) => {

const parseClientConfig = (filePath) => {
const metaConfig = getMetaConfig(filePath);
if (typeof metaConfig !== 'object') {
return metaConfig;
}

if (typeof metaConfig.common !== 'object') {
return ConfigErrors.MISSING_COMMON_CONFIG;
}
Expand Down
21 changes: 20 additions & 1 deletion src/common/log.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,25 @@ const logSocketData = (data, socketName='A') => {
console.log(socketName + ' socket receives data: ' + data);
};

const logServerListening = (port, serverName='A') => {
console.log(serverName + ' server is listening on port ' + port);
};

const logSocketConnection = (remotePort, remoteIP, socketName='A') => {
console.log(socketName + ' socket connect to remote port ' +
remotePort + ' remote ip ' + remoteIP);
};

const logServerError = (error, port, serverName='A') => {
console.log(serverName + ' server on port ' + port +
' occurs error: ' + error.message + ' stack: ' + error.stack);
};

module.exports = {
ConfigErrors, logConfigError, logSocketData
ConfigErrors,
logConfigError,
logSocketData,
logServerListening,
logSocketConnection,
logServerError
};
16 changes: 8 additions & 8 deletions src/common/socket.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
const net = require('net');
const dgram = require('dgram');
const TextEncoding = require('text-encoding');
const {TunnelServerInfoType} = require('./constant');
const {logServerListening, logServerError} = require('./log');

const decoder = new TextEncoding.TextDecoder('utf-8');

Expand All @@ -12,23 +14,21 @@ const createUdpSocket = (port, onListening, onError) => {
const socket = dgram.createSocket('udp4');
socket.on('listening',
onListening ? onListening :
function() {
console.log("Server is listening on port %d.", port);
() => {
// logServerListening(port, 'Udp Remote');
}
);
socket.on('error',
onError ? onError :
function(err) {
console.log('error, msg - %s, stack - %s\n', err.message, err.stack);
}
(err) => {logServerError(err, port, 'Udp Remote');}
);
socket.bind(port);
return socket;
};

const createClientTunnelSocket = (tunnelSockets, uuid, socketType,
bindPort, serverPort, serverIP) => {
const tunnelSocket = Net.createConnection(serverPort, serverIP);
const tunnelSocket = net.createConnection(serverPort, serverIP);
handleSocketError(tunnelSocket);

tunnelSocket.on('close', () => {
Expand All @@ -38,8 +38,7 @@ const createClientTunnelSocket = (tunnelSockets, uuid, socketType,
tunnelSocket.on('connect', () => {
const replyInfo = {
type: TunnelServerInfoType.TUNNEL,
bindPort, socketType,
uuid: null
bindPort, socketType, uuid
};
sendTcpInfo(tunnelSocket, replyInfo);
});
Expand All @@ -55,6 +54,7 @@ const handleSocketError = (socket) => {
});
};

// TODO: add try..catch... so that when receiving wrong message program won't crash
const parseMsgWithMetaData = (msg) => {
if (msg instanceof Uint8Array) {
msg = decoder.decode(msg);
Expand Down
2 changes: 1 addition & 1 deletion src/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ program.version('0.0.1');
//
// program.parse(process.argv);

const filePath = '../test/server.json';
const filePath = './test/server.json';

const parseResult = parseServerConfig(filePath);
if (typeof parseResult !== 'object') {
Expand Down
16 changes: 10 additions & 6 deletions src/tcpClient.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const Net = require('net');
const net = require('net');
const _ = require('lodash');
const {
handleSocketError,
Expand All @@ -7,9 +7,12 @@ const {
sendTcpInfo,
createClientTunnelSocket
} = require('./common/socket');
const {logSocketData} = require('./common/log');
const {SocketType, TunnelClientInfoType,
TunnelServerInfoType} = require('./common/constant');
const {logSocketData, logSocketConnection} = require('./common/log');
const {
SocketType,
TunnelClientInfoType,
TunnelServerInfoType
} = require('./common/constant');

const pipeTunnelAndDataTcpSocket = (tunnelSocket, dataSocket, uuid, bindPort) => {
tunnelSocket.on('data', (data) => {
Expand All @@ -32,7 +35,8 @@ const createTcpController = (serverPort, serverIP, proxies) => {
const tunnelSockets = {};

// TODO: set interval time to reconnect
const tcpControlSocket = Net.createConnection(serverPort, serverIP);
const tcpControlSocket = net.createConnection(serverPort, serverIP);
logSocketConnection(serverPort, serverIP, 'Tcp Control');
handleSocketError(tcpControlSocket);

tcpControlSocket.on('data', (data) => {
Expand All @@ -47,7 +51,7 @@ const createTcpController = (serverPort, serverIP, proxies) => {
const tunnelSocket = createClientTunnelSocket(tunnelSockets, info.uuid,
SocketType.TCP, info.bindPort, serverPort, serverIP);

const dataSocket = Net.createConnection(proxy.localPort, '127.0.0.1');
const dataSocket = net.createConnection(proxy.localPort, '127.0.0.1');
pipeTunnelAndDataTcpSocket(tunnelSocket, dataSocket,
info.uuid, info.bindPort);
}
Expand Down
10 changes: 7 additions & 3 deletions src/tcpServer.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
const Net = require('net');
const net = require('net');
const {handleSocketError} = require('./common/socket');
const {EventType, SocketType} = require('./common/constant');
const {EventType} = require('./common/constant');
const {logServerListening} = require('./common/log');

const createRemoteTcpServer = (eventEmitter, listenPort) => {
const remoteServer = Net.createServer(function (socket) {
const remoteServer = net.createServer(function (socket) {
handleSocketError(socket);

eventEmitter.emit(EventType.RECEIVE_REMOTE_CONNECTION, socket, listenPort);
});

remoteServer.listen(listenPort, '127.0.0.1');
logServerListening(listenPort, 'Tcp Remote');

return remoteServer;
};

const createTcpProxies = (eventEmitter, proxies) => {
Expand Down
9 changes: 6 additions & 3 deletions src/tunnelServer.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
const Net = require('net');
const net = require('net');
const _ = require('lodash');
const uuidv4 = require('uuid/v4');
const {
handleSocketError,
parseMsgWithMetaData,
sendTcpMetaData,
sendTcpInfo} = require('./common/socket');
const {logSocketData} = require('./common/log');
const {logSocketData, logServerListening} = require('./common/log');
const {
EventType,
SocketType,
Expand Down Expand Up @@ -47,7 +48,7 @@ const createTunnelServer = (eventEmitter, listenPort) => {
// msg: {msg, uuid, remotePort, remoteIP}
const stashedMsgInfos = [];

const tunnelServer = Net.createServer((socket) => {
const tunnelServer = net.createServer((socket) => {
handleSocketError(socket);

// Used for tcp <--> tcp piping.
Expand Down Expand Up @@ -164,6 +165,8 @@ const createTunnelServer = (eventEmitter, listenPort) => {
});

tunnelServer.listen(listenPort, '127.0.0.1');
logServerListening(listenPort, 'Tunnel');

return tunnelServer;
};

Expand Down
6 changes: 4 additions & 2 deletions src/udpClient.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
const net = require('net');
const _ = require('lodash');
const {
createClientTunnelSocket,
Expand All @@ -9,7 +10,7 @@ const {
} = require('./common/socket');
const {SocketType, TunnelClientInfoType,
TunnelServerInfoType} = require('./common/constant');
const {logSocketData} = require('./common/log');
const {logSocketData, logSocketConnection} = require('./common/log');

// TODO: improve the random algorithm
let randomPort = 20000;
Expand Down Expand Up @@ -42,7 +43,8 @@ const createUdpController = (serverPort, serverIP, proxies) => {
const tunnelSockets = {};
// TODO: set interval time to reconnect

const udpControlSocket = Net.createConnection(serverPort, serverIP);
const udpControlSocket = net.createConnection(serverPort, serverIP);
logSocketConnection(serverPort, serverIP, 'Udp Control');
handleSocketError(udpControlSocket);

udpControlSocket.on('data', (data) => {
Expand Down
10 changes: 7 additions & 3 deletions src/udpServer.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const _ = require('lodash');
const {createUdpSocket, sendUdpMetaData} = require('./common/socket');
const {EventType, SocketType} = require('./common/constant');
const {logSocketData} = require('./common/log');
const {logSocketData, logServerListening} = require('./common/log');

const createRemoteUdpServer = (eventEmitter, listenPort) => {
const remoteServer = createUdpSocket(listenPort);
Expand All @@ -10,8 +10,11 @@ const createRemoteUdpServer = (eventEmitter, listenPort) => {
logSocketData(msg, 'UDP Remote');

eventEmitter.emit(EventType.RECEIVE_UDP_MESSAGE,
SocketType.UDP, rinfo.port, rinfo.address, listenPort);
msg, rinfo.port, rinfo.address, listenPort);
});

logServerListening(listenPort, 'Udp Remote');
return remoteServer;
};

const createUdpProxies = (eventEmitter, proxies) => {
Expand All @@ -21,7 +24,8 @@ const createUdpProxies = (eventEmitter, proxies) => {
remoteServers[proxy.listenPort] = createRemoteUdpServer(eventEmitter, proxy.listenPort);
}

eventEmitter.on(EventType.SEND_UDP_MESSAGE, (bindPort, remotePort, remoteIP, metaData) => {
eventEmitter.on(EventType.SEND_UDP_MESSAGE, (metaData, bindPort,
remotePort, remoteIP) => {
const server = remoteServers[bindPort];
sendUdpMetaData(server, metaData, remotePort, remoteIP);
});
Expand Down
2 changes: 1 addition & 1 deletion test/server.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"common": {
"bindPort": 7001
"bindPort": 7000
},
"tcp": [
{
Expand Down
8 changes: 4 additions & 4 deletions test/tcpClient.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const Net = require('net');
const net = require('net');
const TextEncoding = require('text-encoding');

const TunnelServerPort = 7001;
Expand All @@ -11,15 +11,15 @@ const decoder = new TextEncoding.TextDecoder('utf-8');
const tunnelSockets = {};

// TODO: set interval time to reconnect
const mainClientSocket = Net.createConnection(TunnelServerPort, ServerIP);
const mainClientSocket = net.createConnection(TunnelServerPort, ServerIP);

// data: {type: 'createTunnel', uuid: int}
mainClientSocket.on('data', (data) => {
console.log('mainClientSocket receive data: ' + data);
const receiveInfo = JSON.parse(decoder.decode(data));
const uuid = receiveInfo.uuid;

const tunnelSocket = Net.createConnection(TunnelServerPort, ServerIP);
const tunnelSocket = net.createConnection(TunnelServerPort, ServerIP);
tunnelSockets[uuid] = tunnelSocket;
tunnelSocket.on('close', () => {
delete tunnelSockets[uuid];
Expand All @@ -29,7 +29,7 @@ mainClientSocket.on('data', (data) => {
tunnelSocket.write(JSON.stringify(replyInfo));
});

const dataSocket = Net.createConnection(BindingPort, '127.0.0.1');
const dataSocket = net.createConnection(BindingPort, '127.0.0.1');
tunnelSocket.pipe(dataSocket).pipe(tunnelSocket);
});

Expand Down
6 changes: 3 additions & 3 deletions test/tcpServer.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const Net = require('net');
const net = require('net');
const TextEncoding = require('text-encoding');

const RemoteServerPort = 7000;
Expand All @@ -11,7 +11,7 @@ let mainClientSocket = null;
const remoteSockets = {};
const tunnelSockets = {};

const remoteServer = Net.createServer(function (socket) {
const remoteServer = net.createServer(function (socket) {
socket.on('error', (e) => {console.log(e);});

const socketId = UUID++;
Expand All @@ -26,7 +26,7 @@ const remoteServer = Net.createServer(function (socket) {

remoteServer.listen(RemoteServerPort, '127.0.0.1');

const tunnelServer = Net.createServer((socket) => {
const tunnelServer = net.createServer((socket) => {
let isPiping = false;
socket.on('error', (e) => {console.log(e);});
// data: {type: 'main'|'tunnel', uuid: int}
Expand Down

0 comments on commit 17bca38

Please sign in to comment.