SOURCE

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 命令行工具 X clear

                    
>
console