---
description: 
globs: 
alwaysApply: true
---
# Absurd SQL - Cursor Development Guide

## Project Overview
Absurd SQL is a backend implementation for sql.js that enables persistent SQLite databases in the browser by using IndexedDB as a block storage system. This guide provides rules and best practices for developing with this project in Cursor.

## Project Structure
```
absurd-sql/
├── src/               # Source code
├── dist/             # Built files
├── package.json      # Dependencies and scripts
├── rollup.config.js  # Build configuration
└── jest.config.js    # Test configuration
```

## Development Rules

### 1. Worker Thread Requirements
- All SQL operations MUST be performed in a worker thread
- Main thread should only handle worker initialization and communication
- Never block the main thread with database operations

### 2. Code Organization
- Keep worker code in separate files (e.g., `*.worker.js`)
- Use ES modules for imports/exports
- Follow the project's existing module structure

### 3. Required Headers
When developing locally or deploying, ensure these headers are set:
```
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
```

### 4. Browser Compatibility
- Primary target: Modern browsers with SharedArrayBuffer support
- Fallback mode: Safari (with limitations)
- Always test in both modes

### 5. Database Configuration
Recommended database settings:
```sql
PRAGMA journal_mode=MEMORY;
PRAGMA page_size=8192;  -- Optional, but recommended
```

### 6. Development Workflow
1. Install dependencies:
   ```bash
   yarn add @jlongster/sql.js absurd-sql
   ```

2. Development commands:
   - `yarn build` - Build the project
   - `yarn jest` - Run tests
   - `yarn serve` - Start development server

### 7. Testing Guidelines
- Write tests for both SharedArrayBuffer and fallback modes
- Use Jest for testing
- Include performance benchmarks for critical operations

### 8. Performance Considerations
- Use bulk operations when possible
- Monitor read/write performance
- Consider using transactions for multiple operations
- Avoid unnecessary database connections

### 9. Error Handling
- Implement proper error handling for:
  - Worker initialization failures
  - Database connection issues
  - Concurrent access conflicts (in fallback mode)
  - Storage quota exceeded scenarios

### 10. Security Best Practices
- Never expose database operations directly to the client
- Validate all SQL queries
- Implement proper access controls
- Handle sensitive data appropriately

### 11. Code Style
- Follow ESLint configuration
- Use async/await for asynchronous operations
- Document complex database operations
- Include comments for non-obvious optimizations

### 12. Debugging
- Use `jest-debug` for debugging tests
- Monitor IndexedDB usage in browser dev tools
- Check worker communication in console
- Use performance monitoring tools

## Common Patterns

### Worker Initialization
```javascript
// Main thread
import { initBackend } from 'absurd-sql/dist/indexeddb-main-thread';

function init() {
  let worker = new Worker(new URL('./index.worker.js', import.meta.url));
  initBackend(worker);
}
```

### Database Setup
```javascript
// Worker thread
import initSqlJs from '@jlongster/sql.js';
import { SQLiteFS } from 'absurd-sql';
import IndexedDBBackend from 'absurd-sql/dist/indexeddb-backend';

async function setupDatabase() {
  let SQL = await initSqlJs({ locateFile: file => file });
  let sqlFS = new SQLiteFS(SQL.FS, new IndexedDBBackend());
  SQL.register_for_idb(sqlFS);
  
  SQL.FS.mkdir('/sql');
  SQL.FS.mount(sqlFS, {}, '/sql');
  
  return new SQL.Database('/sql/db.sqlite', { filename: true });
}
```

## Troubleshooting

### Common Issues
1. SharedArrayBuffer not available
   - Check COOP/COEP headers
   - Verify browser support
   - Test fallback mode

2. Worker initialization failures
   - Check file paths
   - Verify module imports
   - Check browser console for errors

3. Performance issues
   - Monitor IndexedDB usage
   - Check for unnecessary operations
   - Verify transaction usage

## Resources
- [Project Demo](https://priceless-keller-d097e5.netlify.app/)
- [Example Project](https://github.com/jlongster/absurd-example-project)
- [Blog Post](https://jlongster.com/future-sql-web)
- [SQL.js Documentation](https://github.com/sql-js/sql.js/)