export function Watcher(db, selector, opts) { const subscribers = new Set(); let changes = null; return function subscribe(fn) { subscribers.add(fn); if (subscribers.size === 1 && !changes) { changes = db .changes( Object.assign( { since: 'now', live: true, selector }, opts ) ) .on('change', change => { const { id, deleted, doc } = change; subscribers.forEach(s => s(id, !!deleted, doc)); }) .on('error', err => { subscribers.clear(); throw err; }); } return () => { subscribers.delete(fn); if (subscribers.size === 0 && changes) { changes.cancel(); changes = null; } }; }; }