45 lines
1.2 KiB
JavaScript
45 lines
1.2 KiB
JavaScript
// @flow
|
||
import events, { type Event } from "../events";
|
||
import { Document } from "../models";
|
||
|
||
export default class Debouncer {
|
||
async on(event: Event) {
|
||
switch (event.name) {
|
||
case "documents.update": {
|
||
events.add(
|
||
{
|
||
...event,
|
||
name: "documents.update.delayed",
|
||
},
|
||
{
|
||
delay: 5 * 60 * 1000,
|
||
removeOnComplete: true,
|
||
}
|
||
);
|
||
break;
|
||
}
|
||
case "documents.update.delayed": {
|
||
const document = await Document.findByPk(event.documentId);
|
||
|
||
// If the document has been deleted then prevent further processing
|
||
if (!document) return;
|
||
|
||
// If the document has been updated since we initially queued the delayed
|
||
// event then abort, there must be another updated event in the queue –
|
||
// this functions as a simple distributed debounce.
|
||
if (document.updatedAt > new Date(event.createdAt)) return;
|
||
|
||
events.add(
|
||
{
|
||
...event,
|
||
name: "documents.update.debounced",
|
||
},
|
||
{ removeOnComplete: true }
|
||
);
|
||
break;
|
||
}
|
||
default:
|
||
}
|
||
}
|
||
}
|