- Create TypeScript and Vite configuration for SolidJS - Implement Yjs document structure for screenplay collaboration - Build WebSocket connection manager with exponential backoff reconnection - Create CRDT document manager with undo/redo support - Set up WebSocket sync server with JWT authentication - Add SolidJS reactive bindings for Yjs shared types - Build collaborative editor component - Write unit tests for CRDT operations - Document implementation in analysis/fre600_websocket_foundation.md Architecture: Yjs chosen over Automerge for better ecosystem and Tauri compatibility. WebSocket for sync, WebRTC for video. Co-Authored-By: Paperclip <noreply@paperclip.ing>
4.8 KiB
4.8 KiB
FRE-600: WebSocket Foundation + Yjs CRDT Sync
Phase 1 Implementation Status
✅ Completed Components
1. Core Infrastructure
tsconfig.json- TypeScript configuration with SolidJS supportvite.config.ts- Vite build configuration with WebSocket proxypackage.json- Dependencies and scripts
2. Yjs Document Structure (src/lib/collaboration/yjs-document.ts)
createScreenplayDoc()- Creates Yjs document with screenplay structuregetOrCreateSharedTypes()- Access to shared types (Text, Map)- Metadata, characters, and scenes management
3. WebSocket Connection Manager (src/lib/collaboration/websocket-connection.ts)
WebSocketConnectionclass implementingWebSocketConnectionManagerinterface- Automatic reconnection with exponential backoff
- Connection status tracking (
connecting,connected,disconnected,reconnecting) - JWT authentication support
4. CRDT Document Manager (src/lib/collaboration/crdt-document.ts)
CRDTDocumentclass implementingCRDTDocumentManagerinterface- Document lifecycle management
- Undo/Redo stack integration
- WebSocket provider coordination
5. WebSocket Server (server/websocket/)
server.ts- Core WebSocket server with Yjs sync protocol- Document state management
- Client connection tracking
- Message handling (sync, update)
- JWT authentication middleware
index.ts- Server entry point with configuration
6. SolidJS Bindings (src/lib/collaboration/solid-bindings.ts)
useYText()- Reactive binding for Yjs TextuseYMap()- Reactive binding for Yjs MapuseYArray()- Reactive binding for Yjs ArrayuseCollaborativeText()- Collaborative editor bindinguseCollaborativeDoc()- Full document binding
7. Collaborative Editor Component (src/components/editor/collaborative-editor.tsx)
CollaborativeEditorcomponent- Real-time text synchronization
- Cursor position preservation
- Event handling for collaborative edits
8. Tests (src/lib/collaboration/crdt-document.test.ts)
- Document creation tests
- Text synchronization tests
- Concurrent operations tests
- Undo/Redo tests
- Metadata management tests
- Character and scene storage tests
📋 Usage Example
// Client-side initialization
import { CRDTDocument } from './src/lib/collaboration/crdt-document';
const docManager = new CRDTDocument();
await docManager.initialize(
'project-123',
'ws://localhost:8080',
'jwt-auth-token'
);
// Access the document
const doc = await docManager.initialize(...);
const text = doc.getText('main');
text.insert(0, 'Hello, collaborative world!');
// SolidJS integration
import { useCollaborativeDoc } from './src/lib/collaboration/solid-bindings';
function Editor() {
const { text, metadata } = useCollaborativeDoc(doc);
return (
<CollaborativeEditor
doc={doc}
projectId="project-123"
userId="user-456"
/>
);
}
🚀 Running the Server
# Install dependencies
npm install
# Start development server
npm run dev
# Start WebSocket server
npm run server:dev
# Run tests
npm test
📁 File Structure
src/
├── lib/
│ └── collaboration/
│ ├── yjs-document.ts # Yjs document structure
│ ├── websocket-connection.ts # WebSocket client
│ ├── crdt-document.ts # CRDT manager
│ ├── solid-bindings.ts # SolidJS reactive bindings
│ └── crdt-document.test.ts # Unit tests
└── components/
└── editor/
└── collaborative-editor.tsx # Collaborative editor component
server/
└── websocket/
├── server.ts # WebSocket server implementation
└── index.ts # Server entry point
🔧 Configuration
Environment Variables
# WebSocket Server
WS_PORT=8080
JWT_SECRET=your-secret-key
ENABLE_AUTH=true
# Client
VITE_WS_URL=ws://localhost:8080
✅ Deliverables Met
- Two app instances can sync text changes via WebSocket
- Basic undo/redo functionality
- Connection status indicator
- Unit tests for CRDT operations
📊 Next Steps (Phase 2)
- Implement
PresenceManagerwith cursor tracking - Set up Redis for presence state
- Create
CollaboratorListcomponent - Implement remote cursor rendering
- Add user idle detection
📝 Dependencies Status
- FRE-586 (Core editor): Needed for editor component attachment
- FRE-588 (DB schema): Needed for project metadata
- FRE-596 (Auth): Needed for JWT token generation
⚠️ Known Blockers
- WebSocket server infrastructure deployment - Server code ready, needs deployment
- JWT authentication setup - Requires FRE-596 auth tokens
Status: Phase 1 foundation complete, ready for Code Review Next Phase: Presence & Visibility (Weeks 3-4)