From 10d4ec8e603b7c500f870055d58cf2c176a65c7d Mon Sep 17 00:00:00 2001 From: calzoneman Date: Thu, 24 Dec 2015 16:24:07 -0800 Subject: [PATCH] Initial work for proxy connections --- src/io/backend/frontendmanager.js | 20 ++++++++++++++++++ src/io/backend/iobackend.js | 20 ++++++++++++++++++ src/io/backend/proxiedsocket.js | 35 +++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 src/io/backend/frontendmanager.js create mode 100644 src/io/backend/iobackend.js create mode 100644 src/io/backend/proxiedsocket.js diff --git a/src/io/backend/frontendmanager.js b/src/io/backend/frontendmanager.js new file mode 100644 index 00000000..5bd465b3 --- /dev/null +++ b/src/io/backend/frontendmanager.js @@ -0,0 +1,20 @@ +export default class FrontendManager { + constructor() { + this.frontendConnections = {}; + } + + onConnection(socket) { + if (this.frontendConnections.hasOwnProperty(socket.remoteAddress)) { + // TODO: do some validation, maybe check if the socket is still connected? + throw new Error(); + } + + this.frontendConnections[socket.remoteAddressAndPort] = socket; + console.log(socket.remoteAddressAndPort); + socket.on('data', this.onData.bind(this, socket)); + } + + onData(socket, data) { + console.log(data); + } +} diff --git a/src/io/backend/iobackend.js b/src/io/backend/iobackend.js new file mode 100644 index 00000000..e0c8d78d --- /dev/null +++ b/src/io/backend/iobackend.js @@ -0,0 +1,20 @@ +import Server from 'cytube-common/lib/tcpjson/server'; +import FrontendManager from './frontendmanager'; + +export default class IOBackend { + constructor(proxyListenerConfig) { + this.proxyListenerConfig = proxyListenerConfig; + this.initFrontendManager(); + this.initProxyListener(); + } + + initFrontendManager() { + this.frontendManager = new FrontendManager(); + } + + initProxyListener() { + this.proxyListener = new Server(this.proxyListenerConfig); + this.proxyListener.on('connection', + this.frontendManager.onConnection.bind(this.frontendManager)); + } +} diff --git a/src/io/backend/proxiedsocket.js b/src/io/backend/proxiedsocket.js new file mode 100644 index 00000000..38e004b6 --- /dev/null +++ b/src/io/backend/proxiedsocket.js @@ -0,0 +1,35 @@ +import { EventEmitter } from 'events'; + +export default class ProxiedSocket extends EventEmitter { + constructor(socketID, socketData, socketEmitter, frontendConnection) { + super(); + this.id = socketID; + this.ip = socketData.ip; + this._realip = socketData.ip; + this.socketEmitter = socketEmitter; + this.frontendConnection = frontendConnection; + } + + emit() { + const target = socketEmitter.to(this.id); + target.emit.apply(target, arguments); + } + + onProxiedEventReceived() { + EventEmitter.prototype.emit.apply(this, arguments); + } + + join(channel) { + this.frontendConnection.write( + this.frontendConnection.protocol.socketJoinSocketChannels( + this.id, [channel] + ) + ); + } + + disconnect() { + this.frontendConnection.write( + this.frontendConnection.protocol.socketKick(this.id) + ); + } +}