This server does a few things:
abp
Sessions are identified by a UUID such as oranges-arkansas-mexico-fish
. You can share this URL with other people to share your screen and edit collaboratively.
The underlying graph state simulator is based on Anders’ and Briegel's method. Full docs for the Python package are here.
We expose an API so that you can programmatically read and write states to/from the server and simulate mouse clicks.
/<uuid>
: Displays the state using Three.js/<uuid>/graph
:
GET
returns JSON representing the statePOST
accepts JSON in the same format and overwrites the state in memory/<uuid>/edit
:
POST
accepts edit commands such as cz
, add_node
etc.doc/
: Shows this pageIf you do an HTTPS GET against /<uuid>/graph
, you will receive some JSON.
:::bash
$ curl https://abv.peteshadbolt.co.uk/<uuid>/graph
outputs
:::python
{"node":
{"30":
{"position":
{"y": 3.245091885135617, "x": -1.0335390368621762, "z": 0.12485495696298532}, "vop": 0}, "28":
{"position":
{"y": 0.1811335599620998, "x": 3.7102305790943295, "z": 0.3375519427305571}, "vop": 0}, "29":
{"position":
{"y": -1.834182888403804, "x": 1.5968911365745622, "z": 2.8585980299131886
...
The top-level keys are node
and adj
. These model the node metadata and adjacency matrix respectively.
Each node
has
position
({x:<> y:<> z:<>}
)vop
(integer, ignore for now)color
, label
, etc.adj
uses the same data structure as networkx
to efficiently represent sparse adjacency matrices. For each key i
in adj
, the value of adj[i]
is itself a map whose keys j
correspond to the ids of nodes connected to i
. The value of adj[i][j]
is a map which is usually empty but which could be used to store metadata about the edge.
Here's an example of a graph (A-B C)
:
:::python
{'adj': {0: {1: {}}, 1: {0: {}}, 2: {}},
'node': {
0: {'position': {'x': 0, 'y': 0, 'z': 0}, 'vop': 0},
1: {'position': {'x': 1, 'y': 0, 'z': 0}, 'vop': 0},
2: {'position': {'x': 2, 'y': 0, 'z': 0}, 'vop': 10}}}