name upnp naming scheme (fs compatible)

canary
Marcus 2021-04-01 15:06:22 -04:00
parent e0b837876d
commit a105e5aa93
7 changed files with 69 additions and 33 deletions

View File

@ -69,6 +69,6 @@ module.exports.Identity = class Identity {
}
toString() {
return `[Identity(${this.name})]`;
return `[Identity ${this.name}]`;
}
}

View File

@ -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)

View File

@ -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() {
async connectNetwork() {
console.log('creating server on port ' + this.port);
}
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);
}

View File

@ -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",

View File

@ -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,

View File

@ -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;

View File

@ -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"