UNPKG

dagre-d3

Version:

A D3-based renderer for Dagre

103 lines (81 loc) 3.18 kB
<!doctype html> <meta charset="utf-8"> <title>Dagre D3 Demo: TCP State Diagram</title> <link rel="stylesheet" href="demo.css"> <script src="https://d3js.org/d3.v5.min.js" charset="utf-8"></script> <script src="../dagre-d3.js"></script> <style id="css"> body { font: 300 14px 'Helvetica Neue', Helvetica; } .node rect { stroke: #333; fill: #fff; } .edgePath path { stroke: #333; fill: #333; stroke-width: 1.5px; } </style> <h1>Dagre D3 Demo: TCP State Diagram</h1> <svg width=960 height=600><g/></svg> <section> <p>A sample rendering of a TCP state diagram (<a href="http://www.rfc-editor.org/rfc/rfc793.txt">RFC 793</a>). This example shows how to set custom styles in the input graph and how to set a custom initial zoom. </section> <script id="js"> // Create a new directed graph var g = new dagreD3.graphlib.Graph().setGraph({}); // States and transitions from RFC 793 var states = [ "CLOSED", "LISTEN", "SYN RCVD", "SYN SENT", "ESTAB", "FINWAIT-1", "CLOSE WAIT", "FINWAIT-2", "CLOSING", "LAST-ACK", "TIME WAIT" ]; // Automatically label each of the nodes states.forEach(function(state) { g.setNode(state, { label: state }); }); // Set up the edges g.setEdge("CLOSED", "LISTEN", { label: "open" }); g.setEdge("LISTEN", "SYN RCVD", { label: "rcv SYN" }); g.setEdge("LISTEN", "SYN SENT", { label: "send" }); g.setEdge("LISTEN", "CLOSED", { label: "close" }); g.setEdge("SYN RCVD", "FINWAIT-1", { label: "close" }); g.setEdge("SYN RCVD", "ESTAB", { label: "rcv ACK of SYN" }); g.setEdge("SYN SENT", "SYN RCVD", { label: "rcv SYN" }); g.setEdge("SYN SENT", "ESTAB", { label: "rcv SYN, ACK" }); g.setEdge("SYN SENT", "CLOSED", { label: "close" }); g.setEdge("ESTAB", "FINWAIT-1", { label: "close" }); g.setEdge("ESTAB", "CLOSE WAIT", { label: "rcv FIN" }); g.setEdge("FINWAIT-1", "FINWAIT-2", { label: "rcv ACK of FIN" }); g.setEdge("FINWAIT-1", "CLOSING", { label: "rcv FIN" }); g.setEdge("CLOSE WAIT", "LAST-ACK", { label: "close" }); g.setEdge("FINWAIT-2", "TIME WAIT", { label: "rcv FIN" }); g.setEdge("CLOSING", "TIME WAIT", { label: "rcv ACK of FIN" }); g.setEdge("LAST-ACK", "CLOSED", { label: "rcv ACK of FIN" }); g.setEdge("TIME WAIT", "CLOSED", { label: "timeout=2MSL" }); // Set some general styles g.nodes().forEach(function(v) { var node = g.node(v); node.rx = node.ry = 5; }); // Add some custom colors based on state g.node('CLOSED').style = "fill: #f77"; g.node('ESTAB').style = "fill: #7f7"; var svg = d3.select("svg"), inner = svg.select("g"); // Set up zoom support var zoom = d3.zoom().on("zoom", function() { inner.attr("transform", d3.event.transform); }); svg.call(zoom); // Create the renderer var render = new dagreD3.render(); // Run the renderer. This is what draws the final graph. render(inner, g); // Center the graph var initialScale = 0.75; svg.call(zoom.transform, d3.zoomIdentity.translate((svg.attr("width") - g.graph().width * initialScale) / 2, 20).scale(initialScale)); svg.attr('height', g.graph().height * initialScale + 40); </script> <script src="demo.js"></script>