Spaces:
Running
Running
Start switching to CRDT. The env setting works!!!
Browse files- requirements.txt +2 -0
- server/crdt.py +62 -0
- server/main.py +3 -2
- web/package-lock.json +575 -1
- web/package.json +4 -1
- web/src/LynxKiteFlow.svelte +35 -75
- web/src/Workspace.svelte +23 -0
- web/vite.config.ts +8 -1
requirements.txt
CHANGED
@@ -5,6 +5,8 @@ numpy
|
|
5 |
pandas
|
6 |
scipy
|
7 |
uvicorn[standard]
|
|
|
|
|
8 |
# For llm_ops
|
9 |
chromadb
|
10 |
Jinja2
|
|
|
5 |
pandas
|
6 |
scipy
|
7 |
uvicorn[standard]
|
8 |
+
pycrdt
|
9 |
+
pycrdt-websocket
|
10 |
# For llm_ops
|
11 |
chromadb
|
12 |
Jinja2
|
server/crdt.py
ADDED
@@ -0,0 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
'''CRDT is used to synchronize workspace state for backend and frontend(s).'''
|
2 |
+
import contextlib
|
3 |
+
import fastapi
|
4 |
+
import os.path
|
5 |
+
import pycrdt
|
6 |
+
import pycrdt_websocket
|
7 |
+
|
8 |
+
import pycrdt_websocket.ystore
|
9 |
+
|
10 |
+
router = fastapi.APIRouter()
|
11 |
+
|
12 |
+
def ws_exception_handler(exception, log):
|
13 |
+
log.exception(exception)
|
14 |
+
return True
|
15 |
+
|
16 |
+
class WebsocketServer(pycrdt_websocket.WebsocketServer):
|
17 |
+
async def init_room(self, name):
|
18 |
+
ystore = pycrdt_websocket.ystore.FileYStore(f'crdt_data/{name}.crdt')
|
19 |
+
ydoc = pycrdt.Doc()
|
20 |
+
ydoc['workspace'] = ws = pycrdt.Map()
|
21 |
+
ws['nodes'] = []
|
22 |
+
ws['edges'] = []
|
23 |
+
ws['env'] = 'unset'
|
24 |
+
# Replay updates from the store.
|
25 |
+
try:
|
26 |
+
for update, timestamp in [(item[0], item[-1]) async for item in ystore.read()]:
|
27 |
+
ydoc.apply_update(update)
|
28 |
+
except pycrdt_websocket.ystore.YDocNotFound:
|
29 |
+
pass
|
30 |
+
print('init_room', name, ws)
|
31 |
+
_subscription_id = ws.observe_deep(handle_deep_changes)
|
32 |
+
return pycrdt_websocket.YRoom(ystore=ystore, ydoc=ydoc)
|
33 |
+
|
34 |
+
async def get_room(self, name: str) -> pycrdt_websocket.YRoom:
|
35 |
+
print('get_room', name, self.rooms)
|
36 |
+
if name not in self.rooms:
|
37 |
+
self.rooms[name] = await self.init_room(name)
|
38 |
+
print('get_room2', name, self.rooms)
|
39 |
+
room = self.rooms[name]
|
40 |
+
await self.start_room(room)
|
41 |
+
return room
|
42 |
+
|
43 |
+
print('new WebsocketServer')
|
44 |
+
websocket_server = WebsocketServer(exception_handler=ws_exception_handler, auto_clean_rooms=False)
|
45 |
+
asgi_server = pycrdt_websocket.ASGIServer(websocket_server)
|
46 |
+
|
47 |
+
def handle_deep_changes(events):
|
48 |
+
print('events', events)
|
49 |
+
|
50 |
+
@contextlib.asynccontextmanager
|
51 |
+
async def lifespan(app):
|
52 |
+
async with websocket_server:
|
53 |
+
yield
|
54 |
+
|
55 |
+
def sanitize_path(path):
|
56 |
+
return os.path.relpath(os.path.normpath(os.path.join("/", path)), "/")
|
57 |
+
|
58 |
+
@router.websocket("/ws/crdt/{room_name}")
|
59 |
+
async def crdt_websocket(websocket: fastapi.WebSocket, room_name: str):
|
60 |
+
room_name = sanitize_path(room_name)
|
61 |
+
print('room_name', room_name)
|
62 |
+
await asgi_server({'path': room_name}, websocket._receive, websocket._send)
|
server/main.py
CHANGED
@@ -2,6 +2,7 @@ import dataclasses
|
|
2 |
import fastapi
|
3 |
import pathlib
|
4 |
import pkgutil
|
|
|
5 |
from . import ops
|
6 |
from . import workspace
|
7 |
|
@@ -11,8 +12,8 @@ for _, name, _ in pkgutil.iter_modules([str(here)]):
|
|
11 |
print(f'Importing {name}')
|
12 |
__import__(f'server.{name}')
|
13 |
|
14 |
-
app = fastapi.FastAPI()
|
15 |
-
|
16 |
|
17 |
@app.get("/api/catalog")
|
18 |
def get_catalog():
|
|
|
2 |
import fastapi
|
3 |
import pathlib
|
4 |
import pkgutil
|
5 |
+
from . import crdt
|
6 |
from . import ops
|
7 |
from . import workspace
|
8 |
|
|
|
12 |
print(f'Importing {name}')
|
13 |
__import__(f'server.{name}')
|
14 |
|
15 |
+
app = fastapi.FastAPI(lifespan=crdt.lifespan)
|
16 |
+
app.include_router(crdt.router)
|
17 |
|
18 |
@app.get("/api/catalog")
|
19 |
def get_catalog():
|
web/package-lock.json
CHANGED
@@ -21,6 +21,8 @@
|
|
21 |
},
|
22 |
"devDependencies": {
|
23 |
"@sveltejs/vite-plugin-svelte": "^3.0.2",
|
|
|
|
|
24 |
"@tsconfig/svelte": "^5.0.4",
|
25 |
"sass": "^1.77.2",
|
26 |
"svelte": "^4.2.12",
|
@@ -28,7 +30,8 @@
|
|
28 |
"tslib": "^2.6.2",
|
29 |
"typescript": "^5.4.4",
|
30 |
"unplugin-icons": "^0.18.5",
|
31 |
-
"vite": "^5.2.8"
|
|
|
32 |
}
|
33 |
},
|
34 |
"node_modules/@ampproject/remapping": {
|
@@ -575,6 +578,12 @@
|
|
575 |
"url": "https://opencollective.com/popperjs"
|
576 |
}
|
577 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
578 |
"node_modules/@rollup/rollup-android-arm-eabi": {
|
579 |
"version": "4.18.0",
|
580 |
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz",
|
@@ -843,6 +852,39 @@
|
|
843 |
}
|
844 |
}
|
845 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
846 |
"node_modules/@tsconfig/svelte": {
|
847 |
"version": "5.0.4",
|
848 |
"resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.4.tgz",
|
@@ -1081,6 +1123,17 @@
|
|
1081 |
"resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz",
|
1082 |
"integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg=="
|
1083 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1084 |
"node_modules/@types/pug": {
|
1085 |
"version": "2.0.10",
|
1086 |
"resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.10.tgz",
|
@@ -1114,6 +1167,23 @@
|
|
1114 |
"d3-zoom": "^3.0.0"
|
1115 |
}
|
1116 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1117 |
"node_modules/acorn": {
|
1118 |
"version": "8.11.3",
|
1119 |
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
|
@@ -1146,6 +1216,13 @@
|
|
1146 |
"dequal": "^2.0.3"
|
1147 |
}
|
1148 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1149 |
"node_modules/axobject-query": {
|
1150 |
"version": "4.0.0",
|
1151 |
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz",
|
@@ -1159,6 +1236,27 @@
|
|
1159 |
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
1160 |
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
|
1161 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1162 |
"node_modules/binary-extensions": {
|
1163 |
"version": "2.3.0",
|
1164 |
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
|
@@ -1210,6 +1308,31 @@
|
|
1210 |
"node": ">=8"
|
1211 |
}
|
1212 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1213 |
"node_modules/buffer-crc32": {
|
1214 |
"version": "0.2.13",
|
1215 |
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
|
@@ -1438,6 +1561,20 @@
|
|
1438 |
"node": ">=0.10.0"
|
1439 |
}
|
1440 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1441 |
"node_modules/dequal": {
|
1442 |
"version": "2.0.3",
|
1443 |
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
|
@@ -1468,6 +1605,35 @@
|
|
1468 |
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
|
1469 |
"integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
|
1470 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1471 |
"node_modules/es6-promise": {
|
1472 |
"version": "3.3.1",
|
1473 |
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
|
@@ -1680,6 +1846,34 @@
|
|
1680 |
"node": ">=10.17.0"
|
1681 |
}
|
1682 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1683 |
"node_modules/immutable": {
|
1684 |
"version": "4.3.6",
|
1685 |
"resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz",
|
@@ -1785,6 +1979,16 @@
|
|
1785 |
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
|
1786 |
"dev": true
|
1787 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1788 |
"node_modules/kleur": {
|
1789 |
"version": "4.1.5",
|
1790 |
"resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
|
@@ -1800,6 +2004,170 @@
|
|
1800 |
"integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==",
|
1801 |
"dev": true
|
1802 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1803 |
"node_modules/local-pkg": {
|
1804 |
"version": "0.5.0",
|
1805 |
"resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz",
|
@@ -1836,6 +2204,19 @@
|
|
1836 |
"url": "https://github.com/sponsors/sindresorhus"
|
1837 |
}
|
1838 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1839 |
"node_modules/magic-string": {
|
1840 |
"version": "0.30.10",
|
1841 |
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz",
|
@@ -1969,6 +2350,25 @@
|
|
1969 |
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
|
1970 |
}
|
1971 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1972 |
"node_modules/normalize-path": {
|
1973 |
"version": "3.0.0",
|
1974 |
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
|
@@ -2154,6 +2554,13 @@
|
|
2154 |
"node": "^10 || ^12 || >=14"
|
2155 |
}
|
2156 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2157 |
"node_modules/queue-microtask": {
|
2158 |
"version": "1.2.3",
|
2159 |
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
|
@@ -2174,6 +2581,21 @@
|
|
2174 |
}
|
2175 |
]
|
2176 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2177 |
"node_modules/readdirp": {
|
2178 |
"version": "3.6.0",
|
2179 |
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
|
@@ -2287,6 +2709,27 @@
|
|
2287 |
"node": ">=6"
|
2288 |
}
|
2289 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2290 |
"node_modules/sander": {
|
2291 |
"version": "0.5.1",
|
2292 |
"resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz",
|
@@ -2364,6 +2807,16 @@
|
|
2364 |
"node": ">=0.10.0"
|
2365 |
}
|
2366 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2367 |
"node_modules/string-argv": {
|
2368 |
"version": "0.3.2",
|
2369 |
"resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz",
|
@@ -2572,6 +3025,14 @@
|
|
2572 |
"integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==",
|
2573 |
"dev": true
|
2574 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2575 |
"node_modules/unplugin": {
|
2576 |
"version": "1.10.1",
|
2577 |
"resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.10.1.tgz",
|
@@ -2629,6 +3090,13 @@
|
|
2629 |
}
|
2630 |
}
|
2631 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2632 |
"node_modules/vite": {
|
2633 |
"version": "5.2.11",
|
2634 |
"resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz",
|
@@ -2733,6 +3201,112 @@
|
|
2733 |
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
2734 |
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
|
2735 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2736 |
"node_modules/yocto-queue": {
|
2737 |
"version": "0.1.0",
|
2738 |
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
|
|
|
21 |
},
|
22 |
"devDependencies": {
|
23 |
"@sveltejs/vite-plugin-svelte": "^3.0.2",
|
24 |
+
"@syncedstore/core": "^0.6.0",
|
25 |
+
"@syncedstore/svelte": "^0.6.0",
|
26 |
"@tsconfig/svelte": "^5.0.4",
|
27 |
"sass": "^1.77.2",
|
28 |
"svelte": "^4.2.12",
|
|
|
30 |
"tslib": "^2.6.2",
|
31 |
"typescript": "^5.4.4",
|
32 |
"unplugin-icons": "^0.18.5",
|
33 |
+
"vite": "^5.2.8",
|
34 |
+
"y-websocket": "^2.0.4"
|
35 |
}
|
36 |
},
|
37 |
"node_modules/@ampproject/remapping": {
|
|
|
578 |
"url": "https://opencollective.com/popperjs"
|
579 |
}
|
580 |
},
|
581 |
+
"node_modules/@reactivedata/reactive": {
|
582 |
+
"version": "0.2.2",
|
583 |
+
"resolved": "https://registry.npmjs.org/@reactivedata/reactive/-/reactive-0.2.2.tgz",
|
584 |
+
"integrity": "sha512-KnINM/Sng25QAv6sHkJO9q/XyslLegCF5jTsTSVu+AouY3uZDVf4Am99xNCqsfqFZFvnTBBDvCsHNdvTVGvPEA==",
|
585 |
+
"dev": true
|
586 |
+
},
|
587 |
"node_modules/@rollup/rollup-android-arm-eabi": {
|
588 |
"version": "4.18.0",
|
589 |
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz",
|
|
|
852 |
}
|
853 |
}
|
854 |
},
|
855 |
+
"node_modules/@syncedstore/core": {
|
856 |
+
"version": "0.6.0",
|
857 |
+
"resolved": "https://registry.npmjs.org/@syncedstore/core/-/core-0.6.0.tgz",
|
858 |
+
"integrity": "sha512-6TtjEoYJsceYi8u1oRecXwbbLmjHaU0S7HvVfOaEdDfphZLGm/faVuA2fpazqc28F0yIFGvYzvPEBUJn9vqRNw==",
|
859 |
+
"dev": true,
|
860 |
+
"dependencies": {
|
861 |
+
"@reactivedata/reactive": "^0.2.0",
|
862 |
+
"@syncedstore/yjs-reactive-bindings": "^0.6.0"
|
863 |
+
},
|
864 |
+
"peerDependencies": {
|
865 |
+
"yjs": "^13.5.13"
|
866 |
+
}
|
867 |
+
},
|
868 |
+
"node_modules/@syncedstore/svelte": {
|
869 |
+
"version": "0.6.0",
|
870 |
+
"resolved": "https://registry.npmjs.org/@syncedstore/svelte/-/svelte-0.6.0.tgz",
|
871 |
+
"integrity": "sha512-MZcA1v4Qcwkix4P3/aax8azXFV1bqwyNnUZOT3XFCgpGgbRTq0NqNfKVDbDFRerpkZdrYqyWYxpRus2KtqPSjQ==",
|
872 |
+
"dev": true,
|
873 |
+
"peerDependencies": {
|
874 |
+
"@reactivedata/reactive": "*",
|
875 |
+
"@syncedstore/core": "*",
|
876 |
+
"svelte": "*"
|
877 |
+
}
|
878 |
+
},
|
879 |
+
"node_modules/@syncedstore/yjs-reactive-bindings": {
|
880 |
+
"version": "0.6.0",
|
881 |
+
"resolved": "https://registry.npmjs.org/@syncedstore/yjs-reactive-bindings/-/yjs-reactive-bindings-0.6.0.tgz",
|
882 |
+
"integrity": "sha512-VF78h0J4iOt79YU9d6j5E6bFKu7WXYuiI2ue9ZnA+T4SNVn8viRvg0AHm3NqHzudZZUgYT3dpnbv1/ZmU7yPZQ==",
|
883 |
+
"dev": true,
|
884 |
+
"peerDependencies": {
|
885 |
+
"yjs": "^13.5.13"
|
886 |
+
}
|
887 |
+
},
|
888 |
"node_modules/@tsconfig/svelte": {
|
889 |
"version": "5.0.4",
|
890 |
"resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.4.tgz",
|
|
|
1123 |
"resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz",
|
1124 |
"integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg=="
|
1125 |
},
|
1126 |
+
"node_modules/@types/node": {
|
1127 |
+
"version": "22.5.5",
|
1128 |
+
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz",
|
1129 |
+
"integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==",
|
1130 |
+
"dev": true,
|
1131 |
+
"optional": true,
|
1132 |
+
"peer": true,
|
1133 |
+
"dependencies": {
|
1134 |
+
"undici-types": "~6.19.2"
|
1135 |
+
}
|
1136 |
+
},
|
1137 |
"node_modules/@types/pug": {
|
1138 |
"version": "2.0.10",
|
1139 |
"resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.10.tgz",
|
|
|
1167 |
"d3-zoom": "^3.0.0"
|
1168 |
}
|
1169 |
},
|
1170 |
+
"node_modules/abstract-leveldown": {
|
1171 |
+
"version": "6.2.3",
|
1172 |
+
"resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz",
|
1173 |
+
"integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==",
|
1174 |
+
"dev": true,
|
1175 |
+
"optional": true,
|
1176 |
+
"dependencies": {
|
1177 |
+
"buffer": "^5.5.0",
|
1178 |
+
"immediate": "^3.2.3",
|
1179 |
+
"level-concat-iterator": "~2.0.0",
|
1180 |
+
"level-supports": "~1.0.0",
|
1181 |
+
"xtend": "~4.0.0"
|
1182 |
+
},
|
1183 |
+
"engines": {
|
1184 |
+
"node": ">=6"
|
1185 |
+
}
|
1186 |
+
},
|
1187 |
"node_modules/acorn": {
|
1188 |
"version": "8.11.3",
|
1189 |
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
|
|
|
1216 |
"dequal": "^2.0.3"
|
1217 |
}
|
1218 |
},
|
1219 |
+
"node_modules/async-limiter": {
|
1220 |
+
"version": "1.0.1",
|
1221 |
+
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
|
1222 |
+
"integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
|
1223 |
+
"dev": true,
|
1224 |
+
"optional": true
|
1225 |
+
},
|
1226 |
"node_modules/axobject-query": {
|
1227 |
"version": "4.0.0",
|
1228 |
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz",
|
|
|
1236 |
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
1237 |
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
|
1238 |
},
|
1239 |
+
"node_modules/base64-js": {
|
1240 |
+
"version": "1.5.1",
|
1241 |
+
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
|
1242 |
+
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
|
1243 |
+
"dev": true,
|
1244 |
+
"funding": [
|
1245 |
+
{
|
1246 |
+
"type": "github",
|
1247 |
+
"url": "https://github.com/sponsors/feross"
|
1248 |
+
},
|
1249 |
+
{
|
1250 |
+
"type": "patreon",
|
1251 |
+
"url": "https://www.patreon.com/feross"
|
1252 |
+
},
|
1253 |
+
{
|
1254 |
+
"type": "consulting",
|
1255 |
+
"url": "https://feross.org/support"
|
1256 |
+
}
|
1257 |
+
],
|
1258 |
+
"optional": true
|
1259 |
+
},
|
1260 |
"node_modules/binary-extensions": {
|
1261 |
"version": "2.3.0",
|
1262 |
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
|
|
|
1308 |
"node": ">=8"
|
1309 |
}
|
1310 |
},
|
1311 |
+
"node_modules/buffer": {
|
1312 |
+
"version": "5.7.1",
|
1313 |
+
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
|
1314 |
+
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
|
1315 |
+
"dev": true,
|
1316 |
+
"funding": [
|
1317 |
+
{
|
1318 |
+
"type": "github",
|
1319 |
+
"url": "https://github.com/sponsors/feross"
|
1320 |
+
},
|
1321 |
+
{
|
1322 |
+
"type": "patreon",
|
1323 |
+
"url": "https://www.patreon.com/feross"
|
1324 |
+
},
|
1325 |
+
{
|
1326 |
+
"type": "consulting",
|
1327 |
+
"url": "https://feross.org/support"
|
1328 |
+
}
|
1329 |
+
],
|
1330 |
+
"optional": true,
|
1331 |
+
"dependencies": {
|
1332 |
+
"base64-js": "^1.3.1",
|
1333 |
+
"ieee754": "^1.1.13"
|
1334 |
+
}
|
1335 |
+
},
|
1336 |
"node_modules/buffer-crc32": {
|
1337 |
"version": "0.2.13",
|
1338 |
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
|
|
|
1561 |
"node": ">=0.10.0"
|
1562 |
}
|
1563 |
},
|
1564 |
+
"node_modules/deferred-leveldown": {
|
1565 |
+
"version": "5.3.0",
|
1566 |
+
"resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz",
|
1567 |
+
"integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==",
|
1568 |
+
"dev": true,
|
1569 |
+
"optional": true,
|
1570 |
+
"dependencies": {
|
1571 |
+
"abstract-leveldown": "~6.2.1",
|
1572 |
+
"inherits": "^2.0.3"
|
1573 |
+
},
|
1574 |
+
"engines": {
|
1575 |
+
"node": ">=6"
|
1576 |
+
}
|
1577 |
+
},
|
1578 |
"node_modules/dequal": {
|
1579 |
"version": "2.0.3",
|
1580 |
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
|
|
|
1605 |
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
|
1606 |
"integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
|
1607 |
},
|
1608 |
+
"node_modules/encoding-down": {
|
1609 |
+
"version": "6.3.0",
|
1610 |
+
"resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz",
|
1611 |
+
"integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==",
|
1612 |
+
"dev": true,
|
1613 |
+
"optional": true,
|
1614 |
+
"dependencies": {
|
1615 |
+
"abstract-leveldown": "^6.2.1",
|
1616 |
+
"inherits": "^2.0.3",
|
1617 |
+
"level-codec": "^9.0.0",
|
1618 |
+
"level-errors": "^2.0.0"
|
1619 |
+
},
|
1620 |
+
"engines": {
|
1621 |
+
"node": ">=6"
|
1622 |
+
}
|
1623 |
+
},
|
1624 |
+
"node_modules/errno": {
|
1625 |
+
"version": "0.1.8",
|
1626 |
+
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
|
1627 |
+
"integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
|
1628 |
+
"dev": true,
|
1629 |
+
"optional": true,
|
1630 |
+
"dependencies": {
|
1631 |
+
"prr": "~1.0.1"
|
1632 |
+
},
|
1633 |
+
"bin": {
|
1634 |
+
"errno": "cli.js"
|
1635 |
+
}
|
1636 |
+
},
|
1637 |
"node_modules/es6-promise": {
|
1638 |
"version": "3.3.1",
|
1639 |
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
|
|
|
1846 |
"node": ">=10.17.0"
|
1847 |
}
|
1848 |
},
|
1849 |
+
"node_modules/ieee754": {
|
1850 |
+
"version": "1.2.1",
|
1851 |
+
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
|
1852 |
+
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
|
1853 |
+
"dev": true,
|
1854 |
+
"funding": [
|
1855 |
+
{
|
1856 |
+
"type": "github",
|
1857 |
+
"url": "https://github.com/sponsors/feross"
|
1858 |
+
},
|
1859 |
+
{
|
1860 |
+
"type": "patreon",
|
1861 |
+
"url": "https://www.patreon.com/feross"
|
1862 |
+
},
|
1863 |
+
{
|
1864 |
+
"type": "consulting",
|
1865 |
+
"url": "https://feross.org/support"
|
1866 |
+
}
|
1867 |
+
],
|
1868 |
+
"optional": true
|
1869 |
+
},
|
1870 |
+
"node_modules/immediate": {
|
1871 |
+
"version": "3.3.0",
|
1872 |
+
"resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz",
|
1873 |
+
"integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==",
|
1874 |
+
"dev": true,
|
1875 |
+
"optional": true
|
1876 |
+
},
|
1877 |
"node_modules/immutable": {
|
1878 |
"version": "4.3.6",
|
1879 |
"resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz",
|
|
|
1979 |
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
|
1980 |
"dev": true
|
1981 |
},
|
1982 |
+
"node_modules/isomorphic.js": {
|
1983 |
+
"version": "0.2.5",
|
1984 |
+
"resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz",
|
1985 |
+
"integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==",
|
1986 |
+
"dev": true,
|
1987 |
+
"funding": {
|
1988 |
+
"type": "GitHub Sponsors ❤",
|
1989 |
+
"url": "https://github.com/sponsors/dmonad"
|
1990 |
+
}
|
1991 |
+
},
|
1992 |
"node_modules/kleur": {
|
1993 |
"version": "4.1.5",
|
1994 |
"resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
|
|
|
2004 |
"integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==",
|
2005 |
"dev": true
|
2006 |
},
|
2007 |
+
"node_modules/level": {
|
2008 |
+
"version": "6.0.1",
|
2009 |
+
"resolved": "https://registry.npmjs.org/level/-/level-6.0.1.tgz",
|
2010 |
+
"integrity": "sha512-psRSqJZCsC/irNhfHzrVZbmPYXDcEYhA5TVNwr+V92jF44rbf86hqGp8fiT702FyiArScYIlPSBTDUASCVNSpw==",
|
2011 |
+
"dev": true,
|
2012 |
+
"optional": true,
|
2013 |
+
"dependencies": {
|
2014 |
+
"level-js": "^5.0.0",
|
2015 |
+
"level-packager": "^5.1.0",
|
2016 |
+
"leveldown": "^5.4.0"
|
2017 |
+
},
|
2018 |
+
"engines": {
|
2019 |
+
"node": ">=8.6.0"
|
2020 |
+
},
|
2021 |
+
"funding": {
|
2022 |
+
"type": "opencollective",
|
2023 |
+
"url": "https://opencollective.com/level"
|
2024 |
+
}
|
2025 |
+
},
|
2026 |
+
"node_modules/level-codec": {
|
2027 |
+
"version": "9.0.2",
|
2028 |
+
"resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz",
|
2029 |
+
"integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==",
|
2030 |
+
"dev": true,
|
2031 |
+
"optional": true,
|
2032 |
+
"dependencies": {
|
2033 |
+
"buffer": "^5.6.0"
|
2034 |
+
},
|
2035 |
+
"engines": {
|
2036 |
+
"node": ">=6"
|
2037 |
+
}
|
2038 |
+
},
|
2039 |
+
"node_modules/level-concat-iterator": {
|
2040 |
+
"version": "2.0.1",
|
2041 |
+
"resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz",
|
2042 |
+
"integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==",
|
2043 |
+
"dev": true,
|
2044 |
+
"optional": true,
|
2045 |
+
"engines": {
|
2046 |
+
"node": ">=6"
|
2047 |
+
}
|
2048 |
+
},
|
2049 |
+
"node_modules/level-errors": {
|
2050 |
+
"version": "2.0.1",
|
2051 |
+
"resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz",
|
2052 |
+
"integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==",
|
2053 |
+
"dev": true,
|
2054 |
+
"optional": true,
|
2055 |
+
"dependencies": {
|
2056 |
+
"errno": "~0.1.1"
|
2057 |
+
},
|
2058 |
+
"engines": {
|
2059 |
+
"node": ">=6"
|
2060 |
+
}
|
2061 |
+
},
|
2062 |
+
"node_modules/level-iterator-stream": {
|
2063 |
+
"version": "4.0.2",
|
2064 |
+
"resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz",
|
2065 |
+
"integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==",
|
2066 |
+
"dev": true,
|
2067 |
+
"optional": true,
|
2068 |
+
"dependencies": {
|
2069 |
+
"inherits": "^2.0.4",
|
2070 |
+
"readable-stream": "^3.4.0",
|
2071 |
+
"xtend": "^4.0.2"
|
2072 |
+
},
|
2073 |
+
"engines": {
|
2074 |
+
"node": ">=6"
|
2075 |
+
}
|
2076 |
+
},
|
2077 |
+
"node_modules/level-js": {
|
2078 |
+
"version": "5.0.2",
|
2079 |
+
"resolved": "https://registry.npmjs.org/level-js/-/level-js-5.0.2.tgz",
|
2080 |
+
"integrity": "sha512-SnBIDo2pdO5VXh02ZmtAyPP6/+6YTJg2ibLtl9C34pWvmtMEmRTWpra+qO/hifkUtBTOtfx6S9vLDjBsBK4gRg==",
|
2081 |
+
"dev": true,
|
2082 |
+
"optional": true,
|
2083 |
+
"dependencies": {
|
2084 |
+
"abstract-leveldown": "~6.2.3",
|
2085 |
+
"buffer": "^5.5.0",
|
2086 |
+
"inherits": "^2.0.3",
|
2087 |
+
"ltgt": "^2.1.2"
|
2088 |
+
}
|
2089 |
+
},
|
2090 |
+
"node_modules/level-packager": {
|
2091 |
+
"version": "5.1.1",
|
2092 |
+
"resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz",
|
2093 |
+
"integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==",
|
2094 |
+
"dev": true,
|
2095 |
+
"optional": true,
|
2096 |
+
"dependencies": {
|
2097 |
+
"encoding-down": "^6.3.0",
|
2098 |
+
"levelup": "^4.3.2"
|
2099 |
+
},
|
2100 |
+
"engines": {
|
2101 |
+
"node": ">=6"
|
2102 |
+
}
|
2103 |
+
},
|
2104 |
+
"node_modules/level-supports": {
|
2105 |
+
"version": "1.0.1",
|
2106 |
+
"resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz",
|
2107 |
+
"integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==",
|
2108 |
+
"dev": true,
|
2109 |
+
"optional": true,
|
2110 |
+
"dependencies": {
|
2111 |
+
"xtend": "^4.0.2"
|
2112 |
+
},
|
2113 |
+
"engines": {
|
2114 |
+
"node": ">=6"
|
2115 |
+
}
|
2116 |
+
},
|
2117 |
+
"node_modules/leveldown": {
|
2118 |
+
"version": "5.6.0",
|
2119 |
+
"resolved": "https://registry.npmjs.org/leveldown/-/leveldown-5.6.0.tgz",
|
2120 |
+
"integrity": "sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==",
|
2121 |
+
"dev": true,
|
2122 |
+
"hasInstallScript": true,
|
2123 |
+
"optional": true,
|
2124 |
+
"dependencies": {
|
2125 |
+
"abstract-leveldown": "~6.2.1",
|
2126 |
+
"napi-macros": "~2.0.0",
|
2127 |
+
"node-gyp-build": "~4.1.0"
|
2128 |
+
},
|
2129 |
+
"engines": {
|
2130 |
+
"node": ">=8.6.0"
|
2131 |
+
}
|
2132 |
+
},
|
2133 |
+
"node_modules/levelup": {
|
2134 |
+
"version": "4.4.0",
|
2135 |
+
"resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz",
|
2136 |
+
"integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==",
|
2137 |
+
"dev": true,
|
2138 |
+
"optional": true,
|
2139 |
+
"dependencies": {
|
2140 |
+
"deferred-leveldown": "~5.3.0",
|
2141 |
+
"level-errors": "~2.0.0",
|
2142 |
+
"level-iterator-stream": "~4.0.0",
|
2143 |
+
"level-supports": "~1.0.0",
|
2144 |
+
"xtend": "~4.0.0"
|
2145 |
+
},
|
2146 |
+
"engines": {
|
2147 |
+
"node": ">=6"
|
2148 |
+
}
|
2149 |
+
},
|
2150 |
+
"node_modules/lib0": {
|
2151 |
+
"version": "0.2.98",
|
2152 |
+
"resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.98.tgz",
|
2153 |
+
"integrity": "sha512-XteTiNO0qEXqqweWx+b21p/fBnNHUA1NwAtJNJek1oPrewEZs2uiT4gWivHKr9GqCjDPAhchz0UQO8NwU3bBNA==",
|
2154 |
+
"dev": true,
|
2155 |
+
"dependencies": {
|
2156 |
+
"isomorphic.js": "^0.2.4"
|
2157 |
+
},
|
2158 |
+
"bin": {
|
2159 |
+
"0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js",
|
2160 |
+
"0gentesthtml": "bin/gentesthtml.js",
|
2161 |
+
"0serve": "bin/0serve.js"
|
2162 |
+
},
|
2163 |
+
"engines": {
|
2164 |
+
"node": ">=16"
|
2165 |
+
},
|
2166 |
+
"funding": {
|
2167 |
+
"type": "GitHub Sponsors ❤",
|
2168 |
+
"url": "https://github.com/sponsors/dmonad"
|
2169 |
+
}
|
2170 |
+
},
|
2171 |
"node_modules/local-pkg": {
|
2172 |
"version": "0.5.0",
|
2173 |
"resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz",
|
|
|
2204 |
"url": "https://github.com/sponsors/sindresorhus"
|
2205 |
}
|
2206 |
},
|
2207 |
+
"node_modules/lodash.debounce": {
|
2208 |
+
"version": "4.0.8",
|
2209 |
+
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
|
2210 |
+
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
|
2211 |
+
"dev": true
|
2212 |
+
},
|
2213 |
+
"node_modules/ltgt": {
|
2214 |
+
"version": "2.2.1",
|
2215 |
+
"resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz",
|
2216 |
+
"integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==",
|
2217 |
+
"dev": true,
|
2218 |
+
"optional": true
|
2219 |
+
},
|
2220 |
"node_modules/magic-string": {
|
2221 |
"version": "0.30.10",
|
2222 |
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz",
|
|
|
2350 |
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
|
2351 |
}
|
2352 |
},
|
2353 |
+
"node_modules/napi-macros": {
|
2354 |
+
"version": "2.0.0",
|
2355 |
+
"resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz",
|
2356 |
+
"integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==",
|
2357 |
+
"dev": true,
|
2358 |
+
"optional": true
|
2359 |
+
},
|
2360 |
+
"node_modules/node-gyp-build": {
|
2361 |
+
"version": "4.1.1",
|
2362 |
+
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.1.1.tgz",
|
2363 |
+
"integrity": "sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==",
|
2364 |
+
"dev": true,
|
2365 |
+
"optional": true,
|
2366 |
+
"bin": {
|
2367 |
+
"node-gyp-build": "bin.js",
|
2368 |
+
"node-gyp-build-optional": "optional.js",
|
2369 |
+
"node-gyp-build-test": "build-test.js"
|
2370 |
+
}
|
2371 |
+
},
|
2372 |
"node_modules/normalize-path": {
|
2373 |
"version": "3.0.0",
|
2374 |
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
|
|
|
2554 |
"node": "^10 || ^12 || >=14"
|
2555 |
}
|
2556 |
},
|
2557 |
+
"node_modules/prr": {
|
2558 |
+
"version": "1.0.1",
|
2559 |
+
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
|
2560 |
+
"integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
|
2561 |
+
"dev": true,
|
2562 |
+
"optional": true
|
2563 |
+
},
|
2564 |
"node_modules/queue-microtask": {
|
2565 |
"version": "1.2.3",
|
2566 |
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
|
|
|
2581 |
}
|
2582 |
]
|
2583 |
},
|
2584 |
+
"node_modules/readable-stream": {
|
2585 |
+
"version": "3.6.2",
|
2586 |
+
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
|
2587 |
+
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
|
2588 |
+
"dev": true,
|
2589 |
+
"optional": true,
|
2590 |
+
"dependencies": {
|
2591 |
+
"inherits": "^2.0.3",
|
2592 |
+
"string_decoder": "^1.1.1",
|
2593 |
+
"util-deprecate": "^1.0.1"
|
2594 |
+
},
|
2595 |
+
"engines": {
|
2596 |
+
"node": ">= 6"
|
2597 |
+
}
|
2598 |
+
},
|
2599 |
"node_modules/readdirp": {
|
2600 |
"version": "3.6.0",
|
2601 |
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
|
|
|
2709 |
"node": ">=6"
|
2710 |
}
|
2711 |
},
|
2712 |
+
"node_modules/safe-buffer": {
|
2713 |
+
"version": "5.2.1",
|
2714 |
+
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
2715 |
+
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
|
2716 |
+
"dev": true,
|
2717 |
+
"funding": [
|
2718 |
+
{
|
2719 |
+
"type": "github",
|
2720 |
+
"url": "https://github.com/sponsors/feross"
|
2721 |
+
},
|
2722 |
+
{
|
2723 |
+
"type": "patreon",
|
2724 |
+
"url": "https://www.patreon.com/feross"
|
2725 |
+
},
|
2726 |
+
{
|
2727 |
+
"type": "consulting",
|
2728 |
+
"url": "https://feross.org/support"
|
2729 |
+
}
|
2730 |
+
],
|
2731 |
+
"optional": true
|
2732 |
+
},
|
2733 |
"node_modules/sander": {
|
2734 |
"version": "0.5.1",
|
2735 |
"resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz",
|
|
|
2807 |
"node": ">=0.10.0"
|
2808 |
}
|
2809 |
},
|
2810 |
+
"node_modules/string_decoder": {
|
2811 |
+
"version": "1.3.0",
|
2812 |
+
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
|
2813 |
+
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
|
2814 |
+
"dev": true,
|
2815 |
+
"optional": true,
|
2816 |
+
"dependencies": {
|
2817 |
+
"safe-buffer": "~5.2.0"
|
2818 |
+
}
|
2819 |
+
},
|
2820 |
"node_modules/string-argv": {
|
2821 |
"version": "0.3.2",
|
2822 |
"resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz",
|
|
|
3025 |
"integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==",
|
3026 |
"dev": true
|
3027 |
},
|
3028 |
+
"node_modules/undici-types": {
|
3029 |
+
"version": "6.19.8",
|
3030 |
+
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
|
3031 |
+
"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
|
3032 |
+
"dev": true,
|
3033 |
+
"optional": true,
|
3034 |
+
"peer": true
|
3035 |
+
},
|
3036 |
"node_modules/unplugin": {
|
3037 |
"version": "1.10.1",
|
3038 |
"resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.10.1.tgz",
|
|
|
3090 |
}
|
3091 |
}
|
3092 |
},
|
3093 |
+
"node_modules/util-deprecate": {
|
3094 |
+
"version": "1.0.2",
|
3095 |
+
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
3096 |
+
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
|
3097 |
+
"dev": true,
|
3098 |
+
"optional": true
|
3099 |
+
},
|
3100 |
"node_modules/vite": {
|
3101 |
"version": "5.2.11",
|
3102 |
"resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz",
|
|
|
3201 |
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
3202 |
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
|
3203 |
},
|
3204 |
+
"node_modules/ws": {
|
3205 |
+
"version": "6.2.3",
|
3206 |
+
"resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz",
|
3207 |
+
"integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==",
|
3208 |
+
"dev": true,
|
3209 |
+
"optional": true,
|
3210 |
+
"dependencies": {
|
3211 |
+
"async-limiter": "~1.0.0"
|
3212 |
+
}
|
3213 |
+
},
|
3214 |
+
"node_modules/xtend": {
|
3215 |
+
"version": "4.0.2",
|
3216 |
+
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
|
3217 |
+
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
|
3218 |
+
"dev": true,
|
3219 |
+
"optional": true,
|
3220 |
+
"engines": {
|
3221 |
+
"node": ">=0.4"
|
3222 |
+
}
|
3223 |
+
},
|
3224 |
+
"node_modules/y-leveldb": {
|
3225 |
+
"version": "0.1.2",
|
3226 |
+
"resolved": "https://registry.npmjs.org/y-leveldb/-/y-leveldb-0.1.2.tgz",
|
3227 |
+
"integrity": "sha512-6ulEn5AXfXJYi89rXPEg2mMHAyyw8+ZfeMMdOtBbV8FJpQ1NOrcgi6DTAcXof0dap84NjHPT2+9d0rb6cFsjEg==",
|
3228 |
+
"dev": true,
|
3229 |
+
"optional": true,
|
3230 |
+
"dependencies": {
|
3231 |
+
"level": "^6.0.1",
|
3232 |
+
"lib0": "^0.2.31"
|
3233 |
+
},
|
3234 |
+
"funding": {
|
3235 |
+
"type": "GitHub Sponsors ❤",
|
3236 |
+
"url": "https://github.com/sponsors/dmonad"
|
3237 |
+
},
|
3238 |
+
"peerDependencies": {
|
3239 |
+
"yjs": "^13.0.0"
|
3240 |
+
}
|
3241 |
+
},
|
3242 |
+
"node_modules/y-protocols": {
|
3243 |
+
"version": "1.0.6",
|
3244 |
+
"resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.6.tgz",
|
3245 |
+
"integrity": "sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==",
|
3246 |
+
"dev": true,
|
3247 |
+
"dependencies": {
|
3248 |
+
"lib0": "^0.2.85"
|
3249 |
+
},
|
3250 |
+
"engines": {
|
3251 |
+
"node": ">=16.0.0",
|
3252 |
+
"npm": ">=8.0.0"
|
3253 |
+
},
|
3254 |
+
"funding": {
|
3255 |
+
"type": "GitHub Sponsors ❤",
|
3256 |
+
"url": "https://github.com/sponsors/dmonad"
|
3257 |
+
},
|
3258 |
+
"peerDependencies": {
|
3259 |
+
"yjs": "^13.0.0"
|
3260 |
+
}
|
3261 |
+
},
|
3262 |
+
"node_modules/y-websocket": {
|
3263 |
+
"version": "2.0.4",
|
3264 |
+
"resolved": "https://registry.npmjs.org/y-websocket/-/y-websocket-2.0.4.tgz",
|
3265 |
+
"integrity": "sha512-UbrkOU4GPNFFTDlJYAxAmzZhia8EPxHkngZ6qjrxgIYCN3gI2l+zzLzA9p4LQJ0IswzpioeIgmzekWe7HoBBjg==",
|
3266 |
+
"dev": true,
|
3267 |
+
"dependencies": {
|
3268 |
+
"lib0": "^0.2.52",
|
3269 |
+
"lodash.debounce": "^4.0.8",
|
3270 |
+
"y-protocols": "^1.0.5"
|
3271 |
+
},
|
3272 |
+
"bin": {
|
3273 |
+
"y-websocket": "bin/server.cjs",
|
3274 |
+
"y-websocket-server": "bin/server.cjs"
|
3275 |
+
},
|
3276 |
+
"engines": {
|
3277 |
+
"node": ">=16.0.0",
|
3278 |
+
"npm": ">=8.0.0"
|
3279 |
+
},
|
3280 |
+
"funding": {
|
3281 |
+
"type": "GitHub Sponsors ❤",
|
3282 |
+
"url": "https://github.com/sponsors/dmonad"
|
3283 |
+
},
|
3284 |
+
"optionalDependencies": {
|
3285 |
+
"ws": "^6.2.1",
|
3286 |
+
"y-leveldb": "^0.1.0"
|
3287 |
+
},
|
3288 |
+
"peerDependencies": {
|
3289 |
+
"yjs": "^13.5.6"
|
3290 |
+
}
|
3291 |
+
},
|
3292 |
+
"node_modules/yjs": {
|
3293 |
+
"version": "13.6.19",
|
3294 |
+
"resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.19.tgz",
|
3295 |
+
"integrity": "sha512-GNKw4mEUn5yWU2QPHRx8jppxmCm9KzbBhB4qJLUJFiiYD0g/tDVgXQ7aPkyh01YO28kbs2J/BEbWBagjuWyejw==",
|
3296 |
+
"dev": true,
|
3297 |
+
"peer": true,
|
3298 |
+
"dependencies": {
|
3299 |
+
"lib0": "^0.2.86"
|
3300 |
+
},
|
3301 |
+
"engines": {
|
3302 |
+
"node": ">=16.0.0",
|
3303 |
+
"npm": ">=8.0.0"
|
3304 |
+
},
|
3305 |
+
"funding": {
|
3306 |
+
"type": "GitHub Sponsors ❤",
|
3307 |
+
"url": "https://github.com/sponsors/dmonad"
|
3308 |
+
}
|
3309 |
+
},
|
3310 |
"node_modules/yocto-queue": {
|
3311 |
"version": "0.1.0",
|
3312 |
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
|
web/package.json
CHANGED
@@ -11,6 +11,8 @@
|
|
11 |
},
|
12 |
"devDependencies": {
|
13 |
"@sveltejs/vite-plugin-svelte": "^3.0.2",
|
|
|
|
|
14 |
"@tsconfig/svelte": "^5.0.4",
|
15 |
"sass": "^1.77.2",
|
16 |
"svelte": "^4.2.12",
|
@@ -18,7 +20,8 @@
|
|
18 |
"tslib": "^2.6.2",
|
19 |
"typescript": "^5.4.4",
|
20 |
"unplugin-icons": "^0.18.5",
|
21 |
-
"vite": "^5.2.8"
|
|
|
22 |
},
|
23 |
"dependencies": {
|
24 |
"@iconify-json/tabler": "^1.1.110",
|
|
|
11 |
},
|
12 |
"devDependencies": {
|
13 |
"@sveltejs/vite-plugin-svelte": "^3.0.2",
|
14 |
+
"@syncedstore/core": "^0.6.0",
|
15 |
+
"@syncedstore/svelte": "^0.6.0",
|
16 |
"@tsconfig/svelte": "^5.0.4",
|
17 |
"sass": "^1.77.2",
|
18 |
"svelte": "^4.2.12",
|
|
|
20 |
"tslib": "^2.6.2",
|
21 |
"typescript": "^5.4.4",
|
22 |
"unplugin-icons": "^0.18.5",
|
23 |
+
"vite": "^5.2.8",
|
24 |
+
"y-websocket": "^2.0.4"
|
25 |
},
|
26 |
"dependencies": {
|
27 |
"@iconify-json/tabler": "^1.1.110",
|
web/src/LynxKiteFlow.svelte
CHANGED
@@ -16,7 +16,7 @@
|
|
16 |
import ArrowBack from 'virtual:icons/tabler/arrow-back'
|
17 |
import Backspace from 'virtual:icons/tabler/backspace'
|
18 |
import Atom from 'virtual:icons/tabler/Atom'
|
19 |
-
import { useQuery
|
20 |
import NodeWithParams from './NodeWithParams.svelte';
|
21 |
import NodeWithVisualization from './NodeWithVisualization.svelte';
|
22 |
import NodeWithImage from './NodeWithImage.svelte';
|
@@ -26,27 +26,28 @@
|
|
26 |
import NodeSearch from './NodeSearch.svelte';
|
27 |
import EnvironmentSelector from './EnvironmentSelector.svelte';
|
28 |
import '@xyflow/svelte/dist/style.css';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
|
30 |
export let path = '';
|
31 |
|
32 |
const { screenToFlowPosition } = useSvelteFlow();
|
33 |
-
const queryClient = useQueryClient();
|
34 |
-
const backendWorkspace = useQuery(['workspace', path], async () => {
|
35 |
-
const res = await fetch(`/api/load?path=${path}`);
|
36 |
-
return res.json();
|
37 |
-
}, {staleTime: 10000, retry: false});
|
38 |
-
const mutation = useMutation(async(update) => {
|
39 |
-
const res = await fetch('/api/save', {
|
40 |
-
method: 'POST',
|
41 |
-
headers: {
|
42 |
-
'Content-Type': 'application/json',
|
43 |
-
},
|
44 |
-
body: JSON.stringify(update),
|
45 |
-
});
|
46 |
-
return await res.json();
|
47 |
-
}, {
|
48 |
-
onSuccess: data => queryClient.setQueryData(['workspace', path], data),
|
49 |
-
});
|
50 |
|
51 |
const nodeTypes: NodeTypes = {
|
52 |
basic: NodeWithParams,
|
@@ -57,16 +58,6 @@
|
|
57 |
area: NodeWithArea,
|
58 |
};
|
59 |
|
60 |
-
const nodes = writable<Node[]>([]);
|
61 |
-
const edges = writable<Edge[]>([]);
|
62 |
-
let doNotSave = true;
|
63 |
-
$: if ($backendWorkspace.isSuccess) {
|
64 |
-
doNotSave = true; // Change is coming from the backend.
|
65 |
-
nodes.set(JSON.parse(JSON.stringify($backendWorkspace.data?.nodes || [])));
|
66 |
-
edges.set(JSON.parse(JSON.stringify($backendWorkspace.data?.edges || [])));
|
67 |
-
doNotSave = false;
|
68 |
-
}
|
69 |
-
|
70 |
function closeNodeSearch() {
|
71 |
nodeSearchSettings = undefined;
|
72 |
}
|
@@ -78,12 +69,12 @@
|
|
78 |
event.preventDefault();
|
79 |
nodeSearchSettings = {
|
80 |
pos: { x: event.clientX, y: event.clientY },
|
81 |
-
boxes: $catalog.data[
|
82 |
};
|
83 |
}
|
84 |
function addNode(e) {
|
85 |
const meta = {...e.detail};
|
86 |
-
|
87 |
const node = {
|
88 |
type: meta.type,
|
89 |
data: {
|
@@ -97,7 +88,7 @@
|
|
97 |
const title = node.data.title;
|
98 |
let i = 1;
|
99 |
node.id = `${title} ${i}`;
|
100 |
-
while (
|
101 |
i += 1;
|
102 |
node.id = `${title} ${i}`;
|
103 |
}
|
@@ -107,7 +98,7 @@
|
|
107 |
const parent = n.find((x) => x.id === node.parentId);
|
108 |
node.position = { x: node.position.x - parent.position.x, y: node.position.y - parent.position.y };
|
109 |
}
|
110 |
-
return [...n, node]
|
111 |
});
|
112 |
closeNodeSearch();
|
113 |
}
|
@@ -122,46 +113,6 @@
|
|
122 |
parentId: string,
|
123 |
};
|
124 |
|
125 |
-
const graph = derived([nodes, edges], ([nodes, edges]) => ({ nodes, edges }));
|
126 |
-
// Like JSON.stringify, but with keys sorted.
|
127 |
-
function orderedJSON(obj: any) {
|
128 |
-
const allKeys = new Set();
|
129 |
-
JSON.stringify(obj, (key, value) => (allKeys.add(key), value));
|
130 |
-
return JSON.stringify(obj, Array.from(allKeys).sort());
|
131 |
-
}
|
132 |
-
graph.subscribe(async (g) => {
|
133 |
-
if (doNotSave) return;
|
134 |
-
const dragging = g.nodes.find((n) => n.dragging);
|
135 |
-
if (dragging) return;
|
136 |
-
const resizing = g.nodes.find((n) => n.data?.beingResized);
|
137 |
-
if (resizing) return;
|
138 |
-
scheduleSave(g);
|
139 |
-
});
|
140 |
-
let saveTimeout;
|
141 |
-
function scheduleSave(g) {
|
142 |
-
// A slight delay, so we don't send a million requests when a node is resized, for example.
|
143 |
-
clearTimeout(saveTimeout);
|
144 |
-
saveTimeout = setTimeout(() => save(g), 500);
|
145 |
-
}
|
146 |
-
function save(g) {
|
147 |
-
g = JSON.parse(JSON.stringify(g));
|
148 |
-
for (const node of g.nodes) {
|
149 |
-
delete node.measured;
|
150 |
-
delete node.selected;
|
151 |
-
delete node.dragging;
|
152 |
-
delete node.beingResized;
|
153 |
-
}
|
154 |
-
for (const node of g.edges) {
|
155 |
-
delete node.markerEnd;
|
156 |
-
delete node.selected;
|
157 |
-
}
|
158 |
-
g.env = $backendWorkspace.data?.env;
|
159 |
-
const ws = orderedJSON(g);
|
160 |
-
const bd = orderedJSON($backendWorkspace.data);
|
161 |
-
if (ws === bd) return;
|
162 |
-
console.log('changed', JSON.stringify(diff(g, $backendWorkspace.data), null, 2));
|
163 |
-
$mutation.mutate({ path, ws: g });
|
164 |
-
}
|
165 |
function nodeClick(e) {
|
166 |
const node = e.detail.node;
|
167 |
const meta = node.data.meta;
|
@@ -181,6 +132,11 @@
|
|
181 |
</script>
|
182 |
|
183 |
<div class="page">
|
|
|
|
|
|
|
|
|
|
|
184 |
<div class="top-bar">
|
185 |
<div class="ws-name">
|
186 |
<a href><img src="/favicon.ico"></a>
|
@@ -189,8 +145,11 @@
|
|
189 |
<div class="tools">
|
190 |
<EnvironmentSelector
|
191 |
options={Object.keys($catalog.data || {})}
|
192 |
-
value={$
|
193 |
-
onChange={(env) =>
|
|
|
|
|
|
|
194 |
/>
|
195 |
<a href><Atom /></a>
|
196 |
<a href><Backspace /></a>
|
@@ -198,7 +157,7 @@
|
|
198 |
</div>
|
199 |
</div>
|
200 |
<div style:height="100%">
|
201 |
-
<SvelteFlow {nodes} {edges} {nodeTypes} fitView
|
202 |
on:paneclick={toggleNodeSearch}
|
203 |
on:nodeclick={nodeClick}
|
204 |
proOptions={{ hideAttribution: true }}
|
@@ -213,6 +172,7 @@
|
|
213 |
{/if}
|
214 |
</SvelteFlow>
|
215 |
</div>
|
|
|
216 |
</div>
|
217 |
|
218 |
<style>
|
|
|
16 |
import ArrowBack from 'virtual:icons/tabler/arrow-back'
|
17 |
import Backspace from 'virtual:icons/tabler/backspace'
|
18 |
import Atom from 'virtual:icons/tabler/Atom'
|
19 |
+
import { useQuery } from '@sveltestack/svelte-query';
|
20 |
import NodeWithParams from './NodeWithParams.svelte';
|
21 |
import NodeWithVisualization from './NodeWithVisualization.svelte';
|
22 |
import NodeWithImage from './NodeWithImage.svelte';
|
|
|
26 |
import NodeSearch from './NodeSearch.svelte';
|
27 |
import EnvironmentSelector from './EnvironmentSelector.svelte';
|
28 |
import '@xyflow/svelte/dist/style.css';
|
29 |
+
import { syncedStore, getYjsDoc } from "@syncedstore/core";
|
30 |
+
import { svelteSyncedStore } from "@syncedstore/svelte";
|
31 |
+
import { WebsocketProvider } from "y-websocket";
|
32 |
+
|
33 |
+
function getCRDTStore(path) {
|
34 |
+
const sstore = syncedStore({ workspace: {} });
|
35 |
+
console.log('ss', sstore.workspace);
|
36 |
+
const doc = getYjsDoc(sstore);
|
37 |
+
console.log('doc', doc.toJSON());
|
38 |
+
const wsProvider = new WebsocketProvider("ws://localhost:8000/ws/crdt", path, doc);
|
39 |
+
wsProvider.on('sync', function(isSynced: boolean) {
|
40 |
+
console.log('synced', isSynced, 'ydoc', doc.toJSON());
|
41 |
+
});
|
42 |
+
return {store: svelteSyncedStore(sstore), doc};
|
43 |
+
}
|
44 |
+
$: connection = getCRDTStore(path);
|
45 |
+
$: store = connection.store;
|
46 |
+
$: ws = connection.doc?.getMap('workspace');
|
47 |
|
48 |
export let path = '';
|
49 |
|
50 |
const { screenToFlowPosition } = useSvelteFlow();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
51 |
|
52 |
const nodeTypes: NodeTypes = {
|
53 |
basic: NodeWithParams,
|
|
|
58 |
area: NodeWithArea,
|
59 |
};
|
60 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
61 |
function closeNodeSearch() {
|
62 |
nodeSearchSettings = undefined;
|
63 |
}
|
|
|
69 |
event.preventDefault();
|
70 |
nodeSearchSettings = {
|
71 |
pos: { x: event.clientX, y: event.clientY },
|
72 |
+
boxes: $catalog.data[ws.env],
|
73 |
};
|
74 |
}
|
75 |
function addNode(e) {
|
76 |
const meta = {...e.detail};
|
77 |
+
store.update((ws) => {
|
78 |
const node = {
|
79 |
type: meta.type,
|
80 |
data: {
|
|
|
88 |
const title = node.data.title;
|
89 |
let i = 1;
|
90 |
node.id = `${title} ${i}`;
|
91 |
+
while (ws.nodes.find((x) => x.id === node.id)) {
|
92 |
i += 1;
|
93 |
node.id = `${title} ${i}`;
|
94 |
}
|
|
|
98 |
const parent = n.find((x) => x.id === node.parentId);
|
99 |
node.position = { x: node.position.x - parent.position.x, y: node.position.y - parent.position.y };
|
100 |
}
|
101 |
+
return {...ws, nodes: [...n, node]};
|
102 |
});
|
103 |
closeNodeSearch();
|
104 |
}
|
|
|
113 |
parentId: string,
|
114 |
};
|
115 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
116 |
function nodeClick(e) {
|
117 |
const node = e.detail.node;
|
118 |
const meta = node.data.meta;
|
|
|
132 |
</script>
|
133 |
|
134 |
<div class="page">
|
135 |
+
<br>doc: {JSON.stringify(connection.doc)}
|
136 |
+
<br>w2j: {JSON.parse(JSON.stringify(connection.doc)).workspace}
|
137 |
+
<br>ws: {connection.doc?.getMap("workspace")}
|
138 |
+
{#if ws !== undefined}
|
139 |
+
{{ws}}
|
140 |
<div class="top-bar">
|
141 |
<div class="ws-name">
|
142 |
<a href><img src="/favicon.ico"></a>
|
|
|
145 |
<div class="tools">
|
146 |
<EnvironmentSelector
|
147 |
options={Object.keys($catalog.data || {})}
|
148 |
+
value={$store.workspace.env}
|
149 |
+
onChange={(env) => {
|
150 |
+
console.log('env change', env);
|
151 |
+
$store.workspace.env = env;
|
152 |
+
}}
|
153 |
/>
|
154 |
<a href><Atom /></a>
|
155 |
<a href><Backspace /></a>
|
|
|
157 |
</div>
|
158 |
</div>
|
159 |
<div style:height="100%">
|
160 |
+
<SvelteFlow nodes={ws.nodes} edges={ws.edges} {nodeTypes} fitView
|
161 |
on:paneclick={toggleNodeSearch}
|
162 |
on:nodeclick={nodeClick}
|
163 |
proOptions={{ hideAttribution: true }}
|
|
|
172 |
{/if}
|
173 |
</SvelteFlow>
|
174 |
</div>
|
175 |
+
{/if}
|
176 |
</div>
|
177 |
|
178 |
<style>
|
web/src/Workspace.svelte
CHANGED
@@ -3,6 +3,29 @@
|
|
3 |
import { QueryClient, QueryClientProvider } from '@sveltestack/svelte-query'
|
4 |
import { SvelteFlowProvider } from '@xyflow/svelte';
|
5 |
import LynxKiteFlow from './LynxKiteFlow.svelte';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
export let path = '';
|
7 |
const queryClient = new QueryClient()
|
8 |
</script>
|
|
|
3 |
import { QueryClient, QueryClientProvider } from '@sveltestack/svelte-query'
|
4 |
import { SvelteFlowProvider } from '@xyflow/svelte';
|
5 |
import LynxKiteFlow from './LynxKiteFlow.svelte';
|
6 |
+
// import { syncedStore, getYjsDoc } from "@syncedstore/core";
|
7 |
+
// import { svelteSyncedStore } from "@syncedstore/svelte";
|
8 |
+
// import { WebsocketProvider } from "y-websocket";
|
9 |
+
// const todoStore = syncedStore({ todos: [] });
|
10 |
+
// const doc = getYjsDoc(todoStore);
|
11 |
+
// const wsProvider = new WebsocketProvider("ws://localhost:8000/ws/crdt", "my-roomname3", doc);
|
12 |
+
// wsProvider.on('sync', function(isSynced: boolean) {
|
13 |
+
// console.log('synced test', isSynced, 'ydoc', doc.toJSON());
|
14 |
+
// });
|
15 |
+
|
16 |
+
// console.log('ydoc', doc.toJSON());
|
17 |
+
// console.log('todoStore', todoStore);
|
18 |
+
// todoStore.todos.push('asdfx');
|
19 |
+
// console.log('ydoc', doc.toJSON());
|
20 |
+
// // console.log(doc.toJSON());
|
21 |
+
// // console.log(doc.getMap().toJSON());
|
22 |
+
// // console.log(doc.getMap().get('todos'));
|
23 |
+
// // doc.getMap().get('todos').observe(() => {
|
24 |
+
// // console.log('todos changed', todoStore.todos);
|
25 |
+
// // });
|
26 |
+
// // doc.getMap().get('todos').add('hello');
|
27 |
+
|
28 |
+
// export const store = svelteSyncedStore(todoStore);
|
29 |
export let path = '';
|
30 |
const queryClient = new QueryClient()
|
31 |
</script>
|
web/vite.config.ts
CHANGED
@@ -9,6 +9,13 @@ export default defineConfig({
|
|
9 |
Icons({ compiler: 'svelte', defaultStyle: 'vertical-align: sub;' }),
|
10 |
],
|
11 |
server: {
|
12 |
-
proxy: {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
},
|
14 |
})
|
|
|
9 |
Icons({ compiler: 'svelte', defaultStyle: 'vertical-align: sub;' }),
|
10 |
],
|
11 |
server: {
|
12 |
+
proxy: {
|
13 |
+
'/api': 'http://127.0.0.1:8000',
|
14 |
+
'/ws': {
|
15 |
+
target: 'ws://127.0.0.1:8000',
|
16 |
+
ws: true,
|
17 |
+
changeOrigin: true,
|
18 |
+
},
|
19 |
+
},
|
20 |
},
|
21 |
})
|