Use DB Watcher to trigger generateThumbnails

This commit is contained in:
Timothy Farrell 2017-10-27 08:55:50 -05:00
parent 893dfaff94
commit 941e1f6b1b
4 changed files with 59 additions and 10 deletions

View File

@ -35,7 +35,7 @@ function onRouteChange(router, route) {
update(route); update(route);
} }
image.imported.subscribe(generateThumbnails); image.watcher(generateThumbnails);
image.imported.subscribe(redraw); image.imported.subscribe(redraw);
image.removed.subscribe(redraw); image.removed.subscribe(redraw);
index.added.subscribe(redraw); index.added.subscribe(redraw);

View File

@ -1,4 +1,6 @@
export default async function(...args) { export default async function(id, deleted) {
const module = await import('../context/generateThumbnails'); if (!deleted) {
module.invoke(...args); const module = await import('../context/generateThumbnails');
module.invoke(id, deleted);
}
} }

View File

@ -3,15 +3,31 @@ import { log, error } from '../services/console.js';
import { sha256 } from '../utils/crypto.js'; import { sha256 } from '../utils/crypto.js';
import { blobToArrayBuffer, deepAssign } from '../utils/conversion.js'; import { blobToArrayBuffer, deepAssign } from '../utils/conversion.js';
import { Event, backgroundTask } from '../utils/event.js'; import { Event, backgroundTask } from '../utils/event.js';
import { Watcher } from '../utils/watcher.js';
const db = getDatabase(); const db = getDatabase();
const PROCESS_PREFIX = 'importing'; const PROCESS_PREFIX = 'importing';
const PREFIX = 'image'; const PREFIX = 'image';
const SELECTOR = {
_id: {
$gt: `${PREFIX}_`,
$lt: `${PREFIX}_\ufff0`
}
};
const IMPORT_SELECTOR = {
_id: {
$gt: `${PROCESS_PREFIX}_`,
$lt: `${PROCESS_PREFIX}_\ufff0`
}
};
// Events // Events
export const imported = new Event('Image.imported'); export const imported = new Event('Image.imported');
export const removed = new Event('Image.removed'); export const removed = new Event('Image.removed');
// Watchers
export const watcher = Watcher(db, SELECTOR);
// Methods // Methods
const getId = id => (id.startsWith(PREFIX) ? id : `${PREFIX}_${id}`); const getId = id => (id.startsWith(PREFIX) ? id : `${PREFIX}_${id}`);
@ -76,12 +92,7 @@ export async function addAttachment(doc, key, blob) {
// Internal Functions // Internal Functions
const processImportables = backgroundTask(async function _processImportables() { const processImportables = backgroundTask(async function _processImportables() {
const result = await db.find({ const result = await db.find({
selector: { selector: IMPORT_SELECTOR,
_id: {
$gt: `${PROCESS_PREFIX}_`,
$lt: `${PROCESS_PREFIX}_\ufff0`
}
},
limit: 1 limit: 1
}); });

View File

@ -0,0 +1,36 @@
import { log, error } from '../services/console.js';
export function Watcher(db, selector) {
const subscribers = new Set();
let changes = null;
return function subscribe(fn) {
subscribers.add(fn);
if (subscribers.size === 1 && !changes) {
log('Watching:', db, selector);
changes = db
.changes({
since: 'now',
live: true,
selector
})
.on('change', change => {
log('changed:', change);
subscribers.forEach(s => s(change.id, !!change.deleted));
})
.on('error', err => {
error(err);
subscribers.empty();
});
}
return () => {
this.subscribers.delete(fn);
if (subscribers.size === 0 && changes) {
log('Unwatching:', db, selector);
changes.cancel();
changes = null;
}
};
};
}