- 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>
172 lines
4.8 KiB
Markdown
172 lines
4.8 KiB
Markdown
# FRE-600: WebSocket Foundation + Yjs CRDT Sync
|
|
|
|
## Phase 1 Implementation Status
|
|
|
|
### ✅ Completed Components
|
|
|
|
#### 1. Core Infrastructure
|
|
- **`tsconfig.json`** - TypeScript configuration with SolidJS support
|
|
- **`vite.config.ts`** - Vite build configuration with WebSocket proxy
|
|
- **`package.json`** - Dependencies and scripts
|
|
|
|
#### 2. Yjs Document Structure (`src/lib/collaboration/yjs-document.ts`)
|
|
- `createScreenplayDoc()` - Creates Yjs document with screenplay structure
|
|
- `getOrCreateSharedTypes()` - Access to shared types (Text, Map)
|
|
- Metadata, characters, and scenes management
|
|
|
|
#### 3. WebSocket Connection Manager (`src/lib/collaboration/websocket-connection.ts`)
|
|
- `WebSocketConnection` class implementing `WebSocketConnectionManager` interface
|
|
- 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`)
|
|
- `CRDTDocument` class implementing `CRDTDocumentManager` interface
|
|
- 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 Text
|
|
- `useYMap()` - Reactive binding for Yjs Map
|
|
- `useYArray()` - Reactive binding for Yjs Array
|
|
- `useCollaborativeText()` - Collaborative editor binding
|
|
- `useCollaborativeDoc()` - Full document binding
|
|
|
|
#### 7. Collaborative Editor Component (`src/components/editor/collaborative-editor.tsx`)
|
|
- `CollaborativeEditor` component
|
|
- 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
|
|
|
|
```typescript
|
|
// 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
|
|
|
|
```bash
|
|
# 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
|
|
```env
|
|
# WebSocket Server
|
|
WS_PORT=8080
|
|
JWT_SECRET=your-secret-key
|
|
ENABLE_AUTH=true
|
|
|
|
# Client
|
|
VITE_WS_URL=ws://localhost:8080
|
|
```
|
|
|
|
### ✅ Deliverables Met
|
|
|
|
- [x] Two app instances can sync text changes via WebSocket
|
|
- [x] Basic undo/redo functionality
|
|
- [x] Connection status indicator
|
|
- [x] Unit tests for CRDT operations
|
|
|
|
### 📊 Next Steps (Phase 2)
|
|
|
|
1. Implement `PresenceManager` with cursor tracking
|
|
2. Set up Redis for presence state
|
|
3. Create `CollaboratorList` component
|
|
4. Implement remote cursor rendering
|
|
5. 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
|
|
|
|
1. **WebSocket server infrastructure deployment** - Server code ready, needs deployment
|
|
2. **JWT authentication setup** - Requires FRE-596 auth tokens
|
|
|
|
---
|
|
|
|
**Status:** Phase 1 foundation complete, ready for Code Review
|
|
**Next Phase:** Presence & Visibility (Weeks 3-4)
|