diff --git a/lib/Identity.js b/lib/Identity.js index 0ceba8d..a563073 100644 --- a/lib/Identity.js +++ b/lib/Identity.js @@ -69,6 +69,6 @@ module.exports.Identity = class Identity { } toString() { - return `[Identity(${this.name})]`; + return `[Identity ${this.name}]`; } } \ No newline at end of file diff --git a/lib/STP/index.js b/lib/STP/index.js index e6362ca..64c2517 100644 --- a/lib/STP/index.js +++ b/lib/STP/index.js @@ -1,7 +1,7 @@ const net = require('net'); const EventEmitter = require('events'); const NodeRSA = require('node-rsa'); -const log = require('signale').scope('stp'); +const log = require('signale').scope('_STP'); const { KeyExchangePacket, AckPacket @@ -36,7 +36,7 @@ class Server extends EventEmitter { } openServer() { - log.info(`opening STP server on ${this.port}`); + // log.info(`opening STP server on ${this.port}`); this.tcpServer = net.createServer(this.tcpConnectClient.bind(this)); this.tcpServer.on('error', e => { log.warn(e) diff --git a/lib/node.js b/lib/node.js index 37b00b6..f9f6420 100644 --- a/lib/node.js +++ b/lib/node.js @@ -4,6 +4,8 @@ const upnp = require('./upnp'); const md5 = require('md5'); const pkg = require('./../package.json'); const { config, write } = require('./config.js'); +const log = require('signale').scope('NODE'); +const { createAdvertisement, tcp, browseThemAll } = require('mdns'); class Node extends EventEmitter { clients = []; @@ -12,66 +14,84 @@ class Node extends EventEmitter { readyPromise = null; port = null; identity; + multicastAd = null; + multicastBrowser = null; + connected = false; constructor(identity) { super(); this.identity = identity; this.hash = md5(identity.publicKey); - this.name = `valnet node - ${this.hash}`; - // stp.createServer({ - // identity, - // port - // }, socket => { - // log.info('secured connection from ' + socket.remoteAddress); - // this.clients.push(socket); - // }); - this.readyPromise = this.negotiatePort().then(this.startServer.bind(this)); + this.name = `valnet-node-${identity.name}`; + + this.readyPromise = this.negotiatePort() + .then(this.startServer.bind(this)) + .catch(this.serverStartupFailed.bind(this)) + .then(this.connectNetwork.bind(this)) } - startServer() { - - console.log('creating server on port ' + this.port); + async connectNetwork() { + + } + + async serverStartupFailed(error) { + log.warn('Failed to set up Valet server on node.') + } + + async startServer() { + log.info('creating Valnet Node on port ' + this.port + '...'); stp.createServer({ identity: this.identity, port: this.port }, (connection) => { - console.log('incomming connection...'); - console.dir(connection); - }) + log.info('incomming connection from ' + connection.remoteAddress); + }); + + log.info('advertising node on multicast...') + this.multicastAd = createAdvertisement(tcp('STP'), this.port, { + name: 'xyz.valnet.node', + }); + + this.multicastBrowser = browseThemAll(); + + this.multicastBrowser.on('serviceUp', this.serviceUp.bind(this)); + this.multicastBrowser.on('serviceDown', this.serviceDown.bind(this)); + + // log.success('Node successfully registered!'); + } + + async serviceUp(service) { + log.debug('up', service); + } + + async serviceDown(service) { + log.debug('down', service); } async negotiatePort() { - // await upnp.map(5600, 60 * 5, 'other application'); - const mappings = await upnp.mappings(); - const matchingMappings = mappings.filter(mapping => { return mapping.description === this.name }); const alreadyMapped = matchingMappings.length > 0; + const takenPorts = mappings.map(mapping => mapping.public.port); if(alreadyMapped) { - console.log('already mapped!'); this.port = matchingMappings[0].public.port; + log.success(`upnp port ${this.port} already registered!`); return; } - const takenPorts = mappings.map(mapping => mapping.public.port); - for(let port = config.ports.relay; port <= config.ports.relayEnd; port ++) { if(takenPorts.indexOf(port) === -1) { - console.log('registering to port ' + port); await upnp.mapIndefinite(port, this.name); this.port = port; - break; - } else { - console.log('port ' + port + ' is taken...'); + log.success(`registered upnp port ${this.port}`); + return; } } - - // console.log(mappings, this.hash); } diff --git a/package.json b/package.json index 5aa39b2..d601ac2 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "keyv": "^4.0.3", "keyv-file": "^0.2.0", "md5": "^2.3.0", + "mdns": "^2.7.2", "nat-upnp": "^1.1.1", "nedb": "^1.8.0", "node-rsa": "^1.1.1", diff --git a/relay/index.js b/relay/index.js index 6be4544..031c55f 100644 --- a/relay/index.js +++ b/relay/index.js @@ -1,7 +1,7 @@ (async () => { const { title } = require('../lib/title'); const net = require('net'); -const log = require('signale').scope('relay'); +const log = require('signale').scope('RLAY'); const { Identity } = require('../lib/Identity'); const stp = require('../lib/STP'); title('relay', false); @@ -22,7 +22,7 @@ function connectNetwork(t = 1000) { if(t > 60000) t /= 2; const poopoo = config.endpoints[0].split(':'); - console.log(poopoo); + // console.log(poopoo); const client = stp.connect({ identity, diff --git a/relay/service.js b/relay/service.js index b1f668c..8478e03 100644 --- a/relay/service.js +++ b/relay/service.js @@ -1,5 +1,5 @@ (async () => { -const log = require('signale').scope('service'); +const log = require('signale').scope('SRVC'); const { execSync, spawn } = require('child_process'); const branch = execSync('git rev-parse --abbrev-ref HEAD').toString().trim(); let proc; diff --git a/yarn.lock b/yarn.lock index 2474848..15f5f7d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -119,6 +119,10 @@ binary-search-tree@0.2.5: dependencies: underscore "~1.4.4" +bindings@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11" + body-parser@1.19.0: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" @@ -920,6 +924,13 @@ md5@^2.3.0: crypt "0.0.2" is-buffer "~1.1.6" +mdns@^2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/mdns/-/mdns-2.7.2.tgz#1629077b950e2a9bdb02e370d505ff4fa2ace0ff" + dependencies: + bindings "~1.2.1" + nan "^2.14.0" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -992,6 +1003,10 @@ mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" +nan@^2.14.0: + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + nat-upnp@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/nat-upnp/-/nat-upnp-1.1.1.tgz#b18365e4faf44652549bb593c69e6b690df22043"