50 lines
1.5 KiB
JavaScript
50 lines
1.5 KiB
JavaScript
|
import db from "./db";
|
||
|
import api from "./Api";
|
||
|
|
||
|
const delayMillis = 3000; // 3 seconds
|
||
|
const intervalMillis = 300000; // 5 minutes
|
||
|
|
||
|
class Poller {
|
||
|
constructor() {
|
||
|
this.timer = null;
|
||
|
}
|
||
|
|
||
|
startWorker() {
|
||
|
if (this.timer !== null) {
|
||
|
return;
|
||
|
}
|
||
|
this.timer = setInterval(() => this.pollAll(), intervalMillis);
|
||
|
setTimeout(() => this.pollAll(), delayMillis);
|
||
|
}
|
||
|
|
||
|
async pollAll() {
|
||
|
console.log(`[Poller] Polling all subscriptions`);
|
||
|
const subscriptions = await db.subscriptions.toArray();
|
||
|
for (const s of subscriptions) {
|
||
|
try {
|
||
|
await this.poll(s);
|
||
|
} catch (e) {
|
||
|
console.log(`[Poller] Error polling ${s.id}`, e);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
async poll(subscription) {
|
||
|
console.log(`[Poller] Polling ${subscription.id}`);
|
||
|
|
||
|
const since = subscription.last;
|
||
|
const notifications = await api.poll(subscription.baseUrl, subscription.topic, since);
|
||
|
if (!notifications || notifications.length === 0) {
|
||
|
console.log(`[Poller] No new notifications found for ${subscription.id}`);
|
||
|
return;
|
||
|
}
|
||
|
const notificationsWithSubscriptionId = notifications
|
||
|
.map(notification => ({ ...notification, subscriptionId: subscription.id }));
|
||
|
await db.notifications.bulkPut(notificationsWithSubscriptionId); // FIXME
|
||
|
await db.subscriptions.update(subscription.id, {last: notifications.at(-1).id}); // FIXME
|
||
|
};
|
||
|
}
|
||
|
|
||
|
const poller = new Poller();
|
||
|
export default poller;
|