One websocket per project (GatewayConnection, refcounted per endpoint+project, single reconnect ladder) with per-doc facades: a mini y-websocket client over varint-channel-tagged frames (y-protocols sync + awareness, own Awareness per facade so skeleton presence stays per-room). connectProvider's partykit kind routes every parseable board/presence room through the gateway; the per-room dial remains only for unparseable operator rooms. Laziness contract (0001 §5 amendment): sheet-manager warms the hierarchy with PASSIVE subscriptions — no SyncStep1, no BoardRoom wake; touched hints drive the parked dirty flag; doSwitch awaits the new provider.activate() sync barrier before bind/seed; syncLayoutFromSave activates before writing; a stray local write into a passive doc auto-activates. suberr (invalid-file 409, presence 403) surfaces as CollabSubRejectedError — terminal in the switch retry ladder like SexprVersionError, ending the old blind re-dial. Verified: standalone 346 unit tests green (10 new facade tests incl. the no-doc-frame passive pin); browser on the dev stack: pcbnew demo = 1 gateway socket / 0 board-rooms with live collab, eeschema Arduino Leonardo = 2 sockets total, sub table presence+root active / 3 children passive. tests/web: no regressions (4 failures reproduced identically without this diff — pre-existing on the JSPI line; 1 parallel-load flake passes alone). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VLSht9cadprtT2mhynawWu
55 lines
1.6 KiB
JSON
55 lines
1.6 KiB
JSON
{
|
|
"name": "@pcbjam/standalone",
|
|
"version": "0.0.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "node scripts/link-wasm.mjs && VITE_ALLOW_USER_OVERRIDE=1 vite",
|
|
"dev:demo": "node ../../scripts/deploy/dev-demo.mjs",
|
|
"link-wasm": "node scripts/link-wasm.mjs",
|
|
"build": "tsc --noEmit && vite build",
|
|
"preview": "vite preview",
|
|
"e2e:preview": "node scripts/build-preview.mjs",
|
|
"typecheck": "tsc --noEmit",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest"
|
|
},
|
|
"dependencies": {
|
|
"@emoji-mart/data": "^1.2.1",
|
|
"@emoji-mart/react": "^1.1.1",
|
|
"@hocuspocus/provider": "^4.1.1",
|
|
"@pcbjam/shared": "workspace:*",
|
|
"@pcbjam/sync-client": "workspace:*",
|
|
"@radix-ui/react-dialog": "^1.1.4",
|
|
"@radix-ui/react-label": "^2.1.1",
|
|
"@radix-ui/react-slot": "^1.1.1",
|
|
"@sentry/browser": "^10.69.0",
|
|
"@tanstack/react-query": "^5.62.11",
|
|
"@ts-rest/core": "^3.52.1",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"emoji-mart": "^5.6.0",
|
|
"lib0": "^0.2.99",
|
|
"lucide-react": "^0.469.0",
|
|
"react": "^18.3.1",
|
|
"react-dom": "^18.3.1",
|
|
"react-router-dom": "^6.28.1",
|
|
"tailwind-merge": "^2.6.0",
|
|
"tailwindcss-animate": "^1.0.7",
|
|
"y-partyserver": "^2.2.0",
|
|
"y-protocols": "^1.0.6",
|
|
"yjs": "^13.6.18",
|
|
"zod": "^3.24.1"
|
|
},
|
|
"devDependencies": {
|
|
"@types/react": "^18.3.18",
|
|
"@types/react-dom": "^18.3.5",
|
|
"@vitejs/plugin-react": "^4.3.4",
|
|
"autoprefixer": "^10.4.20",
|
|
"postcss": "^8.4.49",
|
|
"tailwindcss": "^3.4.17",
|
|
"typescript": "^5.7.3",
|
|
"vite": "^6.0.7",
|
|
"vitest": "^3.0.0"
|
|
}
|
|
}
|