From 70bd0cdd4773a8a1e0778984d1562b5c1e928be3 Mon Sep 17 00:00:00 2001 From: wisplite Date: Mon, 8 Sep 2025 22:50:30 -0500 Subject: [PATCH] fixed the routing system so it can't just cheat and send data over the incoming connection --- script.js | 62 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 14 deletions(-) diff --git a/script.js b/script.js index 8b3ca08..27232b5 100644 --- a/script.js +++ b/script.js @@ -101,10 +101,10 @@ var forwardTable = {}; var onEdgeEngine = new CompleteNodeOnEdgeEngine(network, nodes, dotNodes, edges, forwardTable); onEdgeEngine.createEdgesTable(); onEdgeEngine.initMovement(); -onEdgeEngine.setArrivalCallback(({ from, to, dot }) => { +onEdgeEngine.setArrivalCallback(async ({ from, to, dot }) => { var ttl = parseInt(dot.id.split('-')[2]); if (stillRouting) { - routePacket(to, dot.id.split('-')[3], dot.id); + await routePacket(to, dot.id.split('-')[4], dot.id); return; } if (document.getElementById('showTTL').checked) { @@ -233,7 +233,24 @@ function quickRoute(startNode, packetInfo, fromNode) { } } -function routePacket(currentNode, goalNode, packetInfo, first=false) { +async function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +async function routePacket(currentNode, goalNode, packetInfo, first=false) { + if (!nodeTable[currentNode]) { + consoleLog(`Node ${currentNode} not found. Dropping packet.`); + return; + } + if (!nodeTable[goalNode]) { + consoleLog(`Node ${goalNode} not found. Dropping packet.`); + return; + } + if (nodeTable[currentNode].emergencyIncoming.length > 0) { + nodeTable[currentNode].emergencyIncoming = [] + nodeTable[packetInfo.split('-')[3]].emergencyOutgoing = [] + edges.remove({'id': `${packetInfo.split('-')[3]}->${currentNode}`}) + } stillRouting = true; const packetId = packetInfo.split('-')[0]; var packetShift = generateRealisticLabel(); @@ -260,10 +277,22 @@ function routePacket(currentNode, goalNode, packetInfo, first=false) { } } ttl--; - const nextNode = nodeTable[currentNode].routingTable[goalNode]; + let nextNode = nodeTable[currentNode].routingTable[goalNode]; + if (!nodeTable[currentNode].outgoing.includes(nextNode) && nodeTable[currentNode].emergencyOutgoing.length == 0 && nodeTable[nextNode].emergencyIncoming.length == 0) { + // use emergency connection slot + nodeTable[currentNode].emergencyOutgoing.push(nextNode); + nodeTable[nextNode].emergencyIncoming.push(currentNode); + await sleep(1000); + connectNodes(currentNode, nextNode); + } else if (nodeTable[currentNode].emergencyOutgoing.length != 0 || nodeTable[nextNode].emergencyIncoming.length != 0) { + consoleLog(`Couldn't connect to ${nextNode}. Dropping packet.`); + console.log(nodeTable[currentNode]) + stillRouting = false; + return; + } if (nextNode) { var movingNode = { - id: `${packetId}-${packetShift}-${ttl}-${goalNode}`, + id: `${packetId}-${packetShift}-${ttl}-${currentNode}-${goalNode}`, label: packetId + `-${ttl}`, shape: 'dot', size: 10, @@ -274,9 +303,14 @@ function routePacket(currentNode, goalNode, packetInfo, first=false) { font: {color: document.getElementById('darkMode').checked ? '#e0e0e0' : '#000'} }; onEdgeEngine.createDotNode(movingNode, currentNode, nextNode); + if (document.getElementById('showTTL').checked) { + edges.update({id: `${currentNode}->${nextNode}`, color: {color: smoothColorTransition('#eb4034', '#40eb34', 0, TTL, ttl+1), highlight: smoothColorTransition('#eb4034', '#40eb34', 0, TTL, ttl)}}); + } else { + edges.update({id: `${currentNode}->${nextNode}`, color: {color: 'yellow', highlight: 'yellow'}}); + } } else { - consoleLog(`No route found from ${currentNode} to ${goalNode}. Dropping packet.`); - console.log(nodeTable[currentNode].routingTable); + consoleLog(`No route found from ${currentNode} to ${goalNode} via ${nextNode}. Dropping packet.`); + console.log(nodeTable[currentNode].routingTable) stillRouting = false; } } @@ -589,7 +623,7 @@ function onNodeAdd() { document.getElementById('addNode').addEventListener('click', function() { const nodeId = generateRealisticLabel(); nodes.add({id: nodeId, label: nodeId}); - nodeTable[nodeId] = {'incoming': [], 'outgoing': [], 'packetCache': [], 'routingTable': {}}; + nodeTable[nodeId] = {'incoming': [], 'outgoing': [], 'emergencyIncoming': [], 'emergencyOutgoing': [], 'packetCache': [], 'routingTable': {}}; onNodeAdd(); }); @@ -600,7 +634,7 @@ network.on('click', function(properties) { if (document.getElementById('quickPlace').checked) { const nodeId = generateRealisticLabel(); nodes.add({id: nodeId, label: nodeId, x: properties.pointer.canvas.x, y: properties.pointer.canvas.y}); - nodeTable[nodeId] = {'incoming': [], 'outgoing': [], 'packetCache': [], 'routingTable': {}}; + nodeTable[nodeId] = {'incoming': [], 'outgoing': [], 'emergencyIncoming': [], 'emergencyOutgoing': [], 'packetCache': [], 'routingTable': {}}; onNodeAdd(); } }); @@ -615,7 +649,7 @@ network.on('doubleClick', function(properties) { } const nodeId = generateRealisticLabel(); nodes.add({id: nodeId, label: nodeId, x: properties.pointer.canvas.x, y: properties.pointer.canvas.y}); - nodeTable[nodeId] = {'incoming': [], 'outgoing': [], 'packetCache': [], 'routingTable': {}}; + nodeTable[nodeId] = {'incoming': [], 'outgoing': [], 'emergencyIncoming': [], 'emergencyOutgoing': [], 'packetCache': [], 'routingTable': {}}; onNodeAdd(); }); @@ -706,7 +740,7 @@ document.getElementById('createRandomGraphConfirm').addEventListener('click', fu const interval = setInterval(() => { const nodeId = generateRealisticLabel(); nodes.add({id: nodeId, label: nodeId, x: Math.random() * 1000, y: Math.random() * 1000}); - nodeTable[nodeId] = {'incoming': [], 'outgoing': [], 'packetCache': [], 'routingTable': {}}; + nodeTable[nodeId] = {'incoming': [], 'outgoing': [], 'emergencyIncoming': [], 'emergencyOutgoing': [], 'packetCache': [], 'routingTable': {}}; onNodeAdd(); nodeCounter++; if (nodeCounter >= nodeCount) { @@ -811,7 +845,7 @@ window.onload = function() { let consoleInputHistory = []; let consoleInputHistoryIndex = 0; // Handle Enter key for command execution - consoleInput.addEventListener('keypress', function(event) { + consoleInput.addEventListener('keypress', async function(event) { if (event.key === 'Enter') { const command = consoleInput.value.trim(); if (command) { // Only add non-empty commands to history @@ -842,10 +876,10 @@ window.onload = function() { break; } document.getElementById('resetTTLColors').click(); - const packetInfo = `${generateRealisticLabel()}-${generateRealisticLabel()}-${TTL}-${args.split('->')[1]}`; + const packetInfo = `${generateRealisticLabel()}-${generateRealisticLabel()}-${TTL}-${args.split('->')[0]}-${args.split('->')[1]}`; nodes.update({id: args.split('->')[0], color: {background: '#ff00d9'}}); nodes.update({id: args.split('->')[1], color: {background: '#ff00d9'}}); - routePacket(args.split('->')[0], args.split('->')[1], packetInfo, true); + await routePacket(args.split('->')[0], args.split('->')[1], packetInfo, true); break; case 'exit': document.getElementById('consoleContainer').style.display = 'none';