class Router {
constructor(id) {
this.id = id;
this.neighbors = [];
this.routes = [];
}
addRoute(nextStation, distance, targetNet) {
this.routes.push({ nextStation, distance, targetNet });
}
addNeighbor() {
this.neighbors.push(...Array.from(arguments));
}
send() {
let newRoutes = this.routes.map(route => {
let newRoute = { ...route };
newRoute.distance++;
return newRoute;
});
this.neighbors.forEach(neighbor => {
neighbor.receive(this, newRoutes);
});
}
receive(sender, routes) {
let updated = false;
routes.forEach(route => {
let i = this.routes.findIndex(r => {
return r.targetNet == route.targetNet;
});
if (i == -1) {
route.nextStation = sender;
this.routes.push(route);
updated = true;
} else {
let foundedRoute = this.routes[i];
if (foundedRoute.nextStation != null &&
route.distance < foundedRoute.distance) {
route.nextStation = sender;
this.routes[i] = route;
updated = true;
}
}
});
if (updated) {
this.send();
}
}
sendData(targetNet, data) {
function deep(routes) {
for(let i = 0; i < routes.length; ++i) {
let route = routes[i];
if(route.targetNet == targetNet) {
if(route.nextStation) {
return deep(route.nextStation.routes);
} else {
signal(targetNet, data);
}
}
}
}
deep(this.routes);
}
}
let listeners = {};
let r1 = new Router("r1");
let r2 = new Router("r2");
let r3 = new Router("r3");
let r4 = new Router("r4");
let r5 = new Router("r5");
function listen(net, callback) {
listeners[net] = callback;
}
function signal(net, data) {
if(typeof listeners[net] === "function") {
listeners[net](data);
}
}
r1.addRoute(null, 0, "net1");
r1.addRoute(null, 0, "net2");
r1.addNeighbor(r2, r3);
r2.addRoute(null, 0, "net2");
r2.addRoute(null, 0, "net3");
r2.addNeighbor(r1, r3);
r3.addRoute(null, 0, "net1");
r3.addRoute(null, 0, "net3");
r3.addRoute(null, 0, "net4");
r3.addNeighbor(r2, r1, r4);
r4.addRoute(null, 0, "net4");
r4.addRoute(null, 0, "net5");
r4.addNeighbor(r3, r5);
r5.addNeighbor(r4);
r5.addRoute(null, 0, "net5");
r5.addRoute(null, 0, "net6");
r1.send();
listen("net5", function (data) {
console.log(data)
});
console