7.8 KiB
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):
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):
// ✅ 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:
- Backend not running
- Not authenticated
- Method requires authentication
Fixes Applied (src/views/Marketplace.vue):
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)
# 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:
# 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
# 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
- Start the UI:
npm run dev - Open DevTools Console
- Login (to trigger WebSocket connection)
- 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
-
Without Backend:
- Navigate to Marketplace
- Should see: "Backend marketplace API not available..." (clear message)
- No crashes or undefined errors
-
Without Login:
- Navigate to Marketplace
- Should see: "Please login first..." (clear message)
-
With Backend & Login:
- Navigate to Marketplace
- Should see: Loading → Apps list OR specific error
File Changes Summary
Modified Files
-
src/api/websocket.ts- Added validation for patch array
- Added try/catch for safety
- Better error logging
-
src/stores/app.ts- Added null checks for WebSocket updates
- Added try/catch in subscription handler
- Removed premature
isConnectedreset on logout
-
src/views/Marketplace.vue- Added authentication check
- Added specific error messages
- Better error categorization
New Documentation
-
TROUBLESHOOTING.md- Common issues and solutions
- Mock mode setup
- Debugging tips
- Backend setup guide
-
ERROR_FIXES.md(this file)- Summary of fixes
- Testing procedures
- Next steps
Architecture Notes
Why These Errors Happened
-
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
-
Marketplace Error:
- RPC method
marketplace.getexists in backend - But requires running backend + authentication
- Now: Checks auth first, provides clear error messages
- RPC method
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
# 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
# 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:
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
- Start backend:
cargo run --release - Start UI:
npm run dev - Login at
http://localhost:8100 - Test marketplace functionality
See TROUBLESHOOTING.md for detailed debugging help!