You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
5.9 KiB
5.9 KiB
Electron App Migration Strategy
Overview
This document outlines the migration strategy for the TimeSafari Electron app, focusing on the transition from web-based storage to native SQLite implementation while maintaining cross-platform compatibility.
Current Architecture
1. Platform Services
ElectronPlatformService
: Implements platform-specific features for desktop- Uses
@capacitor-community/sqlite
for database operations - Maintains compatibility with web/mobile platforms through shared interfaces
2. Database Implementation
- SQLite with native Node.js backend
- WAL journal mode for better concurrency
- Connection pooling for performance
- Migration system for schema updates
- Secure file permissions (0o755)
3. Build Process
# Development
npm run dev:electron
# Production Build
npm run build:web
npm run build:electron
npm run electron:build-linux # or electron:build-mac
Migration Goals
-
Data Integrity
- Preserve existing data during migration
- Maintain data relationships
- Ensure ACID compliance
- Implement proper backup/restore
-
Performance
- Optimize SQLite configuration
- Implement connection pooling
- Use WAL journal mode
- Configure optimal PRAGMA settings
-
Security
- Secure file permissions
- Proper IPC communication
- Context isolation
- Safe preload scripts
-
User Experience
- Zero data loss
- Automatic migration
- Progress indicators
- Error recovery
Implementation Details
1. Database Initialization
// electron/src/rt/sqlite-init.ts
export async function initializeSQLite() {
// Set up database path with proper permissions
const dbPath = path.join(app.getPath('userData'), 'timesafari.db');
// Initialize SQLite plugin
const sqlite = new CapacitorSQLite();
// Configure database
await sqlite.createConnection({
database: 'timesafari',
path: dbPath,
encrypted: false,
mode: 'no-encryption'
});
// Set optimal PRAGMA settings
await sqlite.execute({
database: 'timesafari',
statements: [
'PRAGMA journal_mode = WAL;',
'PRAGMA synchronous = NORMAL;',
'PRAGMA foreign_keys = ON;'
]
});
}
2. Migration System
// electron/src/rt/sqlite-migrations.ts
interface Migration {
version: number;
name: string;
description: string;
sql: string;
rollback?: string;
}
async function runMigrations(plugin: any, database: string) {
// Track migration state
const state = await getMigrationState(plugin, database);
// Execute migrations in transaction
for (const migration of pendingMigrations) {
await executeMigration(plugin, database, migration);
}
}
3. Platform Service Implementation
// src/services/platforms/ElectronPlatformService.ts
export class ElectronPlatformService implements PlatformService {
private sqlite: any;
async dbQuery(sql: string, params: any[]): Promise<QueryExecResult> {
return await this.sqlite.execute({
database: 'timesafari',
statements: [{ statement: sql, values: params }]
});
}
}
4. Preload Script
// electron/preload.ts
contextBridge.exposeInMainWorld('electron', {
sqlite: {
isAvailable: () => ipcRenderer.invoke('sqlite:isAvailable'),
execute: (method: string, ...args: unknown[]) =>
ipcRenderer.invoke('sqlite:execute', method, ...args)
},
getPath: (pathType: string) => ipcRenderer.invoke('get-path', pathType),
env: {
platform: 'electron'
}
});
Build Configuration
1. Vite Configuration
// vite.config.app.electron.mts
export default defineConfig({
build: {
outDir: 'dist',
emptyOutDir: true
},
define: {
'process.env.VITE_PLATFORM': JSON.stringify('electron'),
'process.env.VITE_PWA_ENABLED': JSON.stringify(false)
}
});
2. Package Scripts
{
"scripts": {
"dev:electron": "vite build --watch --config vite.config.app.electron.mts",
"build:electron": "vite build --config vite.config.app.electron.mts",
"electron:build-linux": "electron-builder --linux",
"electron:build-mac": "electron-builder --mac"
}
}
Testing Strategy
-
Unit Tests
- Database operations
- Migration system
- Platform service methods
- IPC communication
-
Integration Tests
- Full migration process
- Data integrity verification
- Cross-platform compatibility
- Error recovery
-
End-to-End Tests
- User workflows
- Data persistence
- UI interactions
- Platform-specific features
Error Handling
-
Database Errors
- Connection failures
- Migration errors
- Query execution errors
- Transaction failures
-
Platform Errors
- File system errors
- IPC communication errors
- Permission issues
- Resource constraints
-
Recovery Mechanisms
- Automatic retry logic
- Transaction rollback
- State verification
- User notifications
Security Considerations
-
File System
- Secure file permissions
- Path validation
- Access control
- Data encryption
-
IPC Communication
- Context isolation
- Channel validation
- Data sanitization
- Error handling
-
Preload Scripts
- Minimal API exposure
- Type safety
- Input validation
- Error boundaries
Future Improvements
-
Performance
- Query optimization
- Index tuning
- Connection management
- Cache implementation
-
Features
- Offline support
- Sync capabilities
- Backup/restore
- Data export/import
-
Security
- Database encryption
- Secure storage
- Access control
- Audit logging
Maintenance
-
Regular Tasks
- Database optimization
- Log rotation
- Error monitoring
- Performance tracking
-
Updates
- Dependency updates
- Security patches
- Feature additions
- Bug fixes
-
Documentation
- API documentation
- Migration guides
- Troubleshooting
- Best practices