immersive2/server/services/databaseService.js
Michael Mainguy a772372b2b Add public URL sharing with express-pouchdb sync
- Add express-pouchdb for self-hosted PouchDB sync server
- Public databases (/db/public/:db) accessible without auth
- Add auth middleware for public/private database access
- Simplify share button to copy current URL to clipboard
- Move feature config from static JSON to dynamic API endpoint
- Add PouchDB sync to PouchData class for real-time collaboration
- Fix Express 5 compatibility by patching req.query
- Skip express.json() for /pouchdb routes (stream handling)
- Remove unused PouchdbPersistenceManager and old share system

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-29 11:49:56 -06:00

63 lines
2.1 KiB
JavaScript

/**
* Database service using express-pouchdb for self-hosted database sync.
* Provides PouchDB HTTP API compatible with client-side PouchDB replication.
*/
import PouchDB from 'pouchdb';
import PouchDBAdapterMemory from 'pouchdb-adapter-memory';
import expressPouchdb from 'express-pouchdb';
import path from 'path';
import { fileURLToPath } from 'url';
// Register memory adapter (works in Node.js without leveldown issues)
PouchDB.plugin(PouchDBAdapterMemory);
const __dirname = path.dirname(fileURLToPath(import.meta.url));
// Data directory for persistent storage (used for logs)
const DATA_DIR = process.env.DATA_DIR || path.join(__dirname, '../../data');
// Use memory adapter for now - data persists while server is running
// TODO: Switch to leveldb once version conflicts are resolved
const memPouchDB = PouchDB.defaults({
adapter: 'memory'
});
// Create express-pouchdb middleware
// Using 'minimumForPouchDB' mode for lightweight operation
// Include routes needed for PouchDB replication
const pouchApp = expressPouchdb(memPouchDB, {
mode: 'minimumForPouchDB',
overrideMode: {
include: [
'routes/root', // GET / - server info
'routes/db', // PUT/GET/DELETE /:db
'routes/all-dbs', // GET /_all_dbs
'routes/changes', // GET /:db/_changes
'routes/bulk-docs', // POST /:db/_bulk_docs
'routes/bulk-get', // POST /:db/_bulk_get
'routes/all-docs', // GET /:db/_all_docs
'routes/revs-diff', // POST /:db/_revs_diff
'routes/documents' // GET/PUT/DELETE /:db/:docid
]
},
logPath: path.join(DATA_DIR, 'logs', 'pouchdb.log')
});
console.log(`[Database] Initialized express-pouchdb with data dir: ${DATA_DIR}`);
// Test that PouchDB can create databases
(async () => {
try {
const testDb = new memPouchDB('_test_db');
const info = await testDb.info();
console.log('[Database] Test DB created successfully:', info);
await testDb.destroy();
console.log('[Database] Test DB destroyed');
} catch (err) {
console.error('[Database] Failed to create test database:', err);
}
})();
export { memPouchDB as PouchDB, pouchApp };