317 lines
7.8 KiB
Markdown
317 lines
7.8 KiB
Markdown
# Error Fixes - WebSocket & Marketplace Issues
|
|
|
|
## Issues Fixed
|
|
|
|
### ✅ 1. WebSocket Patch Error
|
|
**Error**: `Cannot read properties of undefined (reading 'length')`
|
|
|
|
**Root Cause**: The `applyDataPatch` function was trying to read the `length` property of an undefined or null `patch` array.
|
|
|
|
**Fix Applied** (`src/api/websocket.ts`):
|
|
```typescript
|
|
export function applyDataPatch<T>(data: T, patch: PatchOperation[]): T {
|
|
// ✅ NEW: Validate patch is an array before applying
|
|
if (!Array.isArray(patch) || patch.length === 0) {
|
|
console.warn('Invalid or empty patch received, returning original data')
|
|
return data
|
|
}
|
|
|
|
// ✅ NEW: Wrap in try/catch for safety
|
|
try {
|
|
const result = applyPatch(data, patch as any, false, false)
|
|
return result.newDocument as T
|
|
} catch (error) {
|
|
console.error('Failed to apply patch:', error, 'Patch:', patch)
|
|
return data // Return original data on error
|
|
}
|
|
}
|
|
```
|
|
|
|
**Also Fixed** (`src/stores/app.ts`):
|
|
```typescript
|
|
// ✅ Added null checks and error handling
|
|
wsClient.subscribe((update) => {
|
|
if (data.value && update?.patch) { // Added update?.patch check
|
|
try {
|
|
data.value = applyDataPatch(data.value, update.patch)
|
|
} catch (err) {
|
|
console.error('Failed to apply WebSocket patch:', err)
|
|
// Gracefully continue - app still works without real-time updates
|
|
}
|
|
}
|
|
})
|
|
```
|
|
|
|
**Result**:
|
|
- No more crashes from malformed WebSocket messages
|
|
- App continues working even if patches fail
|
|
- Better logging for debugging
|
|
|
|
---
|
|
|
|
### ✅ 2. Marketplace API Error
|
|
**Error**: `Method not found: marketplace.get`
|
|
|
|
**Root Causes**:
|
|
1. Backend not running
|
|
2. Not authenticated
|
|
3. Method requires authentication
|
|
|
|
**Fixes Applied** (`src/views/Marketplace.vue`):
|
|
|
|
```typescript
|
|
async function loadMarketplace() {
|
|
// ✅ NEW: Check authentication first
|
|
if (!store.isAuthenticated) {
|
|
error.value = 'Please login first to access the marketplace'
|
|
loading.value = false
|
|
return
|
|
}
|
|
|
|
try {
|
|
const data = await store.getMarketplace(selectedMarketplace.value)
|
|
// ... rest of logic
|
|
} catch (err) {
|
|
const errorMessage = err instanceof Error ? err.message : 'Failed to load marketplace'
|
|
|
|
// ✅ NEW: Provide specific, actionable error messages
|
|
if (errorMessage.includes('Method not found')) {
|
|
error.value = 'Backend marketplace API not available. Ensure Neode backend is running and up to date.'
|
|
} else if (errorMessage.includes('authenticated') || errorMessage.includes('401')) {
|
|
error.value = 'Authentication required. Please login first.'
|
|
} else if (errorMessage.includes('Network') || errorMessage.includes('fetch')) {
|
|
error.value = 'Cannot connect to backend. Ensure Neode backend is running on port 5959.'
|
|
} else {
|
|
error.value = errorMessage
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**Result**:
|
|
- Clear, actionable error messages
|
|
- Authentication check before API calls
|
|
- Better user experience
|
|
|
|
---
|
|
|
|
## What You Need to Do
|
|
|
|
### Immediate Next Steps
|
|
|
|
**1. Ensure Backend is Running**
|
|
|
|
The marketplace requires a running Neode backend. You have two options:
|
|
|
|
#### Option A: Start the Backend (Recommended)
|
|
```bash
|
|
# Build and run the backend
|
|
cd /Users/tx1138/Code/Neode/core
|
|
cargo build --release
|
|
./target/release/startos
|
|
|
|
# Should see: "Neode backend listening on :5959"
|
|
```
|
|
|
|
#### Option B: Use Mock Mode (Development Only)
|
|
See `TROUBLESHOOTING.md` for how to enable mock mode for UI development without backend.
|
|
|
|
**2. Login First**
|
|
|
|
Before accessing the marketplace:
|
|
```bash
|
|
# Start UI
|
|
cd /Users/tx1138/Code/Neode/neode-ui
|
|
npm run dev
|
|
|
|
# Visit: http://localhost:8100
|
|
# Navigate to Login
|
|
# Enter credentials
|
|
# Then access Marketplace
|
|
```
|
|
|
|
**3. Test the Fixes**
|
|
|
|
```bash
|
|
# With backend running and authenticated:
|
|
# Navigate to Marketplace
|
|
# Should see: Loading → Apps OR Clear error message (not a crash)
|
|
```
|
|
|
|
---
|
|
|
|
## Testing the Fixes
|
|
|
|
### Test WebSocket Error Fix
|
|
|
|
1. **Start the UI**: `npm run dev`
|
|
2. **Open DevTools Console**
|
|
3. **Login** (to trigger WebSocket connection)
|
|
4. **Look for**:
|
|
- ✅ Should see: "WebSocket connected"
|
|
- ✅ Should NOT crash on malformed patches
|
|
- ✅ May see warnings: "Invalid or empty patch received" (this is OK)
|
|
|
|
### Test Marketplace Error Fix
|
|
|
|
1. **Without Backend**:
|
|
- Navigate to Marketplace
|
|
- Should see: "Backend marketplace API not available..." (clear message)
|
|
- No crashes or undefined errors
|
|
|
|
2. **Without Login**:
|
|
- Navigate to Marketplace
|
|
- Should see: "Please login first..." (clear message)
|
|
|
|
3. **With Backend & Login**:
|
|
- Navigate to Marketplace
|
|
- Should see: Loading → Apps list OR specific error
|
|
|
|
---
|
|
|
|
## File Changes Summary
|
|
|
|
### Modified Files
|
|
|
|
1. **`src/api/websocket.ts`**
|
|
- Added validation for patch array
|
|
- Added try/catch for safety
|
|
- Better error logging
|
|
|
|
2. **`src/stores/app.ts`**
|
|
- Added null checks for WebSocket updates
|
|
- Added try/catch in subscription handler
|
|
- Removed premature `isConnected` reset on logout
|
|
|
|
3. **`src/views/Marketplace.vue`**
|
|
- Added authentication check
|
|
- Added specific error messages
|
|
- Better error categorization
|
|
|
|
### New Documentation
|
|
|
|
4. **`TROUBLESHOOTING.md`**
|
|
- Common issues and solutions
|
|
- Mock mode setup
|
|
- Debugging tips
|
|
- Backend setup guide
|
|
|
|
5. **`ERROR_FIXES.md`** (this file)
|
|
- Summary of fixes
|
|
- Testing procedures
|
|
- Next steps
|
|
|
|
---
|
|
|
|
## Architecture Notes
|
|
|
|
### Why These Errors Happened
|
|
|
|
1. **WebSocket Error**:
|
|
- Backend sends JSON Patch operations over WebSocket
|
|
- If patch format is unexpected or empty, code crashed
|
|
- Now: Validates format and handles errors gracefully
|
|
|
|
2. **Marketplace Error**:
|
|
- RPC method `marketplace.get` exists in backend
|
|
- But requires running backend + authentication
|
|
- Now: Checks auth first, provides clear error messages
|
|
|
|
### How It Works Now
|
|
|
|
```
|
|
User navigates to Marketplace
|
|
↓
|
|
Check isAuthenticated ✅
|
|
↓
|
|
Call store.getMarketplace(url)
|
|
↓
|
|
RPC Client → POST /rpc/v1
|
|
↓
|
|
Backend: marketplace.get
|
|
↓
|
|
Return apps OR error with clear message ✅
|
|
↓
|
|
Display apps OR show actionable error ✅
|
|
```
|
|
|
|
---
|
|
|
|
## Verification Checklist
|
|
|
|
Run through this checklist to verify fixes:
|
|
|
|
- [ ] UI starts without errors: `npm run dev`
|
|
- [ ] Login works (with or without backend)
|
|
- [ ] WebSocket connects (if backend available)
|
|
- [ ] WebSocket errors don't crash app
|
|
- [ ] Marketplace shows clear error when not logged in
|
|
- [ ] Marketplace shows clear error when backend unavailable
|
|
- [ ] Marketplace loads apps (when backend running + logged in)
|
|
- [ ] No console errors about "Cannot read properties of undefined"
|
|
- [ ] No crashes when navigating between pages
|
|
|
|
---
|
|
|
|
## Still Getting Errors?
|
|
|
|
### Check Backend Status
|
|
|
|
```bash
|
|
# Is backend running?
|
|
lsof -i :5959
|
|
|
|
# Test backend directly
|
|
curl -X POST http://localhost:5959/rpc/v1 \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"method":"echo","params":{"message":"hello"}}'
|
|
|
|
# Should return: {"result":"hello"}
|
|
```
|
|
|
|
### Check UI Status
|
|
|
|
```bash
|
|
# Is UI running?
|
|
curl http://localhost:8100
|
|
|
|
# Check console for errors
|
|
# Open browser DevTools → Console tab
|
|
```
|
|
|
|
### Enable Debug Logging
|
|
|
|
Add to `src/api/rpc-client.ts`:
|
|
```typescript
|
|
async call<T>(options: RPCOptions): Promise<T> {
|
|
console.log('🔵 RPC:', options.method, options.params)
|
|
// ... rest of method
|
|
console.log('🟢 Result:', data.result)
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Summary
|
|
|
|
### What Was Fixed
|
|
✅ WebSocket no longer crashes on bad patches
|
|
✅ Marketplace shows clear, actionable errors
|
|
✅ Better authentication checks
|
|
✅ Comprehensive error handling
|
|
|
|
### What You Should See Now
|
|
✅ No crashes or undefined errors
|
|
✅ Clear error messages with next steps
|
|
✅ App continues working even if WebSocket fails
|
|
✅ Marketplace works when backend is available
|
|
|
|
### Next Steps
|
|
1. Start backend: `cargo run --release`
|
|
2. Start UI: `npm run dev`
|
|
3. Login at `http://localhost:8100`
|
|
4. Test marketplace functionality
|
|
|
|
**See `TROUBLESHOOTING.md` for detailed debugging help!**
|
|
|